OpenTelemetryのシグナルはOTLP(OpenTelemetry Protocol)形式になるのが普通なわけだけど、それを運ぶ際のトランスポートプロトコルとして、「HTTP/Protobuf」「HTTP/JSON」「gRPC」が用意されている。ただし、OpenTelemetry SDKがこのすべてに対応しているかというと、どうやらけっこう差があるようだ。
これまで試してきたzero-code計装ではいずれもHTTP/Protobufがデフォルトとなっており、これをもとにテストしていた。
各言語のzero-code計装実験を使い、改めて3つのトランスポートプロトコルの対応状況を調べることにしよう。
立てるOpenTelemetry Collectorでは以下のようにreceiverでhttpとgrpcを待ち構える。Collectorのhttpはこれ1つでHTTP/ProtobufとHTTP/JSONをサポートする。httpはTCPポート4318、grpcはTCPポート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/json、grpcのいずれかとなる
ここからテストのために明示指定するとして、パターンは以下のようになる。
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のみと厳しいのはPythonとRubyであった。
いずれにせよ、こう比較表にしてみると、Collector経由なしにアプリケーションから直接シグナルを受け取る側のサービスを考えるならHTTP/Protobufが第一選択肢となりそうだ。ユーザーとしても現状のHTTP/Protobufで大きな不満がなく、そのために今gRPC非対応の言語においてgRPC対応しようぜの開発機運は盛り上がっていないように見える。
もともとgRPCで始まったOTLPだが、最新の仕様においては、OTLP/gRPCがまだ最初に陣取って存在感を出しているものの、続けてOTLP/HTTPもしっかり書かれていて、優劣を付けてもいない。
私見ではあるが、このまま大勢に流れて、HTTP/ProtobufがOTLPを運ぶデファクトスタンダードになるのではないか。
実際「HTTPです、destポート4318を開けてください」と「gRPCです、destポート4317を開けてください」は、前者はファイアウォール管理者に話を通しやすそうだが、後者は「gRPCなにそれ」の説得から始めないといけない気がする。