これまでいくつか警告灯の記事を書いたけど、Grafana Alertingから、またはPrometheusのAlert Managerからwebhookで通知を受けると警告灯が点灯するようにした。
前回はwebhookで受けた内容をログファイルに書き出すようにしたが、今回はwebhookで受けた内容は一切見ない。webhookを受けたのをトリガーにしてGrafana Alerter(とAlert Manager この記事では省略)からアラートのステータスを取りに行って、その内容で警告灯を光らせるにようにした。でないと、通知されたwebhookの内容を見たところで、その時点での他の状態がわからずどのように光らせるか非常に処理が難しくなる。それ用のDBを用意して状態を管理するのもバカらしいし。
長いのを出しても意味がないので超はしょり版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | <?php
// 自身のGrafanaのAlertステータス取得URL
$url = "http://grafana_user:grafana_password@grafana_server:3000/api/alerts/";
$logFile = __DIR__ . '/warn.log';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
//$body = file_get_contents('php://input');
//$json = json_decode($body);
$json = json_decode(get_curl($url), true);
//file_put_contents($logFile, print_r($json), FILE_APPEND);
$warn = false;
$alert = false;
foreach($json as $ealert) {
$log = date("Y-m-d H:i:s "). $ealert['name'] . " " . $ealert['state'] . "\n";
//Systel Load alertがalertingならアラートではなく警告とする
if ($ealert['name'] =='System Load alert'){
if ($ealert['state'] =='alerting'){
$warn = true;
}
}
file_put_contents($logFile, $log, FILE_APPEND);
}
//ライト点灯
if ($alert) {
light(3);
} elseif ($warn) {
light(2);
} else {
light(1);
}
}
function get_curl($url) {
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($c);
//$res = var_dump($res);
curl_close($c);
return $res;
}
function light($c) {
switch ($c) {
case 0:
//警告灯 消灯
$code = "0f";
break;
case 1:
//警告灯 緑
$code = "0b";
break;
case 2:
//警告灯 黄
$code = "0d";
break;
case 3:
//警告灯 赤
$code = "0e";
break;
}
$cmd = 'echo "' . $code . '" | xxd -r -p > /dev/cuaU0';
exec($cmd , $error);
//echo $error;
}
?>
|
上の例は超簡略版なのでSystem Load alertの警告パターン1つだけしか存在しない。(21〜25行)
処理としては、Grafana Alertingで得られるステータスが1つでもアラート(異常相当)なら赤、アラートが無くて警告相当が1つでもあれば黄、アラートも警告も無ければ緑を光らせるもの。
警告状態から正常に復帰した場合は何事もなかったかのように緑点灯(正常)というのは問題ないとすることもできるが、アラートから警告あるいは正常に復帰した場合にまるで問題が起きていなかったかのように黄・緑が光って見えるというのは良くないという考え方もある。上の例には書いていないが、実際にはアラート状態が発生した場合はアラート名と発生したインスタンスを名前とするファイルを一つ書き出すようにしている。その(それらの)ファイルが存在するならGrafana Alertingのステータスではアラートが無い状態に戻っているとしても赤を点灯し続けるようにしている。本当に問題が解決した・解決を確認したなら管理者がそのファイルを手動で消す。
また、警告灯とは別に各インスタンスのステータスをcurlでPrometheusから取得し、Amazon Pollyに読み上げさせるような処理も作っている。今回はせっかくなので警告とアラートも読み上げさせるようにした。ただし、そちらはコードは割愛。
いい歳したオッサンが中学生かよという恥ずかしさはある。うん。
関連記事:- Fail2BanでBAN発生時に警告灯を点灯させる
- Grafana AlertingやAlert Managerと連携して警告灯を点灯 ←いまここ
- USBリレーモジュールの警告灯をブラウザで制御
- 大人の冬休み宿題工作 マイ警告灯を作ろう 後編
- 大人の冬休み宿題工作 マイ警告灯を作ろう 前編
- dump1090 Prometheus ExporterでADS-B受信状況を監視する
- Grafana AlertingやAlert Managerと連携して警告灯を点灯
- Prometheus2とGrafana6によるシステム監視 GrafanaのAlertを使う
- Prometheus2によるシステム監視 FreeBSD標準のエクスポーター prometheus_sysctl_exporterを使う
- Prometheus2とGrafana6によるシステム監視 NTP統計情報の表示
- Prometheus2とGrafana6によるシステム監視 シングルボードコンピュータの温度表示
- Prometheus2とGrafana6によるシステム監視 FreeBSDのメモリとCPU温度
- Prometheus2とGrafana6によるシステム監視 Node Exporterの情報を表示
- Prometheus2とGrafana6によるシステム監視