kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Mackerel の監視ルールをバージョン管理して CircleCI でテストする

mkr monitors { pull / diff / push } コマンドを使うと Mackerel の監視ルールをバージョン管理することができる.

特に diff は素晴らしくて,ローカルにある監視ルール (.json) と Mackerel 管理画面の設定の差分を確認することができるから,運用してたら設定がズレてた!という問題(形骸化)が起きにくく考えられている.

最近 mkr monitors を使って管理ルールを GitHub でバージョン管理していて,さらに CircleCI で動かしているインフラ CI にもテストを追加して,常にチェックを行えるようにした.

mackerel.io

mackerel.io

mkr monitors 運用フロー

現在の運用フローを図にしてみた.

以下の理由で,現在は mkr monitors pullmkr monitors diff だけを使っていて,mkr monitors push は使っていない.

  • 監視ルールの設定は管理画面を使って監視戦略を考えながら行いたい
  • monitors.json の仕様を覚えられない
  • 監視ルールの id 値は Mackerel 側で自動採番されるため mkr monitors push を使うときに id を含められない
    • ドキュメントに書いてある通り,id じゃなくて name で判定する考慮はされている
    • 今回は monitors.json の一貫性を重視した

f:id:kakku22:20161015112236p:plain

インフラ CI

過去に記事を書いているインフラ CI に mkr monitors diff を使ったテストを追加した.

もし Mackerel 管理画面で監視ルールを変更して,GitHub に反映を忘れていると,インフラ CI で検知できるため,必然的に継続的なメンテナンスが実現できて便利!

  • RuboCop
  • Foodcritic
  • mkr monitors diff
  • Serverspec

circle.yml の定義を抜粋して書くと以下のようになる(machine ディレクティブなどは省略している).

mkr をインストールして,mkr monitors diff を実行する.超シンプル!

dependencies:
  pre:
    - curl -fsSL https://mackerel.io/assets/files/scripts/setup-apt.sh | sh
    - sudo apt-get install mkr

test:
  override:
    - mkr monitors diff -e -F monitors/monitors.json

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

必須オプション -e

mkr monitors diff のデフォルトの挙動だと,差分の有無に関係なく,終了コード 0 が返ってくるようになっている.

このままだと CircleCI でエラーにならずに CI の意味がなく,標準出力をパースして自前で判定しようかと思っていたけど,流石に用意されてるだろー!と思って mkr の実装を見たら...あった!必須オプション -e!時間を無駄に使うところだった.

mkr のドキュメントに -e のことは書かれて無く,是非追記して欲しい!(お願いしまーす!)

Flags: []cli.Flag{
    cli.BoolFlag{Name: "exit-code, e", Usage: "Make mkr exit with code 1 if there are differences and 0 if there aren't. This is similar to diff(1)"},
    cli.StringFlag{Name: "file-path, F", Value: "", Usage: "Filename to store monitor rule definitions. default: monitors.json"},
},

github.com

MACKEREL_APIKEY は CircleCI に設定すること

ちなみに MACKEREL_APIKEY の値は circle.yml に書かずに CircleCI 側に設定すると GitHub に書く必要がなくなる.

BUILD SETTINGS → Environment Variables

さらに mkr monitors diff なら Write 権限は不要なので,Read 権限を付与したキーを発行しておくと安心!

まとめ

Mackerel と併用で運用している Zabbix では設定のバージョン管理などは全くしていなく課題に感じていたけど(頑張ったらできるとは思う),Mackerel ではカジュアルに実現できて,さらに CI などの運用に組込みやすく実装されているのは素晴らしい.

引き続き活用してくぞ!

関連記事

tech.feedforce.jp

blog.a-know.me