分布式跟踪已成为基于微服务架构中应用程序性能监控的关键。 Jaeger 是一种流行的用于分布式跟踪的开源工具。通过分布式跟踪,工程团队可以集中了解用户请求如何跨多个服务执行。

什么是积家?

Jaeger 是一个开源分布式跟踪工具,用于监控分布式系统中的事务并对其进行故障排除。它由 Uber 的团队构建,然后于 2015 年开源。Jaeger 也是云原生计算基金会的研究生项目。

在微服务架构中,您可以使用 Jaeger 跨多个服务跟踪事务。跨不同服务跟踪事务的过程称为分布式跟踪。

Jaeger 是一款出色的分布式跟踪开源工具。但是为了有效解决生产问题,工程团队需要度量和跟踪。SigNoz是一个全栈开源工具,为指标和跟踪提供统一的 UI。

SigNoz GitHub repo

什么是分布式跟踪?

在微服务的世界里,一个用户请求在为用户提供他们需要的东西之前要经过数百个服务。为了使业务具有可扩展性,工程团队负责特定的服务,而不了解系统整体的性能。这就是分布式跟踪出现的地方。

[微服务架构](https://res.cloudinary.com/practicaldev/image/fetch/s--G8Vee_gt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/img /blog/2021/09/jaeger_vs_zipkin_microservices_architecture.png)

一个虚构的电子商务应用程序的微服务架构

分布式跟踪可让您深入了解特定服务在分布式软件系统中作为整体的一部分是如何执行的。分布式跟踪涉及两个基本概念:Spanstrace context

用户请求被分解为跨度。

什么是跨度?

跨度表示跟踪中的单个操作。因此,它表示由单个服务完成的工作,可以根据用例进一步分解。

当请求在服务之间传输时,跟踪上下文会被传递,它跟踪跨服务的用户请求。因此,您可以查看用户请求如何跨服务执行,并确定您需要关注的具体内容,而无需手动切换多个仪表板。

[跟踪上下文被传递以跟踪跨服务的用户请求](https://res.cloudinary.com/practicaldev/image/fetch/s--ZXTMH1wS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/ https://signoz.io/img/blog/2021/09/opentelemetry_distributed_tracing-min.png)

当用户请求从一个服务传递到另一个服务时,会传递一个跟踪上下文

Jaeger如何实现分布式追踪?

分布式跟踪工具有四个关键组件。这些组件一起将事务捕获到跨度中,然后关联这些跨度以形成跟踪。

分布式跟踪工具的四个关键组件是:

  • 仪表

  • 数据管道

  • 后端存储

  • Web UI/可视化

[Jaeger 架构](https://res.cloudinary.com/practicaldev/image/fetch/s--sPD4rjIu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/img /blog/2021/09/Jaeger_architecture-min.jpg)

积家架构(来源:积家网站)

让我们详细了解这些组件是什么,以及这些组件如何组合在一起来监控微服务架构。

仪表

什么是仪器?

检测是从应用程序代码生成遥测数据(日志、指标和跟踪)的过程。它本质上是编写代码,使您的应用程序代码能够发出遥测数据,以后可以使用这些数据来调查问题。

大多数分布式跟踪工具提供客户端库、代理和 SDK 来检测应用程序代码。 Jaeger 的检测客户端库基于OpenTracing APIs

OpenTracing 是一个开源项目,旨在为分布式跟踪提供供应商中立的 API 和工具。后来它被合并到OpenTelemetry。 Jaeger 拥有以下语言的官方客户端库:

  • 爪哇

  • 节点.js

  • 蟒蛇

  • C++

  • C#

检测服务时,它会为传入事务生成跨度并将跟踪上下文附加到传出事务。

数据管道

在客户端库的帮助下收集到跟踪数据后,可以直接将其发送到存储后端进行存储和可视化。但是,随着应用程序的扩展,拥有用于数据缓冲的跟踪管道是一个很好的做法。该管道支持以多种格式接收数据、操作、批处理、索引和排队。

Jaeger 提供 Jaeger 收集器,如架构图中所示。收集器在存储跟踪数据之前验证跟踪、索引它们并执行任何转换。

后端存储

Jaeger 附带用于测试设置的简单内存存储。 Jaeger 支持两种流行的开源 NoSQL 数据库作为跟踪存储后端:

  • 卡桑德拉

  • 弹性搜索

Web UI/可视化

在分布式跟踪方面,Jaeger 的 UI 基本但全面。

在 Jaeger 中实现分布式跟踪 - 示例应用程序

HotRod 应用示例

示例 HotRod 应用程序是一个演示拼车应用程序。它显示了四个位置,通过单击一个位置,您可以叫车到该位置。

[HotRod 应用程序 webUI](https://res.cloudinary.com/practicaldev/image/fetch/s--xQTlLmji--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://signoz.io/ img/blog/2021/09/hotrod_application_ui-min.jpg)

HotRod 应用程序 webUI

示例 HotRod 应用程序是一个演示拼车应用程序。它显示了四个位置,通过单击一个位置,您可以叫车到该位置。

[后端响应](https://res.cloudinary.com/practicaldev/image/fetch/s--DYdrm61T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/img /blog/2021/09/hotrod_app_customer_call-min.jpg)

当您单击客户按钮时,后端会以车牌号和 ETA 进行响应

开始使用 Jaeger 分布式跟踪的步骤

为了了解 Jaeger 如何用于分布式跟踪,让我们运行演示应用程序 HotRod 并使用 Jaeger 查看它的跟踪。

使用 Jaeger 运行 HotRod 应用程序的步骤:

  1. 运行 Jaeger 的推荐方式是使用 Docker 镜像。如果您没有安装 docker,请从官方 Docker 网站安装。

  2. HotRod 应用是用 Go 实现的,所以需要install Go。

  3. 使用以下命令将 Jaeger 后端作为一体化 Docker 映像运行:

   docker run -d -p6831:6831/udp -p16686:16686 jaegertracing/all-in-one:latest

进入全屏模式 退出全屏模式

容器启动后,您将能够通过http://localhost:16686/search访问 Jaeger 的 UI

  1. 在本地克隆 Jaeger 的 GitHub 仓库并更改目录
   git clone https://github.com/jaegertracing/jaeger.git
   cd jaeger

进入全屏模式 退出全屏模式

  1. 运行示例 HotRod 应用程序
   go run ./examples/hotrod/main.go all

进入全屏模式 退出全屏模式

您将能够通过http://127.0.0.1:8080/访问应用程序 UI

要查看 Jaeger 上的跟踪,我们需要生成一些负载。多次点击不同的位置。当您现在访问 Jaeger UI 时,您可以找到服务列表及其在 Jaeger 上捕获的跟踪。

[Jaeger UI](https://res.cloudinary.com/practicaldev/image/fetch/s--B_Y1Mk8y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz.io/img /blog/2021/09/distributed_tracing_jaeger_reporting-min.jpg)

Jaeger 仪表盘上报告的 HotRod 应用程序的服务列表

Jaeger 还通过跟踪请求如何流动并在仪表板中显示它来创建依赖关系图。从依赖关系图中,我们可以看到 HotRod 应用程序有四个微服务和两个数据库。

[Jaeger 依赖图](https://res.cloudinary.com/practicaldev/image/fetch/s--UdtAUY-I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/signoz. io/img/blog/2021/09/jaeger_dependency_graph-min.jpg)

Jaeger 显示了映射您的服务的依赖关系图

使用 Jaeger 作为分布式跟踪工具的限制

Jaeger 是分布式跟踪的首选。但工程团队需要的不仅仅是跟踪来快速解决问题。他们需要访问指标和跟踪。响应时间、错误率、请求率和 CPU 使用率等指标对于了解应用程序性能同样重要。

使用 Jaeger 作为分布式跟踪工具的几个关键挑战如下:

  • 仅提供跟踪数据。您将不得不使用另一个工具来进行指标和日志管理。

  • Jaeger 支持的数据库需要主动维护。

  • Jaeger 的 Web UI 受限于基本的可视化。

对于快速发展的工程团队,您需要能够推动快速洞察和解决问题的仪表板。这就是SigNoz出现的地方。对于微服务中的分布式跟踪,它是 Jaeger 的绝佳替代品。

SigNoz - 分布式跟踪的 Jaeger 替代方案

SigNoz 是一个全栈开源应用程序性能监控和可观察性工具,可以用来代替 Jaeger。 SigNoz 旨在原生支持 OpenTelemetry。 OpenTelemetry 正在成为生成和维护遥测数据(日志、指标和跟踪)的世界标准。

SigNoz 可以用作微服务架构的分布式跟踪工具。

SigNoz 还在数据存储方面为用户提供了灵活性。您可以在安装 SigNoz 时选择 ClickHouse 或 Kafka + Druid 作为后端存储。两者都是经过行业验证且高度可扩展的数据库。

[带有 OpenTelemetry 和 ClickHouse 的 SigNoz 架构](https://res.cloudinary.com/practicaldev/image/fetch/s--6BdjoEB__--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:/ signoz.io/img/blog/2021/09/SigNoz_architecture_clickhouse.png)

以 ClickHouse 作为存储后端和 OpenTelemetry 用于代码检测的 SigNoz 架构

SigNoz 带有开箱即用的可视化功能,例如 RED 指标。

[SigNoz UI 显示流行的 RED 指标](https://res.cloudinary.com/practicaldev/image/fetch/s--OKFqZ_PP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// signoz.io/img/blog/common/signoz_charts_application_metrics.png)

SigNoz UI 显示应用程序概览指标,例如 RPS、50th/90th/99th Percentile 延迟和错误率

您还可以使用火焰图来可视化跟踪数据的跨度。所有这些都来自 SigNoz 的开箱即用。

[用于在 SigNoz UI 中可视化分布式跟踪范围的火焰图](https://res.cloudinary.com/practicaldev/image/fetch/s--FOoIlefK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880 /https://signoz.io/img/blog/common/signoz_flamegraphs.png)

显示每个跨度的确切持续时间的火焰图 - 分布式跟踪的概念

SigNoz 可以帮助您跟踪的一些事情:

  • 应用程序概览指标,例如 RPS、50th/90th/99th Percentile 延迟和错误率

  • 应用程序中最慢的端点

  • 查看确切的请求跟踪以找出下游服务中的问题、缓慢的数据库查询、调用第三方服务(如支付网关等)

  • 按服务名称、操作、延迟、错误、标签/注释过滤跟踪。

  • 对跟踪数据运行聚合

  • 指标和跟踪的统一 UI

你可以在这里查看 SigNoz 的 GitHub 存储库👇

SigNoz GitHub repo

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