🍇

OpenTelemetryのPythonインストゥルメンテーションパターン分類

2024/05/17に公開

https://opentelemetry.io/docs/languages/python/automatic/example/ の要点抽出です。

手動(manual)インストゥルメンテーション

概要:

  • プログラムの処理中で tracer.start_as_current_span でスパンを作成する
@app.route("/server_request")
def server_request():
    with tracer.start_as_current_span(
        "server_request",
        context=extract(request.headers),
        kind=trace.SpanKind.SERVER,
        attributes=collect_request_attributes(request.environ),
    ):
        print(request.args.get("param"))
        return "served"

実行時:

source ./venv/bin/activate
python server_manual.py

(必要に応じてvenvをactiveにして)普通に起動するだけ

自動(automatical)インストゥルメンテーション

概要:

  • モンキーパッチ(実行時の処理書き換え)によってログを出力する
    • コード自体にはOpenTelemetry用の内容変更はなし
    • 実行時に監視用プロセス内でサーバーを起動する
@app.route("/server_request")
def server_request():
    print(request.args.get("param"))
    return "served"

(コード内にはOpenTelemetryに関わる修正はない)

実行時:

opentelemetry-instrument --traces_exporter console --metrics_exporter none python server_automatic.py

opentelemetry-instrument プロセス内でサーバーを起動する

プログラム(programmatical)インストゥルメンテーション

概要:

  • 自動インストゥルメンテーションにやってることは近いが、プロセスのラップをプログラムコード内で定義している
  • コードの各種API定義部分には干渉せず、起動コマンドの修正のみ
instrumentor = FlaskInstrumentor()

app = Flask(__name__)

instrumentor.instrument_app(app)
# instrumentor.instrument_app(app, excluded_urls="/server_request")
@app.route("/server_request")
def server_request():
    print(request.args.get("param"))
    return "served"

実行時:

source ./venv/bin/activate
python server_programmatic.py

(必要に応じてvenvをactiveにして)普通に起動するだけ

Discussion