トップ 最新

ただのにっき

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サポートしよう……。