サーバーレス
このガイドでは、OpenTelemetry計装ライブラリを使用してサーバーレス関数のトレーシングを開始する方法を説明します。
AWS Lambda
コミュニティ提供のLambdaレイヤーを使用してAWS Lambda関数を自動的に計装することもできます。
以下では、OpenTelemetryでLambdaラッパーを使用してAWS Lambda関数を手動で計装し、設定されたバックエンドにトレースを送信する方法を示します。
プラグアンドプレイのユーザーエクスペリエンスに興味がある場合は、OpenTelemetry Lambda Layersを参照してください。
依存関係
まず、空のpackage.json
を作成します。
npm init -y
次に、必要な依存関係をインストールします。
npm install \
@opentelemetry/api \
@opentelemetry/auto-instrumentations-node \
@opentelemetry/exporter-trace-otlp-http \
@opentelemetry/instrumentation \
@opentelemetry/sdk-trace-base \
@opentelemetry/sdk-trace-node
AWS Lambdaラッパーコード
このファイルには、トレーシングを有効にするすべてのOpenTelemetryロジックが含まれています。
以下のコードをlambda-wrapper.js
として保存してください。
/* lambda-wrapper.js */
const api = require('@opentelemetry/api');
const { BatchSpanProcessor } = require('@opentelemetry/sdk-trace-base');
const {
OTLPTraceExporter,
} = require('@opentelemetry/exporter-trace-otlp-http');
const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
const {
getNodeAutoInstrumentations,
} = require('@opentelemetry/auto-instrumentations-node');
api.diag.setLogger(new api.DiagConsoleLogger(), api.DiagLogLevel.ALL);
const spanProcessor = new BatchSpanProcessor(
new OTLPTraceExporter({
url: '<backend_url>',
}),
);
const provider = new NodeTracerProvider({
spanProcessors: [spanProcessor],
});
provider.register();
registerInstrumentations({
instrumentations: [
getNodeAutoInstrumentations({
'@opentelemetry/instrumentation-aws-lambda': {
disableAwsContextPropagation: true,
},
}),
],
});
<backend_url>
を、すべてのトレースをエクスポートするお気に入りのバックエンドのURLに置き換えてください。
まだセットアップしていない場合は、JaegerまたはZipkinをチェックしてください。
disableAwsContextPropagation
がtrueに設定されていることに注意してください。
これは、Lambda計装がデフォルトでX-Rayコンテキストヘッダーを使用しようとするためです。
この関数でアクティブトレーシングが有効になっていない限り、これは非サンプルコンテキストとなり、NonRecordingSpan
を作成します。
詳細については、計装ドキュメントを参照してください。
AWS Lambda関数ハンドラー
Lambdaラッパーができたので、Lambda関数として機能するシンプルなハンドラーを作成します。
以下のコードをhandler.js
として保存してください。
/* handler.js */
'use strict';
const https = require('https');
function getRequest() {
const url = 'https://opentelemetry.io/';
return new Promise((resolve, reject) => {
const req = https.get(url, (res) => {
resolve(res.statusCode);
});
req.on('error', (err) => {
reject(new Error(err));
});
});
}
exports.handler = async (event) => {
try {
const result = await getRequest();
return {
statusCode: result,
};
} catch (error) {
return {
statusCode: 400,
body: error.message,
};
}
};
デプロイメント
Lambda関数をデプロイする方法は複数あります。
ここではServerless Frameworkを使用します。 詳細については、Setting Up Serverless Frameworkガイドを参照してください。
serverless.yml
というファイルを作成します。
service: lambda-otel-native
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs14.x
region: '<your-region>'
environment:
NODE_OPTIONS: --require lambda-wrapper
functions:
lambda-otel-test:
handler: handler.hello
OpenTelemetryが正常に動作するためには、lambda-wrapper.js
が他のすべてのファイルより前に含まれている必要があります。
NODE_OPTIONS
設定がこれを保証します。
Serverless Frameworkを使用してLambda関数をデプロイしていない場合は、AWSコンソールUIを使用してこの環境変数を手動で追加する必要があることに注意してください。
最後に、以下のコマンドを実行してプロジェクトをAWSにデプロイします。
serverless deploy
AWSコンソールUIを使用して、新しくデプロイされたLambda関数を呼び出すことができます。 Lambda関数の呼び出しに関連するスパンが表示されることが期待されます。
バックエンドの確認
Lambda関数からOpenTelemetryによって生成されたトレースをバックエンドで確認できるようになります。
GCP function
以下では、Google Cloud Platform(GCP)UIを使用してHTTPトリガー関数を計装する方法を示します。
関数の作成
GCPにログインして、関数を配置するプロジェクトを作成または選択します。 サイドメニューでServerlessに移動し、Cloud Functionsを選択します。 次に、Create Functionをクリックし、環境として2nd generationを選択し、関数名を入力してリージョンを選択します。
otelwrapperの環境変数設定
閉じている場合は、Runtime, build, connections and security settingsメニューを開き、下にスクロールして環境変数NODE_OPTIONS
を以下の値で追加します。
--require ./otelwrapper.js
ランタイムの選択
次の画面(Code)で、ランタイムとしてNode.jsバージョン16を選択します。
OTelラッパーの作成
サービスを計装するために使用されるotelwrapper.js
という新しいファイルを作成します。
SERVICE_NAME
を提供し、<address for your backend>
を設定してください。
/* otelwrapper.js */
const { resourceFromAttributes } = require('@opentelemetry/resources');
const {
SEMRESATTRS_SERVICE_NAME,
} = require('@opentelemetry/semantic-conventions');
const api = require('@opentelemetry/api');
const { BatchSpanProcessor } = require('@opentelemetry/sdk-trace-base');
const {
OTLPTraceExporter,
} = require('@opentelemetry/exporter-trace-otlp-http');
const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
const {
getNodeAutoInstrumentations,
} = require('@opentelemetry/auto-instrumentations-node');
api.diag.setLogger(new api.DiagConsoleLogger(), api.DiagLogLevel.ALL);
const collectorOptions = {
url: '<address for your backend>',
};
const provider = new NodeTracerProvider({
resource: resourceFromAttributes({
[SEMRESATTRS_SERVICE_NAME]: '<your function name>',
}),
spanProcessors: [
new BatchSpanProcessor(new OTLPTraceExporter(collectorOptions)),
],
});
provider.register();
registerInstrumentations({
instrumentations: [getNodeAutoInstrumentations()],
});
パッケージ依存関係の追加
package.json
に以下を追加します。
{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/auto-instrumentations-node": "^0.56.1",
"@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
"@opentelemetry/instrumentation": "^0.200.0",
"@opentelemetry/sdk-trace-base": "^2.0.0",
"@opentelemetry/sdk-trace-node": "^2.0.0",
"@opentelemetry/resources": "^2.0.0",
"@opentelemetry/semantic-conventions": "^2.0.0"
}
}
関数にHTTP呼び出しを追加
以下のコードは、アウトバウンド呼び出しを実証するためにOpenTelemetryウェブサイトに呼び出しを行います。
/* index.js */
const functions = require('@google-cloud/functions-framework');
const https = require('https');
functions.http('helloHttp', (req, res) => {
let url = 'https://opentelemetry.io/';
https
.get(url, (response) => {
res.send(`Response ${response.body}!`);
})
.on('error', (e) => {
res.send(`Error ${e}!`);
});
});
バックエンド
GCP VMでOTelコレクターを実行する場合、トレースを送信できるようにVPCアクセスコネクターを作成する必要がある可能性があります。
デプロイ
UIでDeployを選択し、デプロイメントの準備ができるまで待ちます。
テスト
テストタブからクラウドシェルを使用して関数をテストできます。
フィードバック
このページは役に立ちましたか?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!