mkr monitors { pull / diff / push } コマンドを使うと Mackerel の監視ルールをバージョン管理することができる.
特に diff は素晴らしくて,ローカルにある監視ルール (.json) と Mackerel 管理画面の設定の差分を確認することができるから,運用してたら設定がズレてた!という問題(形骸化)が起きにくく考えられている.
最近 mkr monitors を使って管理ルールを GitHub でバージョン管理していて,さらに CircleCI で動かしているインフラ CI にもテストを追加して,常にチェックを行えるようにした.
mkr monitors 運用フロー
現在の運用フローを図にしてみた.
以下の理由で,現在は mkr monitors pull と mkr monitors diff だけを使っていて,mkr monitors push は使っていない.
- 監視ルールの設定は管理画面を使って監視戦略を考えながら行いたい
monitors.jsonの仕様を覚えられない- 監視ルールの
id値は Mackerel 側で自動採番されるためmkr monitors pushを使うときにidを含められない- ドキュメントに書いてある通り,
idじゃなくてnameで判定する考慮はされている - 今回は
monitors.jsonの一貫性を重視した
- ドキュメントに書いてある通り,
インフラ 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
必須オプション -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"},
},
MACKEREL_APIKEY は CircleCI に設定すること
ちなみに MACKEREL_APIKEY の値は circle.yml に書かずに CircleCI 側に設定すると GitHub に書く必要がなくなる.
BUILD SETTINGS → Environment Variables
さらに mkr monitors diff なら Write 権限は不要なので,Read 権限を付与したキーを発行しておくと安心!
まとめ
Mackerel と併用で運用している Zabbix では設定のバージョン管理などは全くしていなく課題に感じていたけど(頑張ったらできるとは思う),Mackerel ではカジュアルに実現できて,さらに CI などの運用に組込みやすく実装されているのは素晴らしい.
引き続き活用してくぞ!