Trace
背景
分布式追踪,更常被称为 Trace,记录请求(由应用程序或最终用户发出)在多服务架构(如微服务和无服务器应用程序)中传播所经过的路径。如果没有追踪,很难查明分布式系统中性能问题的原因。它可以提高我们的应用程序或系统健康状况的可见性,并让我们调试难以在本地重现的行为。追踪对于分布式系统至关重要,这些系统通常具有不确定的问题或过于复杂而无法在本地重现。 追踪通过分解请求在分布式系统中流动时发生的事情,从而降低了调试和理解分布式系统的难度。一个 Trace 由一个或多个 Span 组成。第一个 Span 代表 Root Span。每个 Root Span 代表从开始到结束的请求。父 Span 下面的 Span 提供了更深入的上下文,说明请求期间发生的事情(或构成请求的步骤)。许多可观测性后端将 Trace 可视化为瀑布图,可能看起来像这张图片。
瀑布图显示了 Root Span 与其子 Span 之间的父子关系。当一个 Span 封装另一个 Span 时,这也代表了一种嵌套关系。 最近 SR 添加了一个追踪框架。它利用 opentelemetry 和 jaeger 来追踪系统中的分布式事件。
- Opentelemetry 是一个检测/追踪 SDK。开发人员可以使用它来检测代码并将追踪数据发送到可观测性后端。它支持多种语言。我们在 SR 中使用 java 和 CPP SDK。
- 目前,Jaeger 被用作可观测性后端。
基本用法
在 SR 中启用追踪的步骤
decster@decster-MS-7C94:~/soft/jaeger-1.31.0-linux-amd64$ ll
total 215836
drwxr-xr-x 2 decster decster 4096 02-05 05:01:30 ./
drwxrwxr-x 28 decster decster 4096 05-18 18:24:07 ../
-rwxr-xr-x 1 decster decster 19323884 02-05 05:01:31 example-hotrod*
-rwxr-xr-x 1 decster decster 23430444 02-05 05:01:29 jaeger-agent*
-rwxr-xr-x 1 decster decster 51694774 02-05 05:01:29 jaeger-all-in-one*
-rwxr-xr-x 1 decster decster 41273869 02-05 05:01:30 jaeger-collector*
-rwxr-xr-x 1 decster decster 37576660 02-05 05:01:30 jaeger-ingester*
-rwxr-xr-x 1 decster decster 47698843 02-05 05:01:30 jaeger-query*
decster@decster-MS-7C94:~/soft/jaeger-1.31.0-linux-amd64$ ./jaeger-all-in-one
- 配置 FE&FE 以启用追踪。目前,opentelemetry java & cpp sdk 使用不同的协议,java 使用 grpc proto,而 cpp 使用 thrift&UDP,因此端点端口不同。
fe.conf
# Enable jaeger tracing by setting jaeger_grpc_endpoint
# jaeger_grpc_endpoint = https://:14250
be.conf
# Enable jaeger tracing by setting jaeger_endpoint
# jaeger_endpoint = localhost:6831
- 打开 jaeger web UI,通常在
https://:16686/search
- 进行一些数据摄取(streamload/insert into)并在 web UI 上搜索 TXN traces
(trace_pic2.png)
(trace_pic3.png)
添加 traces
- 要添加 trace,首先熟悉 tracer、span、trace 传播等基本概念,请阅读 observability primer
- 阅读实用程序类及其在 SR 中的用法:TraceManager.java(java)
common/tracer.h/cpp (cpp)
,它当前的用法(例如写入 txn(load/insert/update/delete) trace,以及它到 BE 的传播)。 - 添加您自己的 trace