OpenTelemetry Node.js への移行 - AWS X-Ray

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

OpenTelemetry Node.js への移行

このセクションでは、Node.js アプリケーションを X-Ray SDK から OpenTelemetry に移行する方法について説明します。自動計測と手動計測の両方のアプローチについて説明し、一般的なユースケースの具体的な例を示します。

X-Ray Node.js SDK を使用すると、Node.js アプリケーションを手動で計測してトレースできます。このセクションでは、X-Ray から OpenTelemetry 計測に移行するためのコード例を示します。

ゼロコード自動計測ソリューション

X-Ray SDK for Node.js を使用してリクエストをトレースするには、アプリケーションコードを変更する必要があります。OpenTelemetry を使用すると、ゼロコードの自動計測ソリューションを使用してリクエストをトレースできます。

OpenTelemetry ベースの自動計測を使用したゼロコード自動計測。

  1. Node.js の AWS Distro for OpenTelemetry (ADOT) 自動計測の使用 – Node.js アプリケーションの自動計測については、AWS 「 Distro for OpenTelemetry JavaScript 自動計測によるトレースとメトリクス」を参照してください。

    (オプション) ADOT JavaScript 自動計測 AWS を使用して でアプリケーションを自動的に計測するときに CloudWatch Application Signals を有効にして、現在のアプリケーションの状態をモニタリングし、ビジネス目標に照らして長期的なアプリケーションパフォーマンスを追跡することもできます。Application Signals は、アプリケーション、サービス、依存関係をアプリケーション中心の統合ビューで表示し、アプリケーションの状態をモニタリングしてトリアージできるようにします。詳細については、「Application Signals」を参照してください。

  2. OpenTelemetry JavaScript ゼロコード自動計測の使用 – OpenTelemetry JavaScript による自動計測については、JavaScript ゼロコード計測」を参照してください。

手動計測ソリューション

Tracing setup with X-Ray SDK

X-Ray SDK for Node.js を使用した場合、SDK を使用してコードを計測する前に、aws-xray-sdkX-Ray SDK をサービスプラグインまたはローカルサンプリングルールで設定するためにパッケージが必要でした。

var AWSXRay = require('aws-xray-sdk'); AWSXRay.config([AWSXRay.plugins.EC2Plugin,AWSXRay.plugins.ElasticBeanstalkPlugin]); AWSXRay.middleware.setSamplingRules(<path to file>);
Tracing setup with OpenTelemetry SDK
注記

AWS X-Ray リモートサンプリングは現在、OpenTelemetry JS 用に設定することはできません。ただし、X-Ray リモートサンプリングのサポートは現在、Node.js の ADOT Auto-Instrumentation を通じて利用できます。

以下のコード例では、次の依存関係が必要です。

npm install --save \ @opentelemetry/api \ @opentelemetry/sdk-node \ @opentelemetry/exporter-trace-otlp-proto \ @opentelemetry/propagator-aws-xray \ @opentelemetry/resource-detector-aws

アプリケーションコードを実行する前に、OpenTelemetry SDK をセットアップして設定する必要があります。これは、–-require フラグを使用して実行できます。instrumentation.js という名前のファイルを作成します。これには、OpenTelemetry 計測の設定とセットアップが含まれます。

次のコンポーネントを設定することをお勧めします。

  • OTLPTraceExporter – CloudWatch エージェント/OpenTelemetry Collector へのトレースのエクスポートに必要です

  • AWSXRayPropagator – X-Ray と統合された AWS サービスにトレースコンテキストを伝達するために必要です

  • Resource Detectors (Amazon EC2 Resource Detector など) - アプリケーションを実行しているホストのメタデータを検出するには

/*instrumentation.js*/ // Require dependencies const { NodeSDK } = require('@opentelemetry/sdk-node'); const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto'); const { AWSXRayPropagator } = require("@opentelemetry/propagator-aws-xray"); const { detectResources } = require('@opentelemetry/resources'); const { awsEc2Detector } = require('@opentelemetry/resource-detector-aws'); const resource = detectResources({ detectors: [awsEc2Detector], }); const _traceExporter = new OTLPTraceExporter({ url: 'http://localhost:4318/v1/traces' }); const sdk = new NodeSDK({ resource: resource, textMapPropagator: new AWSXRayPropagator(), traceExporter: _traceExporter }); sdk.start();

その後、次のような OpenTelemetry 設定でアプリケーションを実行できます。

node --require ./instrumentation.js app.js

OpenTelemetry SDK ライブラリ計測を使用して、 AWS SDK などのライブラリのスパンを自動的に作成できます。これらを有効にすると、 AWS SDK for JavaScript v3 などのモジュールのスパンが自動的に作成されます。OpenTelemetry には、すべてのライブラリ計測を有効にするか、有効にするライブラリ計測を指定するオプションがあります。

すべての計測を有効にするには、 @opentelemetry/auto-instrumentations-nodeパッケージをインストールします。

npm install @opentelemetry/auto-instrumentations-node

次に、次のように設定を更新して、すべてのライブラリ計測を有効にします。

