CLOVER🍀

That was when it all began.

OpenTelemetryのFaaS向けの機能とAWS Distro for OpenTelemetryの違い

これは、なにをしたくて書いたもの?

OpenTelemetryのInstrumentationを見ていると、言語によってはServerless Function(FaaS)をサポートしているようです。

これをLocalStack上で試してみようと思ったのですが、うまく動かなかったので…そこに至るまでに調べたことをメモしておくことに
しました。

内容的にには、主にOpenTelemetryのFaaSサポートとAWS Distro for OpenTelemetryの違いです。

OpenTelemetryとFaaS

OpenTelemetryのドキュメント内に、FaaS向けのものがあります。

Functions as a Service | OpenTelemetry

OpenTelemetryコミュニティでは、Lambda向けのレイヤーを提供しているようです。対象の言語は、JavaJavaScriptPythonです。

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のみのようですね。

Serverless | OpenTelemetry

AWS Distro for OpenTelemetry

OpenTelemetryに、AWS Distro for OpenTelemetryのことが出てきたので見てみましょう。

Distributed Tracing – AWS Distro for OpenTelemetry – Amazon Web Services

ドキュメントは、AWS X-Rayの中に含まれています。

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 SDKAWS Distro for OpenTelemetry Collectorの2つの
コンポーネントが必要であり、詳細はAWS Distro for OpenTelemetry [言語]のページを見てください、となっています。

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-RayAmazon CloudWatch、Amazon Managed Service for Prometheusなどに送信可能
  • AWS Distro for OpenTelemetry(ADOT)が提供するOpenTelemetry Collectorもある

端的に言うとOpenTelemetry SDKを使って、AWSのマネージドサービスやその他にテレメトリーデータを送信できるようにする
仕組みのようですね。

AWS Distro for OpenTelemetry(ADOT)は独立したWebサイトがあります。

AWS Distro for OpenTelemetry

ドキュメントはこちら。

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リポジトリーは、こちらです。

GitHub - open-telemetry/opentelemetry-lambda: Create your own Lambda Layer in each OTel language using this starter code. Add the Lambda Layer to your Lamdba Function to get tracing with OpenTelemetry.

Lambdaレイヤーを使えない場合は、手動Instrumentationを使うわけですね。

Lambda Manual Instrumentation | OpenTelemetry

同じようなことが、JavaScriptのInstrumentationにも書いてあります。

Serverless | OpenTelemetry

Lambdaレイヤーが使える場合は自動Instrumentationを

Serverless / AWS Lambda

そうでない場合はラッパー相当のコードを書くことになり、組み込む際には環境変数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

おわりに

今回はここまでです。

ちょっと時間が経ったら、また試してみようかなと思います。