(COM307) OpenTelemetry Lambda Layers のコレクタでローカルでトレース取得したかったけどダメだった
はじめに
前回の記事でコレクタを起動できたのでトレースの取得を試してみます。
モニタリング環境のセットアップ
トレースの送信を確認するためにotel-cliを使います。このツールではCLIからトレースの送信ができる他、サーバモードで起動することでトレースの受信、TUIでの表示ができます。 このサーバモードを使って以下のような構成でトレースの確認をしてみます。
otel-cli serverの起動
otel-cli serverは以下のようにポート14318を指定して起動します。
#!/bin/bash otel-cli server tui \ --endpoint 0.0.0.0:14317 \ --traces-endpoint http://0.0.0.0:14318/v1/traces \ --protocol grpc \ --verbose
コレクタの設定
コレクタ側は上記のサーバのポートに向けて送信するexporterを設定します。
receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4318 http: endpoint: 0.0.0.0:4317 exporters: otlphttp: endpoint: http://0.0.0.0:14317 otlp: endpoint: http://0.0.0.0:14318 compression: none tls: insecure: true logging: verbosity: detailed service: pipelines: traces: receivers: [otlp] exporters: [logging, otlp] metrics: receivers: [otlp] exporters: [logging]
トレース送信
上記サーバとコレクタを起動したらトレースを送信してみます。
otel-cli exec \ --endpoint 0.0.0.0:4317 \ --traces-endpoint http://0.0.0.0:4318/v1/traces \ --protocol grpc \ --verbose \ --service my-service \ --name "curl google" \ curl https://google.com
何度か送信すると以下のようにトレースがTUIで表示され、コレクタで受信、転送が行えるのが確認できました。
./start-server.sh Trace ID | Span ID | Parent | Name | Kind | Start | End | Elapsed 88bdbb1d9d60fbd0c021fff8b9400d9e | 5b632df43ce3f5f0 | | curl google | client | 0 | 191 | 191 93fdca58ff8cbcc065f53561bcfcd632 | 88136e9b3fb2a9e5 | | curl google | client | 0 | 422 | 422 70d5e36161089057a91c5790072a7bd7 | e81bcaa1085104c8 | | curl google | client | 0 | 376 | 376 dca3fb0c1ba3c1bb199f5eb56cf7f4ea | 46b620332ad9b7b0 | | curl google | client | 0 | 187 | 187
関数のトレースの取得
これだけだとスタンドアロンのコレクタと変わらないのでLambda関数を実行してトレースを取得して......... みたかったのですが、今回の構成では実現できませんでした。
より詳しくは以下の通りです。
- コレクタはLambda ランタイムから送信される関数起動イベント受信時にLambda Telemetry APIからの
platform.runtimeDone
イベントを待機します - Runtime API エミュレータではTelemetry APIが実装されていないため、上記のイベントが送信されることがなくコレクタは待機しつづけます
エミュレータでのTelemetry APIの実装
実際にはTelemetry APIのインタフェースとスタブ(No OP) 実装およびそれらへのルーティングは実装されています。エミュレータのコードをちょっと書き換えるとエンドポイントを有効にできるのですが、この実装は何もしてくれないので上記の問題を解決できませんでした。残念。
- APIの実装
- ルーティングの実装
- このあたりからSetTelemetrySubscriptionを呼んでおくとAPIを有効化できる
まとめ
残念ながらローカルで起動してトレースを取得することはできませんでしたが、エミュレータとコレクターのコードを行ったり来たりしたので少しだけ実装や挙動に詳しくなれました。