分布式追踪
编辑分布式追踪
编辑分布式追踪使您能够在一个视图中分析整个微服务架构的性能。这是通过追踪所有请求实现的——从最初的 Web 请求到您的前端服务——以及对后端服务的查询。这使得查找应用程序中的潜在瓶颈变得更容易、更快。
Elastic APM 自动支持分布式追踪,但在下面概述的一些情况下,需要进行额外的设置。
真实用户监控 (RUM) 关联
编辑如果您的后端服务动态生成 HTML 页面,则必须在初始化 RUM 代理时将跟踪 ID 和父跨度 ID 注入到页面中。这确保了 Web 浏览器的页面加载显示为跟踪的根,并允许您分析在浏览器中花费的时间与在后端服务中花费的时间。
要启用 JavaScript RUM 代理,请将类似于此的代码片段添加到 HTML 页面的正文中,最好在其他 JavaScript 库之前。
elasticApm.init({ serviceName: 'my-frontend-app', // Name of your frontend app serverUrl: 'https://example.com:8200', // APM Server host pageLoadTraceId: '${transaction.traceId}', pageLoadSpanId: '${transaction.ensureParentId()}', pageLoadSampled: ${transaction.sampled} })
更多信息,请参见 transaction.ensureParentId()
.
自定义协议
编辑分布式追踪自动支持 HTTP/HTTPS。如果您使用其他协议,例如 TCP、UDP、WebSocket 或 Protocol Buffers,则必须遵循一些手动设置步骤。
在分布式追踪中,多个事务通过 traceparent
链接在一起。要创建您自己的分布式追踪,您必须将当前 traceparent
从发送服务传递到接收服务,并创建一个作为该 traceparent
子项的新事务。
- 在一个服务中,使用
apm.startTransaction()
启动事务,或使用apm.startSpan()
启动跨度。 - 使用
apm.currentTraceparent
获取已启动事务/跨度的序列化traceparent
字符串。 - 编码
traceparent
并将其作为常规请求的一部分发送到接收服务。 - 解码并在接收服务中存储
traceparent
。 - 使用
apm.startTransaction()
手动启动作为接收到的traceparent
子项的新事务。将traceparent
作为childOf
选项传入。
示例
编辑考虑您使用原始 UDP 在两个服务 A 和 B 之间进行通信的情况。
服务 A
服务 A 启动一个事务,并获取当前的 traceparent
。
agent.startTransaction('my-service-a-transaction') const traceparent = agent.currentTraceparent
然后,服务 A 将 traceparent
作为“标头”发送到服务 B。
// Pseudocode for sending data sendMetadata(`traceparent: ${traceparent}\n`)
服务 B
服务 B 从传入请求中读取 traceparent
。
// Pseudocode for reading incoming request const traceparent = readTraceparentFromUDPPacket()
服务 B 使用 traceparent
初始化一个作为原始 traceparent
子项的新事务。
agent.startTransaction('my-service-b-transaction', { childOf: traceparent })