はじめに
七尾百合子さん、お誕生日 132日目 おめでとうございます! nikkieです。
FlaskのOpenTelemetryの例を知ったので、FastAPIで試しました。
目次
FastAPI アプリを OpenTelemetry で計装
ばーん!
PEP 723を使って用意しました。
コンソール (☆) で実行
% uv run https://gist.githubusercontent.com/ftnext/a1b354b2dc7e9a8ac8059afa4792591d/raw/3b93803d1d0f0434c04c24c69f24fad8a01f4466/fastapi_opentelemetry.py
別のコンソールでリクエストを送ると
% curl http://127.0.0.1:8000/
{"message":"Hello World"}
(☆)のコンソールにトレースが出力されます!
考えたこと
Flaskを例にしたドキュメントをすでに読んでいました。
3つの例のうち「プログラムによる計装」をFastAPIに読み替えています。
- opentelemetry-instrumentation-flask に代えて opentelemetry-instrumentation-fastapi をインストール
- Flaskの例にあるTracerの設定のコードを移植
- https://opentelemetry.io/docs/languages/python/instrumentation/#acquire-tracer
- 標準出力に出力するためには、
FastAPIInstrumentor.instrument_app(app)だけでは足りませんでした
ソースコード中のdocstringを読むと、FastAPIInstrumentor.instrument_app(app)だけでいけそうですが、
https://github.com/open-telemetry/opentelemetry-python-contrib/blob/59cc34e9f37decd0e9f00ccb279c3bb8e0345d6e/instrumentation/opentelemetry-instrumentation-fastapi/src/opentelemetry/instrumentation/fastapi/__init__.py#L16-L30
実際にはTracerの設定が必要です(もう少し理解を深められそうな宿題事項)
積ん読リスト
PyCon APAC 2023にOpenTelemetryを扱ったセッションがあります(他の年や海外のPyConにもあるでしょう)
終わりに
FastAPIアプリケーションにOpenTelemetryを導入する方法が分かりました。
OpenTelemetry自体は掴みかねているところがあり、まだまだ素振りの余地があります。
FlaskやFastAPIなどWebアプリケーション側に入れるのは、アプリケーションの可観測性を上げるためと理解できるのですが、requestsやhttpxといったクライアント側にもOpenTelemetryのパッケージが用意されているのはなぜなんでしょう?
https://opentelemetry.io/ecosystem/registry/?language=python&component=instrumentation