OpenTracing 桥接编辑

OpenTracing 已被弃用,取而代之的是 OpenTelemetry。此 Elastic APM OpenTracing 桥接 已弃用。建议使用 OpenTelemetry 桥接

Elastic APM OpenTracing 桥接允许使用 OpenTracing API 创建 Elastic APM 事务和跨度。换句话说,它将对 OpenTracing API 的调用转换为 Elastic APM,从而允许重用现有的检测。

有关 OpenTracing 的更多信息,请参阅 OpenTracing 网站

先决条件编辑

Elastic APM Node.js 代理的 OpenTracing 支持通过名为 elastic-apm-node-opentracing 的单独模块提供。

此模块要求单独安装 Elastic APM Node.js 代理。为了确保将这两个依赖项都添加到应用程序中,请按如下方式安装它们

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()

API编辑

tracer = new Tracer(agent)

elastic-apm-node-opentracing 模块公开了一个与 OpenTracing 兼容的 Tracer 类。

在实例化 Tracer 对象时,必须提供 Elastic APM Node.js 代理的实例作为其唯一参数。

有关 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 跨度上记录 Error 对象将创建一个 Elastic APM 错误。示例

const err = new Error('boom!')

span.log({
  event: 'error',
  'error.object': err
})

其他日志会被静默丢弃。