分布式跟踪编辑

Elastic APM 支持分布式跟踪,通过跟踪所有请求(从对前端服务的初始 Web 请求到对后端服务的查询),使您能够在一个视图中分析整个微服务架构的性能。

启用跨域请求编辑

默认情况下,RUM 代理中启用了分布式跟踪,但它只包含对同一来源的请求。为了包含跨域请求,您必须设置 distributedTracingOrigins 配置选项。

例如,考虑一个从以下位置提供服务的应用程序:https://example.com。默认情况下,对 https://example.com 发出的所有 HTTP 请求都将包含在跟踪中。要同时包含对以下位置发出的请求:https://api.example.com,您需要添加以下配置

var apm = initApm({
  ...
  distributedTracingOrigins: ['https://api.example.com']
})

这有效地告诉代理将分布式跟踪 HTTP 标头 (traceparent) 添加到对 https://api.example.com 发出的请求中。

传播 Tracestate编辑

Tracestate 可用于跨不同的跟踪系统提供额外的供应商特定跟踪信息,并且是 traceparent 字段的配套标头。

默认情况下,RUM 代理不会将 tracestate HTTP 标头传播到配置的来源。但是,用户可以通过启用 propagateTracestate 标志来更改该行为,该标志有效地将 tracestate HTTP 标头添加到配置的来源。截至今天,只有采样决策通过 tracestate 标头传播。然后,APM 服务器和 UI 使用此信息来计算服务指标,如分布和吞吐量(服务地图)。

分布式跟踪标头(traceparent 和 tracestate)仅附加到 API 调用。要查看来自后端服务的完整跟踪,请参阅 动态生成的 HTML。要详细了解跨域请求以及为什么需要此过程,请参阅 MDN 页面上的 跨域资源共享

服务器配置编辑

RUM 代理只是分布式跟踪中的一个组件,因此您必须正确配置其他组件才能使用分布式跟踪。在上面的示例中,您需要确保 https://api.example.com 可以响应包含分布式跟踪标头的请求。具体来说,https://api.example.com 将收到一个包含以下标头的 OPTIONS 请求

Access-Control-Request-Headers: traceparent, tracestate
Access-Control-Request-Method: [request-method]
Origin: [request-origin]

并且应该使用以下标头进行响应

Access-Control-Allow-Headers: traceparent, tracestate
Access-Control-Allow-Methods: [allowed-methods]
Access-Control-Allow-Origin: [request-origin]

Access-Control-Request-Headers 可能包含比 traceparenttracestate 更多的标头。如果服务器希望让浏览器发送原始请求,则响应应包含所有标头。

为了确保包含分布式跟踪中的所有组件,后端代理的采样率可能会受到 RUM 代理的采样率的影响。

后端代理兼容性编辑

从 5.0 版本开始,RUM 代理支持官方 W3C tracecontext traceparent 标头,而不是以前使用的 elastic-apm-traceparent 标头。使用下表确定我们的哪些版本的后端代理也支持官方 W3C tracecontext 标头。兼容的代理使用官方 tracecontext 规范来传播跟踪,因此可以与 RUM 代理 5.0 及更高版本一起用于分布式跟踪。

我们的后端代理将同时支持 traceparentelastic-apm-traceparent 标头,直到它们各自的主要版本发布。因此,您可以在升级 RUM 代理之前安全地升级后端代理。

代理名称 代理版本

Go 代理

>= 1.6

Java 代理

>= 1.14

.NET 代理

>= 1.3

Node.js 代理

>= 3.4

Python 代理

>= 5.4

Ruby 代理

>= 3.5

动态生成的 HTML编辑

如果您的后端服务动态生成 HTML 页面,则需要在初始化 RUM 代理时将跟踪 ID 和父跨度 ID 注入页面。这可确保 Web 浏览器的页面加载显示为跟踪的根。例如

var apm = initApm({
    ...
    pageLoadTraceId: <trace-id>,
    pageLoadSpanId: <span-id>,
    pageLoadSampled: <is-sampled>
})

pageLoadSpanId 应设置为后端事务的父 ID。大多数 Elastic APM 后端代理都提供提取此信息的方法。有关更多信息,请参阅相关代理的 API