Grafana の便利べんり使つかいかた

更新こうしん

Found some pros in Grafana though I impressed cons on it a few days ago.

先日せんじつ Elasticsearch Kibana と比較ひかくして Grafana の欠点けってんをいくつかげましたが、Grafana にもいくつか活用かつよう方法ほうほうがあることがかってきましたので、公平こうへいせいてんからいくつか報告ほうこくさせていただきたいとおもいます。

Grafana や Kibana など GUI けいの「データベース web 可視かしツール」には、プログラマてき人種じんしゅには「かゆいところにとどかない」欠点けってんがある一方いっぽうで、プログラマでない方々かたがたが「20% の労力ろうりょくで 80% の効果こうかられる」メリットがあります。また、Kibana のぜん機能きのう利用りようしようとすると有償ゆうしょうサービスを利用りようせざるをませんが、Grafana は基本きほんてき無償むしょうぜん機能きのう使つかえそうですので、Grafana も活用かつようしていきたいところです。(とくに、無償むしょうばんの Kibana にはセキュリティ機能きのうがないので、デモサイトとう公開こうかいするには有償ゆうしょうサービスを使用しようせざるをません。もちろん、一番いちばん安価あんか選択肢せんたくしえらぶと US$ 15/つきくらいから利用りようできそうですので、しょう企業きぎょうにとっても投資とうしがくとして十分じゅうぶん安価あんかだとはおもいますが。)

ちょっと脱線だっせん

じつは Dash + Plotly を勉強べんきょうしようとして、こんなサイトをんでいました。(Dash の紹介しょうかいだけでなく、なか動向どうこう非常ひじょうによくサーベイしてらっしゃいますので、業界ぎょうかい関係かんけいしゃほうには一読いちどくをおすすめします。)

とく印象いんしょうてきなのは、

… But when it comes to data transformation and analytics, (これらの BI ツールは) it’s hard to beat the breadth and flexibility of programming languages and communities like Python…

というところで、GUI てきな BI(Business Intelligence という分野ぶんやがあるそうです)ツールと、Dash + Plotly のようなソフトウェアフレームワークは共存きょうぞんしていくことになるのかなあ、という印象いんしょうちました。

閑話休題かんわきゅうだい?

さて、Dash + Plotly のチュートリアルをんでいて、以前いぜんからの疑問ぎもんふたたあたまをよぎりました。Kibana や Grafana を活用かつようしていくとして、とき系列けいれつデータをたくわえるのに(当面とうめん)どんなデータベースを活用かつようしていくべきなのだろうか、というてんです。Kibana は Elasticsearch を前提ぜんていとしています。また、Python には Elasticsearch を利用りようするライブラリがありますので、たとえば Pandas のデータフレーム作成さくせい利用りようできそうです。

人間にんげんよわいもので、このようなときにどうしてもかんがえてしまうのは、「なかではなに主流しゅりゅうなのだろうか」ということです。つまりらば大樹たいじゅかげてきかんがえになってしまうわけです。さっそく Google でトレンドを調しらべてみました。

まずは、Grafana と関連付かんれんづけてトレンドをてみます。

Grafana のコミュニティでは、InfluxDB の人気にんきたかいようです。つぎに、pandas と関連付かんれんづけててみます。

pandas のデータフレームとしては、Elasticsearch のほうが優勢ゆうせいのようにえます。せっかく Elasticsearch を勉強べんきょうしていることですし、しばらくは Elasticsearch でおこなってみようとおもいます。(というか、Kibana は Elasticsearch の専用せんようコンパニオンツールなので、Elasticsearch でしか利用りようできない。)

本当ほんとう閑話休題かんわきゅうだい

前回ぜんかい、Grafana で MongoDB を利用りようしようとして(プラグインをさがしたりして)苦労くろうしたのですが、Elasticsearch はデフォルトで Grafana に対応たいおうしているので簡単かんたんです。

まずは、データソースを追加ついかします。

