diff --git a/webhook.php b/webhook.php new file mode 100644 index 0000000..e8bb70a --- /dev/null +++ b/webhook.php @@ -0,0 +1,64 @@ + 500, + "msg" => "数据库连接失败:" . mysqli_connect_error() + ], JSON_UNESCAPED_UNICODE); + exit; +} +mysqli_set_charset($conn,"utf8mb4"); + +$rawBody = file_get_contents('php://input'); +$alertData = json_decode($rawBody, true); + +if (!is_array($alertData) || empty($alertData['alerts'])) { + echo json_encode([ + "code" => 400, + "msg" => "未获取到有效告警数据" + ], JSON_UNESCAPED_UNICODE); + mysqli_close($conn); + exit; +} + +$insertCount = 0; +foreach ($alertData['alerts'] as $alert) { + $alertName = mysqli_real_escape_string($conn, $alert['labels']['alertname'] ?? "未知告警"); + $instance = mysqli_real_escape_string($conn, $alert['labels']['instance'] ?? ""); + $severity = mysqli_real_escape_string($conn, $alert['labels']['severity'] ?? "warning"); + $status = $alert['status'] ?? "firing"; + $startsAt = mysqli_real_escape_string($conn, $alert['startsAt'] ?? date("Y-m-d H:i:s")); + $endsAt = isset($alert['endsAt']) ? "'" . mysqli_real_escape_string($conn, $alert['endsAt']) . "'" : "NULL"; + $fingerprint= mysqli_real_escape_string($conn, $alert['fingerprint'] ?? md5($alertName.$instance.$startsAt)); + $content = mysqli_real_escape_string($conn, json_encode($alert, JSON_UNESCAPED_UNICODE)); + $alertType = $status === "resolved" ? 2 : 1; + + $checkSql = "SELECT id FROM alert_log WHERE mail_uid = '$fingerprint'"; + $checkRes = mysqli_query($conn, $checkSql); + if (mysqli_num_rows($checkRes) > 0) continue; + + $insertSql = "INSERT INTO alert_log + (mail_uid, alert_type, alert_name, instance, severity, starts_at, ends_at, content, receive_time) + VALUES ('$fingerprint', $alertType, '$alertName', '$instance', '$severity', '$startsAt', $endsAt, '$content', NOW())"; + + if (mysqli_query($conn, $insertSql)) $insertCount++; +} + +echo json_encode([ + "code" => 200, + "msg" => "告警处理完成", + "insert_num" => $insertCount +], JSON_UNESCAPED_UNICODE); + +mysqli_close($conn); +?>