🔭
OTLP-http/python の方法
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 を使いたい。
Discussion