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 などの運用に組込みやすく実装されているのは素晴らしい.
引き続き活用してくぞ!