これは、なにをしたくて書いたもの?
OpenTelemetryのInstrumentationを見ていると、言語によってはServerless Function(FaaS)をサポートしているようです。
これをLocalStack上で試してみようと思ったのですが、うまく動かなかったので…そこに至るまでに調べたことをメモしておくことに
しました。
内容的にには、主にOpenTelemetryのFaaSサポートとAWS Distro for OpenTelemetryの違いです。
OpenTelemetryとFaaS
OpenTelemetryのドキュメント内に、FaaS向けのものがあります。
Functions as a Service | OpenTelemetry
OpenTelemetryコミュニティでは、Lambda向けのレイヤーを提供しているようです。対象の言語は、Java、JavaScript、Pythonです。
Lambda Auto-Instrumentation | OpenTelemetry
Lambda向けのCollectorの構成。これは、OpenTelemetry CollectorをLambdaを使う環境内に組み込む時のガイドですね。
Lambda Collector Configuration | OpenTelemetry
このページに書いていることは、AWS Distro for OpenTelemetry Lambdaとは別の内容だそうです。
This is different than the current AWS Distribution of OpenTelemetry (ADOT) implementation which bundles instrumentation and the Collector together.
そして、手動Instrumentationの方法。
Lambda Manual Instrumentation | OpenTelemetry
言語側のInstrumentationのページに記載があるのは、現時点だとJavaScriptのみのようですね。
AWS Distro for OpenTelemetry
OpenTelemetryに、AWS Distro for OpenTelemetryのことが出てきたので見てみましょう。
Distributed Tracing – AWS Distro for OpenTelemetry – Amazon Web Services
AWS Distro for OpenTelemetry and AWS X-Ray - AWS X-Ray
Instrumenting your application for AWS X-Ray - AWS X-Ray
言語ごとのページ。いずれもAWS X-Rayでの使用が有効になったOpenTelemetry SDKとAWS Distro for OpenTelemetry Collectorの2つの
コンポーネントが必要であり、詳細はAWS Distro for OpenTelemetry [言語]のページを見てください、となっています。
- AWS Distro for OpenTelemetry Go - AWS X-Ray
- AWS Distro for OpenTelemetry Java - AWS X-Ray
- AWS Distro for OpenTelemetry JavaScript - AWS X-Ray
- AWS Distro for OpenTelemetry Python - AWS X-Ray
- AWS Distro for OpenTelemetry .NET - AWS X-Ray
- AWS Distro for OpenTelemetry Ruby - AWS X-Ray
AWS Distro for OpenTelemetryについての、AWSのブログはこちら。
public preview時。
AWS Distro for OpenTelemetry now available for public preview | AWS Open Source Blog
トレーシング、メトリクスのGA時。
AWS Distro for OpenTelemetry is now generally available for metrics | AWS Open Source Blog
AWS Distro for OpenTelemetry is now GA for tracing | AWS Open Source Blog
AWS Distro for OpenTelemetry、略してADOTは、OpenTelemetryのコンポーネントを使ってアプリケーションの計測ができるように
するためのものです。トレースデータやメトリクスデータなどのテレメトリーデータの収集などを自動で行えるようにし、
手動実装による収集の必要性を軽減するとされています。
AWS Distro for OpenTelemetry(ADOT)は、以下のサービスと統合できるようです。
また、提供される機能などはこのような感じのようです。
- トレースデータ … AWS X-RayやNewRelic、Dynatrace、Datadogなどに送信可能
- メトリクスデータ … AWS X-Ray、Amazon CloudWatch、Amazon Managed Service for Prometheusなどに送信可能
- AWS Distro for OpenTelemetry(ADOT)が提供するOpenTelemetry Collectorもある
端的に言うとOpenTelemetry SDKを使って、AWSのマネージドサービスやその他にテレメトリーデータを送信できるようにする
仕組みのようですね。
AWS Distro for OpenTelemetry(ADOT)は独立したWebサイトがあります。
ドキュメントはこちら。
Introduction | AWS Distro for OpenTelemetry
読んでいくと、AWS X-Ray用のInstrumentalをインストールしたり、AWS X-Rayにテレメトリーデータを送信する際には
ADOT用のCollectorを導入する必要がありそうなど、固有のことはいろいろあるようです。
とはいえ、今回扱うOpenTelemetryコミュニティの提供するInstrumentationやCollectorと、AWS Distro for OpenTelemetry(ADOT)は
別の話だということを忘れてはいけないわけですが。
OpenTelemetryのFaaS向けの機能を振り返る
話を、OpenTelemetryのみに戻しましょう。少し同じ内容を振り返ります。
自動Instrumentationを使う場合は、OpenTelemetryコミュニティの提供するLambdaレイヤーを使えばよさそうです。
Lambda Auto-Instrumentation | OpenTelemetry
このLambdaレイヤーのソースコードのあるGitHubリポジトリーは、こちらです。
Lambdaレイヤーを使えない場合は、手動Instrumentationを使うわけですね。
Lambda Manual Instrumentation | OpenTelemetry
同じようなことが、JavaScriptのInstrumentationにも書いてあります。
Lambdaレイヤーが使える場合は自動Instrumentationを
そうでない場合はラッパー相当のコードを書くことになり、組み込む際には環境変数NODE_OPTIONS
と-r
(--require
)オプションで
作成したラッパースクリプトを指定します。
Serverless / AWS Lambda / AWS Lambda wrapper code
そして、AWS Distro for OpenTelemetry(ADOT)とはまた別に、OpenTelemetryコミュニティが提供するLambdaレイヤーと
OpenTelemetry Collectorを組み合わせるということもできます。
Lambda Collector Configuration | OpenTelemetry
OpenTelemetryのFaaS向けの機能をLocalStackで使うと…
このタイトル通り、LocalStack上で試してみたのですがOpenTelemetryのFaaS向けの機能はドキュメントの例(手動Instrumentation)では
動作せず(テレメトリーデータがCollectorに記録されず)、NodeTracerProvider
を使って書かれていたのでNodeSDK
に変えてみたら
いいのかなとも思って試してみたのですが。
NodeSDK
に変更すると、テレメトリーデータはCollectorに記録されるのですが、今度はトレーシングデータとしてつながらなくなり…
という結果になったので、今回は諦めました。
試してみた時のOpenTelemetry Instrumentationライブラリーのバージョンはこちらです。
"dependencies": { "@opentelemetry/api": "^1.6.0", "@opentelemetry/auto-instrumentations-node": "^0.39.4", "@opentelemetry/exporter-trace-otlp-http": "^0.44.0", "@opentelemetry/instrumentation": "^0.44.0", "@opentelemetry/sdk-node": "^0.44.0", "@opentelemetry/sdk-trace-base": "^1.17.1", "@opentelemetry/sdk-trace-node": "^1.17.1" },
LocalStackのバージョン。
$ python3 -V Python 3.10.12 $ localstack --version 2.3.2
おわりに
今回はここまでです。
ちょっと時間が経ったら、また試してみようかなと思います。