3.1 AIOps 基础与可观测性标准
本章节为 Observable Ops 提供理论基础:涵盖 AIOps 成熟度模型、可观测性三大支柱(+Events)、OpenTelemetry 规范体系、SRE 黄金指标、数据集成模式与分阶段实施路径。
1. AIOps 成熟度模型
1.1 六级成熟度定义
传统五级模型缺少「完全无监控」的初始状态,本方案补充 L0 构成六级体系:
| 等级 | 特征 | 核心能力 | 与本方案对应 |
|---|---|---|---|
| L0 缺失级 | 无系统化监控,纯靠用户投诉 | 人工巡检或无监控 | 启动基线 |
| L1 初始级 | 人工巡检、被动告警 | 阈值告警、基础 Dashboard | 传统监控阶段 |
| L2 响应级 | 规则自动化、多维度监控 | 事件关联、自动化脚本、CMDB | 数据融合层(统一标准化) |
| L3 预测级 | ML 模型辅助决策 | 异常检测、趋势预测、容量规划 | 智能感知层(异常检测) |
| L4 自治级 | 自动根因分析、自主恢复 | 因果推理、故障自愈、变更管理 | 根因分析 + 自动执行 |
| L5 进化级 | 知识闭环、持续自优化 | 跨系统知识迁移、决策进化 | 知识进化模块 |
1.2 成熟度评分卡
每级跃迁前需自评打分(1-5分),任一维度< 3 分则该级未达成:
| 维度 | L1 达标标准 | L2 达标标准 | L3 达标标准 | L4 达标标准 |
|---|---|---|---|---|
| 数据覆盖 | 核心服务指标70% 覆盖 | 全量服务覆盖 + 日志 60% | 追踪50% + Events 30% | 四类数据 80%+融合 |
| 告警有效率 | 告警触发后有人响应 | 有效告警率 > 40% | 误报率 < 30% | 根因准确率 > 60% |
| 自动化程度 | 纯人工处理 | 规则自动触发脚本 | ML辅助决策 | 自动修复 > 50% |
| 知识沉淀 | 无记录 | 人工记录操作手册 | 结构化案例库 | 知识图谱上线 |
| MTTD | > 10 分钟 | < 10 分钟 | < 5 分钟 | < 2 分钟 |
1.3 各等级典型失败模式
| 等级 | 最常见失败 | 根本原因 | 规避动作 |
|---|---|---|---|
| L1→L2 | Dashboard 建成无人看 | 数据无法指导决策 | 先定义告警,再建 Dashboard |
| L2→L3 | ML 模型上线后频繁误报 | 数据质量差、标签不足 | 先做数据治理再训模型 |
| L3→L4 | 根因分析准确率低下 | 拓扑数据缺失、传播路径不明 | 先完善拓扑建模再上 RCA |
| L4→L5 | 知识积累停滞 | 无反馈闭环机制 | 强制要求每次故障后更新知识 |
1.4 成熟度跃迁关键路径
| 跃迁 | 核心动作 | 典型周期 | 核心前置条件 |
|---|---|---|---|
| L0 → L1 | 核心指标采集、告警规则配置 | 1-2 月 | 网络可达、CMDB 初始化 |
| L1 → L2 | 统一数据采集标准化、建设 CMDB、部署集中式 Dashboard | 3-6 月 | 数据孤岛打通 |
| L2 → L3 | 引入 ML 异常检测、建设时序预测、告警降噪 | 6-12 月 | 数据质量达标(完整率 > 95%) |
| L3 → L4 | 部署图数据库、构建拓扑依赖、实现根因推理 | 6-12 月 | 拓扑数据完整率 > 90% |
| L4 → L5 | 知识闭环自动化、跨系统知识迁移、持续学习 | 12-24 月 | 知识积累量 > 1 万条、反馈闭环形成 |
2. 可观测性三大支柱(+ Events)
2.1 支柱定义与采集规范
| 支柱 | 数据形态 | 采集方式 | 存储模型 | 典型工具 | 本方案对应 |
|---|---|---|---|---|---|
| Metrics 指标 | 数值型时序数据 | Pull (Prometheus) / Push (OTLP) | TSDB | Prometheus / VictoriaMetrics | 数据融合 → 智能感知 |
| Logs 日志 | 非结构化/半结构化文本 | Agent 采集 (Fluent Bit) | 倒排索引 / 列式存储 | ELK / Loki / ClickHouse | 数据融合 → 故障研判 |
| Traces 追踪 | 调用链 Span 序列 | SDK 埋点 / eBPF 自动插针 | Trace ID 索引 | Jaeger / Tempo / Zipkin | 数据融合 → 拓扑建模 |
| Events 事件 | 结构化变更记录 | Webhook / Kafka / K8s Events | 时序 + 事件表 | Kafka / EventBridge | 数据融合 → 智能感知 |
Events 作为第四支柱的必要性:传统三大支柱描述「系统当前状态」,Events 描述「状态为何发生变化」——代码发布、扩缩容、配置变更、开关切换是故障的前置信号,而非故障本身。结合 Events 与三大支柱做时序关联分析,是将告警响应从「事后」提前至「事中」的关键。
2.2 各支柱数据量估算
生产环境数据量估算公式(单集群,月均增速供参考):
| 支柱 | 估算公式 | 1000 Pod集群示例 | 存储周期建议 |
|---|---|---|---|
| Metrics | 节点数 × 30指标 × 10s × 2592000秒 |
~50GB/月 | 热存 30d /冷存 1年 |
| Logs | Pod数 × 日志量/Pod/s × 86400秒 × 30天 |
~500GB/月(压缩后) | 30d 全量 / 90d索引 |
| Traces | QPS × 平均Span数 × Span大小 × 30天 |
~200GB/月 | 7d 全量 / 30d 采样 |
| Events | 变更次数/天 × 事件大小 × 30天 |
~1GB/月 | 90d 全量 |
基数管理(Cardinality)失控是 Metrics 存储的头号杀手:高基数标签组合(instance_id、pod_name、request_id 同时作为标签)可使存储膨胀100 倍。原则:
high_cardinality_label → 作为 attribute,不作为 metric label。
2.3 支柱间的关联关系
时序关联的核心价值:故障发生前 60 秒内的变更事件(E1/E2/E3)往往是最直接的诱因。通过 Events 与 Metrics/Logs/Traces 的时间对齐,可将根因定位耗时从平均 30 分钟压缩至 5 分钟。
2.4 数据流映射矩阵
| 数据流 | 采集协议 | 采集层组件 | 处理层(数据融合) | 消费层 |
|---|---|---|---|---|
| Metrics | OTLP / Remote Write / Scrape | OTel Collector / Prometheus | 时序归一化(PromQL → 统一模型) | 智能感知(异常检测) |
| Logs | OTLP / Fluent Bit / Filebeat | OTel Collector Logs Receiver | 日志结构化(解析 → 事件化) | 故障研判(关键字/模式分析) |
| Traces | OTLP / Jaeger gRPC / Zipkin | OTel Collector Traces Receiver | Span 聚合 → 拓扑建模 | 认知网络(依赖图谱) |
| Events | Webhook / K8s Event / Kafka | Event Bridge / 自研 Adapter | 事件归一化(变更类型 + 实体关联) | 智能感知(变更关联告警) |
3. OpenTelemetry 规范
3.1 规范体系全景
OpenTelemetry(OTel)由 CNCF 托管,是可观测性领域事实上的标准协议。本方案采用 OTel 作为统一采集层协议:
3.2 Collector Pipeline 配置模板
OTel Collector 通过 Pipeline(receivers → processors → exporters)组装数据流。以下是生产级配置模板:
# otel-collector-config.yaml(精简示例)
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
prometheus:
config:
scrape_configs:
- job_name: "k8s-pods"
kubernetes_sd_configs:
- role: pod
filelog:
include: ["/var/log/pods/*.log"]
start_at: end
processors:
#内存限制,防止 OOM
memory_limiter:
check_interval: 5s
limit_mib: 1000
spike_limit_mib: 200
# 批量聚合,减少下游压力
batch:
timeout: 5s
send_batch_size: 1024
# 尾部采样(Tail Sampling):先缓存后按策略采样
tail_sampling:
decision_wait: 10s
policies:
- name: errors-policy
type: status_code
status_code: {status_codes: [ERROR]}
- name: slow-traces-policy
type: latency
latency: {threshold_ms: 1000}
- name: probabilistic-policy
type: probabilistic
probabilistic: {sampling_percentage: 10}
exporters:
otlp:
endpoint: "victoriametrics:9428"
tls:
insecure: false
kafka:
brokers: ["kafka:9092"]
topic: "otel-traces"
protocol: otlp_json
service:
pipelines:
traces:
receivers: [otlp, jaeger]
processors: [memory_limiter, batch, tail_sampling]
exporters: [otlp, kafka]
metrics:
receivers: [otlp, prometheus]
processors: [memory_limiter, batch]
exporters: [otlp]
logs:
receivers: [filelog]
processors: [memory_limiter, batch]
exporters: [kafka]3.3 OTel 指标类型详解
OTel 定义了四种指标类型,理解其语义是正确使用的基础:
| 类型 | 语义 | 适用场景 | 示例 | 可聚合方式 |
|---|---|---|---|---|
| Counter | 累计递增计数器 | 请求总数、错误总数 | http_requests_total = 1.2M |
求和(Sum) |
| Histogram | 分布统计(buckets) | 延迟、体积 | http_request_duration_ms P99=245 |
分位数(Percentile) |
| Gauge | 瞬时值 | CPU、内存、连接数 | memory_usage_bytes = 4.2GB |
平均值(Mean) |
| UpDownCounter | 双向累计 | 活跃连接数、队列深度 | active_connections = 127 |
快照值 |
常见错误:将
http_request_duration_seconds(Histogram 类型)用Sum()聚合会产生无意义的「总延迟」数值。正确做法是取Histogram的Avg()或直接使用Histogram的 bucket 计算百分位数。
3.4 数据模型映射
| OTLP 数据类型 | 本方案数据模型 | 关键映射规则 |
|---|---|---|
ResourceMetrics |
实体指标(服务/主机/容器) | resource.attributes.service.name → 服务实体 |
ScopeMetrics |
服务级指标 | 按 Scope 隔离,同一服务多实例合并 |
Traces |
调用链(拓扑建模) | Span parent_id 构建调用树,span.name 构建接口关系 |
LogRecords |
结构化日志 | severity_text → 日志级别,body → 消息体 |
3.5 非 OTel 组件适配策略
| 场景 | 适配方案 | 数据损失 | 实施成本 | 优先级 |
|---|---|---|---|---|
| Prometheus 已有部署 | Collector 接收 Prometheus Remote Write,转 OTLP | 无 | 低 | P0 |
| ELK 日志体系已有 | Filebeat → Kafka → Collector Logs Receiver | 无 | 低 | P0 |
| SkyWalking APM | Collector 带 SkyWalking Receiver 插件 | Trace 部分属性丢失 | 中 | P1 |
| Datadog APM | Agent 侧开启 OTLP Export,Datadog 作为副输出 | 无 | 低 | P1 |
| 自研监控系统 | 开发自定义 Exporter 或直推 Collector | 取决于实现 | 中 | P2 |
| 老旧设备 SNMP | SNMP Exporter → Prometheus → Collector | 仅指标,无日志/追踪 | 高 | P3 |
4. SRE 黄金指标与 SLO 定义
4.1 黄金指标体系(Google SRE)
SRE 体系以四个黄金指标衡量服务健康度,适用于请求驱动型服务:
| 指标 | 缩写 | 定义 | 测量方式 | 本方案对应模块 |
|---|---|---|---|---|
| 延迟 | Latency | 请求处理耗时分布 | Histogram P50/P95/P99 | 智能感知 → 异常检测 |
| 流量 | Traffic | 服务 QPS/RPM | Counter 增量 | 智能感知 → 趋势监控 |
| 错误 | Errors | 失败请求率(5xx / 业务异常) | Counter 比值 | 故障研判 → 错误率告警 |
| 饱和度 | Saturation | 资源利用率(CPU/内存/连接数) | Gauge 百分比 | 影响分析 → 容量评估 |
4.2 USE 方法(资源导向)
对于基础设施类资源(磁盘、网络、队列),黄金指标不适用,应使用 USE 方法:
| 类型 | 指标 | 公式 | 告警阈值建议 |
|---|---|---|---|
| 错误率 | 利用率 = 时间忙碌/总时间 |
> 80% 持续5 分钟 | 容量不足 |
| 饱和度 | 饱和度 = 队列深度/最大队列 |
> 60% | 即将过载 |
| 错误 | 错误 = 失败操作/总操作 |
> 0.1% | 硬件/网络故障 |
4.3 SLO / SLI / SLA 定义模板
SLO 定义示例(API 服务):
| 项目 | 定义 | 说明 |
|---|---|---|
| SLI | 可用 API 请求占比 | successful_requests / total_requests |
| SLO | 月度可用性 > 99.9%(月均宕机 ≤ 44 分钟) | 内部目标,比 SLA严格 |
| SLA | 月度可用性 > 99.5%(合同约定) | 对客承诺,比 SLO 宽松 |
| Error Budget | 月度容错预算 = 1 - SLO = 0.1% | 当 Error Budget 消耗 > 50%,进入风险状态 |
Error Budget 告警策略:
| Error Budget 消耗 | 状态 | 行动 |
|---|---|---|
| 0-50% | 🟢 健康 | 正常迭代 |
| 50-100% | 🟡 风险 | 暂停非关键变更,优先稳定性 |
| >100% | 🔴 违约 | 所有变更暂停,触发 Incident |
4.4 多服务 SLO 层级
大型系统中 SLO 呈树状依赖,根服务 SLO 依赖下游服务 SLO 的叠加:
SLO 预算叠加原则:上游 SLO 必然严格于或等于下游 SLO。若支付服务 SLO(99.99%)比订单服务(99.9%)更严格,系统设计应保证支付库优先。
5. 运维数据集成模式
5.1 Push vs Pull 对比与选型
| 维度 | Pull 模式 | Push 模式 | 适用场景 |
|---|---|---|---|
| 典型协议 | Prometheus HTTP Scrape | OTLP gRPC / StatsD / Kafka | — |
| 采集控制 | 消费端控制节奏 | 生产者主动推送 | — |
| 扩展性 | 易水平扩展(增加 scrape target) | 生产者压力可控 | — |
| 实时性 | 取决于 scrape interval(默认 15s) | 可达亚秒级 | — |
| 盲区 | 新服务未注册前无法采集 | 无盲区(自动上报) | — |
| 本方案策略 | Prometheus 系列指标(已知服务) | OTLP / Kafka(动态/临时任务) | 混合策略 |
混合策略配置原则:
- 已知、长期运行的服务 → Pull(Prometheus Scrape),稳定可控
- 短期 Job、Serverless、Sidecar → Push(OTLP),避免盲区
- 事件类数据(Events) → Push via Kafka,保证不丢消息
5.2 实时 vs 批量处理矩阵
| 维度 | 实时流处理 | 微批次处理 | 定时批量处理 |
|---|---|---|---|
| 延迟 | < 1s | 1-60s | 分钟 ~ 小时级 |
| 典型工具 | Kafka + Flink / Kafka Streams | Spark Structured Streaming | Airflow / DolphinScheduler |
| 适用场景 | 故障检测、实时告警、即时响应 | 聚合分析、趋势计算、中等延迟需求 | 报表生成、容量规划、知识积累 |
| 本方案消费层 | 数据融合(实时流) | 智能感知聚合 | 知识进化历史积累 |
5.3 数据一致性模型选择
| 级别 | 保证 | 实现方式 | 适用场景 | 本方案应用 |
|---|---|---|---|---|
| At-least-once | 不丢,可能重复 | Kafka ACK=all + 消费位点记录 | 指标采集(重复可去重) | Metrics 数据流 |
| At-most-once | 不重复,可能丢 | 无 ACK 的 UDP / Raw TCP | 日志采样、监控代理本地缓存 | 日志采样降级 |
| Exactly-once | 不丢不重 | Flink Checkpoint + Kafka 事务 | 资金相关、计费指标(极少数) | 计费指标(极少数) |
5.4 采集延迟预算
每类数据有其最低可接受的延迟上限,超出则失去故障检测价值:
| 数据类型 | 延迟上限 | 超标后果 | 推荐采集间隔 |
|---|---|---|---|
| 业务关键指标(QPS/ErrorRate) | 10s | 故障发现延迟 > 10s | 10s |
| 基础设施指标(CPU/内存) | 30s | 容量问题发现滞后 | 15s |
| 日志(ERROR/FATAL) | 30s | 关键日志丢失 | 5s |
| 调用链 Trace | 60s | Trace 片段化 | 持续(采样率10-100%) |
| 变更事件 | 10s | 无法做变更关联分析 | 事件驱动推送 |
5.5 多云/混合云数据集成
| 场景 | 挑战 | 推荐方案 | 实施注意点 |
|---|---|---|---|
| 公有云 + 本地 IDC | 网络隔离、延迟高 | 本地部署 Collector Aggregate,压缩后跨网同步 | 带宽估算:指标< 10Mbps/集群 |
| 多区域 K8s 集群 | 集群间网络不通 | 每集群独立采集,Global View 聚合 Dashboard | 统一 metric label(region/cluster) |
| 边缘节点 | 资源受限、断网 | 本地缓冲(Bounded Queue)+ 断网续传 | 边缘 OTel Collector 内存限制 256MB |
| 跨云数据库 | 监控协议不统一 | 统一到 OTel Collector,通过 OTLP 转发 | DB Exporter 需单独部署 |