1. 课程导论:为什么需要链路监控与告警联动,Jaeger与Prometheus生态概述

1.1 从单体到微服务:监控的断裂与重构

在单体应用时代,监控相对简单:一台或几台服务器,一个进程,日志、指标、健康检查基本能覆盖所有问题。但当架构演进为微服务、Serverless、服务网格后,一个用户请求可能穿越数十个服务节点、跨越多个数据中心、依赖不同的中间件和数据库。此时,传统的监控手段出现了三个核心断裂:

  • 调用链断裂:无法追踪一个请求在服务间的完整流转路径,故障定位如同大海捞针。
  • 指标与日志割裂:Prometheus 告诉你 CPU 飙高,但不知道是哪个请求导致的;ELK 告诉你日志报错,但不知道对整体延迟的影响。
  • 告警无上下文:收到一条“P99 延迟 > 500ms”的告警,却无法快速关联到具体的调用链、错误栈和上下游依赖。
核心痛点:没有链路追踪的告警是“盲人摸象”,没有告警驱动的链路追踪是“事后诸葛亮”。两者必须联动,才能形成可观测性的完整闭环。

1.2 为什么需要链路监控与告警联动?

链路监控(Distributed Tracing)与告警(Alerting)的联动,不是简单的“把两个工具拼在一起”,而是构建一种 事件驱动、上下文丰富、根因可追溯 的运维新范式。其核心价值体现在三个层面:

维度 传统分离模式 联动模式
故障发现 指标告警触发,人工登录多系统查日志和链路 告警自动携带 Trace ID,一键跳转至故障链路详情
根因定位 依赖经验猜测,平均定位时间(MTTR)以小时计 通过链路拓扑和 Span 标签,快速定位故障服务与代码行
容量规划 基于粗略的指标水位,容易过度或不足 基于真实请求链路的依赖关系和延迟分布,精准扩容
SLO 管理 仅监控服务级别指标,无法区分慢请求类型 按链路标签(如 API 版本、用户等级)细分 SLO 达成情况

简单来说,联动让告警从“告诉你系统病了”升级为“告诉你哪里病了、病因是什么、影响范围有多大”。

1.3 Jaeger 与 Prometheus 生态概述

本课程选择 Jaeger 和 Prometheus 作为核心技术栈,是因为它们分别是链路追踪和指标监控领域的事实标准,且拥有活跃的开源社区和丰富的集成能力。

1.3.1 Prometheus:指标监控与告警引擎

Prometheus 是一个开源的系统监控和告警工具包,其核心是 拉取(Pull)模型 和 多维数据模型。它通过定期从目标(Target)抓取指标数据,存储在本地时序数据库中,并通过 PromQL 查询语言进行聚合与分析。其告警能力由 Alertmanager 组件负责,支持分组、抑制、静默和路由到不同的接收器(如邮件、钉钉、PagerDuty)。

  • 核心优势:简单可靠、多维标签、强大的 PromQL、与 Kubernetes 原生集成。
  • 在联动中的角色:作为告警的“大脑”,负责定义告警规则(如延迟、错误率、饱和度),并在触发时发出包含上下文信息的告警通知。

1.3.2 Jaeger:分布式链路追踪系统

Jaeger 是受 Dapper 和 OpenZipkin 启发,由 Uber 开源并捐赠给 CNCF 的分布式追踪系统。它主要用于监控和排查微服务架构中的请求延迟和错误。Jaeger 的核心组件包括:

  • Agent(代理):作为 Sidecar 或 DaemonSet 运行,负责接收应用发出的 Span 数据并批量上报。
  • Collector(收集器):接收 Agent 或应用直推的 Span,进行校验、索引和存储。
  • Query(查询服务):提供 API 和 Web UI,支持按服务、操作、标签、时间范围检索 Trace。
  • Storage(存储后端):支持 Cassandra、Elasticsearch、Kafka 等,用于持久化 Span 数据。
关键概念:Trace(追踪)代表一个完整的请求链路,由多个 Span(跨度)组成。每个 Span 记录了一个服务或组件内的操作,包含开始时间、结束时间、服务名、操作名和标签(Tags)。

1.4 Jaeger 与 Prometheus 联动架构总览

下面的 SVG 图展示了本课程将要构建的联动架构。核心思路是:Prometheus 负责指标采集与告警,Jaeger 负责链路追踪与根因分析,两者通过告警中的 Trace ID 和标签进行关联。

Jaeger 与 Prometheus 联动架构总览 Jaeger 与 Prometheus 联动架构总览 微服务应用 Service A / B / C (嵌入 Jaeger Client) (暴露 /metrics) Prometheus 指标采集 & 存储 PromQL 查询 告警规则评估 Alertmanager 告警分组 & 路由 发送通知 (含 Trace ID) Jaeger Span 收集 & 存储 Trace 查询 & 分析 依赖拓扑图 运维人员 收到告警通知 点击 Trace ID 跳转 Jaeger UI 拉取 /metrics 触发告警 上报 Span 发送通知 查询 Trace 联动关键点: 1. 应用在暴露 Prometheus 指标的同时,将 Trace ID 作为标签(Label)注入到指标中。 2. Alertmanager 发送告警时,将 Trace ID 嵌入通知内容(如告警标题或链接)。

1.5 课程核心能力与学习路径

通过本课程,你将掌握以下核心能力:

  1. 独立部署与配置:在生产环境或开发环境部署 Jaeger 和 Prometheus 集群,并配置高可用存储。
  2. 应用接入与埋点:使用 Jaeger Client(如 Go、Java、Python SDK)对微服务进行无侵入或低侵入的链路埋点。
  3. 告警规则编写:基于 PromQL 编写针对链路延迟、错误率、吞吐量的告警规则,并配置 Alertmanager 路由。
  4. 联动集成开发:开发或配置中间件,实现告警通知自动携带 Trace ID,并支持一键跳转 Jaeger UI。
  5. 故障演练与排障:通过混沌工程注入故障,实战演练从告警触发到根因定位的完整流程。
  6. 生产级最佳实践:涵盖采样策略、存储优化、成本控制、多租户隔离等进阶话题。
前置要求:本课程假设你已具备基本的 Docker/Kubernetes 操作经验,了解微服务架构的基本概念,并熟悉至少一种编程语言(课程示例以 Go 和 Java 为主)。如果你对 PromQL 或 Jaeger 数据模型完全陌生,不用担心,我们会在前几章进行详细讲解。

1.6 本章小结