概述
Jaeger 是用于追踪分布式服务之间事务的开源软件。它用来监控复杂的微服务环境并对其进行故障排除。
什么是分布式跟踪?
分布式跟踪是一种方法,用于查看和了解微服务间复杂交互中的整个事件链。
现代的云原生软件开发十分依赖微服务,因为每个独立的服务都提供不同的核心功能。当用户在应用中发出请求时,许多单独的服务都会做出响应,产生相应的结果。
应用中的一个调用可能会涉及几十项彼此交互的服务。当出现问题或某个请求变慢时,开发人员和工程师该如何查明问题所在?所以我们需要一种能跟踪所有连接的方法。
这就是分布式跟踪的意义所在。它通常是作为服务网格(管理和监控微服务的一种方式)的一部分运行。
Jaeger 使用分布式跟踪来了解不同微服务的请求路径。我们可以直观地看到调用流,无需凭猜测工作。
整理有序的事务信息对于调试和优化而言非常有用。Jaeger 内含的工具可用于监控分布式事务、优化性能和延迟,以及执行根本原因分析(RCA)(一种问题解决方法)。
Jaeger 的工作原理如何?
Jaeger 可收集、存储并直观显示分布式系统的“迹线”,让人们深入了解请求如何通过系统、时间用在了何处以及错误发生在何处。
Jaeger 将执行请求显示为一条条迹线(trace)。迹线代表系统中的数据/执行路径。
一条迹线包含一个或多个跨度(span)。跨度是 Jaeger 中作业的逻辑单元,如数据库查询或 HTTP 请求。每个跨度都由操作名称、开始时间和持续时间组成。跨度可以进行嵌套和排序。
Jaeger 的流程
Jaeger 的工作原理是:在分布式系统中跟踪某个操作的执行情况,并将特定例程分配给 Jaeger 的多个组件。
OpenTelemetry SDK 可用于任何编程语言,然后导出为 Jaeger 或其他跟踪平台能够理解的格式。
开始运行后,Jaeger 将遵循以下流程:
- Jaeger 跟踪首先对应用进行插桩处理。插桩可修改应用代码以生成迹线。可以使用适用于各种编程语言的 Jaeger 客户端库,手动进行插桩处理;也可以使用支持 OpenTracing 或 OpenTelemetry API 的中间件和框架,自动进行插桩处理。
- 应用运行时,迹线会提供跨微服务操作的详细执行路径。每条迹线由多个跨度组成,每个跨度包含操作名称、开始和结束时间等信息,以及提供其他上下文信息(如 HTTP 状态代码、错误消息)的键值对标记。
- 为了把跨度连接成一条·迹线,Jaeger 会将标识符和其他迹线上下文作为请求和响应的一部分在服务之间传递。这就是所谓的上下文传播。每个跨度和迹线都有一个唯一的 ID,这样就能把请求历程的各个部分拼凑在一起。
- 系统使用 Jaeger 客户端库收集跨度,然后发送给 Jaeger Agent,后者通常与应用一起部署,或在 Kubernetes 等环境中作为守护进程集部署。
- Jaeger Collector 从 Jaeger Agent 接收跨度,并将其存储到后端数据库中。Jaeger 支持 Elasticsearch、Cassandra 或 Google Cloud Bigtable 等多种存储选项,从而实现了迹线数据管理的可扩展性和灵活性。
- Jaeger Query 服务提供了一个 UI,可供用户搜索并直观显示迹线。借助 Jaeger UI,开发人员和操作人员可以探索各个迹线的详细信息,直观显示跨度层次结构和时间,并分析系统行为和性能。
- Jaeger Console 是一个用户界面,可直观显示分布式跟踪数据,以便深入了解:延迟问题、错误分析、依赖项分析和性能优化。
Jaeger 的用例
Jaeger 可通过分布式系统让您深入了解微服务和请求的行为。因此,它可以提供以下功能:
- 性能优化:Jaeger 可精准确定一系列微服务中出现延迟的位置,还能提供服务如何交互和相互依赖的可视化信息,帮助优化资源分配。
- 根本原因分析:Jaeger 迹线可以追溯服务故障或意外结果的起源,帮助快速解决问题。此外,Jaeger 还可以与监控系统集成,在出现异常模式(如延迟或错误率达到高峰)时向团队发出警报。
- 安全性和合规性:由于迹线显示了数据是如何通过系统的,因此可作为一种审查跟踪方式,这对于遵守有关数据处理的法规要求至关重要。
- 开发和测试:开发人员可以在本地环境中执行 Jaeger 跟踪,以便在部署应用之前检测错误、延迟和依赖项问题。
分布式跟踪和红帽
红帽® OpenShift® Observability 包含一系列综合全面的可观测性功能,旨在帮助用户深入了解其 OpenShift 应用和基础架构的性能与运行状况。红帽的可观测性堆栈的一项功能是分布式跟踪,直到 2024 年还包括 Jaeger。2024 年初,红帽弃用了 Jaeger 和 Elasticsearch,转为使用 Tempo Operator 和红帽版 OpenTelemetry。
红帽版 OpenTelemetry 可用于收集多种格式的迹线,不仅包括来自 Jaeger 客户端的迹线,还包括来自 Zipkin 和 OpenTelemetry Protocol(OTLP)的迹线。这只是个开始,因为这个收集器可用来收集所有可观测性信号。红帽最新发布的分布式跟踪包含多项增强功能。除了根据跨度自动生成指标外,它还能根据这些指标创建警报。为了帮助实现 Prometheus 堆栈集成,我们还在此版本中添加了 Target Allocator 组件,让客户能够轻松抓取 Prometheus 端点,并有效地进行管理和扩展。
Tempo 可作为 Jaeger 产品提供的分布式跟踪存储和可视化功能的即用型替代方案。它便于进行简单的本地部署以尝试分布式跟踪,或用于对不需要大量跟踪存储的部署以及大型部署进行快速故障排除。Tempo 仍包含 Jaeger 用户界面,确保迹线以流畅的可视化方式呈现。