序
こんにちは、これはMackerel Advent Calendar 2019 の19日目のエントリです。
日々サービス運用に携わっている中である特定のアラートが多く発生したり、
また逆に、何かしらの対策を講じることで今まで頻発していたアラートが減ることがあるかと思います。
そのような時、感覚的には増えたな、減ったなと思うんですが、
じゃあ具体的にどのくらい増減してるんだ、ということが分からない状態でした。
そこで定量的にアラートの増減を把握するために、アラート回数の集計を試みることにしました。
破
Mackerelではアラートの通知もwebhookで飛ばすことができるので、
エンドポイントをAPI+Lambdaにして、
その結果をMackerelのサービスメトリックに投稿して集計できないかと考えました。
大まかな流れは下記の通りです。
※こちらは cohalzさんの記事を参考にしました。
- アラートが発生するとMackerelのwebhookからAPI Gatewayのエンドポイントにリクエストが飛ぶ
- API GatewayからLambdaを呼び出す
- LambdaからMackerelのサービスメトリック投稿のAPIにPOSTする
サービスメトリック投稿のためにはMackerelのAPIに下記のようなJSONをPOSTします。
[{"name": string, "time": number, "value": number}]
MackerelからAPI Gatewayに通知されるJSONには以下のような内容を含んでいるため、
nameをmonitorName、timeを日付+固定時刻(00:00)にしてサービスメトリックに投稿すれば、
日×モニター名別にアラート回数をグラフ化できそうだと考えました。
参考
"alert": {
"openedAt": 1473129912,
"closedAt": 1473130092,
"createdAt": 1473129912693,
"criticalThreshold": 1.9588528112516932,
"duration": 5,
"isOpen": true,
"metricLabel": "MetricName",
"metricValue": 2.255356387321597,
"monitorName": "MonitorName",
"monitorOperator": ">",
"status": "critical",
"trigger": "monitor",
"url": "https://mackerel.io/orgs/.../alerts/2bj...",
"warningThreshold": 1.4665636369580741
実際にアラート発火させサービスメトリックに投稿した結果がこちらになります。
countAlert*のサービスメトリックに対して、alertA、alertBの結果が投稿されています。
しかし、これだと意図通りに集計できません。
同一nameで同一時刻にサービスメトリックを投稿すればvalueは増加していくと何故か思い込んでいたのですが、
もちろんそんなことはなく、valueは新しい投稿で上書きされます。
(最初に気づけよという話なのですが、メトリック投稿するまで気づきませんでした…)
急
思ったようにアラートを集計できなかったというまとめになってしまったのですが、
Mackerelがwebhookで飛ばせる情報には、有益な項目が多々含まれていることがわかったので、
アラート集計に限らず試していければと思います。