分布式追踪

编辑

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 获取更多信息