OpenTracing 桥接
编辑OpenTracing 桥接
编辑OpenTracing 已停止维护,建议使用 OpenTelemetry。此 Elastic APM OpenTracing 桥接已弃用。请考虑使用OpenTelemetry 桥接代替。
Elastic APM OpenTracing 桥接允许使用 OpenTracing API 创建 Elastic APM 事务和跨度。换句话说,它将对 OpenTracing API 的调用转换为 Elastic APM,从而允许重用现有的检测。
有关 OpenTracing 的更多信息,请参阅 OpenTracing 网站。
先决条件
编辑Elastic APM Node.js Agent 的 OpenTracing 支持通过一个名为 elastic-apm-node-opentracing
的单独模块提供。
此模块要求单独安装 Elastic APM Node.js Agent。要确保将这两个依赖项都添加到应用程序中,请按如下方式安装它们
npm install elastic-apm-node elastic-apm-node-opentracing --save
OpenTracing 与 Elastic APM 术语
编辑Elastic APM 区分事务和跨度。在 OpenTracing 的上下文中,事务可以被视为一种特殊的跨度。
由于 OpenTracing 本身只有跨度的概念,因此 Elastic APM OpenTracing 桥接将在幕后自动创建 Elastic 事务或 Elastic 跨度。有一组规则决定创建哪个
- 如果
agent.currentTransaction
为null
,则在调用tracer.startSpan()
时将创建一个新的 Elastic 事务。 - 如果
agent.currentTransaction
持有现有事务,但该事务已结束,则在调用tracer.startSpan()
时将创建一个新的 Elastic 事务。 - 在所有其他情况下,在调用
tracer.startSpan()
时将创建一个新的 Elastic 跨度。
初始化
编辑重要的是,在您的 Node.js 应用程序中需要任何其他模块之前(即在 express
、http
等之前)启动代理。
这意味着您应该在应用程序的主文件(通常是 index.js
、server.js
或 app.js
)中需要并启动代理。
这是一个简单的示例,其中我们首先启动代理,然后初始化 OpenTracing 桥接
// Add this to the VERY top of the first file loaded in your app const agent = require('elastic-apm-node').start({ // Override service name from package.json // Allowed characters: a-z, A-Z, 0-9, -, _, and space serviceName: '', // Use if APM Server requires a token secretToken: '', // Use if APM Server uses API keys for authentication apiKey: '', // Set custom APM Server URL (default: http://127.0.0.1:8200) serverUrl: '', }) const Tracer = require('elastic-apm-node-opentracing') // Pass the Elastic APM agent as an argument to the OpenTracing tracer const tracer = new Tracer(agent) const span = tracer.startSpan('my-first-span') // ... do some work ... span.finish()
API
编辑tracer = new Tracer(agent)
elastic-apm-node-opentracing
模块公开了一个与 OpenTracing 兼容的 Tracer 类。
在实例化 Tracer 对象时,必须提供 Elastic APM Node.js Agent 的实例作为其唯一的参数。
有关 tracer
API 的详细信息,请参阅 opentracing-javascript
API 文档。
Elastic APM 特定标签
编辑Elastic APM 定义了一些具有特殊含义的标签,这些标签不会存储为常规标签。相反,它们将用于在事务或跨度上设置某些元数据。
以下标签对于事务和跨度都具有特殊含义
-
type
- 设置事务或跨度的类型,例如事务的request
或跨度的db.mysql.query
如果底层 Elastic APM 对象是事务,则以下标签仅对跨度具有特殊含义
-
result
- 设置事务的结果(默认为success
) -
error
- 如果标签值为true
,则将事务的结果设置为error
(默认为success
) -
http.status_code
- 设置事务的结果。例如,如果标签值为200
,则事务结果将设置为HTTP 2xx
(默认为success
) -
user.id
- 设置用户 ID,显示在 Elastic APM 应用程序中事务详细信息的“用户”选项卡中 -
user.email
- 设置用户电子邮件,显示在 Elastic APM 应用程序中事务详细信息的“用户”选项卡中 -
user.username
- 设置用户名,显示在 Elastic APM 应用程序中事务详细信息的“用户”选项卡中
注意事项
编辑并非所有 OpenTracing API 的功能都受支持。
上下文传播
编辑此桥接仅支持 opentracing.FORMAT_TEXT_MAP
和 opentracing.FORMAT_HTTP_HEADERS
格式。opentracing.FORMAT_BINARY
目前不受支持。
跨度引用
编辑目前,此桥接仅支持 opentracing.REFERENCE_CHILD_OF
引用。其他引用,如 opentracing.REFERENCE_FOLLOWS_FROM
,尚未支持。
行李
编辑不支持 span.setBaggageItem()
方法。行李项将被静默丢弃。
日志
编辑仅支持错误日志记录。在 OpenTracing 跨度上记录错误对象将创建一个 Elastic APM 错误。示例
const err = new Error('boom!') span.log({ event: 'error', 'error.object': err })
其他日志将被静默丢弃。