前置知识: 云计算

可观测性

4 minIntermediate2026/6/14

可观测性三支柱:日志、指标、分布式追踪的原理、工具与实践详解。

1. 可观测性概述

1.1 三大支柱

支柱描述核心问题
日志 (Logs)离散事件记录发生了什么?
指标 (Metrics)聚合数值数据现在什么状态?
追踪 (Traces)请求链路追踪请求经过了哪里?

1.2 监控 vs 可观测性

对比项监控可观测性
方式预定义仪表盘探索式查询
问题已知问题未知问题
数据指标为主日志+指标+追踪
思维被动告警主动探索

2. 日志

2.1 日志级别

级别用途
ERROR错误,需要立即处理
WARN警告,可能的问题
INFO重要业务事件
DEBUG调试信息
TRACE详细追踪

2.2 结构化日志

{
  "timestamp": "2026-06-14T10:30:00Z",
  "level": "INFO",
  "service": "order-service",
  "trace_id": "abc123",
  "span_id": "def456",
  "message": "Order created",
  "user_id": "user-789",
  "order_id": "order-101",
  "duration_ms": 45
}

2.3 日志架构

应用 → Fluentd/Filebeat → Kafka → Logstash → Elasticsearch → Kibana

应用 → Fluent Bit → Loki → Grafana

2.4 ELK vs EFK vs PLG

组件特点
ELKElasticsearch + Logstash + Kibana功能全面、资源消耗大
EFKElasticsearch + Fluentd + KibanaFluentd 替代 Logstash
PLGPrometheus + Loki + Grafana轻量、与指标统一

3. 指标

3.1 指标

描述示例
Counter单调递增计数器请求总数、错误总数
Gauge可增可减的值当前连接数、内存使用
Histogram分布统计请求延迟分布
Summary分位数统计P50/P95/P99 延迟

3.2 Prometheus

数据模型

metric_name{label1="value1", label2="value2"} value timestamp

http_requests_total{method="GET", path="/api/users", status="200"} 1234

PromQL 查询

# 请求速率(每秒)
rate(http_requests_total[5m])

# P99 延迟
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

# 错误率
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])

# 按 service 分组
sum(rate(http_requests_total[5m])) by (service)

3.3 四大黄金信号

信号描述指标
延迟请求处理时间P50/P95/P99
流量请求量QPS
错误失败率Error Rate
饱和度资源使用率CPU/Memory/Disk

3.4 RED 方法

指标描述
Rate请求速率
Errors错误率
Duration请求延迟

3.5 USE 方法

指标描述
Utilization使用率
Saturation饱和度
Errors错误数

4. 分布式追踪

4.1 核心概念

概念描述
Trace一次请求的完整链路
Span链路中的一个操作
SpanContext跨进程传递的上下文
Baggage跨 Span 传播的键值对

4.2 OpenTelemetry

统一可观测性标准,合并了 OpenTracing 和 OpenCensus。

架构

应用 → OTel SDK → OTel Collector → 后端(Jaeger/Tempo/...)

代码示例

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter

# 配置
provider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="otel-collector:4317"))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

# 使用
tracer = trace.get_tracer("my-service")
with tracer.start_as_current_span("process-order") as span:
    span.set_attribute("order.id", "12345")
    # 业务逻辑

4.3 追踪后端

工具特点
JaegerCNCF 项目,功能全面
Zipkin老牌追踪系统
TempoGrafana 生态,对象存储
SkyWalkingAPM+追踪

5. 告警

5.1 告警原则

原则描述
可操作性每个告警都应有明确动作
避免噪音减少无效告警
分级P0-P3 分级
升级超时自动升级

5.2 AlertManager 配置

route:
  receiver: 'slack'
  group_by: ['alertname', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
    - match:
        severity: critical
      receiver: 'pagerduty'
      repeat_interval: 1h

receivers:
  - name: 'slack'
    slack_configs:
      - channel: '#alerts'
  - name: 'pagerduty'
    pagerduty_configs:
      - service_key: 'xxx'

6. 可观测性最佳实践

实践描述
关联三大支柱trace_id 贯穿日志、指标、追踪
语义约定使用 OpenTelemetry 语义约定
采样策略尾部采样保留异常请求
SLO/SLI定义服务等级目标和指标
仪表盘分层概览→服务→实例