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_KEYINSTANA_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 リソース検出器
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)