(COM307) OpenTelemetry Lambda Layers のコレクタでローカルでトレース取得したかったけどダメだった

2023.12.28

はじめに

前回の記事でコレクタを起動できたのでトレースの取得を試してみます。

モニタリング環境のセットアップ

トレースの送信を確認するために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) 実装およびそれらへのルーティングは実装されています。エミュレータのコードをちょっと書き換えるとエンドポイントを有効にできるのですが、この実装は何もしてくれないので上記の問題を解決できませんでした。残念。

まとめ

残念ながらローカルで起動してトレースを取得することはできませんでしたが、エミュレータとコレクターのコードを行ったり来たりしたので少しだけ実装や挙動に詳しくなれました。