雑記

インフラのことだったりプログラムのことだったりどうでもいいこと書いたり。要は雑記。

sensuとGrafanaを連携してグラフを自動生成してみる

sensuを使っていて何が不満だったかというと、グラフの生成なんですよね。

監視対象についてはsensu-clientsを設定して起動すれば終わりだったのに対し、グラフの生成だけは毎回ダッシュボードからぽちぽち設定する必要があったのです。これがちょーめんどくさかったのです。

どーにか方法がないかなーと考えていたら同僚の方がGrafanaのscripted dashboardsというのがあるよと教えてくれました。 これとsensu-apiを使ってグラフの生成を自動化してみます。

scripted dashboardsって?

以下を参照。

要はJSを使ってグラフの生成を動的に実現するものです。

どうやって自動生成してるの?

おおざっぱな流れは以下の図を参照(雑です)

f:id:og732:20141118234039j:plain

図の通り、sensuのAPIにアクセスしてclient一覧とその設定を取得し、json.rbというスクリプトで生成するグラフのtemplateを作成、scripted.jsでグラフ化しています。 図では時系列DBがGraphiteですが、InfluxDBでも調整すればいけます。

ちなみに、sensuからGraphiteにデータを送る時にschemaを付与するのですが、そのschemaの先頭がその「ip-xxx-xxx-xxx-xxx」(xxxはIPアドレス)になるようにしてください。EC2ではデフォルトでそうなってるはずです。

json.rbについて

上記で触れていますが、grafanaのtemplateを生成するためのスクリプトです。リクエストがあると以下の処理を実行します。

  1. sensu-apiにアクセスしてclients一覧を取得する
  2. clients一覧から監視対象一覧のリンクを生成する
  3. どのグラフを生成するかsensuに設定されているsubscriptionsから判断する
  4. json/template/以下にsubscriptionsで設定されているtemplateがあるようなら、そのtemplateにグラフ生成対象のschmeaを埋め込んでtemplateを生成する
  5. 2と4の結果をjson形式にして返却する

動作の注意点として、

  • cgiで動作させます。利用しているwebサーバによって設定してください。
<Directory /opt/grafana/json>
    AddHandler cgi-script .rb
    Options ExecCGI
</Directory>
  • sensu-apiへのURLを設定してください。スクリプト内で設定されています。デフォルトはlocalhostです。

  • rubyのパスが「/opt/sensu/embedded/ruby」となっています。sensuのrubyを利用するためです。sensuのインストール環境と別の環境で実行する場合は変更する必要があります。

細かいことは

ソースを見てくださいw何も難しいことはしてませんから、多分そっちの方がはやいです。

om732/grafana-scripted-dashboards · GitHub

2015/05/07 追記

Githubにあげてるやつがちょっと古いので、別のレポジトリに調整してあげなおしました。試してみたいという方はこちらの方がよろしいかと思います。