share facebook facebook2 twitter menu hatena pocket slack

2017.06.12 MON

Chihuahua に弟 mchihuahua が出来ました

川原 洋平

WRITTEN BY 川原 洋平

あれから三ヶ月

Datadog の Monitors 定義を YAML で管理する Chihuahua を mruby-cli で作り直しました。

inokappa/mchihuahua
mchihuahua - Datadog monitors を YAML DSL で管理してみる試みです

github.com

使い方について

README.md を御覧ください。

実装メモ

ワンバイナリにした

mruby-cli を利用してワンバイナリ化しました。また、クロスコンパイルで MacOS X と Linux 向け(共に 64bit 版)のバイナリを提供することが出来ました。
mruby-cli 最高。

一緒に mruby-datadog も刷新した

mchihuahua を実装するにあたり、Datadog API クライアントの mruby-datadog もほぼほぼ作り直しました。

inokappa/mruby-datadog
Contribute to mruby-datadog development by creating an account on GitHub.

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 をご利用頂ければ幸いでござります。

元記事はこちら

Chihuahua に弟 mchihuahua が出来ました