在本文中,您将了解如何在本地运行 Jaeger,为什么以及何时应该这样做,以及 Jaeger 在本地运行时有哪些限制。

让我们从基础开始:分布式跟踪系统通常由客户端和后端组件组成。

我将简要介绍客户端组件,尽管这篇文章的大部分内容都是关于后端组件的。

客户端组件

客户端部分通常是安装在应用程序中的一组库,它们“检测”它——为服务内部运行时发生的每个有趣事件生成一个“span”对象。

一个现代且推荐的开源客户端 SDK 是OpenTelemetry。

仅在客户端上的跨度是没有意义的——它们需要可供使用它们的人访问。消费者通常是监控系统的开发运维团队或维护系统并添加新功能的开发人员。

跟踪用法

收集的跟踪数据可以通过多种方式使用并提供价值。这些是常见的:

  • Aggregate spans to trace — 将来自不同分布式服务的同一跟踪(逻辑操作)的一部分的所有跨度(事件)分组到单个实体中

  • 查询收集的数据(显示服务 X 中从端点GET /users开始的最后一小时内的所有跟踪)

  • 可视化数据——通常在图表或时间线中

  • 查找错误(异常、500 等)并调查其根本原因

  • 调查性能瓶颈

后端组件

为了满足上述要求,我们需要设置后端组件。

它们用于从客户端组件收集跨度、处理它们、将它们存储在数据库中、为数据和 UI 公开 API 以查看跟踪和执行查询。

Jaeger(一个CNCF毕业项目)是一个流行的开源项目,其后端组件可以做到这一点并且易于设置。

要在生产环境中使用 Jaeger,建议将其安装在具有负载平衡、自动缩放、复制和所有功能的云环境中。

但是,有时只需在轻量级和简单的设置中在本地运行它就足够了。

本地运行

在本地运行 Jaeger 后端的推荐方法是使用 docker:

$ docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 14250:14250 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.23

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

并在http://localhost:16686中访问 UI。

然后,您可以配置 Opentelemetry Client SDK 安装或OpenTelemetry Collector以使用 Jaeger 导出器并将跟踪数据发送到此本地 Jaeger。

import { NodeTracerProvider } from "@opentelemetry/node";
import { SimpleSpanProcessor } from "@opentelemetry/tracing";
import { JaegerExporter } from "@opentelemetry/exporter-jaeger";

const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(new JaegerExporter()));
provider.register();

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

(这是在 nodejs 中将数据导出到本地 jaeger 的样子)。

运行本地 Jaeger:好处

1\。更快的调试

如果您在服务代码库上工作(例如,修复错误、开发新功能或实现与其他服务/数据库/消息系统的集成等),您很可能会这样做:

  1. 在本地开发站上启动服务实例

  2. 向它发送流量以测试您的更改

  3. 验证您期望的行为

通过在本地检测它,您可以更快地调试开发问题。

例如:找到您的应用程序中发生错误的点,控制台日志记录较少,断点等。

[Jaeger 中的跟踪示例在以列表形式访问 Redis 密钥时显示错误](https://res.cloudinary.com/practicaldev/image/fetch/s--CIvEULSG--/c_limit%2Cf_auto% 2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7mbq1ax2y0mfkt887g2t.png)

在以列表形式访问 Redis 键时,Jaeger 中显示错误的跟踪示例(红色下划线不是 Jaeger UI 的一部分)

2\。运行测试

在本地运行您的集成测试套件时——如果测试失败,有时可以通过在 Jaeger UI 中检查它来更容易理解出了什么问题,您可以在其中查看以分层结构组织的突出显示的错误和事件。

3\。仪器开发

如果您正在编写一个新的检测库,那么在 UI 中观察跟踪输出可能比浏览文本日志要容易得多。您可以浏览JS 检测包以获取更多信息和示例。

运行本地 Jager:限制

Jaeger 是免费的,设置相对容易,并且可以很好地满足大多数基本设置和跟踪需求。

UI 和功能集非常基本,您可能很快就会发现自己需要更高级的功能。

其他替代品在以下情况下可以提供价值并提高开发效率:

1\。异步消息传递中缺乏端到端的可见性

使用异步消息传递系统时,通常有两种跟踪情况。

第一个是消息代理生成一个跟踪时。 Jaeger 在向我们展示这一痕迹方面做得很好。

第二种情况,常见于批处理场景,是消息代理(如 Kafka 和 AWS SQS)中的发送者和接收者生成多个跟踪(例如,每个接收开始一个新跟踪)。在这种情况下,Jaeger 将分别显示这些轨迹。这使得跟踪和调试复杂事务变得更加复杂。

更高级的后端可能有一个开箱即用的解决方案,并将检测到它并将这些跟踪合并到单个逻辑流中。

2\。跨环境跟踪

如果您的组织在生产环境中使用 Jaeger,假设您想使用 Jaeger 进行测试,那么将本地跟踪发送到生产环境 Jaeger 是非常不理想的。

它不仅会污染生产环境,而且在这个痕迹丛林中很难找到你的痕迹。通过在本地运行 Jaeger,您可以获得一个用于测试和开发的独立游乐场。

但是,这种情况下的一个主要缺陷是您本地的 Jaeger 将仅显示从本地开发站生成的跟踪的一部分。这意味着您失去了跟踪如何通信和影响下游和上游服务(即生产和登台)的上下文。

在这种情况下,_您将不会有一个孤立的本地开发会话,同时看到您的更改的全部效果_在不同的环境中。

3\。高级搜索

对所有数据或基于跟踪属性的自由文本搜索。例如,如果您想在特定跟踪中搜索有效负载中的令牌。

4\。跟踪数据处理和洞察

Jaeger 呈现原始轨迹并突出显示错误,然而,仅基于该数据生成见解并非微不足道且相当复杂。

此类见解的示例可以是 API 重大变更检测、基于结构的跟踪聚合、跟踪中的参数旅程、依赖性分析、与生产或登台的基线比较等。

5\。增强的用户界面

Jaeger UI 在一个长列表中枚举一个跨度的所有属性。它不会对相关数据进行分组或组织,不会在树中显示 JSON 内容,不会突出显示 HTTP 状态代码等常见数据以及其他让我们的生活更轻松的好东西。

底线

运行本地 Jaeger 有很大的好处。它易于设置,当涉及到更快的调试和运行测试时,您可以获得在本地工作时可能需要的额外信心。

Jaeger 是一个很棒的工具,可以很好地满足您的基本跟踪需求。

但是,当您的服务工作变得有点复杂,或者当您想在本地工作时将工作效率提升到一个新的水平时,您可能希望考虑其他替代方案。

如果我上面提到的限制对您来说是一个交易破坏者(如果不是现在,它们可能会在未来出现),那么市场上有几个供应商,提供各种解决方案来增强您的基于跟踪的工作流程。 Aspecto 可以帮助您克服所有这些问题。

Aspecto为您提供 Jaeger 所获得的一切,但具有增强的 UI、搜索和故障排除功能,用于本地开发和调试。[开始]((https://www.aspecto.io/?utm_source=dev.to&utm_medium=post&utm_campaign=why-and-how-to-run-jaeger-locally)需要 2 分钟,它是免费的并且基于 OpenTelemetry。将其视为 Jaeger 和 Chrome DevTools 的融合,用于您的分布式应用程序。

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