const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node'); ... const sdk = new NodeSDK({ resource: resource, instrumentations: [getNodeAutoInstrumentations()], textMapPropagator: new AWSXRayPropagator(), traceExporter: _traceExporter });
Tracing setup with ADOT auto-instrumentation for Node.js

Node.js の ADOT 自動計測を使用して、Node.js アプリケーションの OpenTelemetry を自動的に設定できます。ADOT Auto-Instrumentation を使用すると、手動でコードを変更して受信リクエストをトレースしたり、 AWS SDK や HTTP クライアントなどのライブラリをトレースしたりする必要はありません。詳細については、AWS 「 Distro for OpenTelemetry JavaScript Auto-Instrumentation」の「トレースとメトリクス」を参照してください。

Node.js の ADOT 自動計測は以下をサポートします。

  • 環境変数による X-Ray リモートサンプリング – export OTEL_TRACES_SAMPLER=xray

  • X-Ray トレースコンテキストの伝播 (デフォルトで有効)

  • リソース検出 (Amazon EC2、Amazon ECS、Amazon EKS 環境のリソース検出はデフォルトで有効になっています)

  • サポートされているすべての OpenTelemetry 計測の自動ライブラリ計測。 OTEL_NODE_ENABLED_INSTRUMENTATIONSおよび OTEL_NODE_DISABLED_INSTRUMENTATIONS環境変数を介して選択的に無効化/有効化できます。

  • スパンの手動作成

受信リクエストのトレース

With X-Ray SDK

Express.js

Express.js アプリケーションによって受信された HTTP リクエストを追跡する X-Ray SDK では、2 つのミドルウェアAWSXRay.express.openSegment(<name>)と は、定義されたルートをすべてラップしてトレースする必要がありAWSXRay.express.closeSegment()ました。

app.use(xrayExpress.openSegment('defaultName')); ... app.use(xrayExpress.closeSegment());

復元

Restify アプリケーションによって受信された HTTP リクエストをトレースするために、X-Ray SDK のミドルウェアは、Restify Server の aws-xray-sdk-restify モジュールから enable を実行して使用されました。

var AWSXRay = require('aws-xray-sdk'); var AWSXRayRestify = require('aws-xray-sdk-restify'); var restify = require('restify'); var server = restify.createServer(); AWSXRayRestify.enable(server, 'MyApp'));
With OpenTelemetry SDK

Express.js

の受信リクエストのトレースサポートExpress.jsは、OpenTelemetry HTTP 計測OpenTelemetry Express 計測によって提供されます。で次の依存関係をインストールしますnpm

npm install --save @opentelemetry/instrumentation-http @opentelemetry/instrumentation-express

OpenTelemetry SDK 設定を更新して、Express モジュールの計測を有効にします。

const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express'); ... const sdk = new NodeSDK({ ... instrumentations: [ ... // Express instrumentation requires HTTP instrumentation new HttpInstrumentation(), new ExpressInstrumentation(), ], });

復元

Restify アプリケーションの場合は、OpenTelemetry Restify 計測が必要です。次の依存関係をインストールします。

npm install --save @opentelemetry/instrumentation-restify

OpenTelemetry SDK 設定を更新して、restify モジュールの計測を有効にします。

const { RestifyInstrumentation } = require('@opentelemetry/instrumentation-restify'); ... const sdk = new NodeSDK({ ... instrumentations: [ ... new RestifyInstrumentation(), ], });

AWS SDK JavaScript V3 計測

With X-Ray SDK

AWS SDK からの送信 AWS リクエストを計測するには、次の例のようにクライアントを計測しました。

import { S3, PutObjectCommand } from '@aws-sdk/client-s3'; const s3 = AWSXRay.captureAWSv3Client(new S3({})); await s3.send(new PutObjectCommand({ Bucket: bucketName, Key: keyName, Body: 'Hello!', }));
With OpenTelemetry SDK

DynamoDB、Amazon S3 などへのダウンストリーム AWS SDK 呼び出しのトレースサポートは、OpenTelemetry AWS SDK 計測によって提供されます。 Amazon S3 で次の依存関係をインストールしますnpm

npm install --save @opentelemetry/instrumentation-aws-sdk

SDK 計測を使用して OpenTelemetry AWS SDK 設定を更新します。

import { AwsInstrumentation } from '@opentelemetry/instrumentation-aws-sdk'; ... const sdk = new NodeSDK({ ... instrumentations: [ ... new AwsInstrumentation() ], });

送信 HTTP 呼び出しの計測

With X-Ray SDK

X-Ray を使用して送信 HTTP リクエストを計測するには、クライアントを計測する必要がありました。たとえば、以下の「」を参照してください。

個々の HTTP クライアント

var AWSXRay = require('aws-xray-sdk'); var http = AWSXRay.captureHTTPs(require('http'));

すべての HTTP クライアント (グローバル)

var AWSXRay = require('aws-xray-sdk'); AWSXRay.captureHTTPsGlobal(require('http')); var http = require('http');
With OpenTelemetry SDK

