OpenTelemetry Integration for Node.js アプリケーション

OpenTelemetry との統合における主な方法は、 OpenTelemetry によって監視されているアプリケーションのデフォルトの OTLP エクスポーターを設定し、そのデータを Instana エージェントに送信するようにすることです。 これについては、「 OpenTelemetry 」のページに記載されています。

OpenTelemetry との連携は、追加のコンポーネントを使用してさらにカスタマイズすることができます。 Node.js で利用可能な OpenTelemetry コンポーネントについては、以下の通りです:

サーバーレス OpenTelemetry エクスポーター

パッケージ @instana/opentelemetry-exporter は、 OpenTelemetry のスパンを変換し、 Instana バックエンドに送信する OpenTelemetry エクスポーター を提供します。

Instana Node.js OpenTelemetry エクスポーターは、主にサーバーレス環境 (AWS Lambda や AWS Fargate など) での使用を目的として設計されています。 Instana すでに、ホストエージェントを通じて、 SaaS およびセルフホスト型ソリューション向けの OpenTelemetry をサポートしています。 ただし、 Node.js アプリケーションがエージェントが存在しないサーバーレス環境で実行されている場合は、サーバーレス版 OpenTelemetry エクスポーターを使用することをお勧めします。

OpenTelemetry エクスポーターのインストール

OpenTelemetry Exporter をインストールするには、次のコマンドを実行してください:

npm install --save @instana/opentelemetry-exporter@latest

OpenTelemetry エクスポーターの有効化

エクスポート機能では、アプリケーションに指定する必要がある2つの 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 のUIに表示されます。

OpenTelemetry 増殖業者

OpenTelemetry のコンテキスト・プロパゲーター・パッケージ @opentelemetry/propagator-instana は、 Instana の独自トレース相関ヘッダーを OpenTelemetry のトレースコンテキストに変換し、その逆も同様に行います。

OpenTelemetry のコンテキスト・プロパゲーターに関する一般的な情報については、 OpenTelemetry Propagators を参照してください。

OpenTelemetry プロパゲーターの設置

OpenTelemetry Propagator をインストールするには、次のコマンドを実行してください:

npm install --save @instana/propagator-instana@latest

OpenTelemetry プロパゲーターの有効化

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

const provider = new NodeTracerProvider();

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

OpenTelemetry サンプル集

OpenTelemetry のサンプリングパッケージ @instana/opentelemetry-sampler は、デフォルトの OpenTelemetry のサンプリング動作を上書きし、トレースコンテキスト内のフラグ sampled の値が でない限り、すべてのリクエストが falseサンプリングされるようにします。

「 OpenTelemetry 」サンプラーに関する一般的な情報については、 OpenTelemetry Samplers をご覧ください。

OpenTelemetry サンプラーのインストール

OpenTelemetry Sampler をインストールするには、次のコマンドを実行してください:

npm install --save @instana/opentelemetry-sampler@latest

OpenTelemetry サンプラーの有効化

サンプラーは、パッケージ `@opentelemetry/propagator-instana と一緒に使用する必要があります。

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-detector-instana は、 OpenTelemetry のトレース情報に追加のリソース属性を付加します。

OpenTelemetry のリソース検出器に関する一般的な情報については、 OpenTelemetry リソース検出器を参照してください。

OpenTelemetry リソース検出ツールのインストール

OpenTelemetry リソース検出ツールをインストールするには、次のコマンドを実行してください:

npm install --save @instana/resource-detector-instana

OpenTelemetry リソース検出機能の有効化

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 エージェントへの接続を試みる際、3回再試行を行います。 これは再試行間のタイムアウトです (デフォルト: 1000)
  • INSTANA_AGENT_TIMEOUT_MS: Instana エージェントへの接続時のクライアントタイムアウト(デフォルト: 3000