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 跨度。有一组规则决定创建哪个

  1. 如果 agent.currentTransactionnull,则在调用 tracer.startSpan() 时将创建一个新的 Elastic 事务。
  2. 如果 agent.currentTransaction 持有现有事务,但该事务已结束,则在调用 tracer.startSpan() 时将创建一个新的 Elastic 事务。
  3. 在所有其他情况下,在调用 tracer.startSpan() 时将创建一个新的 Elastic 跨度。

初始化

编辑

重要的是,在您的 Node.js 应用程序中需要任何其他模块之前(即在 expresshttp 等之前)启动代理。

这意味着您应该在应用程序的主文件(通常是 index.jsserver.jsapp.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()
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_MAPopentracing.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
})

其他日志将被静默丢弃。