Otel Collector v0.104.0 で otlpreceiver default endpoint が変更になったので対応した

2024/07/11に公開

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

OpenTelemetry Collector v0.104.0 で otlpreceiver のデフォルトエンドポイントが localhost に変更されました。

https://github.com/open-telemetry/opentelemetry-collector/releases/tag/v0.104.0

原文を引用します。

The otlpreceiver now uses localhost by default instead of 0.0.0.0. This may break the receiver in containerized environments like Kubernetes. If you depend on 0.0.0.0 disable the component.UseLocalHostAsDefaultHost feature gate or explicitly set the endpoint to 0.0.0.0.

どういうことか?

以前から Collector 起動時ログに以下のような警告が出ていました。

warn	localhostgate/featuregate.go:63	The default endpoints for all servers in components will change to use localhost instead of 0.0.0.0 in a future version. Use the feature gate to preview the new default.

0.0.0.0 でエンドポイントを起動することはセキュリティ上の懸念であるため、デフォルトが localhost に変更されたと推測します。

対応

私は以下のようにエンドポイントを指定せずに Otel Collector を使用していたため、今回の v0.104.0 でデプロイしたらトレースを受け付けなくなり沼にハマりました。

receivers:
  otlp:
    protocols:
      grpc:

明示的に指定

0.0.0.0:4317 のように明示的に指定してあげることで v0。104。0 以前と同じように動作します。
ただ、接続元制限は Security Group などで行う必要があります。

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317

ホスト名(IPアドレス) を拾ってくる

0.0.0.0 よりセキュアな設定として、ホスト名を拾ってくる方法もあります。
接続元制限は相変わらず必要です。

Kubernetes の場合は Pod の IP アドレスを拾ってくることができます。

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: ${env:MY_POD_IP}:4317

ECS の場合はこちらになります。

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: ${env:HOSTNAME}:4317

まとめ

すこし沼ったので備忘を含めて記事にしました。
そもそもエンドポイントを指定せずに使っていたのがよくなかったのかもしれません。
ログだったりアップデートだったりをきちんを追うことの大切さが改めてわかりました。

Discussion