标签 Prometheus 下的文章

观测云更新

故障中心

“异常追踪”功能全面升级为“故障中心”

故障中心提供一体化的故障处理支持。当监控器发现异常时,会自动生成故障事件,合并重复告警,并按值班规则通知负责人。若超时未处理,将根据升级策略扩大通知范围。在故障详情页中,可一站式查看关联的监控指标、错误日志、调用链路等信息,支持状态流转与团队协作,所有操作均有完整记录。故障中心这一功能将进一步帮助团队规范故障处理流程,提升响应效率与过程透明度。

在故障中心的计费逻辑中:每命中一次升级策略,在发送通知时记录 100 次任务调用。

  • 创建监控器时,开启「关联故障」,自动生成故障事件

图片

  • 故障事件列表

图片

  • 故障事件详情页

图片

  • 值班规则配置

图片

错误

“错误中心”功能全新上线!可自动汇总 APM、RUM 和日志中的错误,并通过智能聚合将相同问题收敛为统一 Issue 进行跟踪。使用前需配置投递规则以设定监控范围,即可在列表中查看错误概况、处理状态与发生趋势,也可进入详情页分析完整堆栈、关联链路和用户会话。所有错误支持状态流转与团队协作,实现从发现到解决的全流程管理。

同步增加“错误条数”计费,统计每日新增的 Issue 数据条数,包含错误中心产生的 Issue 数据。

  • 错误中心列表,可自定义筛选查看不同来源的错误列表

图片

  • 错误详情页,基于错误来源展示对应的详情页,下图为用户访问监测错误详情页

图片

Open API

1、资源目录:新增支持创建、编辑、删除资源分组信息;

2、支持直接编辑账号状态(值班中、休假中)。

指标分析

1、新增 Top N 序列及最大返回点数选项,可以指定在每个查询中,返回排序后最大或最小的若干条(20/50/100/500)数据序列;

2、新增支持点击图表数据点,下拉选择查看相似趋势指标、下钻分析或其他关联查看。

图片

基础设施

1、主机:

  • 新增支持通过 df_mute 字段进行列表筛选;
  • 对于通过 Open API 或规则创建的主机全局静默,系统将在主机列表新增支持展示“静默”标识。

图片

2、资源目录:新增“服务清单”列表入口。

图片

场景

1、仪表板:新增关联监控器按钮,支持一键查看与该仪表板关联的监控器;

图片

2、图表:为所有图表别名配置新增统一序号标识和悬停联动直观化展示多查询行配置时的对应关系。

图片

APM

Profiling:若 Profile 文件体积超过 20MB,系统暂不支持在线解析,同时新增友好提示,您可使用专业分析工具进行查看。

LLM 监测

LLM 查看器【所有 Trace】列表中,“总 Tokens 数” 调整为统计整条 Trace 消耗的 Tokens 数;总 Tokens 列将同步显示输入、输出 Tokens 数量。

图片

日志

查看器:在显示项选择“重置为默认字段”后,message 字段显示逻辑优化

图片

管理

SSO 管理:优化 SSO 登录流程。用户需先通过邮箱选择身份提供商并完成认证,成功后才能在受保护状态下查看可访问的工作空间,避免权限信息外泄。

部署版

管理后台 > 全局配置:新增平台级系统公告管理配置

集成更新

  • 新增 RedPeaks SAP 集成;
  • 更新 AWS rds mysql 仪表盘;
  • 新增 kingbase 监控器;
  • 更新英文版本dashbord,主要处理中英文转换问题;
  • 更新腾讯 PGSQL 仪表板&监控器;
  • 更新资源目录 icon 以及分类目录。

DataKit 更新

新加功能

  • 新增主机变更检测功能,支持用户、crontab、服务及文件变更监控
  • flameshot 支持持续采集模式,增加默认定时采集和阈值触发持续采集功能
  • 新增 DataKit 自身日志采集配置功能

问题修复

  • 修复 Prometheus export 采集器 tags 优先级错误问题
  • 修复全局 host 标签设置 host=__datakit_ip 时无效的问题
  • 修复 eBPF 采集器导致 istio-init 容器不退出的问题
  • 修复容器日志采集使用默认 stdout 配置时存在无用操作的问题
  • 修复 WAL 锁文件使用 PID 导致退出后无法重用的问题
  • 修复 profile 采集器初始化时机问题,避免磁盘缓存未初始化导致的 panic
  • 修复 Statsd 指标采集,新增 event/service check 采集,这俩类数据目前以日志形式来采集

