GrafanaダッシュボードをChatOpsで自動生成

サーバエンジニアの @toritori0318 です。
今回は、社内で利用するための便利ツールを書いたお話をします。


動的なインフラストラクチャ

弊社ではTV企画毎にサーバクラスタを起動するため、日常的にサーバが増減します。1
また企画によって利用するサービス(投票/抽選/キャッシュ/etc...)を選択することが可能なため、企画毎に得たいメトリクスリソースも異なることになります。
その際、様々なサーバリソースを一元で確認するための企画毎メトリクスダッシュボードが欲しくなるのですが、それをおまとめして可視化するために弊社ではGrafanaを利用しています。

企画クラスタに対して今までは定常的なモニタリングが必要な場合にのみ手動ポチポチでダッシュボードを作っていたのですが、クラスタが新規作成される毎に手動登録するのは運用としてはあまりよろしくありません。
そこである程度運用を楽にするため何らかの仕組みを考えてみました。


CLI化

まずはGrafanaへの登録を行うフローをざっくりと考えてみました。
色々と調査した結果、GrafanaダッシュボードにインポートするJSON設定を作るのが一番お手軽そうだったため以下の様なフローを考えました。

  • 企画毎の設定(どのサービスを利用している?ELBのIDは?AutoScalingGroup ARNは?)をコンフィグファイル化しておく
  • コンフィグファイルを読み込み、その値を元にレンダリング
  • レンダリングした結果をダッシュボードJSONに書き換える

本当ははじめに「全てをAPIで登録するバージョン」で考えてみましたがすぐに却下。
理由としては、一番面倒くさいところが結局 UI化するところ であることに気付いたためです。これを一つ一つAPIの値に当てはめるととても大変そうですね…😇2

そんなわけで採用した方針としては

予め設定されているダッシュボードのJSONをexportし、設定JSONをテンプレファイルに変換した後、その結果をインポートJSONとして利用する

ことに決定しました。


具体的な手順に落とし込むと以下のようになりますでしょうか。

  1. 管理画面から設定済みダッシュボード設定のJSONをexport
  2. JSONのままだと扱いづらいのでワンライナーでyamlに変換
  3. 2. で変換したyamlをテンプレートとし、サービス毎に分割/テンプレートとして作成
  4. 企画毎の設定(どのサービスを利用しているか?ELBのIDは?AutoScalingGroup ARNは?などなど)をコンフィグ化
  5. コンフィグファイルを読み込み、その値を元にレンダリングしGrafana設定ファイルとして出力
  6. 上記で出力されたGrafana設定ファイルはyamlなのでJSONにコンバート
  7. 上記のJSONを管理画面からimportする

2 - 6 の一連の流れはほぼシェルスクリプトで書けました。5. だけちょっとしたプログラムを書きましたが、レンダリングするだけの簡単なコードです。

実際に設定として利用する 4. のコンフィグファイルは以下のようなイメージとなります。

dashboard_title: なにかのダッシュボード  
space_id: hogedev  
services:  
  facade:
    title: 3rdファサード
    elb_name: elb-xxxxxxxxx
    autoscaling_group_name: asg-xxxxxx
    redis_instance_id: i-xxxxxxxxxxx
    datasource: platform-ds

  harvestmoon:
    title: Harvestmoon
    elb_name: elb-xxxxxxxxx
    autoscaling_group_name: asg-xxxxxx
    datasource: platform-ds

サービス毎のテンプレートを予め用意しておけば、あとはこのコンフィグファイルを作るだけでGrafana設定JSONを生成することが出来るようになりました。やったね!


ChatOps化

ここまで書いてふと思ったのですが 上記で作成した4.のコンフィグファイルも自動で生成すれば良いのでは? と思いつきました。
幸いにも弊社では企画毎クラスタ規模を確認するためのChatOpsコマンドがすでに存在しておりました。そこでこちらのコマンドを参考に実装を進めたところ小一時間ほどでプロトタイプが出来てしまいました💪

さらに Grafana APIの JSONからGrafanaダッシュボードを作成するAPI を利用するとほぼほぼ全自動で出来そうな気がしてきましたね!

というわけで以下がChatOps版の完成イメージとなります。

以下のフォーマットでコマンドを実行すると内部で自動的にGrafana設定JSONが生成され、ダッシュボードへのURLリンクが表示されます。

gragra <企画カテゴリ1> <企画カテゴリ2> <ダッシュボードタイトル>  

リンクをクリックすると以下のように自動生成されたダッシュボードへ遷移することが出来ます。やったね!


まとめ

Grafanaのダッシュボードを簡単に生成するために試行錯誤し、最終的にはSlackから自動生成する仕組みを作った話でした。
自動化楽しいですね!😊

HAROiDではこのように運用改善するためのツールを作ってくれるメンバーを募集しています!
もし興味がありましたらお気軽にお問い合わせ下さい。
Wantedly


  1. サーバクラスタを動的に作るのはいくつかの理由があるのですが、それはまた別の機会に…

  2. コンテンツごとの位置とか大きさとかすべてを設定していくのは骨が折れますね