OpenTelemetry Integration for Node.js 應用程式

與 OpenTelemetry 整合的主要方法是配置 OpenTelemetry 所監視之任何應用程式的預設 OTLP 匯出程式,以將其資料傳送至 Instana 代理程式。 這在 OpenTelemetry 頁面上說明。

可以使用其他元件進一步自訂 OpenTelemetry 整合。 此頁面說明 Node.js 可用的 OpenTelemetry 元件。

無伺服器 OpenTelemetry Exporter

套件 @instana/opentelemetry-exporter 提供 OpenTelemetry exporter ,可將 OpenTelemetry 跨距轉換並傳送至 Instana 後端。

Instana Node.js OpenTelemetry 匯出器主要設計用於在無伺服器環境中使用,例如 AWS Lambda 或 AWS Fargate。 Instana 已透過主機代理程式提供 OpenTelemetry for SaaS 及自行管理解決方案的支援。 不過,如果您的 Node.js 應用程式在無伺服器環境中執行 (代理程式不存在) ,則無伺服器 OpenTelemetry 匯出器是要執行的方法。

若要使用匯出器,請將套件安裝至專案,將套件匯入至追蹤模組,並建立新的 InstanaExporter實例。

匯出器預期必須提供兩個 Instana 環境變數 給應用程式:

  • INSTANA_AGENT_KEY
  • INSTANA_ENDPOINT_URL

或者,您可以提供這些值作為建構子的引數,但不建議使用此替代方案,因為這是您可能想要避免公開的機密資料。

例如,您可以將匯出器配置到追蹤模組中,如下所示:

'use strict';

const process = require('process');
require('@opentelemetry/api');
const opentelemetry = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { Resource } = require('@opentelemetry/resources');
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');

// Require the Instana OpenTelemetry Exporter
const { InstanaExporter } = require('@instana/opentelemetry-exporter');

// Instantiate the Instana Exporter.
// Make sure to provide the agent key and the serverless endpoint URL via the following environment variables:
// * INSTANA_AGENT_KEY
// * INSTANA_ENDPOINT_URL
const instanaTraceExporter = new InstanaExporter();

/*
 * If you have not provided the agent key and the serverless endpoint URL via environment variables:
 * const instanaTraceExporter = new InstanaExporter({ agentKey: 'agent_key', endpointUrl: 'endpoint_url' });
 */

const nodeAutoInstrumentations = getNodeAutoInstrumentations();

const sdk = new opentelemetry.NodeSDK({
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: 'my-service'
  }),
  // Configure OpenTelemetry to use the Instana Exporter
  traceExporter: instanaTraceExporter,
  instrumentations: [nodeAutoInstrumentations]
});

sdk.start()
...

當 OpenTelemetry 所監視的應用程式執行時, Instana 匯出程式會將 OpenTelemetry 跨距轉換為 Instana 跨距,並將它們傳送至後端端點。

OpenTelemetry 追蹤視覺化將呈現在 Instana 使用者介面中,就像一般 Instana 追蹤跨距一樣。

OpenTelemetry 傳播器

OpenTelemetry 環境定義傳播器套件 @opentelemetry/propagator-instana 會將專有 Instana 追蹤相關性標頭轉換成 OpenTelemetry 追蹤環境定義,反之亦然。 如需 OpenTelemetry 環境定義傳播器的一般資訊,請參閱 OpenTelemetry 傳播器

使用 npm install --save @opentelemetry/propagator-instana來安裝套件,並將下列程式碼新增至廣域追蹤器配置檔:

const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
const { InstanaPropagator } = require('@opentelemetry/propagator-instana');
// ...

const provider = new NodeTracerProvider();

provider.register({
  propagator: new InstanaPropagator()
});

OpenTelemetry 取樣器

除非追蹤環境定義中 sampled 旗標的值為 false,否則 OpenTelemetry 取樣器套件 @instana/opentelememetry-sampler 會置換預設 OpenTelemetry 取樣行為,以便對任何要求進行取樣。 如需 OpenTelemetry 範例程式的一般資訊,請參閱 OpenTelemetry 範例程式

取樣器需要與套件 `@opentelemetry/propagator-instana 一起使用。

使用指令 npm install --save @opentelemetry/propagator-instana @instana/opentelemetry-sampler來安裝這兩個套件,並將下列程式碼新增至廣域追蹤器配置檔:

const api = require('@opentelemetry/api');
const opentelemetry = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');
const { Resource } = require('@opentelemetry/resources');
const { InstanaAlwaysOnSampler } = require('@instana/opentelemetry-sampler');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { InstanaPropagator } = require('@opentelemetry/propagator-instana');

const nodeAutoInstrumentations = getNodeAutoInstrumentations();
api.propagation.setGlobalPropagator(new InstanaPropagator());

const traceOtlpExporter = new OTLPTraceExporter({
  url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT
});

const sdk = new opentelemetry.NodeSDK({
  traceExporter: traceOtlpExporter,
  instrumentations: [nodeAutoInstrumentations],
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: 'my-service'
  }),
  sampler: new InstanaAlwaysOnSampler()
});

sdk
  .start()
  .then(() => console.log('Tracing initialized'))
  .catch(err => console.log('Error initializing tracing', err));

OpenTelemetry 資源偵測器

附註: Instana OpenTelemetry 資源偵測器一律需要 Instana 代理程式部署並在相同主機上執行。

OpenTelemetry 資源偵測器套件 @opentelemetry/resource-偵測器-instana 可利用其他資源屬性來強化 OpenTelemetry 追蹤資訊。 如需 OpenTelemetry 資源偵測器的一般資訊,請參閱 OpenTelemetry 資源偵測器

使用指令 npm install --save @opentelemetry/resource-detector-instana安裝套件,並將下列程式碼新增至廣域追蹤器配置檔:

import {
  Resource,
  processDetector,
  envDetector,
} from "@opentelemetry/resources";
import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions";
import { NodeSDK } from "@opentelemetry/sdk-node";
import { instanaAgentDetector } from "@opentelemetry/resource-detector-instana";

const globalResource = new Resource({
   [SemanticResourceAttributes.SERVICE_NAME]: "TestService",
});

const sdk = new NodeSDK({
   resourceDetectors: [envDetector, processDetector, instanaAgentDetector]
   resource: globalResource,
});

sdk.start()

此外,還可以提供下列環境變數:

  • INSTANA_AGENT_HOST:Instana 代理程式主機名稱 (預設值: localhost)
  • INSTANA_AGENT_PORT:Instana 代理程式埠 (預設值: 42699)
  • INSTANA_RETRY_TIMEOUT_MS: 資源偵測器執行三次重試,以連接至 Instana 代理程式。 這是重試之間的逾時值 (預設值: 1000)
  • INSTANA_AGENT_TIMEOUT_MS: 連接至 Instana 代理程式時,用戶端逾時 (預設值: 3000)