第40周:可观测性与故障诊断
目标:理解现代可观测性体系(Metrics、Logging、Tracing),能够为 L4 负载均衡器添加 per-packet 事件日志,并使用 eBPF 采集网络诊断信息。
1. 可观测性三大支柱
1.1 三个维度
1 | 可观测性(Observability)= 三个核心支柱 |
1.2 网络场景的可观测性
1 | 网络包的可观测性: |
2. 性能指标体系
2.1 关键指标
1 | // metrics.h — 指标定义 |
2.2 延迟测量
1 | // latency.h — 延迟测量(直方图) |
2.3 使用示例
1 | // 在主循环中测量 |
3. 日志系统
3.1 日志级别与格式
1 | // log.h — 分级日志 |
3.2 结构化日志(JSON)
1 | // 简单的 JSON 日志 |
3.3 高性能日志技巧
1 | 性能 vs 详细度: |
4. 全链路追踪(Tracing)
4.1 概念
1 | 分布式追踪(Dapper / OpenTracing / OpenTelemetry): |
4.2 包级追踪实现
1 | // tracing.h — 包级追踪 |
4.3 在 LB 中集成追踪
1 | void lb_process_with_trace(struct rte_mbuf *m, uint32_t trace_id) { |
4.4 专用 writer 线程
1 | // writer_thread.c — 后台写日志线程 |
5. eBPF 采集网络诊断信息
5.1 采集 TCP 重传
1 | // tcp_retrans.bpf.c — 跟踪 TCP 重传 |
5.2 采集 RTT
1 | // tcp_rtt.bpf.c — 跟踪 RTT |
5.3 RTT 估算
1 | # 使用 bpftrace 跟踪 RTT 分布 |
5.4 重传统计
1 | # 重传统计(5 秒间隔) |
6. 集成示例:L4 LB 详细日志
6.1 日志结构
1 | // packet_log.h — 包级日志 |
6.2 LB 主循环集成日志
1 | void lb_process_with_logging(struct rte_mbuf *m) { |
6.3 异步日志输出到 syslog
1 | // syslog.c — 异步发送日志到 syslog |
7. 监控与告警
7.1 告警阈值
1 | // alert.h — 告警阈值 |
7.2 Prometheus 集成
1 | // prometheus_exporter.c — 通过 HTTP 暴露指标 |
8. 故障排查技巧
8.1 常见故障
1 | LB 常见问题: |
8.2 排查工具
1 | # 实时观察 PPS |
9. 业界最佳实践
1 | 1. Metrics |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/05/19/第40周:可观测性与故障诊断/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!