功能优化

  • 为选举模块增加更多日志和指标,便于检测选举频繁切换和采集器暂停失败问题
  • 更新 DataKit HTTP 客户端指标,增加 URL 路径标签和请求体传输汇总指标
  • SQLServer 采集器新增 sqlserver_host 标签,并将 instance 标签改为 counter_instance
  • bug report 新增 Git 配置文件收集功能
  • Windows 进程采集器新增 status 字段支持
  • DDTrace 采集新增更多 source_type 支持

前言

本节详细聊一下基于envoy的可观测性

日志

首先是日志,配置日志的方式也很简单

static_resources:
  listeners:
    - name: ingress_listener
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 10000
      filter_chains:
        - filters:
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                stat_prefix: ingress_http
                ...
                access_log:
                - name: envoy.access_loggers.stdout
                  typed_config:
                    "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
                    log_format:
                      text_format: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %BYTES_SENT% %DURATION% %REQ(X-REQUEST-ID)% \"%REQ(USER-AGENT)%\" \"%REQ(X-FORWARDED-FOR)%\" %UPSTREAM_HOST% %UPSTREAM_CLUSTER% %RESPONSE_FLAGS%\n"
  • 该配置是将日志输出在控制台,也可以直接输出为文件,然后通过工具采集走path: /var/log/envoy/access.log
  • 也可以直接将日志输出至kafka,并且按比例采集、只采集4xx、5xx等都可以配置,这里就不在赘述了

admin管理页面

envoy有默认的admin页面,方便查看统计信息、打开某些功能的开关等

admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

打开9901页面:

watermarked-envoy_ob_1.png

可以查看相关的统计信息、也可以打开某些开关,功能还是很丰富的

merics接入prometheus

打开了admin之后,就默认提供了相关的prometheus stats http://10.105.148.194:9901/stats/prometheus

这时只需在k8s集群外弄一个prometheus,并且采集该envoy即可

prometheus.yml

global:
  scrape_interval: 5s
  evaluation_interval: 5s

