Mackerel APIを手軽に叩くためのCLI・Pythonモジュールを公開しました
TL;DR
背景
みなさん、 Mackerel API 叩いてますか!(挨拶
Mackerel はその Web UI の使いやすさも特徴的なのですが、API でいろいろ出来るのもイマドキの SaaS っぽくて素敵ですよね。とはいえ、基本的には mkr
などの純正ツール群経由で間接的に利用するケースが多いのかなと思います。
一方で、mkr
が対応していない API もあります。それらを活用することでいろいろと便利なことが出来ます。
例えばサービスメトリックの送信や、AWS インテグレーションまでカバーした GitOps などをやろうとすると、API を直接叩けたほうが便利です。1
弊社でも、いくつか Mackerel API を ネタに 利用した記事を掲載しています。
- Mackerel API を利用してオーガニゼーションへ招待してみる | DevelopersIO
- [待望の新機能] MackerelのAWSインテグレーションがAPI経由で追加・更新可能になりました! #mackerelio | DevelopersIO
- 【土日夜間は通知を止めたい!】 Mackerel の監視ルール・ホストをスクリプトで通知 OFF/ON する方法まとめ 〜 定期自動化目指す PoC つき #mackerelio | DevelopersIO
- [アップデート] MackerelからAmazon EventBridgeへの連係ができるようになりました | DevelopersIO
- RDS のイベントログを Amazon SNS 経由で Mackerel のグラフアノテーション登録する PoC を作る #mackerel | DevelopersIO
これらの記事以外にも、弊社では Mackerel も業務の一部なので、より手軽に様々な API を叩く必要があります。
Mackerel API は単純に REST API なので、これらの記事みたいに curl
コマンドで叩けはするんですが、毎回環境変数(API キー)やヘッダを設定するのも面倒だしということで、「簡単な」シェルスクリプトを用意して使ってました。
ただ、シェルスクリプトとして作るだけでコードの見通しが悪くなったり、AWS Lambda などはまた別にコード書いたりしていることを考えると効率が悪かったので、先日思い切って Python で実装し直しました。
せっかくなので公開します。何かの参考にでもなれば幸いです。
GitHub のリポジトリはこちらです。
makapi.py - mackerel-api-client-python
Mackerel APIを縮めて makapi.py
です。「まかぴ」と発音します。
60 行程度のコードなので見て頂いたほうが早いのですが、単に requests
へ渡す処理をラップしているだけです。別ファイルにおいて import
してもらってもいいし、コピペして埋め込んでも構いません。
ただし、社内での限定的な利用が主目的であることと、コード自体の見通しの問題(長くしたくない)という設計思想上の問題から、例外処理などのエラーハンドリングや入力のバリデーションなどには全くと言って良いほど気を配っていません。
実際に使う場合はそのあたりくれぐれもご注意ください。2
使い方は README にも書いてますが、API キーを与えてオブジェクトを生成した後、/api/v0/
を除いた部分の API を指定して get や post してください。
from makapi import makapi m = makapi(MACKEREL_APIKEY) m.get('org') m.put('hosts/<hostId>') m.post('hosts/<hostId>/status','{"status":"standby"}') m.delete('services/<serviceName>')
pakapi - mackerel-api-client CLI
もともと makapi
というのは、前述したシェルスクリプト版の名前だったんですが、それの Python 版と言うことで pakapi
と呼んでます。「ぱかぴ」と発音します。
上述のモジュールを呼んでるので、同じディレクトリに入れておいてください。
環境変数 MACKEREL_APIKEY
に API キーをセットした状態で実行ください。指定方法は makapi.py
と同じです。
% export MACKEREL_APIKEY=******** % ./pakapi get org {"name":"********"}
引数に何も指定しない、あるいは help
と指定することで usage が表示されます。
% ./pakapi help Usage: pakapi METHOD API { payload } METHOD ... get / put / post / delete API ...... '/api/v0/' is not need. See https://mackerel.io/ja/api-docs/ payload .. specify Input as JSON format Example: pakapi get org pakapi post hosts/<hostId>/status '{"status":"standby"}' pakapi help
こちらも、社内での限定的な利用が主目的であることと、コード自体の見通しの問題から、複雑なオプションやエラーハンドリングなどは省いてます。
思想的には makapi.py
と同様になります。
とはいえ非可逆的な変更、例えば POST
や DELETE
を実行するには dry run や最終確認プロンプトなどが欲しいので、その辺りは今後実装すすめていきたいと思います。
脚注
- 本気で GitOps をやるなら Terraform provider for mackerel を使うほうが良さそうです ↩
-
この辺りは考え方かもしれませんが、実際に処理が走るのは Mackerel の中で、そちらについては はてな社に所属するトップエンジニアの方々が面倒を見ているはずだからと
油断安心してます ↩