值班机器人接入实时 Prometheus 告警卡片自适应渲染

封面信息图

在很多技术团队的值班群里,传统的监控报警消息往往长成这样:
[Firing: 1] ServiceHighLatency - service="order-pay", cluster="prod-east", value="3200ms"
一条干瘪扁平的纯文本字符串,没有任何趋势图,没有发生突变前后的对比,更没有上下文关联。

值班工程师在收到这样一条消息时,第一反应往往是:
这个 3200ms 是突发尖峰还是持续走高?”、“过去半小时的正常基线是多少?”、“这个服务的负责人是谁,排障手册在哪里?”。
为了弄清这些基本事实,工程师必须打开电脑,登录 Grafana,找到对应的看板,调整时间范围,花费整整 3 到 5 分钟 才能建立起对故障的基础感知。

在争分夺秒的故障响应现场,通知不能只是一声机械的哨音,它必须成为一个**“包含趋势图谱、智能根因摘要与一键处置动作的微型作战指挥中心”**。

本文深入讲解我们如何通过 Grafana Image Renderer、Prometheus 实时时序与大模型诊断能力,打造自适应富文本告警卡片渲染引擎。

自适应告警卡片的核心组件与视觉动线

一张工业级的生产告警卡片,必须在手机屏幕的有限空间内,完成四个维度的信息立体呈现:

┌─────────────────────────────────────────────────────────────┐
│ 🔴 [P1 故障告警] prod/order-pay 核心接口响应延迟恶化         │
├─────────────────────────────────────────────────────────────┤
│ ⏱ 触发时间: 14:32:15      📊 当前数值: 3,240ms (阈值 200ms)   │
│ 🎯 关联服务: order-pay     📍 所在集群: prod-k8s-east        │
├─────────────────────────────────────────────────────────────┤
│ 📈 过去 30 分钟时序趋势图 (自动内嵌高清 Sparkline 渲染图):   │
│   [ ~~~~~~~~~~|___/‾‾‾‾‾‾‾‾‾ ] (红线标明突增拐点与 SLA 警戒线) │
├─────────────────────────────────────────────────────────────┤
│ 💡 AI 诊断摘要:                                              │
│    延迟突增与下游 MySQL 慢查询激增呈现 0.96 强因果关联。     │
├─────────────────────────────────────────────────────────────┤
│ 🛠 快捷行动指令:                                            │
│   [ 📖 查看 Runbook ]   [ ⚡ 一键熔断慢接口 ]   [ 👤 呼叫负责人 ] │
└─────────────────────────────────────────────────────────────┘
  1. 第一层(状态与严重级):红/橙高对比度色块,明确故障定级(P1/P2/P3)与爆炸半径。
  2. 第二层(核心趋势图):自动抓取该指标在过去 30 分钟内的时序曲线图,清晰展示“平稳基线 → 突增拐点 → 当前高位”,让工程师一眼看清故障形态。
  3. 第三层(LLM 诊断一句话摘要):大模型结合拓扑与因果检验产出的 30 字精炼根因结论。
  4. 第四层(可操作交互动作):直达 Grafana 大盘的超链接、官方 Runbook 指南以及一键止血按钮。

技术实现:从 Alertmanager 到自适应富媒体卡片

渲染引擎的后台处理流水线由四个毫秒级异步步骤构成:

[ Prometheus Alertmanager Webhook ] ─── 触发告警 JSON
                 │
                 ▼
┌─────────────────────────────────────────────────────────────┐
│ 1. Alert Enrichment Worker (告警富化服务)                   │
│    - 提取 PromQL 表达式与时间窗口 [T-30m, T]                │
├─────────────────────────────────────────────────────────────┤
│ 2. Grafana Image Renderer 极速渲染 Sparkline 趋势图          │
│    - 通过无头浏览器 (Headless Chromium) 生成高质量 PNG 图像  │
├─────────────────────────────────────────────────────────────┤
│ 3. LLM 诊断 Agent 注入一句话因果判断                        │
├─────────────────────────────────────────────────────────────┤
│ 4. 组装企业微信 / 飞书 Markdown 卡片并调用 API 发送         │
└─────────────────────────────────────────────────────────────┘

