🍇
OpenTelemetryのPythonインストゥルメンテーションパターン分類
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