一、数据管道可观测性概述

大家好,我是老张。做了这么多年数据工程,我越来越觉得——数据管道就像黑箱。数据进去了,能不能出来?什么时候出来?出来的是不是对的?这些问题,以前全靠猜。

可观测性,说白了就是给这个黑箱装上玻璃。让你能看清里面发生了什么。

1.1 什么是数据管道可观测性

先别急着背定义。我习惯这么理解:可观测性 = 你能问出任何关于系统状态的问题,并且立刻得到答案。

对于数据管道来说,可观测性意味着:

  • 我知道数据现在流到哪一步了
  • 我知道每一步花了多长时间
  • 我知道有没有数据丢失或重复
  • 我知道哪里出了问题,以及为什么

举个例子。有一次我在维护一个实时推荐管道,突然用户反馈推荐内容不更新了。如果没有可观测性,我得挨个查 Kafka 消费位点、Flink 作业状态、HBase 写入延迟……折腾两小时。但有了可观测性,我直接看仪表盘——哦,Kafka 某个分区积压了 10 万条消息。五分钟定位问题。

核心定义:数据管道可观测性是通过对管道内部状态的持续测量与可视化,实现对数据流转过程的理解、诊断与优化能力。

1.2 为什么需要可观测性

你想想看,现在的数据管道有多复杂?

  • 数据源可能有十几个:MySQL、Kafka、日志文件、API 接口……
  • 中间经过 ETL、清洗、聚合、特征工程……
  • 最终落到数仓、数据湖、在线服务里

任何一个环节出问题,下游全崩。我见过最惨的一次——某个离线管道跑了一整夜,第二天发现源表字段类型变了,所有数据都写成了 NULL。因为没有可观测性,没人发现,直接影响了当天的业务报表。

所以,可观测性解决三个核心痛点:

痛点 没有可观测性 有可观测性
故障定位 靠猜、靠日志翻、靠重启 一眼看到瓶颈和异常
数据质量 跑完了才发现数据不对 实时监控数据完整性
性能优化 不知道哪里慢 精确到每个算子的耗时

我曾经踩过的坑:有一次管道跑慢了,我以为是数据量大了,加资源、调并行度,折腾两天。后来才发现是某个下游服务限流了,每次请求等 3 秒。如果有可观测性,这个问题的追踪时间能从两天缩短到十分钟。

1.3 核心三支柱:日志、指标、追踪

聊可观测性,绕不开这三个东西。我习惯把它们比作侦探破案的三件套:

  • 日志 = 目击者的口供,详细但零散
  • 指标 = 案发现场的统计数据,宏观但不够细
  • 追踪 = 嫌疑人的行动轨迹,串联起整个过程

下面一个一个说。

1.3.1 日志(Logs)

日志是最传统的手段。每一条日志记录一个具体事件:什么时候、在哪台机器、发生了什么。

但日志有个问题——太多了。一个中等规模的管道,一天能产生几十 GB 日志。你不可能一条条看。所以日志的关键在于:

  • 结构化:用 JSON 格式,方便检索
  • 分级:ERROR、WARN、INFO、DEBUG,别什么都打 INFO
  • 上下文:带上请求 ID、任务 ID,方便关联
// 好的日志示例
{
  "timestamp": "2024-01-15T10:30:00Z",
  "level": "ERROR",
  "service": "etl-worker",
  "task_id": "task-12345",
  "message": "Failed to write to HBase",
  "error": "Connection timeout",
  "retry_count": 3
}

// 坏的日志示例
2024-01-15 10:30:00 ERROR: something went wrong

我的习惯:日志里一定要加 task_id 或 trace_id。没有这个,你根本没法把分散在多台机器上的日志串起来。

1.3.2 指标(Metrics)

指标是聚合后的数据。它不关心某一条记录,它关心整体趋势。

常用的指标类型:

  • 计数:处理了多少条数据、失败了多少条
  • 延迟:每条数据的处理耗时、端到端延迟
  • 饱和度:队列积压长度、CPU 使用率

指标的好处是轻量、实时。我一般用 Prometheus 采集,Grafana 展示。一个典型的仪表盘会包含:

指标名 类型 说明
records_processed_total Counter 累计处理记录数
processing_latency_seconds Histogram 处理延迟分布
queue_backlog Gauge 当前队列积压量

1.3.3 追踪(Traces)

追踪是三者里最年轻的,但也是最强大的。它记录一条数据从源头到终点的完整路径。

每条追踪由多个 Span 组成。一个 Span 代表一个操作单元,比如「从 Kafka 读取数据」「执行 SQL 转换」「写入 HBase」。

我举个例子。一条用户点击日志经过管道:

Trace ID: abc-123
├── Span: 接收 HTTP 请求 (耗时 2ms)
├── Span: 写入 Kafka (耗时 5ms)
├── Span: Flink 消费 (耗时 120ms)
│   ├── Span: 数据清洗 (耗时 30ms)
│   ├── Span: 特征计算 (耗时 70ms)
│   └── Span: 写出到 Redis (耗时 20ms)
└── Span: 返回响应 (耗时 1ms)

看到没?哪个环节慢,一目了然。我上次优化管道,就是靠追踪发现特征计算占了 70ms,进一步排查发现是一个 Python UDF 效率太低。换成 Java 实现后,直接降到 10ms。

1.4 三支柱的关系

这三者不是互相替代的,而是互补的。我画了张图来说明:

可观测性三支柱 日志 (Logs) 发生了什么? 指标 (Metrics) 整体趋势如何? 追踪 (Traces) 完整路径是什么? 三者结合 = 真正的可观测性 日志告诉你哪里错了 指标告诉你影响范围 追踪告诉你为什么会错 缺少任何一个,你都无法完整理解管道状态

你看这张图就明白了。日志告诉你「哪里错了」,指标告诉你「影响有多大」,追踪告诉你「为什么会错」。缺一个,你都无法完整理解管道状态。

我的建议:刚开始做可观测性,别贪多。先把指标做起来,再逐步加上日志结构化和分布式追踪。一口吃不成胖子。

1.5 本章小结

这一章我们聊了:

  • 可观测性是什么——给数据管道装玻璃
  • 为什么需要——故障定位、数据质量、性能优化
  • 三支柱——日志、指标、追踪,各有分工,缺一不可