2025年3月11日火曜日

OpenTelemetry のトレース箇所を独自で設定する方法

OpenTelemetry のトレース箇所を独自で設定する方法

概要

前回 OpenTelemetry を Flask アプリに適用する方法を紹介しました
前回の方法はトレースやメトリックス情報を自動で送信してくれる設定です
今回は手動でトレース情報を送信する方法を紹介します

環境

  • 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

app.py

自動でトレースする設定は外し自分でトレースしたい箇所に設定します
基本的には tracer.start_as_current_span でトレースしたい箇所にスパンを作成するだけで OK です

以下の設定では2箇所でスパンを作成しています

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、コレクターを起動します

  • export OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true && pipenv run opentelemetry-instrument --logs_exporter otlp --service_name dice-server python app.py
  • docker run --rm --name jaeger -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -p 16686:16686 -p 14317:4317 -p 14318:4318 -p 14250:14250 -p 14268:14268 -p 14269:14269 -p 9411:9411 jaegertracing/all-in-one:latest
  • docker run -p 4317:4317 -v $(pwd)/otel-collector-config.yaml:/etc/otel-collector-config.yaml otel/opentelemetry-collector:latest --config=/etc/otel-collector-config.yaml

動作確認

localhost:8080/rolldice にアクセスし Jaeger で確認しましょう
以下のように1つのリクエストに対して2つのスパンが作成されていれば OK です

最後に

OpenTelemetry を使って独自のトレース情報を設定する方法を紹介しました
自動の場合はスパンなどが細かく設定できないのでプロダクションでは独自設定を使うことになると思います

参考サイト

0 件のコメント:

コメントを投稿