Python 实现自适应卡片生成器

import requests
import json
import time
from typing import Dict, Any

class AdaptiveAlertCardRenderer:
    def __init__(
        self, 
        grafana_renderer_url: str = "http://grafana-renderer.monitoring.svc:8081/render",
        grafana_api_token: str = "glsa_xxxxxx",
        wechat_webhook: str = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send"
    ):
        self.renderer_url = grafana_renderer_url
        self.token = grafana_api_token
        self.webhook = wechat_webhook

    def render_sparkline_image_url(self, panel_id: int, dashboard_uid: str, service: str) -> str:
        """
        调用 Grafana Image Renderer 插件,渲染过去 30 分钟的时序趋势图
        """
        now_ms = int(time.time() * 1000)
        from_ms = now_ms - (30 * 60 * 1000) # 30 分钟前
        
        # 拼接渲染参数 (紧凑型 500x200 尺寸,非常适合手机端浏览)
        render_url = (
            f"{self.renderer_url}/d-solo/{dashboard_uid}/service-overview"
            f"?orgId=1&panelId={panel_id}&from={from_ms}&to={now_ms}"
            f"&var-service={service}&width=500&height=200&theme=dark"
        )
        
        # 在生产环境中,将渲染好的图像上传至内部轻量 OSS 并返回公网/内网可读 URL
        # 此处返回对象存储托管的直链
        return f"https://cdn-monitor.company.internal/renders/{dashboard_uid}_{service}_{now_ms}.png"

    def build_and_send_card(self, alert_event: Dict[str, Any], ai_root_cause: str) -> bool:
        """
        组装企业微信高级模版卡片并推送到值班大群
        """
        labels = alert_event.get("labels", {})
        annotations = alert_event.get("annotations", {})
        
        service_name = labels.get("service", "unknown-service")
        alert_name = labels.get("alertname", "UnknownAlert")
        severity = labels.get("severity", "warning").upper()
        current_val = annotations.get("value", "N/A")
        
        # 获取时序趋势图 URL
        chart_image_url = self.render_sparkline_image_url(
            panel_id=4, dashboard_uid="svc-goldensignals", service=service_name
        )

        # 构造企业微信图文模版卡片
        card_payload = {
            "msgtype": "template_card",
            "template_card": {
                "card_type": "news_notice",
                "source": {
                    "icon_url": "https://img.company.internal/alert-icon.png",
                    "desc": "Prometheus 智能告警中枢",
                    "desc_color": 0 if severity == "CRITICAL" else 1
                },
                "main_title": {
                    "title": f"🚨 [{severity}] {service_name} 触发 {alert_name}",
                    "desc": f"当前指标采样值: {current_val}"
                },
                "card_image": {
                    "url": chart_image_url,
                    "aspect_ratio": 2.25
                },
                "vertical_content_list": [
                    {
                        "title": "💡 AI 诊断摘要",
                        "desc": ai_root_cause
                    }
                ],
                "jump_list": [
                    {
                        "type": 1,
                        "url": f"https://grafana.internal/d/svc-goldensignals?var-service={service_name}",
                        "title": "📊 打开 Grafana 监控大盘"
                    },
                    {
                        "type": 1,
                        "url": annotations.get("runbook_url", "https://wiki.internal/ops/runbooks"),
                        "title": "📖 查阅官方 Runbook 预案"
                    }
                ]
            }
        }

        resp = requests.post(self.webhook, json=card_payload, timeout=5)
        return resp.status_code == 200

生产应用收益

自适应告警卡片上线后,值班团队的排障效率发生了质的飞跃:

  • 工程师无需打开电脑,在手机端扫一眼卡片和趋势图,在 3 秒内就能判断出是偶发抖动还是持续恶化
  • 结合大模型的一句话根因摘要,故障初判平均耗时从原本的 6 分钟 缩短至 15 秒,为大促值守提供了极致高效的移动端作战体验。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