わたしのサイト(iotserv)では、けんの PM 2.5 データを demo_sps30 というインデックスに格納かくのうしているので、Index name に demo_sps30 と入力にゅうりょくします。時間じかんじくフィールドは datetime なので、そのように変更へんこうします。Min time interval は「1ふん」としました。(データベースもそうなっています。)

つぎに、ダッシュボードの設計せっけいです。MongoDB のとき苦労くろうしたのですが、Elasticsearch では簡単かんたんです。

ここでおどろいたのは、グラフの表示ひょうじきわめてはやいということです。これは正確せいかくうと、グラフの表示ひょうじはやいというよりもデータベースへの query が効率こうりつてきはやということでしょう。

データベースへの query をインスペクタでのぞいてみました。まだ Elasticsearch の REST API に不慣ふなれなのでむのがしんどいのですが、エイっ。

{
  "search_type": "query_then_fetch",
  "ignore_unavailable": true,
  "index": "demo_sps30",
  "max_concurrent_shard_requests": 256
}
{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "datetime": {
              "gte": "1552271738843",
              "lte": "1552293338844",
              "format": "epoch_millis"
            }
          }
        },
        {
          "query_string": {
            "analyze_wildcard": true,
            "query": "location:veranda"
          }
        }
      ]
    }
  },
  "aggs": {
    "2": {
      "date_histogram": {
        "interval": "1m",
        "field": "datetime",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "1552271738843",
          "max": "1552293338844"
        },
        "format": "epoch_millis"
      },
      "aggs": {
        "1": {
          "avg": {
            "field": "mass_pm2_5"
          }
        }
      }
    }
  }
}

やや冗長じょうちょうな query にえるのですが、ポイントは

      "date_histogram": {
        "interval": "1m",
        "field": "datetime",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "1552271738843",
          "max": "1552293338844"
        },

というところと、

      "aggs": {
        "1": {
          "avg": {
            "field": "mass_pm2_5"
          }
        }
      }

ところのようです。前者ぜんしゃでは Elasticsearch の aggregation 機能きのう使つかって、時間じかんじくじょうにヒストグラムを作成さくせいして複数ふくすうの bucket(Elasticsearch の用語ようごです。一般いっぱんにヒストグラムの bin とばれる概念がいねんおなじかとおもいます)に分割ぶんかつし、後者こうしゃではその結果けっかであるかく bucket のなかで、 avg(平均へいきん計算けいさんする)という aggregation を実行じっこうし、それらをパイプラインで連結れんけつしています。

上記じょうき query 要求ようきゅうをしてみると、(まだドキュメントすう(つまりレコードすう)が 11まんほどとちいさなデータベースではありますが)Intel Celeron J3455(1.5GHz, ESXi 仮想かそうメモリ 2GB)のサーバー(localhost)へのわせで 25ミリびょう程度ていど結果けっかかえってきます。十分じゅうぶん高速こうそくなのではないか、とおもいます。

今日きょうのまとめ

というわけで、まずはお客様きゃくさまデモをおせして、反応はんのうさぐってみたいとおもっています。

ダッシュボード全景ぜんけい

リアルタイムグラフ(iframe)

以下いかのリアルタイムグラフでは、マウスでドラッグすることで時間じかんじく拡大かくだいできます。ダブルクリックで縮小しゅくしょうもできます。

客様きゃくさま反応はんのうになります…

もし「いいね 😎 」という反応はんのうかえってきたらうれしいですね。それでもダメなら Dash + Plotly でしょうか。「いやあ、うちは Excel で十分じゅうぶんですよ」とかわれるとかなしいところですが、最初さいしょ引用いんようした Introducing Dash でも、

… I like this example a lot because Excel still reigns supreme, even in technical computing and quantitative finance. I don’t think that Excel’s dominance is just a matter of technical ability. After all, there are legions of spreadsheet programmers who have learned the nuances of Excel, VBA, and even SQL…

かれていましたし、しようがないのかな、と複雑ふくざつ心境しんきょうではあります。

今日きょうはここまで。