Mackerel APIを手軽に叩くためのCLI・Pythonモジュールを公開しました

MackerelはAPIを叩けばいろんなことが出来ていいですよね。純正のmkrコマンドもいいんですがもっと手軽に、APIを直叩きしてJSONを得るような用途で使えるツールを弊社内で(主にぼくが)使ってます。このたびPythonで実装しなおしたのでせっかくなので公開します。
2021.03.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

TL;DR

背景

みなさん、 Mackerel API 叩いてますか!(挨拶

Mackerel はその Web UI の使いやすさも特徴的なのですが、API でいろいろ出来るのもイマドキの SaaS っぽくて素敵ですよね。とはいえ、基本的には mkr などの純正ツール群経由で間接的に利用するケースが多いのかなと思います。

一方で、mkrが対応していない API もあります。それらを活用することでいろいろと便利なことが出来ます。
例えばサービスメトリックの送信や、AWS インテグレーションまでカバーした GitOps などをやろうとすると、API を直接叩けたほうが便利です。1

弊社でも、いくつか Mackerel API を ネタに 利用した記事を掲載しています。

これらの記事以外にも、弊社では 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 と同様になります。

とはいえ非可逆的な変更、例えば POSTDELETE を実行するには dry run や最終確認プロンプトなどが欲しいので、その辺りは今後実装すすめていきたいと思います。

脚注


  1. 本気で GitOps をやるなら Terraform provider for mackerel を使うほうが良さそうです 
  2. この辺りは考え方かもしれませんが、実際に処理が走るのは Mackerel の中で、そちらについては はてな社に所属するトップエンジニアの方々が面倒を見ているはずだからと 油断 安心してます