sensuを使っていて何が不満だったかというと、グラフの生成なんですよね。
監視対象についてはsensu-clientsを設定して起動すれば終わりだったのに対し、グラフの生成だけは毎回ダッシュボードからぽちぽち設定する必要があったのです。これがちょーめんどくさかったのです。
どーにか方法がないかなーと考えていたら同僚の方がGrafanaのscripted dashboardsというのがあるよと教えてくれました。 これとsensu-apiを使ってグラフの生成を自動化してみます。
scripted dashboardsって?
以下を参照。
要はJSを使ってグラフの生成を動的に実現するものです。
どうやって自動生成してるの?
おおざっぱな流れは以下の図を参照(雑です)
図の通り、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を生成するためのスクリプトです。リクエストがあると以下の処理を実行します。
- sensu-apiにアクセスしてclients一覧を取得する
- clients一覧から監視対象一覧のリンクを生成する
- どのグラフを生成するかsensuに設定されているsubscriptionsから判断する
- json/template/以下にsubscriptionsで設定されているtemplateがあるようなら、そのtemplateにグラフ生成対象のschmeaを埋め込んでtemplateを生成する
- 2と4の結果をjson形式にして返却する
動作の注意点として、
<Directory /opt/grafana/json> AddHandler cgi-script .rb Options ExecCGI </Directory>
rubyのパスが「/opt/sensu/embedded/ruby」となっています。sensuのrubyを利用するためです。sensuのインストール環境と別の環境で実行する場合は変更する必要があります。
細かいことは
ソースを見てくださいw何も難しいことはしてませんから、多分そっちの方がはやいです。