🔭

OTLP-http/python の方法

2024/11/25に公開

jaeger で OpenTelemetry Protocol (OTLP) over HTTP (port 4318) なエンドポイントに python instrument されたものを送り込みたいとき。デフォルトでは grpc/https だと思われてしまうので、OTEL_EXPORTER_OTLP_PROTOCOL を指定する(doc)。

OTEL_EXPORTER_OTLP_ENDPOINT=https://jaeger.endpoint.example.org \
OTEL_SERVICE_NAME=test \
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \
opentelemetry-instrument python somescript.py

jaeger は metrics は収集しないので、OTLP metrics 送る段でエラーログがでる。気になるようなら次のようにして metrics を無効化する(doc)。

OTEL_EXPORTER_OTLP_ENDPOINT=https://jaeger.endpoint.example.org \
OTEL_SERVICE_NAME=test \
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \
OTEL_METRICS_EXPORTER=none \
opentelemetry-instrument python somescript.py

propagate hint

opentelemetry-instrumentation では、web サーバしか propagation が仕込まれていないように見受けられる。ansible では自前で実装
していたりする。

そういう時は最低限のコードを追加せざるを得ない。

import requests
import os
from opentelemetry import trace, propagate

propagate.extract({k.lower():v for k,v in os.environ.items()})
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("access") as span:
    conf={}
    propagate.inject(conf)
    assert requests.get("https://www.iij.ad.jp", json={"conf":conf}).ok

後は instrument すれば propagate されるようになっているはず。

OTEL_EXPORTER_OTLP_ENDPOINT=https://jaeger.endpoint.example.org \
OTEL_SERVICE_NAME=test \
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \
OTEL_METRICS_EXPORTER=none \
OTEL_PYTHON_TRACER_PROVIDER=sdk_tracer_provider \
opentelemetry-instrument python somescript.py

環境変数 TRACEPARENT, TRACESTATE を使いたい。
https://github.com/open-telemetry/opentelemetry-specification/issues/740

Discussion