引言:从监控到可观测性的范式跃迁
传统监控(Monitoring)回答的是"已知问题是否发生了",而可观测性(Observability)回答的是"为什么会发生意想不到的问题"。在微服务、容器化和Serverless架构中,系统的复杂度指数级增长——一个用户请求可能横跨数十个服务、数百个容器实例,仅依赖CPU/内存等指标已无法定位故障根因。云原生可观测性围绕三大支柱构建:日志(Logs)、指标(Metrics)、链路追踪(Traces),并在OpenTelemetry项目推动下走向统一化。
1. 三大支柱的协同与差异
1.1 日志(Logs)
日志是离散事件的时间序列记录,具有高维度和高基数的特点。典型日志包括:
- 应用日志:请求处理、异常堆栈、业务事件
- 系统日志:内核事件、容器运行时事件、编排器事件
- 审计日志:安全合规相关的操作记录
结构化日志(如JSON格式)已成为最佳实践,包含trace_id、span_id字段以实现与分布式追踪的关联。
1.2 指标(Metrics)
指标是可聚合的数值时间序列,通常携带少量标签(维度)。四类核心指标:
- Counter:只增不减(如请求总数、错误总数)
- Gauge:可增可减(如CPU使用率、连接数)
- Histogram:分布统计(如P99延迟、响应时间分布)
- Summary:客户端分位数计算
RED率(Rate-Errors-Duration)和USE法(Utilization-Saturation-Errors)是两个经典的指标选择框架。
1.3 链路追踪(Traces)
链路追踪记录单个请求在分布式系统中的完整传播路径。核心概念:
- Span:一个工作单元,包含操作名、时间戳、标签和事件
- Trace:由根Span及其所有子Span构成的有向无环图(DAG)
- 因果关系:父子Span通过trace_id和parent_span_id关联
W3C Trace Context规范定义了标准的HTTP头传播:traceparent和tracestate。
2. OpenTelemetry:统一可观测性标准
2.1 架构概览
OpenTelemetry(OTel)是CNCF毕业的可观测性框架,由以下组件构成:
- API:语言特定的埋点接口,无副作用(无导出器时退化为No-Op)
- SDK:API的实现,负责采样、批处理、导出
- Collector:无状态代理,接收-处理-导出遥测数据
- 语义约定(Semantic Conventions):跨语言的统一命名规范
2.2 Collector的管道设计
OTel Collector的核心抽象是Pipeline,由Receivers-Processors-Exporters三段流式连接:
- Receivers:接收数据(OTLP gRPC/HTTP、Prometheus、Jaeger、Fluent Forward等)
- Processors:处理数据(批处理、采样、过滤、转换、内存限制)
- Exporters:输出数据(OTLP到后端、Kafka、文件、Logging调试)
2.3 采样策略
全量采样在生产环境不可行,常见策略:
- Head采样:在Trace根节点即时决定是否采样,一致性但可能漏掉慢请求
- Tail采样:在Trace完整收集后按条件筛选(如错误率、延迟阈值),资源消耗高但精准
- Probabilistic采样:按固定概率随机采样,实现简单但长尾问题覆盖率低
3. Prometheus + Grafana指标监控实战
3.1 Prometheus数据模型
Prometheus使用多维时间序列模型:metric_name{label1="value1", label2="value2"} timestamp value
四种指标类型的用途:
- http_requests_total(Counter):HTTP请求总数,增长速率即QPS
- http_request_duration_seconds(Histogram):延迟分桶统计
- node_memory_available_bytes(Gauge):可用内存字节数
3.2 PromQL查询语言
Prometheus的查询语言支持即时向量、范围向量、偏移量和子查询:
# 计算HTTP请求的5分钟平均QPS
rate(http_requests_total[5m])
# 计算P99延迟
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
# 错误率占比
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
3.3 高可用性与长期存储
Prometheus的联邦(Federation)和多副本部署(HA Pair)解决了单点问题。Thanos和Cortex提供了:
- 全局查询视图(跨多集群)
- 对象存储(S3/GCS)上的低成本长期存储
- 降采样(Downsampling)机制,久远数据降低精度以节省存储
4. Jaeger与分布式追踪的实现原理
Jaeger基于Google Dapper论文设计,核心组件:
- Agent:本地Daemon,接收UDP Span并转发
- Collector:接收、验证、转换、存储Span数据
- Query:查询服务接口
- UI:前端可视化界面
存储后端选择:
- Elasticsearch:全文检索能力强,适合大规模部署
- Cassandra:高写入吞吐,写入优化存储引擎
- Badger/Memcached:轻量级方案,适合开发环境
5. eBPF驱动的无侵入可观测性
eBPF(Extended Berkeley Packet Filter)允许在内核中运行沙箱程序,实现无Agent的自动观测:
- Pixie:自动采集HTTP/gRPC/MySQL/Postgres等协议指标
- Cilium Hubble:网络层可观测,暴露L7协议级别的流量信息
- Falco:运行时安全检测,基于系统调用分析异常行为
- Parca:持续CPU profiling,采样生产环境进程的低频性能数据
传统Agent方案面临语言绑定、性能开销、版本维护等问题,eBPF的零侵入+内核级视角代表了可观测性技术的下一个前沿。
6. 实战:构建统一可观测性平台
推荐的生产级技术栈组合:
- 可观测性框架:OpenTelemetry(统一API层)
- 指标:Prometheus + Cortex/Thanos(长期存储)
- 日志:Loki(对象存储后端)+ Promtail(Agent采集)
- 追踪:Jaeger(ES后端)或 Tempo(对象存储后端)
- 可视化:Grafana(统一仪表盘)
- eBPF无侵入:Pixie/Cilium Hubble(补充盲区)
三者关联的关键是使用统一的exemplar机制:Trace后端自动从指标中的Exemplar字段关联到对应Trace实现指标到追踪的一跳跳转。
结语
云原生可观测性是一个持续演进的领域。从三大支柱各自的独立工具链,到OpenTelemetry的统一抽象,再到eBPF带来内核级可视化,可观测性的粒度越来越细、视角越来越全。最终目标不是收集数据,而是通过关联日志、指标和追踪,实现从"发现问题"到"定位根因"的分钟级闭环。

发表评论 取消回复