分布式跟踪
编辑分布式跟踪编辑
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
可能包含比 traceparent
和 tracestate
更多的标头。如果服务器希望让浏览器发送原始请求,则响应应包含所有标头。
为了确保包含分布式跟踪中的所有组件,后端代理的采样率可能会受到 RUM 代理的采样率的影响。
后端代理兼容性编辑
从 5.0 版本开始,RUM 代理支持官方 W3C tracecontext traceparent
标头,而不是以前使用的 elastic-apm-traceparent
标头。使用下表确定我们的哪些版本的后端代理也支持官方 W3C tracecontext 标头。兼容的代理使用官方 tracecontext 规范来传播跟踪,因此可以与 RUM 代理 5.0 及更高版本一起用于分布式跟踪。
我们的后端代理将同时支持 traceparent
和 elastic-apm-traceparent
标头,直到它们各自的主要版本发布。因此,您可以在升级 RUM 代理之前安全地升级后端代理。
代理名称 | 代理版本 |
---|---|
Go 代理 |
>= |
Java 代理 |
>= |
.NET 代理 |
>= |
Node.js 代理 |
>= |
Python 代理 |
>= |
Ruby 代理 |
>= |
动态生成的 HTML编辑
如果您的后端服务动态生成 HTML 页面,则需要在初始化 RUM 代理时将跟踪 ID 和父跨度 ID 注入页面。这可确保 Web 浏览器的页面加载显示为跟踪的根。例如
var apm = initApm({ ... pageLoadTraceId: <trace-id>, pageLoadSpanId: <span-id>, pageLoadSampled: <is-sampled> })
pageLoadSpanId
应设置为后端事务的父 ID。大多数 Elastic APM 后端代理都提供提取此信息的方法。有关更多信息,请参阅相关代理的 API