1. 可观测性工程导论

在传统运维语境里,我们习惯问:“系统还活着吗?”于是有了存活探针、端口检查和 CPU 使用率曲线。但在 Confluent Kafka 数据平台这类分布式流数据系统里,这个问题远远不够。真正棘手的是:“为什么这条订单事件延迟了 8 秒才到达下游?”“为什么消费者组突然开始反复 rebalance?”“为什么 broker 磁盘写入正常,端到端吞吐却掉了 40%?”回答这些问题,需要的不只是监控,而是可观测性。

可观测性(Observability)源自控制论:一个系统若能仅凭其外部输出,就推断出内部状态,则称其可观测。落到工程实践,它意味着:当系统没有按预期工作时,我们不必登录机器、重启服务或猜测,而是能通过系统自身产生的数据,提出新问题并逐步逼近根因。监控回答“已知的已知”,可观测性则支撑“未知的未知”。

三大支柱:指标、日志、追踪

可观测性通常由三类遥测数据支撑,它们不是三套独立工具,而是同一事实的三种投影。

  • 指标(Metrics):随时间变化的数值聚合,如 kafka_server_brokertopicmetrics_bytesin_total、消费者 lag、请求 P99 延迟。它便宜、可长期存储、适合告警和趋势判断,但维度有限,难以解释“为什么”。
  • 日志(Logs):离散事件的文本或结构化记录,如 broker 的 INFO [ReplicaManager]、Connect worker 的 task 失败堆栈、Schema Registry 的兼容性拒绝。它信息丰富、可携带上下文,但量大、成本高、跨服务关联困难。
  • 追踪(Traces):一次请求或一条消息在多个组件间的因果链路,由 trace ID 和 span 组成。在 Kafka 场景中,它可串起 producer → broker → consumer → 下游数据库的完整路径,直接回答“慢在哪一跳”。

三者的关系可以用一个判断逻辑来理解:指标告诉你“有异常”,追踪告诉你“异常发生在哪条链路”,日志告诉你“那一跳具体发生了什么”。缺少任何一根支柱,排障都会退化为盲人摸象。

Confluent Kafka 数据平台可观测性三支柱协同 指标定位异常 · 追踪锁定链路 · 日志解释根因 Producer 订单事件发送 Kafka Broker 分区/副本写入 Consumer 消费与处理 下游系统 数据库/数仓 指标 Metrics bytesIn / bytesOut / lag 请求 P99、ISR 收缩次数 作用:告警与趋势定位 追踪 Traces trace_id 贯穿生产到消费 span 记录每跳耗时与状态 作用:锁定慢链路与断点 日志 Logs broker / connect / SR 事件 错误堆栈、rebalance 原因 作用:解释具体根因 典型排障路径:指标发现 → 追踪定位 → 日志解释 例:consumer lag 突增(指标)→ 追踪显示 broker 到 consumer 跳延迟高(追踪) → 日志出现 “Rebalance due to session timeout”(日志)→ 定位为 GC 停顿导致心跳超时

在 Confluent Kafka 平台中的价值

Confluent 平台把 Kafka、Schema Registry、Connect、ksqlDB、Control Center 等组件组合成一条数据管道。可观测性在这里的价值非常具体:

  • 端到端延迟归因:一条消息从 producer 发出到写入下游,可能经过 broker 复制、Connect 转换、Schema 校验。只有追踪能把“8 秒”拆成“broker 0.2s + Connect 转换 0.3s + 下游写入 7.5s”。
  • 消费者健康判断:lag 指标能发现消费落后,但无法区分是消费逻辑慢、分区分配不均,还是 rebalance 风暴。日志中的 Rebalance 事件和追踪中的 poll 间隔才能给出答案。
  • Schema 变更影响评估:Schema Registry 的兼容性检查失败会直接阻断生产。指标反映失败率,日志给出具体不兼容字段,追踪则显示哪些应用受影响。
  • 容量与成本治理:指标用于判断分区是否倾斜、副本是否过多;日志用于识别异常重试;追踪用于发现不必要的跨集群调用。

挑战:为什么 Kafka 的可观测性更难

Kafka 的异步、分区、多副本特性,让可观测性面临几个独特挑战。

第一,异步解耦导致追踪断链。Producer 发送后并不等待消费者处理,消息在 broker 中停留的时间没有天然的请求上下文。要在 Kafka 中实现追踪,必须把 trace 上下文写入消息头(headers),由消费者提取后继续传播。若消息头被中间组件丢弃,链路就会断裂。

第二,分区与消费者组带来维度爆炸。一个 topic 可能有 200 个分区、30 个消费者实例。lag 指标如果只按 topic 聚合,会掩盖单分区热点;如果按分区展开,又会产生大量时间序列。合理的做法是分层:topic 级看趋势,partition 级看倾斜,consumer 级看实例健康。

第三,日志量大且噪声高。Broker 在高吞吐下每秒可产生数万条日志,其中大量是正常的副本同步和请求处理记录。若不加采样和结构化,排障时会被淹没。建议对 broker 日志按级别和 logger 分类,对 Connect 和 Schema Registry 保留结构化字段(如 connector、task、subject)。

第四,指标语义需要领域知识。UnderReplicatedPartitions 大于 0 不一定代表故障,可能是短暂的副本同步;RequestHandlerAvgIdlePercent 低才说明 broker 线程池吃紧。不理解这些语义,告警就会误报。

一个实用的起点:先为每个关键 topic 建立“黄金信号”看板——吞吐(bytesIn/bytesOut)、延迟(端到端 P99)、错误(生产/消费失败率)、饱和度(ISR 收缩、磁盘使用、线程池空闲)。这四类信号能覆盖大多数异常的第一现场。

从数据到判断:一个最小示例

假设某订单 topic 的消费者 lag 在 10:00 从 200 突增到 12000。按三支柱协同排查:

  1. 看指标:lag 增长的同时,consumer poll rate 下降,但 broker 的 bytesIn 正常,说明生产端没问题,问题在消费端。
  2. 看追踪:抽取一条 trace,发现 broker 到 consumer 的 span 耗时从 5ms 涨到 900ms,而 consumer 内部处理 span 只有 20ms,说明瓶颈在网络或消费者拉取阶段。
  3. 看日志:consumer 日志出现 Disconnected from node 3 和 Rebalance,broker 日志显示该节点网络抖动。根因是消费者与 broker 之间的连接不稳定,触发频繁 rebalance,导致消费停滞。

这个例子说明:指标负责“发现”,追踪负责“定位”,日志负责“解释”。三者缺一,排障就会变成猜测。可观测性工程的目标,就是让这条路径尽可能短、尽可能自动。

可观测性不是买一套 APM 工具,而是设计系统时就让指标、日志、追踪在关键路径上可采集、可关联、可查询。对 Confluent Kafka 平台而言,这意味着在 producer、broker、consumer、Connect、Schema Registry 各环节统一 trace 上下文、统一日志字段、统一指标命名,并围绕业务语义(如订单延迟)而非仅基础设施指标来组织看板。