17.6.5 告警面板与可视化规范

在告警面板设计中,核心目标是让值班人员在最短时间内定位问题与影响范围。面板围绕“告警态势—关键指标—服务拓扑—处置指引”展开,避免堆砌图表;统一时间范围、刷新周期与图表单位,确保同一视图内可比较性。关键业务优先展示高优先级告警与SLO指标,辅助展示基础资源指标以支撑根因排查。

原理草图(告警到面板的链路):

文章图片

面板布局建议采用三层结构:
- 顶部:全局态势与摘要(当前告警数量、等级分布、影响服务数、近1小时告警趋势)
- 中部:服务维度与告警列表(业务域/集群、状态色块、SLO达标率)
- 底部:深入分析与关联指标(资源指标、依赖服务、历史对比)

可视化规范(需强制统一):
- 颜色规范:红/橙/黄=严重/高/中,绿=正常,灰=未知或无数据
- 单位与精度:统一单位与小数位,采用IEC/SI标准
- 轴与刻度:时间轴统一粒度,关键指标固定Y轴范围
- 标注与阈值:阈值线、SLO目标线、关键事件点
- 文案与命名:告警标题包含对象、条件与影响
- 空值处理:无数据与正常明确区分,避免误判

最小可用安装与验证(演示环境):

# 1) 启动Grafana(Docker)
docker run -d --name grafana \
  -p 3000:3000 \
  -e GF_SECURITY_ADMIN_PASSWORD=admin123 \
  grafana/grafana:10.2.3

# 2) 访问并登录
# http://<IP>:3000  用户: admin  密码: admin123

# 3) 预期效果
# 进入Grafana首页,显示“Welcome to Grafana”

Prometheus数据源与告警面板变量联动(示例):
- 变量:cluster、namespace、service、instance
- 作用:告警列表 → 服务视图 → 实例视图 → 日志/链路入口

示例PromQL(可直接用于面板):

# 告警总数(Alertmanager导入后可用)
ALERTS{alertstate="firing"}

# 服务SLO(成功率)
sum(rate(http_requests_total{job="order",status=~"2.."}[5m]))
/
sum(rate(http_requests_total{job="order"}[5m]))

# 5分钟内错误率
sum(rate(http_requests_total{job="order",status=~"5.."}[5m]))
/
sum(rate(http_requests_total{job="order"}[5m]))

面板示例(Grafana面板JSON片段,强调阈值与单位统一):

{
  "title": "订单服务SLO",
  "type": "timeseries",
  "fieldConfig": {
    "defaults": {
      "unit": "percent",
      "decimals": 2,
      "thresholds": {
        "mode": "absolute",
        "steps": [
          {"color": "red", "value": 95},
          {"color": "orange", "value": 98},
          {"color": "green", "value": 99}
        ]
      }
    }
  },
  "targets": [
    {
      "expr": "100 * (sum(rate(http_requests_total{job=\"order\",status=~\"2..\"}[5m])) / sum(rate(http_requests_total{job=\"order\"}[5m])))",
      "legendFormat": "SLO(%)"
    }
  ]
}

告警列表与处置卡片(示例说明模板):
- 告警名:订单服务QPS下降>30%(5m)
- 影响范围:cluster={{cluster}} / namespace={{namespace}} / service={{service}}
- 可能原因:发布、上游限流、数据库慢查询
- 排查步骤:检查发布记录 → 查看P95延迟 → 查看DB连接池
- 回滚方案:切换上一个版本 / 降级开关
- 负责人:oncall#order

可视化规范落地检查清单(上线前必须过):
1. 面板所有图统一单位与精度(%/ms/req/s)
2. 时间范围统一(如最近1小时),刷新周期一致(如30s)
3. 阈值线与SLO线存在且与告警规则一致
4. 空值明确显示为灰色或“无数据”
5. 告警标题包含对象+条件+影响

常见排错与处理:

# Grafana无法连接Prometheus
# 1) 确认Prometheus地址可达
curl -s http://<prometheus_ip>:9090/-/ready

# 2) Grafana服务器能否访问Prometheus
docker exec -it grafana bash -lc "curl -s http://<prometheus_ip>:9090/api/v1/targets | head"

# 预期:返回JSON,含activeTargets

# 3) 检查Grafana日志
docker logs grafana --tail 200 | grep -i datasource

配置一致性与自动化(Provisioning示例):

# /etc/grafana/provisioning/dashboards/alerting.yaml
apiVersion: 1
providers:
  - name: "alerting-board"
    orgId: 1
    folder: "Alerting"
    type: file
    updateIntervalSeconds: 30
    options:
      path: /var/lib/grafana/dashboards
# 把dashboard JSON放入挂载目录
mkdir -p /var/lib/grafana/dashboards
cp alerting-dashboard.json /var/lib/grafana/dashboards/
# 预期:Grafana自动加载“Alerting”文件夹

练习:
1. 设计“全局态势+服务维度+深入分析”三层面板,并为每层设置统一单位与阈值。
2. 为“订单服务”创建SLO面板,阈值线分别为99%、98%、95%,并验证告警触发时颜色变化。
3. 新增变量cluster与service,实现一键过滤并下钻到实例视图。
4. 模拟Prometheus不可达,观察Grafana日志与面板错误提示,写出排错步骤。