以下の内容はhttps://kmuto.hatenablog.com/entry/2025/02/04/224500より取得しました。


各言語のOpenTelemetry SDKのEXPORTERプロトコルの対応状況を調べてみた

OpenTelemetryのシグナルはOTLP(OpenTelemetry Protocol)形式になるのが普通なわけだけど、それを運ぶ際のトランスポートプロトコルとして、「HTTP/Protobuf」「HTTP/JSON」「gRPC」が用意されている。ただし、OpenTelemetry SDKがこのすべてに対応しているかというと、どうやらけっこう差があるようだ。

これまで試してきたzero-code計装ではいずれもHTTP/Protobufがデフォルトとなっており、これをもとにテストしていた。

kmuto.hatenablog.com

各言語のzero-code計装実験を使い、改めて3つのトランスポートプロトコルの対応状況を調べることにしよう。

立てるOpenTelemetry Collectorでは以下のようにreceiverでhttpgrpcを待ち構える。Collectorのhttpはこれ1つでHTTP/ProtobufとHTTP/JSONをサポートする。httpTCPポート4318、grpcTCPポート4317を使うことが既定値となっている。

receivers:
  otlp:
    protocols:
      http:
      grpc:

exporters:
  debug:
    verbosity: detailed

service:
  pipelines:
    logs:
      receivers: [otlp]
      exporters: [debug]
    metrics:
      receivers: [otlp]
      exporters: [debug]
    traces:
      receivers: [otlp]
      exporters: [debug]

アプリケーション側のexporter設定は環境変数で切り替えることができる。

  • OTEL_EXPORTER_OTLP_ENDPOINT: エンドポイント。デフォルトは http://localhost:4318(HTTP/ProtobufおよびHTTP/JSON用)。今立てているローカルホストのgRPCに渡すなら http://localhost:4317とする
  • OTEL_EXPORTER_OTLP_PROTOCOL: プロトコルhttp/protobuf(デフォルト)、http/jsongrpcのいずれかとなる

ここからテストのために明示指定するとして、パターンは以下のようになる。

  • OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf (HTTP/Protobuf)
  • OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 OTEL_EXPORTER_OTLP_PROTOCOL=http/json (HTTP/JSON
  • OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 OTEL_EXPORTER_OTLP_PROTOCOL=grpc (gRPC)

結果はどうだったろうか。Rubyも加えた7言語の2025年2月4日時点での状況は以下のとおりであった。

言語 HTTP/Protobuf HTTP/JSON gRPC
Go (opentelemetry-go-instrumentation) ×
Go (alibaba/opentelemetry-go-auto-instrumentation)
.NET ×
Java ×
Python × ×
PHP ×
JavaScript
Ruby × ×

ふーむ、興味深い。

全勝はalibaba版GoとJavaScript。.NET・Java・OpenTelemetry版GoがHTTP/JSON非対応なのに対し、PHPはHTTP/JSONに対応するが代わりにgRPC非対応。そしてHTTP/Protobufのみと厳しいのはPythonRubyであった。

いずれにせよ、こう比較表にしてみると、Collector経由なしにアプリケーションから直接シグナルを受け取る側のサービスを考えるならHTTP/Protobufが第一選択肢となりそうだ。ユーザーとしても現状のHTTP/Protobufで大きな不満がなく、そのために今gRPC非対応の言語においてgRPC対応しようぜの開発機運は盛り上がっていないように見える。

もともとgRPCで始まったOTLPだが、最新の仕様においては、OTLP/gRPCがまだ最初に陣取って存在感を出しているものの、続けてOTLP/HTTPもしっかり書かれていて、優劣を付けてもいない。

私見ではあるが、このまま大勢に流れて、HTTP/ProtobufがOTLPを運ぶデファクトスタンダードになるのではないか。

実際「HTTPです、destポート4318を開けてください」と「gRPCです、destポート4317を開けてください」は、前者はファイアウォール管理者に話を通しやすそうだが、後者は「gRPCなにそれ」の説得から始めないといけない気がする。




以上の内容はhttps://kmuto.hatenablog.com/entry/2025/02/04/224500より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14