概要
これまではアプリ -> コレクタ -> exporter -> Jaeger という経路でトレース情報を送信していました
推奨ではないですがコレクタと exporter をすっ飛ばして直接トレース情報を Jaeger に送信することもできるので紹介します
環境
- macOS 15.3.1
- Python 3.12.9
- flask 3.1.0
- open-telemetry 0.51b0
- OpenTelemetry Collector 0.121.0
- Jaeger (all in one) 1.67.0
Jaeger 起動
-
docker run --rm --name jaeger -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -p 16686:16686 -p 4317:4317 -p 4318:4318 -p 14250:14250 -p 14268:14268 -p 14269:14269 -p 9411:9411 jaegertracing/all-in-one:latest
4317 で OTLP のトレース情報を直接受けます
アプリ起動
-
export OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true && pipenv run opentelemetry-instrument --logs_exporter otlp --service_name dice-server python app.py
上記の設定では otlp は localhost:4317 に送信されます
app.py
前回と変わりませんが記載しておきます
from random import randint
from flask import Flask
from opentelemetry import trace
# Acquire a tracer
tracer = trace.get_tracer("diceroller.tracer")
app = Flask(__name__)
@app.route("/rolldice")
def roll_dice():
username = get_username()
return str(roll(username))
def get_username():
with tracer.start_as_current_span("get_username") as rollspan:
username = "hawksnowlog"
rollspan.set_attribute("username", username)
return username
def roll(username: str):
# This creates a new span that's the child of the current one
with tracer.start_as_current_span("roll") as rollspan:
res = randint(1, 6)
rollspan.set_attribute("roll.value", res)
return res
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
動作確認
Jaeger を確認するとトレース情報が確認できます
最後に
おそらく OpenTelemetry が推奨する方法ではないですがこの方法でもトレース情報を送信できます
アプリのメトリックスを取得しない(トレースだけ)かつ OTLP の情報を Jaeger 以外に送らないのであればこの構成でもいいのかもしれません