あれから三ヶ月
Datadog の Monitors 定義を YAML で管理する Chihuahua を mruby-cli で作り直しました。
github.com
使い方について
README.md を御覧ください。
実装メモ
ワンバイナリにした
mruby-cli を利用してワンバイナリ化しました。また、クロスコンパイルで MacOS X と Linux 向け(共に 64bit 版)のバイナリを提供することが出来ました。
mruby-cli 最高。
一緒に mruby-datadog も刷新した
mchihuahua を実装するにあたり、Datadog API クライアントの mruby-datadog もほぼほぼ作り直しました。
github.com
mute と unmute を追加した
従来の Chihuahua に無かった mute と unmute 機能を追加しました。
$ mchihuahua mute --project=your_project_name --monitor_ids=1234567,1234568 --dry_run $ mchihuahua mute --project=your_project_name --monitor_ids=1234567,1234568 $ mchihuahua unmute --project=your_project_name --monitor_ids=1234567,1234568 --dry_run $ mchihuahua unmute --project=your_project_name --monitor_ids=1234567,1234568
export 時に Monitor ID も合わせて標準出力に出力するようにした
mute と unmute が Monitor ID を指定して実行するので、export の際の標準出力に Monitor ID も出力するようにしました。
ちなみに、赤色で出力されている定義は mute 中の監視項目となります。
Monitor 定義更新時の diff は diff コマンドを使わざる得なかった
Chihuahua では Monitor 定義更新時の差分には samg/diffy を使っていましたが、mruby には同様の実装が無かったので、泣く泣く diff コマンドを呼ぶようにしちゃいました。
Mchihuahua::Helper.yaml_file_writer(@latest_monitor_tmp_file, data) diff_output, diff_error, diff_code = \ Open3.capture3("diff", "-u", "#{@current_monitor_tmp_file}", "#{@latest_monitor_tmp_file}")
幸いにも k0kubun/mruby-open3 を利用させて頂き、実行結果のハンドリング等は diffy と同等の処理を書くだけで済みました。
感謝、感激
Unicode に難儀した
YAML データをファイルに書き込む際にMonitor 定義内に日本語が入っていると、日本語の部分が Unicode エスケープシーケンスで出力されて焦りました…。
苦肉の策として、こちらの記事を参考にさせて頂いて String クラスに以下のようなメソッドを使って Unicode エスケープシーケンスを日本語に置き換えるようにしました。
class String def oreno_unicode_decode self.gsub!(/\\u([0-9a-fA-F]{4})/) { [$1.hex].pack("U") } end end
以下のような挙動の変化が確認出来ます。
bash-3.2$ ./mruby/bin/mirb mirb - Embeddable Interactive Ruby Shell > puts YAML.dump(['川原', 'abc', '日本語']) --- - "\u5DDD\u539F" - abc - "\u65E5\u672C\u8A9E" ... => nil > puts YAML.dump(['川原', 'abc', '日本語']).oreno_unicode_decode --- - "川原" - abc - "日本語" ... => nil
正しいアプローチかは解りませんが、mruby の内部処理で日本語は Unicode で扱われているんだろうなあとフワッと理解出来ました。この辺りの情報ってきっとどこかに有るんだろうな…。ぜひ、確認したいと思います。
ということで…
引き続き、色々と改修していきたいと考えていますので、よろしければ mchihuahua をご利用頂ければ幸いでござります。