2015-12-08(火) [長年日記]
■ Mackerelの通知をPushbulletにも送るようにした
先日Mackerel+IFTTTで運用担当者がアラートに絶対に気づく仕組みを作るという記事をみかけたので「これは応用できそう」と思って真似してみることにした。そういえば日記には書いてなかったけど、IDCFクラウド上で運用してるサーバはMackerelで監視しているのだ。ただ、Mackerelがサポートしている通知メディアのうち自分が使っているのはメールだけなので、ちょっと通知に気づきにくいのが難点だったんだよね。Pushbulletが使えるなら(いまのところ)それがベスト。
で、上の記事に当初書かれていた:
Mackerel → IFTTT(Maker) → Pushbullet
という流れがうまく動かなくて、ブクマにメモっておいたら気づいてもらえて、いまの記事にあるように間にreflector.ioを挟むようにしたらうまくいった:
Mackerel → reflector.io → IFTTT(Maker) → Pushbullet
もっともMakerが求めてるJSONをMackerelが投げてくれるわけではないので、このままだと単に「何か発生した」ってことしかわからない。せっかく間にreflector.ioをかましているのでここでJSONを加工する。reflector.ioはPipelineという仕組みでこの変換メソッドをJavaScriptで記述できる。
とりあえずMackerelでテスト用のイベントを発火させてみると、こんなJSONが出ていることがわかった:
{"event":"sample","message":"Sample Notification from Mackerel"}
ので、reflector.ioのPipelineはこんな感じ:
var src = JSON.parse(request.body); request.body = JSON.stringify({ value1: src.event, value2: src.message }); return request;
これを通ると、IFTTTのMakerチャンネルに届くJSONはこうなる:
{"value1":"sample","value2":"Sample Notification from Mackerel"}
この「value1」はPushbulletチャンネルでは大文字始まりの「Value1」として参照できるので(2、3も同様)、好きなようにメッセージを組み立てればよろしい。できたレシピがこんな感じ:
実際の通知で使われるJSONはまた違うので、Pipelineを書き換えないといけないのだけど、MackerelのヘルプにあるWebhookにアラートを通知するには通知されるJSONは以下のような内容を含んでいますと書いてあるだけで……「ような」ってなんだよ! 仕様書けよ!!(笑) まったくもー、Web屋はほんと仕様を書かないよな……。
というわけで、実際にアラートが出るまで実用的なPipelineが書けないのだった(という話をMackerel Advent Calendar 2015に書けばいいのでは?)。安定してるからめったに通知来ないけど。
もっとも、こんなに多段にサービスを経由してたら、どこか途中のサービスが落ちてるだけで通知を受け取れなくなってしまうわけで「絶対に気づく仕組み」とはとうてい言えないよなぁ。やっぱMackerel自身がPushbulletをサポートしてくれるのが一番なんだけど(リクエストは行ってるらしい)。
というかですね、この過程でPushbulletがOAuth2に準拠してることに気づいたのだけど、宅配トラッカーでAPIトークンを設定させてるの超ダサいじゃん!! 余裕ができたらOAuth2サポートしよう……。