使用 OpenTelemetry API

了解如何在 Sentry 中使用 OpenTelemetry API。

Sentry 内置支持 OpenTelemetry API。使用 OpenTelemetry API 开始的任何 span 都将被 Sentry 自动捕获,而使用 Sentry SDK 开始的任何 span 将自动传播到 OpenTelemetry。

虽然 Sentry SDK 内置了一些 OpenTelemetry 仪器化,但您可能希望向应用程序添加额外的仪器化。这可以通过像下面的示例所示通过 OpenTelemetry 注册仪器化来完成:

Copied
const Sentry = require("@sentry/node");
const {
  GenericPoolInstrumentation,
} = require("@opentelemetry/instrumentation-generic-pool");

Sentry.init({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",

  // The SentrySampler will use this to determine which traces to sample
  tracesSampleRate: 1.0,

  // Add additional OpenTelemetry instrumentation:
  openTelemetryInstrumentations: [new GenericPoolInstrumentation()],
});

可以通过 @opentelemetry/instrumentation 中的 registerInstrumentations() 添加仪器化。 但是,使用 ESM(import/export 语法)时,您需要注意在导入任何需要仪器化的模块之前进行注册。

通常,registerInstrumentations() 应该在注册 ESM 加载器 之后,并在同一上下文中调用。

我们建议使用 Sentry.startSpan() 和相关 API 来创建 span,但您也可以使用原生的 OpenTelemetry API 来创建 span。

您可以通过 client.tracer 访问 Sentry 使用的跟踪器,然后使用 OpenTelemetry API 创建 span,如下所示:

Copied
const Sentry = require("@sentry/node");

const tracer = Sentry.getClient()?.tracer;
// Now you can use native APIs on the tracer:
tracer.startActiveSpan("span name", () => {
  // measure something
});

您还可以使用任何其他跟踪器。所有 OpenTelemetry span 都将被 Sentry 自动捕获。

您可以访问 Sentry 设置的 TracerProvider,当使用 Sentry 的默认 OpenTelemetry 仪器化时。这使您可以轻松地添加额外的 span 处理程序,从而将跟踪数据导出到各种 OTEL 收集器或其他后端。

Copied
const Sentry = require("@sentry/node");

const provider = Sentry.getClient()?.traceProvider;
provider?.addSpanProcessor(new MySpanProcessor());