Golangの素振りを兼ねて、Mackerelのプラグインを作ってみた

社内で話題に登ったのをきっかけに、「ドメインの有効期限をチェックする」Mackerelのチェックプラグインを作りました。

https://github.com/attakei/mackerel-plugin-check-whois

これぐらいの記述なら普段使ってるPythonのほうが楽そうな気もしたが、 素振りのサイズとして手頃なのとMackerel本体が書かれているという理由で、 Golangを採用した。

やること

基本的には以下のような流れの処理をするだけ。

  • 指定されたドメインのWHOIS情報を問い合わせる

  • 有効期限の情報をパースする

  • チェック日時と比較する

  • Critlcal,Warningの条件を満たしたら、そう返す

できないこと

処理の構成上、WHOISの結果に有効期限相当の情報がない場合や、 使用しているパーサーが有効期限を拾えない場合は、 UNKNOWNステータスを返す。

例えば、 .co.jp ドメインは State に有効期限と思わしき文字列が付与されていますが、 パーサーがこれを拾えないので、現時点ではチェックができない。

Golangの素振り感想

記憶している限りでは、実動作するプロダクト類をコンパイル型言語で書くのはかなり前。 自分が思っていたほどよりは、かなり楽にコード書けた気がする。

自分は素振りをして実体感をしないとあまりそのへんが腹落ちしないタイプなのだけど、 今回の感覚は、次の2点にあるのかなと思ってて、この後で深堀りしてみる。

  • インタプリタ系言語との差が減っていること

  • Mackerelプラグインをお題にしたこと

インタプリタ系言語との差が減っていること

普段はPythonやPHPといった言語を使っているのですが、 社内・プライベートのどちらでも、 中規模以上ではLinterによる文法チェックやユニットテストを標準導入している。

さらに、タイプヒンティングの導入も進んでおり、 「パッケージの提供」に至るまでのインタプリタ系・コンパイラ系における境界が確実に薄くなってる。

今回の規模感だと特にそうで、大規模は流石にきついけど、 小規模な領域に完全に閉じているケースでは、 Golangを選択肢として加えられることが実感できるいい経験になったと思う。

Mackerelプラグインをお題にしたこと

Mackerelプラグインは

「出力される内容が指定のフォーマットに従っていれば、自由に作れる」

ものと解釈している。

とくに、チェックプラグインは「コマンドの終了ステータス」ぐらいしかルールがないし、 それ以外のことをほぼしなくて良いので、素振りのお題としては非常にコンパクトなのが良かった。

実質的に工夫点っぽいのを無理やり上げると、 「JPドメインのWHOISコマンドの結果を英語で貰わないといけない」 点のキャッチアップぐらいで、あとは既存のプラグインのコードを参考にしつつ、 Golangの最低限のルールだけリファレンスを見るだけでカバーができた。

「プラグインを書く」ということ

「プラグインを書ける」ということは、 「プラグインを受け入れられるような仕組みがきちんと整っている」ということ。

プラグインを受け入れるためには、 インターフェースについての考慮をきちんとしておく必要があることを考えると、 プラグインを作るたびにプラットホーム側のエンジニアに感謝や尊敬の念を持たざるをえないなと感じる。