Node.js HTTP クライアントのトレースサポートは、OpenTelemetry HTTP Instrumentation によって提供されます。で次の依存関係をインストールしますnpm

npm install --save @opentelemetry/instrumentation-http

OpenTelemetry SDK 設定を次のように更新します。

const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); ... const sdk = new NodeSDK({ ... instrumentations: [ ... new HttpInstrumentation(), ], });

他のライブラリの計測サポート

OpenTelemetry JavaScript でサポートされているライブラリインストルメンテーションの完全なリストは、サポートされているインストルメンテーション にあります。

または、OpenTelemetry レジストリを検索して、OpenTelemetry が Registry でライブラリの計測をサポートしているかどうかを調べることもできます。

トレースデータを手動で作成する

With X-Ray SDK

X-Ray を使用して、アプリケーションを追跡するセグメントとその子サブセグメントを手動で作成するには、aws-xray-sdkパッケージコードが必要でした。

var AWSXRay = require('aws-xray-sdk'); AWSXRay.enableManualMode(); var segment = new AWSXRay.Segment('myApplication'); captureFunc('1', function(subsegment1) { captureFunc('2', function(subsegment2) { }, subsegment1); }, segment); segment.close(); segment.flush();
With OpenTelemetry SDK

カスタムスパンを作成して使用することで、計測ライブラリでキャプチャされない内部アクティビティのパフォーマンスをモニタリングできます。この種のスパンのみ サーバーは X-Ray セグメントに変換され、他のすべてのスパンは X-Ray サブセグメントに変換されることに注意してください。詳細については、「セグメント」を参照してください。

トレースセットアップで OpenTelemetry SDK を設定してスパンを作成すると、Tracer インスタンスが必要になります。必要に応じていくつでも Tracer インスタンスを作成できますが、アプリケーション全体に 1 つの Tracer を持つことが一般的です。

const { trace, SpanKind } = require('@opentelemetry/api'); // Get a tracer instance const tracer = trace.getTracer('your-tracer-name'); ... // This span will appear as a segment in X-Ray tracer.startActiveSpan('server', { kind: SpanKind.SERVER }, span => { // Do work here // This span will appear as a subsegment in X-Ray tracer.startActiveSpan('operation2', { kind: SpanKind.INTERNAL }, innerSpan => { // Do more work here innerSpan.end(); }); span.end(); });

OpenTelemetry SDK を使用してトレースに注釈とメタデータを追加する

カスタムキーと値のペアをスパンの属性として追加することもできます。デフォルトでは、これらのスパン属性はすべて X-Ray raw データ内のメタデータに変換されることに注意してください。属性がメタデータではなく注釈に変換されるようにするには、属性のリストにaws.xray.annotations属性のキーを追加します。詳細については、「カスタマイズされた X-Ray 注釈を有効にする」を参照してください。

tracer.startActiveSpan('server', { kind: SpanKind.SERVER }, span => { span.setAttribute('metadataKey', 'metadataValue'); span.setAttribute('annotationKey', 'annotationValue'); // The following ensures that "annotationKey: annotationValue" is an annotation in X-Ray raw data. span.setAttribute('aws.xray.annotations', ['annotationKey']); // Do work here span.end(); });

Lambda 計測

With X-Ray SDK

Lambda 関数のアクティブトレースを有効にした後、追加の設定なしで X-Ray SDK が必要でした。Lambda は Lambda ハンドラー呼び出しを表すセグメントを作成し、追加の設定なしで X-Ray SDK を使用してサブセグメントまたは計測ライブラリを作成しました。

With OpenTelemetry SDK

AWS 販売された Lambda レイヤーを使用して Lambda を自動的に計測できます。解決策は 2 つあります。

  • (推奨) CloudWatch Application Signals Lambda レイヤー

    注記

    この Lambda レイヤーでは、デフォルトで CloudWatch Application Signals が有効になっているため、メトリクスとトレースの両方を収集することで、Lambda アプリケーションのパフォーマンスとヘルスのモニタリングが可能になります。トレースのみが必要な場合は、Lambda 環境変数 を設定する必要がありますOTEL_AWS_APPLICATION_SIGNALS_ENABLED=false。詳細については、「Lambda でアプリケーションを有効にする」を参照してください。

  • AWS ADOT JS 用の マネージド Lambda レイヤー。詳細については、AWS 「 Distro for OpenTelemetry Lambda Support for JavaScript」を参照してください。

Lambda 計測を使用したスパンの手動作成

ADOT JavaScript Lambda Layer は Lambda 関数の自動計測を提供しますが、カスタムデータの提供や、ライブラリ計測の対象ではない Lambda 関数自体内のコードの計測など、Lambda で手動計測を実行する必要がある場合があります。

自動計測とともに手動計測を実行するには、 を依存関係@opentelemetry/apiとして追加する必要があります。この依存関係のバージョンは、ADOT JavaScript SDK で使用されるのと同じ依存関係のバージョンにすることをお勧めします。OpenTelemetry API を使用して、Lambda 関数にスパンを手動で作成できます。

NPM を使用して@opentelemetry/api依存関係を追加するには:

npm install @opentelemetry/api