为 Telegraf 和 InfluxDB 添加对 Zipkin 和追踪的支持

导航至

为什么需要追踪?

每个人似乎都在采用微服务架构来支持其持续交付计划。与传统的单体架构相比,微服务架构允许您从一套小型模块化服务构建应用程序,这些服务作为独特的进程运行,允许您进行更改而不会影响整个应用程序。这令人兴奋,因为它允许更快更好地交付代码,但也增加了复杂性,因为几个独特且不同的服务可能是故障的原因,并且可能不清楚根本原因是什么。需要一种在微服务级别可视化生产系统的方法,以了解系统如何以及为何行为异常。

为了实现这一点,开发人员需要查看每个服务以及服务之间发生的错误,而一种新的方法是使用追踪。追踪允许您检测这些服务交互的整个路径。在没有追踪的情况下,开发人员必须查看每个进程的指标和日志来检测代码中的错误,然后尝试找出事物之间的关系以确定根本原因。并且服务变得越高级,以前简单的策略就变得复杂而乏味。 InfluxData 意识到需要简化微服务平台中的故障排除,并决定将追踪功能添加到 Zipkin Telegraf 插件中。

什么是追踪?

在我们深入研究插件之前,我们需要回顾一下什么是追踪。追踪或 trace 讲述了事务在分布式系统中传播的历程。它是“span”的有向无环图 (DAG)。在这些 span 中,有一些标识符提供有关特定 span 的信息。此类标识符包括 ID、名称、类型和持续时间,这些标识符有助于识别每个 span 之间的关系,从而创建追踪。追踪可以在许多情况下使用。通常,进程会在白天变慢,并且可能很难检测到持续时间突然变化的原因。追踪是跟踪延迟、分析、通信和其他错误的完美解决方案,通过识别根本原因。这是一个显示追踪内 span 之间关系的图表

Example of a trace

Zipkin

Zipkin 是一个分布式追踪系统。它有助于收集排除微服务架构中延迟问题所需的定时数据。它管理此数据的收集和查找。 Zipkin 的设计基于 Google Dapper 论文。 Zipkin 使用 Cassandra、MySQL 或 Elasticsearch 作为后端,我们想看看是否可以将数据存储在 InfluxDB 中。

我们如何实现追踪:作为 Zipkin Telegraf 插件

我们采用了 Zipkin 的数据结构,并将其实现到新的 InfluxData Telegraf 插件中。 Telegraf 插件旨在收集、处理和写入指标。此插件收集排除微服务架构中延迟问题所需的追踪和时间戳数据。因此,Zipkin 插件是一个包含的代码单元,它在后台运行 Zipkin http 服务器。它以 Zipkin 数据格式定期收集追踪客户端发送的 span,并将它们转换为 Telegraf 的内部数据格式。

然后,该插件将收集的数据写入 InfluxDB 数据库。 InfluxDB 接收来自 Telegraf 插件的行协议写入请求,并存储它们。然后我们可以使用 Jaeger 的 UI 可视化收集的数据。

这是一个说明此过程的图表

Telegraf & Jaeger process

配置

如果 Content-Type 分别为 application/jsonapplication/x-thrift,则插件接受 JSONthrift 格式的 span。如果未设置 Content-Type,则插件假定为 JSON 格式。

追踪

此插件使用 Annotations 标签和字段来跟踪来自 span 的数据

  • 追踪 (TRACE): 是一组共享单个根 span 的 span。追踪是通过收集共享 traceId 的所有 Span 构建的。
  • Span (SPAN): 是一组与特定 RPC 对应的 Annotations 和 BinaryAnnotations。
  • 注释 (Annotations): 对于 span 的每个注释和二进制注释,都会输出一个指标。记录请求开始和结束时的时间发生。

标签

  • "id": span 的 64 位 ID。
  • "parent_id": 与特定子 span 关联的 ID。如果没有子 span,则父 ID 设置为 ID。
  • "trace_id": 特定追踪的 64 位或 128 位 ID。追踪中的每个 span 都共享此 ID。高位和低位连接并转换为十六进制。
  • "name": 定义一个 span

字段

  • "duration_ns": span 结束和开始之间的时间,以纳秒为单位。

查询示例

获取服务 my_web_server 的所有 Span 名称

SHOW TAG VALUES FROM "zipkin" with key="name" WHERE "service_name" = 'my_web_server'

此查询返回一个列表,其中包含具有给定 service_namemy_web_server 的注释的 span 的名称。

未来计划

该插件目前通过 Telegraf 收集数据并将其存储在 InfluxDB 中,可以在 InfluxDB 中针对数据运行查询。然后可以使用 Jaeger 显示这些数据,Jaeger 是一个 OpenTracing 兼容的分布式追踪系统,其灵感来自 Dapper,用于监控基于微服务的架构。 InfluxData 将努力允许使用我们自己的 Chronograf 可视化工具进行追踪可视化。

InfluxData 的优势

其他分布式追踪系统结合了收集和用户界面,这是一个不错的功能,但当需要运行多个系统时就不是了。这会导致极高的基数,并使数据非常难以解释。 InfluxData 通过将收集和可视化分别分离到 Telegraf 和 Chronograf 中来解决此问题。两者都易于设置,并且几乎无需维护。

下一步

通过下载我们的开源软件免费设置 InfluxData,亲自体验这些优势。我们提供了详细的入门步骤来帮助您设置这个新插件,并将随时向您通报我们发布的关于此插件的新功能。