Edited at

Shellscriptでかんたん!Mackerelにサービスメトリックを自動ポスト

More than 3 years have passed since last update.

この記事は animateLAB Advent Calendar 2015 および Mackerel Advent Calendar 2015 5日目の記事です。1記事で2カレンダーに参加の実績解除だ!

こんにちは、id:kariaです。Qiita的には "@kariaです" と自己紹介するのが正しい気がしますが、Mackerelははてなさんのプロダクトだし、はてなIDで自己紹介するのが何となく正しい気がしました。ちなみにはてなブログには(はてなダイアリー時代から含めて)12〜13年ほど前からお世話になってます。古参アピール乙!

ここからが本題です。Mackerelにはカスタムメトリックと言って、ユーザーが定義した任意の数値をポストしグラフ化する機能が存在します。そのヘルプがこちら。

ホストのカスタムメトリックを投稿する - Mackerel ヘルプ

うーん、ちょっと難しそうだな?

……とお思いの貴方にお勧めなのがAPI仕様にある「サービスメトリックの投稿」です。このAPIを利用すると、curlでワンライナーでMackerelにサービスメトリックの値を投げられるぞ!やったー!というのが本日のお題です。

サンプルとして、MySQLのprocesslistを見てテーブルレベルロックの状況を確認するというソースコードをGitHubに置いときました。

karia/post_mackerel_mysql_process

MySQLのrootパスワードがスクリプト内に直書きとかツッコミ所は多々あるかと思いますが、サンプルなのでそれは置いておくとして肝となる部分は以下の箇所です。

curl https://mackerel.io/api/v0/services/SERVICENAME/tsdb -H 'X-Api-Key: APIKEY' -H 'Content-Type: application/json' -X POST -d '[{"name": "MySQL.USERNAME.all", "time": '$(date +%s)', "value": '${COUNT_USER}'}, {"name": "MySQL.USERNAME.locked", "time": '$(date +%s)', "value": '${COUNT_LOCKED}'}]'

ヘッダ部分にはMackerelのAPI Keyと、JSON形式で投げるのでContent-Typeをそのように指定します。

JSONの中身については、timeの箇所にはdate +%sで現在のUNIX時刻を置いておきます(任意の時刻を置きたければ置いてよいかと思います)。あとはnameは何らか決めた上でvalueに値を入れてやれば完了です。上記の例では、$COUNT_USERおよび$COUNT_LOCKEDという変数にあらかじめ値を入れた上でcurlコマンドを叩いています。

なおサービスメトリックは秒単位でPOSTできてしまうのですが(サンプルでも5秒おきに投げてます)、実際のグラフ上では1分単位で見ることができないので1分未満の間隔でPOSTする意味は今のところないです。Mackerel ヘルプにもデータの保持間隔は最短でも1分おきであることが明記されています。

私からは以上です。なお、昨日のMackerel Advent Calendarはid:senyoltwさんのMackerel+IFTTTで運用担当者がアラートに絶対に気づく仕組みを作るでした。私も前職で担当者にアラート発生連絡の電話を100回ぐらいしたことがあるのでお気持ちはわかります。そして明日の担当は@HKDnetさんです。よろしくお願いします!