rule_files:
  - /etc/prometheus/*.rules

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

  - job_name: "envoy"
    metrics_path: /stats/prometheus
    static_configs:
    - targets: ["10.105.148.194:9901"]
docker run -d --name prometheus \
  -p 9090:9090 \
  -v ./prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
  registry.cn-beijing.aliyuncs.com/wilsonchai/prometheus:v3.5.0

traces接入jaeger

jaeger的安装可以参考这里: opentelemetry全链路初探--埋点与jaeger

jaeger启动之后,改造一下envoy的配置,这里要特别注意,不同版本的配置不一样,我这里envoy的版本是:v1.32

static_resources:
  listeners:
    - name: ingress_listener
      filter_chains:
        - filters:
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                ...

                tracing:

                  provider:
                    name: envoy.tracers.opentelemetry
                    typed_config:
                      "@type": type.googleapis.com/envoy.config.trace.v3.OpenTelemetryConfig
                      service_name: envoy-proxy
                      grpc_service:
                        envoy_grpc:
                          cluster_name: jaeger_otlp_collector
                ...

  clusters:
    ...
    - name: jaeger_otlp_collector
      type: LOGICAL_DNS
      connect_timeout: 5s
      lb_policy: ROUND_ROBIN
      http2_protocol_options: {}

      load_assignment:
        cluster_name: jaeger_otlp_collector
        endpoints:
        - lb_endpoints:
          - endpoint:
              address:
                socket_address:
                  address: 10.22.12.178
                  port_value: 4317
    ...

修改完成之后重启下envoy

jaeger成功接收到了来自envoy的trace

watermarked-envoy_ob_2.png
watermarked-envoy_ob_3.png

由于只在envoy配置了trace,没有和后端服务联动,所有只显示了envoy这一段的trace信息,如果要联动后端,可以参考这个系列的文章: 全链路监控配置

小结

至此,logs、metrics、traces三大可观测的指标建设完成,envoy可观测性的建设也结束了

联系我

  • 联系我,做深入的交流

 title=


至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

运维大模型训练数据集:从采集到落地的实操手册

引言

智能运维(AIOPS)的核心竞争力,源于大模型对运维场景的深度适配 —— 而这一切的前提,是具备高质量、场景化的训练数据集。运维数据天然存在 “分散、敏感、非结构化” 的特点,通用数据集无法满足故障诊断、流程自动化等核心需求。本文跳出传统文档框架,以 “实操流程 + 工具矩阵 + 避坑指南” 的形式,拆解运维领域数据集构建的全链路,助力快速落地可用数据集。

一、数据来源:双轨采集(真实 + 合成)

  1. 真实数据采集清单(脱敏为前提)

数据类别主流来源必采信息点采集工具推荐故障工单Jira/ServiceNow/ 钉工牌故障现象、排查步骤、根因、解决方案、耗时接口同步 + 定时爬虫监控告警Prometheus/Zabbix/Grafana异常指标、触发阈值、时间、关联资源PromQL 查询 + Logstash 同步系统日志ELK/Splunk/Fluentd错误堆栈、日志级别、时间戳、资源 IDFilebeat 采集 + Kafka 缓存运维知识库Confluence/Wiki/ 内部文档SOP 流程、故障复盘、配置规范文档导出 + PDF 解析工具专家经验企业微信 / 钉钉运维群 / Slack故障讨论、临时方案、踩坑记录聊天记录导出 + 关键词过滤自动化脚本GitHub/GitLab/Gitee修复脚本、配置模板、执行逻辑Git API 批量拉取

  1. 合成数据补充方案(填补稀缺场景)

  • 故障注入生成:用 Chaos Mesh(K8s 环境)、Chaos Blade(多云环境)注入常见故障(网络延迟、磁盘满、CPU 飙升),录制完整处理流程;
  • 模板化生成:基于 “故障类型 - 环境 - 现象 - 根因 - 方案” 五要素模板,批量生成标准化案例(如 “VM 环境 + MySQL + 连接超时 + 最大连接数不足 + 调优参数”);
  • 大模型辅助生成:输入 Prompt(例:“生成 K8s 环境下 Pod CrashLoopBackOff + 内存泄漏的故障日志与处理步骤”),通过 GLM4.5/DeepSeek 生成数据后,需经运维专家校验技术准确性。

二、数据处理三步法:合规→标准→去噪

  1. 脱敏合规:规避数据安全风险

  • 核心操作

    • 替换类:IP / 域名 / 设备 ID→[MASKED] 占位符(例:172.16.0.5→[IP_MASKED]);
    • 删除类:密钥、密码、订单号等敏感信息直接剔除;
    • 模糊化:业务数据(如用户量、峰值流量)按区间处理(例:12300 用户→1.2 万 + 用户)。
  • 工具选型:IBM Presidio(多语言敏感信息识别)、AWS Glue DataBrew(可视化操作)、自定义正则(快速适配特定格式)。
  1. 数据标准化:统一格式与术语

  • 日志结构化:非结构化日志→JSON 格式(固定字段:time level resource content);
  • 时间统一:所有数据转为 UTC 时间戳(避免时区混乱);
  • 术语词典:建立运维术语映射表(例:“Pod 重启”=“容器实例重启”、“磁盘满”=“存储资源耗尽”)。
  1. 噪声过滤:保留高价值数据

  • 剔除无效信息:闲聊记录、重复日志、测试告警、描述模糊的工单;
  • 去重处理:通过 “故障现象 + 根因” 字段去重,避免重复训练;
  • 质量筛选:仅保留 “现象清晰 + 根因明确 + 方案可执行” 的案例(低质量数据占比≤5%)。

三、标注结构化:让数据 “可被模型理解”

  1. 核心标注维度(简化版)

标注维度标注要求示例故障层级三级分类(大类 - 中类 - 小类)应用服务故障→连接故障→Redis 连接超时根因与证据主 / 次根因 + 对应依据主根因:Redis 最大连接数不足;证据:日志 “maxclients reached”执行步骤含工具、命令、验证环节1. redis-cli info clients 查连接数;2. 修改 redis.conf;3. 重启 Redis;4. 验证服务连通性环境特征部署环境 + 核心组件K8s 1.25 + Redis 6.2 + 云服务器 ECS

  1. 标注流程与质量控制

  2. 分工:资深运维→标注复杂案例(复合故障 / 罕见故障);初级运维→基础分类标注;
  3. 校验:交叉标注 15% 案例,Cohen's Kappa 系数≥0.8 视为合格;
  4. 工具:优先选 Label Studio(开源免费 + 支持多类型数据),高精度需求可选 Prodigy。

四、数据增强:3 种方式提升模型鲁棒性

  1. 文本层面增强

  • 同义替换:“查看日志”→“检索日志输出”“查看日志信息”;
  • 句式转换:主动句 “运维人员重启服务”→被动句 “服务已被重启”→疑问句 “是否需要重启服务?”;
  • 多语言适配:核心案例翻译为中英双语(适配国际化团队)。
  1. 场景层面增强

  • 复合故障组合:“网络抖动 + 数据库连接池耗尽”“CPU 过载 + 日志磁盘满”;
  • 跨环境适配:同一故障(如 MySQL 慢查询)生成 K8s/VM/Serverless 三种环境的案例;
  • 步骤变体:同一根因提供多种解决方案(如重启服务可通过命令行 / 可视化平台 / 自动化脚本实现)。
  1. 负样本构造

  • 误导性案例:“磁盘使用率 90%” 但根因为 “内存泄漏”;“HTTP 502 错误” 但根因为 “缓存失效”;
  • 无效步骤案例:根因为 “网络分区”,却包含 “修改数据库配置” 等无关操作。

五、数据集落地:划分、存储与版本管理

  1. 数据集划分(按比例 + 场景覆盖)

  • 训练集(70%):覆盖 80% 以上常见故障类型(如服务不可用、配置错误、资源过载);
  • 验证集(15%):含中等复杂度案例,用于调优模型超参数;
  • 测试集(15%):聚焦边缘场景(罕见故障、复合故障、极端环境),评估模型泛化能力。
  1. 存储格式选型

数据类型推荐格式优势适用场景结构化数据Parquet/JSON压缩率高、查询快故障案例、标注数据非结构化数据Markdown保留上下文、易读取复盘报告、SOP 文档大文件数据二进制 + 索引存储高效、检索便捷日志片段、脚本文件

  1. 版本管理实操

  • 工具:优先 DVC(数据版本控制专用,支持大文件);关联代码仓库则用 Git LFS;
  • 版本规范:v 主版本。次版本。修订号(例:v1.2.0,主版本 = 结构变更,次版本 = 新增案例,修订号 = 小幅优化);
  • 变更记录:每版需记录 “新增案例数、优化点、负责人、更新时间”。

六、质量评估:3 类核心指标 + 避坑指南

  1. 自动化质检指标

指标类型具体要求校验工具完整性必填字段(如根因、步骤)缺失率≤0.5%Great Expectations一致性术语统一、时间格式统一Python 正则 + SQL 查询准确性命令语法正确、脱敏格式规范Pydantic + 自定义校验脚本逻辑性步骤与根因匹配、现象与日志一致规则引擎 + 人工抽样

  1. 常见坑与规避方案

  • 坑 1:敏感信息脱敏不彻底→规避:先人工审核 5% 数据,再用工具批量脱敏;
  • 坑 2:标注规则不一致→规避:先制定标注手册,交叉标注分歧案例统一评审;
  • 坑 3:数据场景单一导致模型过拟合→规避:测试集中边缘案例占比不低于 30%;
  • 坑 4:数据集更新后模型效果下降→规避:每次更新后做 A/B 测试,对比准确率 / 召回率。

七、工具矩阵速查表(按环节分类)

构建环节工具名称核心特点适用规模数据采集Apache NiFi多源接入、可视化流程中大型企业数据采集Logstash+Filebeat轻量高效、易部署中小型团队数据脱敏IBM Presidio多语言支持、识别精准全规模数据标注Label Studio开源免费、功能全面全规模数据增强NLPAug文本增强、自定义规则全规模版本管理DVC大文件支持、版本追溯中大型企业质量检查Great Expectations规则灵活、自动化校验全规模存储管理MinIO对象存储、高可用中大型团队存储管理MySQL结构化存储、查询便捷小型团队

八、实战案例片段(结构化示例)

plaintext

案例ID:OPS-2025-0892
时间:2025-05-12T09:45:00Z
环境:Kubernetes 1.28 + Redis 7.0 + 阿里云ECS
故障类型:中间件故障→缓存服务故障→Redis连接超时
现象:
1. 订单服务接口响应时间从200ms升至3s+;
2. 监控告警:Redis连接数达1000(阈值800);
日志片段:
- level=error msg="Redis connection timeout: dial tcp [IP_MASKED]:6379: i/o timeout"
- level=warning msg="maxclients limit reached, closing connection"
根因:
主根因:Redis配置maxclients=1000,未随业务扩容;
次根因:订单服务未配置连接池复用,连接数激增;
处理步骤:
1. 执行redis-cli -h [IP_MASKED] -p 6379 config set maxclients 2000 临时调整;
2. 修改Redis配置文件redis.conf,持久化maxclients参数;
3. 优化订单服务连接池配置(maxIdle=50,maxActive=200);
4. 重启订单服务,通过jmeter压测验证接口响应时间恢复至250ms内;
影响范围:
受影响服务:订单服务、购物车服务;
故障时长:12分钟;
受影响用户:约8000人;

结语

运维数据集的构建,本质是 “运维经验的数字化沉淀”。无需追求 “大而全”,而应聚焦 “准而精”—— 先覆盖 80% 的常见故障,再通过持续迭代补充边缘场景。核心是建立 “数据采集 - 处理 - 标注 - 增强 - 评估” 的闭环,让数据集随运维场景、技术栈的变化不断优化,最终成为大模型赋能 AIOPS 的核心燃料。

写在前面,本人目前处于求职中,如有合适内推岗位,请加:lpshiyue 感谢。同时还望大家一键三连,赚点奶粉钱。本系列已完结,完整版阅读课联系本人

现代分布式系统的可观测性不是简单的数据收集,而是基于业务目标的智能过滤与决策体系

在掌握了风险可控的发布策略后,我们需要解决一个更根本的问题:如何准确判断发布是否成功?如何在海量监控数据中识别真正重要的信号?全栈监控与告警设计正是连接系统状态与人工干预的关键桥梁。本文将从SLO定义出发,深入探讨监控指标体系构建、告警规则设计、分级抑制策略的全链路实践,帮助企业构建既敏感又精准的可观测体系。

1 监控体系的哲学转变:从数据收集到价值判断

1.1 传统监控的局限性:数据丰富而洞察匮乏

传统监控系统面临的核心矛盾是数据收集能力价值提取效率之间的巨大鸿沟。随着微服务和云原生架构的普及,单个系统产生的指标数量呈指数级增长,但运维团队能够有效处理的告警数量基本恒定。

监控数据的三个价值层次

  • 基础指标:CPU、内存、网络等资源消耗数据(容易收集但价值有限)
  • 应用性能:请求延迟、错误率、吞吐量等业务相关指标(需要业务埋点)
  • 用户体验:真实用户感知的可用性和性能(最难测量但最具价值)

根据行业数据,未经验证的监控告警中超过70%属于噪音或误报,导致团队产生"告警疲劳",反而忽略真正重要的异常信号。

1.2 SLO:监控价值的锚点

Service Level Objective(服务等级目标)为监控系统提供了价值判断的基准。SLO将模糊的"系统健康"概念转化为可量化的目标,成为区分信号与噪音的核心依据。

SLO的核心价值在于:

  • 目标一致性:使技术指标与业务目标对齐
  • 优先级判断:基于错误预算确定问题处理的紧急程度
  • 资源分配:根据SLO达成情况指导稳定性投入
# SLO定义示例:API服务可用性目标
api_service_slo:
  availability: 99.9%  # 每月最多43分钟不可用
  latency_p95: 200ms   # 95%请求延迟低于200ms
  error_rate: 0.1%     # 错误率低于0.1%
  rolling_period: 30d  # 滚动计算周期为30天

2 全栈监控体系构建:从基础设施到用户体验

2.1 监控数据的三位一体

现代监控体系需要整合指标(Metrics)、日志(Logs)、追踪(Traces) 三类数据,形成完整的可观测性能力。

指标监控提供系统量化度量,适合趋势分析和阈值告警:

  • 基础资源指标:CPU、内存、磁盘、网络(通过Node Exporter采集)
  • 应用性能指标:QPS、延迟、错误率(通过应用埋点暴露)
  • 业务指标:订单量、支付成功率、用户活跃度(自定义业务埋点)

日志分析记录系统详细行为,用于故障排查和审计:

  • 结构化日志收集(Filebeat/Fluentd)
  • 日志聚合与检索(Elasticsearch)
  • 模式识别与异常检测(机器学习分析)

分布式追踪提供请求全链路视角,优化性能诊断:

  • 请求级跟踪(Jaeger/SkyWalking)
  • 服务依赖拓扑自动发现
  • 瓶颈分析与链路优化

2.2 监控数据采集的技术选型

Prometheus生态已成为云原生监控的事实标准,其拉取模型多维数据模型特别适合动态环境。

# Prometheus配置示例
scrape_configs:
  - job_name: 'api-service'
    static_configs:
      - targets: ['api-service:8080']
    metrics_path: '/metrics'
    scrape_interval: 15s
    # 指标Relabeling,增强元数据
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter:9115

多数据源整合是大型系统的必然选择。Zabbix适合传统基础设施监控,Prometheus擅长云原生环境,商业方案如CloudWatch提供开箱即用体验。

2.3 监控数据建模与存储优化

监控数据的时序特性要求专用存储方案。Prometheus TSDB适合短期数据存储,长期存储需考虑Thanos、Cortex或M3DB等分布式方案。

数据降采样策略对成本控制至关重要:

  • 原始数据:保留2天,15秒精度
  • 5分钟聚合数据:保留30天
  • 1小时聚合数据:保留1年
  • 日级别聚合数据:永久保留

3 从SLO到告警规则:精准告警的数学基础

3.1 错误预算:SLO的可操作化表达

错误预算将SLO转化为可消耗的资源,为告警触发提供客观依据。例如,99.9%可用性目标意味着每月有43分钟错误预算。

错误预算消耗速率(Burn Rate)成为告警的关键指标:

  • 快速燃烧:高错误率短时间消耗大量预算(需要立即处理)
  • 慢速燃烧:低错误率持续消耗预算(需要计划性修复)
# 错误预算消耗计算
def calculate_burn_rate(slo_target, error_rate, time_window):
    """计算错误预算消耗速率"""
    error_budget = 1 - slo_target  # 错误预算比例
    actual_consumption = error_rate * time_window
    burn_rate = actual_consumption / (error_budget * time_window)
    return burn_rate

# 示例:99.9%可用性目标,1%错误率持续30分钟
burn_rate = calculate_burn_rate(0.999, 0.01, 30)
if burn_rate > 10:  # 消耗速率超过10倍
    trigger_critical_alert()

3.2 多维度SLO指标映射

不同服务需要不同的SLO定义方式,核心是建立技术指标与用户体验的直接关联。

API服务SLO映射

-- 基于SLI(服务等级指标)计算SLO达成率
SELECT 
    time_bucket('1 hour', timestamp) as hour,
    -- 可用性SLI
    SUM(CASE WHEN status_code < 500 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as availability,
    -- 延迟SLI 
    PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY latency) as latency_p95,
    -- 错误率SLI
    SUM(CASE WHEN status_code >= 500 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as error_rate
FROM api_requests 
WHERE timestamp >= NOW() - INTERVAL '30 days'
GROUP BY hour

批处理服务SLO特性

  • 完整性:数据处理是否100%成功
  • 及时性:作业是否在时间窗口内完成
  • 正确性:输出结果是否符合质量要求

3.3 告警规则的数学建模

有效的告警规则需要基于统计学原理而非简单阈值。

动态基线告警考虑历史模式和周期性:

-- 基于时间序列分析的异常检测
WITH baseline AS (
  SELECT
    AVG(latency) as historical_avg,
    STDDEV(latency) as historical_stddev
  FROM api_metrics
  WHERE time > NOW() - INTERVAL '4 weeks'
    AND hour_of_day = EXTRACT(HOUR FROM NOW())
)
SELECT 
  current.latency,
  (current.latency - baseline.historical_avg) / baseline.historical_stddev as z_score
FROM current_metrics current, baseline
WHERE ABS((current.latency - baseline.historical_avg) / baseline.historical_stddev) > 3

多指标复合告警提高准确性:

  • 条件1:错误率 > 2%(持续5分钟)
  • 条件2:P95延迟 > 基线200%
  • 条件3:流量下降 > 30%
  • 触发条件:条件1 AND (条件2 OR 条件3)

4 告警分级体系:避免雪崩的防御工事

4.1 分级原则:基于业务影响而非技术症状

告警分级的目标是确保重要告警得到及时处理,而非处理所有技术异常。分级应基于业务影响程度而非技术严重性。

四级分类体系在实践中证明有效:

  • P0(紧急):业务核心功能不可用,影响大量用户(立即呼叫)
  • P1(高):功能降级或部分用户受影响(2小时内处理)
  • P2(中):潜在问题或边缘功能异常(24小时内处理)
  • P3(低):轻微异常或需要观察(无需立即处理)

4.2 智能抑制与降噪策略

告警抑制是避免告警雪崩的关键技术。

层级抑制确保只收到根本原因告警:

# Alertmanager抑制规则示例
inhibit_rules:
  - source_match:  # 源告警(更严重)
      severity: 'critical' 
    target_match:  # 目标告警(被抑制)
      severity: 'warning'
    equal: ['cluster', 'alertname']  # 相同集群和告警名称

时间窗口聚合将相关告警合并发送:

# Alertmanager路由配置
route:
  group_by: ['cluster', 'alertname']
  group_wait: 10s  # 初始等待时间
  group_interval: 1m  # 同一组告警发送间隔
  repeat_interval: 4h  # 相同告警重复发送间隔

动态静默基于条件自动抑制已知问题:

-- 智能静默规则示例
CREATE RULE auto_silence_maintenance 
WHEN alert_name = 'NodeDown' 
AND description LIKE '%for maintenance%'
DO SILENCE FOR 2h;

4.3 分级通知渠道与升级策略

不同级别的告警需要不同的通知强度和升级路径

通知渠道矩阵

严重等级即时通知1小时内未确认4小时内未解决
P0电话+短信+钉钉升级主管升级总监+运维总监
P1钉钉+短信升级团队主管升级部门主管
P2钉钉每日站会同步周报汇总
P3工单系统每周评审月度优化

人性化通知内容提升响应效率:

{
  "alert_id": "API_HIGH_ERROR_RATE_20250115",
  "title": "【P1】订单服务错误率超过阈值",
  "summary": "订单服务错误率在5分钟内从1%上升到5%,已消耗15%错误预算",
  "impact": "可能导致0.1%用户下单失败,预计影响金额5万元/小时",
  "actions": [
    "1. 检查订单服务日志:https://logs.company.com/order-service",
    "2. 查看相关监控:https://grafana.company.com/d/order-overview",
    "3. 最近部署:订单服务v1.2.3(2小时前部署)"
  ],
  "runbook": "https://runbook.company.com/order-service-high-error-rate",
  "slo_impact": "错误预算消耗速率:3倍(正常阈值:1倍)"
}

5 全栈监控实战:从配置到优化的完整流程

5.1 监控即代码:声明式配置管理

将监控配置版本化,实现可重复、可审计的监控体系。

Prometheus规则即代码

# api_service_alerts.yml
groups:
- name: api_service
  rules:
  - alert: APIHighErrorRate
    expr: |
      # 基于错误预算的智能告警
      sum(rate(api_requests_total{status=~"5.."}[5m])) by (service)
      / 
      sum(rate(api_requests_total[5m])) by (service)
      > 0.05  # 5%错误率阈值
    for: 5m
    labels:
      severity: critical
      service: api-gateway
    annotations:
      summary: "{{ $labels.service }} 错误率超过5%"
      description: "服务 {{ $labels.service }} 当前错误率为 {{ $value }},已持续5分钟"
      runbook: "https://runbook.company.com/api-high-error-rate"

Dashboard即代码(JSON配置)确保监控视图一致性:

{
  "dashboard": {
    "title": "订单服务监控",
    "tags": ["microservice", "order"],
    "timezone": "browser",
    "panels": [
      {
        "title": "API成功率",
        "type": "graph",
        "targets": [
          {
            "expr": "sum(rate(orders_api_requests_total{status=~'2..'}[5m])) / sum(rate(orders_api_requests_total[5m]))",
            "legendFormat": "成功率"
          }
        ]
      }
    ]
  }
}

5.2 监控自愈与自动化响应

自动化响应逐步降低人工干预需求。

基于严重程度的自动化策略

def evaluate_autoremediation(alert):
    """评估是否适合自动修复"""
    if alert.severity == "critical":
        if alert.metric == "cpu_usage" and alert.value > 90:
            return scale_out(alert.service, factor=1.5)
        elif alert.metric == "memory_usage" and alert.value > 95:
            return restart_pod(alert.pod_name)
    return None

渐进式应急响应

  1. Level 1:自动扩容/重启(无状态服务)
  2. Level 2:流量切换/降级(有状态服务)
  3. Level 3:人工决策介入(数据敏感操作)

5.3 监控效能度量与持续优化

监控系统本身需要被监控和优化。

关键效能指标

  • 告警准确率:有效告警比例(目标>90%)
  • 平均检测时间(MTTD):异常发生到告警的时间(目标<1分钟)
  • 平均响应时间(MTTR):告警到修复的时间(目标<15分钟)
  • 告警疲劳指数:人均每日处理告警数(目标<5条)

定期健康度评估

-- 监控系统健康度SQL查询
SELECT
  DATE(timestamp) as day,
  COUNT(*) as total_alerts,
  SUM(CASE WHEN acknowledged = true THEN 1 ELSE 0 END) as acknowledged_alerts,
  AVG(acknowledge_time - trigger_time) as avg_ack_time,
  PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY acknowledge_time - trigger_time) as p95_ack_time
FROM alerts
WHERE timestamp >= NOW() - INTERVAL '30 days'
GROUP BY day
ORDER BY day;

6 组织协同与文化建设

6.1 监控责任共担模型

监控不是运维团队的独角戏,而需要全组织协同

三级责任模型

  • 平台团队:负责监控基础设施稳定性和通用指标
  • 业务团队:负责业务指标和SLO定义
  • SRE团队:负责SLO达标和错误预算管理

监控素养培养

  • 新员工监控工具培训
  • 定期监控案例分享会
  • 监控配置代码审查

6.2 监控质量内建流程

将监控要求嵌入开发流程,而非事后补丁。

开发阶段检查清单

  • [ ] 应用暴露必要的监控指标
  • [ ] 定义清晰的SLO和目标
  • [ ] 设计告警规则和响应流程
  • [ ] 准备运维手册和排查指南

部署流水线集成

# CI/CD中的监控校验
- name: Validate Monitoring
  steps:
    - name: Check Metrics Exposure
      run: |
        curl -s http://$APP_URL/metrics | grep -q "http_requests_total"
    - name: Validate SLO Definition
      run: |
        python scripts/validate_slo.py --manifest slo/manifest.yaml

总结

构建有效的全栈监控与告警体系是一个持续演进的过程,需要技术、流程和文化的协同发展。从SLO定义到告警规则,再到分级抑制策略,每一层都需要精心设计和不断优化。

成功监控体系的核心特征

  1. 业务对齐:监控指标与业务目标紧密关联
  2. 精准告警:基于SLO和错误预算的智能触发
  3. 分级处理:重要信号优先处理,噪音自动抑制
  4. 持续优化:定期评估效果并迭代改进

避免的常见反模式

  • 监控指标丰富但缺乏业务关联
  • 告警数量庞大但有效信号稀少
  • 响应流程冗长但解决效率低下
  • 工具堆砌但缺乏整体设计

监控的终极目标不是收集更多数据,而是提供更好的决策支持。通过本文介绍的方法论和实践,团队可以构建既能够及时发现真实问题,又避免告警雪崩的高效监控体系。


📚 下篇预告
《压力测试方法论——目标设计、场景建模、指标评估与容量规划的完整闭环》—— 我们将深入探讨:

  • 🎯 目标制定:基于业务目标的压测场景设计与成功标准定义
  • 📊 场景建模:真实流量模拟、异常场景构造与容量边界探测
  • 📈 指标体系:性能基线、瓶颈识别与容量规划的数据基础
  • 🔄 优化闭环:从性能测试到系统调优的持续改进机制
  • 🏗️ 容量规划:基于压测结果的资源预估与扩容策略

点击关注,掌握系统性能评估与容量规划的完整方法论!

今日行动建议

  1. 评估当前监控体系的告警准确率,识别主要噪音来源
  2. 为关键服务定义明确的SLO和错误预算消耗机制
  3. 实施告警分级策略,建立基于业务影响的分级体系
  4. 配置告警抑制规则,减少重复告警和告警雪崩
  5. 建立监控效能度量机制,持续优化告警质量

使用 springboot 集成 micrometer 实现自定义 prometheus 指标。
假如在多实例的商城系统中存在一个用于统计商品查看次数的指标,名为 item_view_count ,label:item_idinstance_id
当服务重启时,按照 micrometer 的默认行为,这个指标会被置为 0 。

对于这个行为我想到了两种方案。

  1. 将这个值持久化,并且在第一次创建指标时加载。
  2. 服务重启后使用新的 instance_id ,这样在做 sum 统计时不会被重置影响

各位都是如何处理这个问题呢?

使用 springboot 集成 micrometer 实现自定义 prometheus 指标。
假如在多实例的商城系统中存在一个用于统计商品查看次数的指标,名为 item_view_count ,label:item_idinstance_id
当服务重启时,按照 micrometer 的默认行为,这个指标会被置为 0 。

对于这个行为我想到了两种方案。

  1. 将这个值持久化,并且在第一次创建指标时加载。
  2. 服务重启后使用新的 instance_id ,这样在做 sum 统计时不会被重置影响

各位都是如何处理这个问题呢?