Sync fastapi docs from f5c6e9b4 on 2026-10-11

This commit is contained in:
The Librarian
2026-10-11 04:00:08 +00:00
parent 818066b271
commit 4ea5e319f3
29 changed files with 2470 additions and 260 deletions
+2 -2
View File
@@ -4,8 +4,8 @@ This is a mirror of the Fastapi repository.
**Synced from:** https://github.com/tiangolo/fastapi.git
**Branch:** master
**Commit:** 50113da16fec53b66b80d75e80a89296de4fa5a5
**Sync Date:** 2026-09-11
**Commit:** f5c6e9b4f9cadc1bf0f9a1fd672e621206b63007
**Sync Date:** 2026-10-11
**Content:** Paths: docs, docs_src
---
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
Wenn Ihre API läuft, möchten Sie vielleicht wissen, wie viel Traffic sie erhält, welche Requests langsam sind und wann Fehler auftreten.
**Telemetrie** umfasst Daten über das Verhalten Ihrer Anwendung, die Ihnen helfen, diese Fragen zu beantworten. Zu den gängigen Typen gehören:
- **Metriken**: Messwerte, die Sie über einen Zeitraum zusammenfassen können, etwa Responsezeiten und die Anzahl der verarbeiteten Requests.
- **Traces**: Aufzeichnungen einzelner Requests und der Operationen, die zu ihrer Verarbeitung ausgeführt werden. Jede zeitlich erfasste Operation wird als **Span** bezeichnet.
- **Logs**: Aufzeichnungen von Events mit Zeitstempel, etwa das Starten einer Anwendung oder das Fehlschlagen einer Operation.
[**OpenTelemetry**](https://opentelemetry.io/) ist eine Sammlung von Standards und Werkzeugen zum Erfassen von Telemetriedaten und zum Senden dieser Daten an einen Monitoring-Dienst, wo Sie sie in Dashboards untersuchen können.
**FastAPI bietet standardmäßig OpenTelemetry-Unterstützung** für HTTP-Request-Traces, Metriken und Logs. WebSocket-Verbindungen liefern ebenfalls Traces und Logs. Um diese Daten anzuzeigen, konfigurieren Sie einen Monitoring-Dienst, der sie empfängt.
## FastAPI installieren { #install-fastapi }
Installieren Sie FastAPI mit den `standard`-Extras, die die Pakete zum Senden von Telemetriedaten enthalten:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## Die Anwendung erstellen { #create-the-app }
Erstellen Sie eine Datei `main.py`:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
Beachten Sie, dass alles standardmäßig funktioniert. Sie müssen keinen eigenen Code schreiben, damit die Telemetrie funktioniert.
## FastAPI Cloud { #fastapi-cloud }
Wenn Sie mit `fastapi[standard]` auf [FastAPI Cloud](https://fastapicloud.com) deployen, funktionieren Metriken automatisch. Sie müssen nichts weiter konfigurieren.
Mit einem Pro-Tarif können Sie die Anzahl der Requests, Fehlerraten und Responsezeiten im [Metriken-Dashboard](https://fastapicloud.com/docs/monitoring-and-performance/metrics/) anzeigen.
<img src="/img/tutorial/opentelemetry/image01.png" alt="FastAPI Cloud Pro-Metriken-Dashboard mit Beispieldaten">
## Andere Monitoring-Dienste { #other-monitoring-services }
Um Telemetriedaten an einen anderen Monitoring-Dienst zu senden, konfigurieren Sie einen Endpunkt, der **OTLP** akzeptiert, das OpenTelemetry-Protokoll zum Senden von Telemetriedaten. Verwenden Sie den HTTP/protobuf-Basisendpunkt des Dienstes.
Setzen Sie diese Umgebungsvariablen und ersetzen Sie die Beispiel-URL durch Ihren Endpunkt:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` identifiziert Ihre Anwendung im Monitoring-Dienst. Der Endpunkt ist die Basis-URL für den Empfang von Daten. Unter dieser URL werden Traces an `/v1/traces`, Metriken an `/v1/metrics` und Logs an `/v1/logs` gesendet.
Wenn Ihr Dienst Authentifizierung erfordert, setzen Sie `OTEL_EXPORTER_OTLP_HEADERS` auf die von ihm vorgegebenen Header, zum Beispiel `api-key=YOUR_API_KEY`.
## Die Anwendung ausführen { #run-the-app }
Starten Sie die Anwendung im selben Terminal:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
Senden Sie in einem anderen Terminal einen Request:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
Öffnen Sie Ihren Monitoring-Dienst und suchen Sie nach `my-api`. Nach dem nächsten Export sehen Sie einen Trace mit einem `GET /items/{item_id}`-Span sowie Metriken zur Anzahl der Requests, zur Responsedauer und zu aktiven Requests.
## Telemetrie anpassen { #customize-telemetry }
### Provider und Exporter konfigurieren { #configure-providers-and-exporters }
Ein **Provider** stellt die Objekte bereit, die Traces, Metriken oder Logs aufzeichnen. Seine Konfiguration steuert, wie diese Daten verarbeitet und exportiert werden.
Telemetriebibliotheken können die globalen Provider von OpenTelemetry konfigurieren. Konfigurieren Sie die Bibliothek, bevor die Anwendung startet, und FastAPI verwendet diese Provider automatisch.
Wenn ein OTLP-Endpunkt in der Umgebung gesetzt ist, fügt FastAPI jedem aktivierten Provider einen Exporter für dieses Ziel hinzu. Vorhandene Exporter senden weiterhin Daten an ihre Ziele.
Konfigurieren Sie jedes Ziel einmal. Wenn eine andere Bibliothek bereits das in der Umgebung angegebene Ziel verwaltet, deaktivieren Sie deren Export über die Umgebung oder schalten Sie FastAPIs automatische Einrichtung aus:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
Sie können auch einen Provider direkt im Dictionary `telemetry` übergeben. Dieser Provider verwendet beispielsweise den Konsolenexporter von OpenTelemetry, um Request-Spans in Ihrem Terminal auszugeben:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
Der **Exporter** sendet die Spans an ihr Ziel. `BatchSpanProcessor` gruppiert Spans und sendet sie im Hintergrund. Ersetzen Sie den Konsolenexporter durch einen Exporter Ihrer Monitoring-Bibliothek, um deren Ziel zu verwenden. Weitere Konfigurationsoptionen finden Sie im [Leitfaden zur Python-Instrumentierung von OpenTelemetry](https://opentelemetry.io/docs/languages/python/instrumentation/).
Verwenden Sie `meter_provider` oder `logger_provider` im selben Dictionary, um einen Provider für Metriken oder Logs bereitzustellen. Die Anwendung oder Bibliothek, die einen Provider erstellt, verwaltet dessen Shutdown. FastAPI verwaltet die Exportkomponenten, die es hinzufügt.
/// warning | Achtung
OpenTelemetry verwendet standardmäßig globale Provider. Eine unabhängige Telemetriekonfiguration für [gemountete Unteranwendungen](sub-applications.md) ist nicht garantiert.
///
### Request-Operationen nachverfolgen { #trace-request-operations }
Standardmäßig enthalten Request-Traces Spans für das Auflösen von Abhängigkeiten, das Ausführen Ihrer Pfadoperation-Funktion, das Serialisieren der Response und das Ausführen jedes Tasks in FastAPIs `BackgroundTasks`. Diese Spans verwenden denselben Provider und dieselben Exporter.
Die Spans der Hintergrundtasks bleiben Teil des Request-Traces. Sie werden ausgeführt, nachdem der HTTP-Response-Span beendet ist, und erhöhen daher nicht die gemessene Responsezeit.
Um nur den HTTP-Request-Span aufzuzeichnen, setzen Sie `operation_spans` auf `False`:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### WebSocket-Verbindungen nachverfolgen { #trace-websocket-connections }
Jede WebSocket-Verbindung hat einen Span wie `WS /ws/{room}`, der den Handler und das Aufräumen der Abhängigkeiten umfasst. Er verwendet dieselben Provider und Einstellungen, einschließlich `operation_spans` für das Auflösen von Abhängigkeiten und das Ausführen des Endpunkts.
HTTP-Request-Metriken erfassen nur HTTP-Requests. Normale WebSocket-Verbindungsabbrüche mit den Codes `1000` oder `1001` erzeugen keine Fehlerlogs.
### Fehler untersuchen { #inspect-errors }
FastAPI zeichnet unbehandelte Exceptions als OpenTelemetry-Logs auf, die mit dem Trace des Requests oder der Verbindung verknüpft sind. Fehlerlogs werden auch dann aufgezeichnet, wenn der Trace nicht durch Sampling erfasst wird.
Exception-Logs enthalten den Typ, die Nachricht und den Stacktrace der Exception. Nachrichten und Stacktraces können sensible Informationen enthalten. Verwenden Sie die Logprozessoren Ihres Providers, um diese zu filtern oder zu schwärzen, oder setzen Sie `logs` auf `False`, um diese Logs zu deaktivieren.
FastAPI zeichnet außerdem fehlgeschlagene Request-Validierungen als Warnungslogs mit der Route und der Fehleranzahl auf. Diese Logs enthalten nicht die ungültigen Eingabedaten.
## Die aufzuzeichnenden Daten auswählen { #choose-what-to-record }
Das Dictionary `telemetry` akzeptiert außerdem diese Einstellungen:
| Einstellung | Zweck | Defaultwert |
| --- | --- | --- |
| `tracing` | Spans für HTTP-Requests und WebSocket-Verbindungen aufzeichnen | `True` |
| `metrics` | HTTP-Request-Metriken aufzeichnen | `True` |
| `logs` | Fehlgeschlagene Validierungen und unbehandelte Exceptions aufzeichnen | `True` |
| `operation_spans` | Spans für Request-Operationen hinzufügen | `True` |
| `exclude` | Requests überspringen, wenn eine Funktion, die den ASGI-Scope empfängt, `True` zurückgibt | `None` |
| `auto_configure` | Exporter für Endpunkte hinzufügen, die in Umgebungsvariablen gesetzt sind | `True` |
Um beispielsweise Metriken zu erfassen und dabei Healthchecks auszuschließen:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
Setzen Sie `auto_configure` auf `False`, wenn Ihre Anwendung die Einrichtung der Provider selbst übernimmt, etwa innerhalb ihrer Lifespan-Funktion.
+24 -51
View File
@@ -1,8 +1,5 @@
sponsors:
- - login: renderinc
avatarUrl: https://avatars.githubusercontent.com/u/36424661?v=4
url: https://github.com/renderinc
- login: subtotal
- - login: subtotal
avatarUrl: https://avatars.githubusercontent.com/u/176449348?v=4
url: https://github.com/subtotal
- login: greptileai
@@ -29,9 +26,6 @@ sponsors:
- login: svix
avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4
url: https://github.com/svix
- login: permitio
avatarUrl: https://avatars.githubusercontent.com/u/71775833?v=4
url: https://github.com/permitio
- login: databento
avatarUrl: https://avatars.githubusercontent.com/u/64141749?v=4
url: https://github.com/databento
@@ -50,16 +44,16 @@ sponsors:
- - login: manulife-ai
avatarUrl: https://avatars.githubusercontent.com/u/195145621?v=4
url: https://github.com/manulife-ai
- login: ptimizeroracle
avatarUrl: https://avatars.githubusercontent.com/u/99191972?u=ee268f7afba9856cbd30859ba33708849bc2ece4&v=4
url: https://github.com/ptimizeroracle
- login: scalar
avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4
url: https://github.com/scalar
- login: Trivie
avatarUrl: https://avatars.githubusercontent.com/u/8161763?v=4
url: https://github.com/Trivie
- - login: takashi-yoneya
avatarUrl: https://avatars.githubusercontent.com/u/33813153?u=2d0522bceba0b8b69adf1f2db866503bd96f944e&v=4
url: https://github.com/takashi-yoneya
- login: Doist
- - login: Doist
avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4
url: https://github.com/Doist
- - login: alixlahuec
@@ -74,9 +68,6 @@ sponsors:
- login: ChargeStorm
avatarUrl: https://avatars.githubusercontent.com/u/26000165?v=4
url: https://github.com/ChargeStorm
- login: tltaylor1
avatarUrl: https://avatars.githubusercontent.com/u/234697691?u=f9bf860a7a6e1109b35f1eb930920bd37e3bf571&v=4
url: https://github.com/tltaylor1
- login: justoutofcuriosity
avatarUrl: https://avatars.githubusercontent.com/u/57193655?v=4
url: https://github.com/justoutofcuriosity
@@ -107,6 +98,9 @@ sponsors:
- login: ashi-agrawal
avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4
url: https://github.com/ashi-agrawal
- login: mjohnsey
avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4
url: https://github.com/mjohnsey
- login: jugeeem
avatarUrl: https://avatars.githubusercontent.com/u/116043716?u=e4df530e99a086a1085f3dc125b94783670fb383&v=4
url: https://github.com/jugeeem
@@ -125,30 +119,18 @@ sponsors:
- login: anthonycepeda
avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4
url: https://github.com/anthonycepeda
- login: PedroRuizCode
avatarUrl: https://avatars.githubusercontent.com/u/69810923?u=26f9b262922b724deacdfa16ccd5785d093ac371&v=4
url: https://github.com/PedroRuizCode
- login: patsatsia
avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4
url: https://github.com/patsatsia
- login: bradsward
avatarUrl: https://avatars.githubusercontent.com/u/60303274?u=6b74120e142c8bd4dae22edcf3ac6bb9c3b427bb&v=4
url: https://github.com/bradsward
- login: dudikbender
avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4
url: https://github.com/dudikbender
- login: jaredtrog
avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
url: https://github.com/jaredtrog
- login: Ryandaydev
avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=87b1afc7f4fff933779959270e2d168339e91402&v=4
url: https://github.com/Ryandaydev
- login: gorhack
avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4
url: https://github.com/gorhack
- login: mj0331
avatarUrl: https://avatars.githubusercontent.com/u/3890353?u=1c627ac1a024515b4871de5c3ebbfaa1a57f65d4&v=4
url: https://github.com/mj0331
- login: aacayaco
avatarUrl: https://avatars.githubusercontent.com/u/3634801?u=eaadda178c964178fcb64886f6c732172c8f8219&v=4
url: https://github.com/aacayaco
@@ -170,6 +152,9 @@ sponsors:
- login: netsatan
avatarUrl: https://avatars.githubusercontent.com/u/955557?u=cb8fc0ae7f7b06807f0a58e335b1af96c9da0344&v=4
url: https://github.com/netsatan
- login: KevinTCoughlin
avatarUrl: https://avatars.githubusercontent.com/u/706967?u=f00384d8ecf138ebb1f7d6aca34dc2a9d5431dc1&v=4
url: https://github.com/KevinTCoughlin
- login: koxudaxi
avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4
url: https://github.com/koxudaxi
@@ -179,12 +164,6 @@ sponsors:
- login: jstanden
avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4
url: https://github.com/jstanden
- login: mjohnsey
avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4
url: https://github.com/mjohnsey
- login: cizekmilan
avatarUrl: https://avatars.githubusercontent.com/u/15999191?u=df194a9bf279f503bc96af41a35c0027eb94ad4f&v=4
url: https://github.com/cizekmilan
- login: khadrawy
avatarUrl: https://avatars.githubusercontent.com/u/13686061?u=59f25ef42ecf04c22657aac4238ce0e2d3d30304&v=4
url: https://github.com/khadrawy
@@ -194,9 +173,6 @@ sponsors:
- login: jsoques
avatarUrl: https://avatars.githubusercontent.com/u/12414216?u=620921d94196546cc8b9eae2cc4cbc3f95bab42f&v=4
url: https://github.com/jsoques
- login: wdwinslow
avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=371272f2c69e680e0559a7b0a57385e83a5dc728&v=4
url: https://github.com/wdwinslow
- login: hiancdtrsnm
avatarUrl: https://avatars.githubusercontent.com/u/7343177?v=4
url: https://github.com/hiancdtrsnm
@@ -215,13 +191,13 @@ sponsors:
- login: ternaus
avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4
url: https://github.com/ternaus
- login: jaredtrog
avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
url: https://github.com/jaredtrog
- - login: jpfyoder
avatarUrl: https://avatars.githubusercontent.com/u/7548821?u=1683290ed65dae6987d673da044067577ee71521&v=4
url: https://github.com/jpfyoder
- - login: manoelpqueiroz
avatarUrl: https://avatars.githubusercontent.com/u/23669137?u=b12e84b28a84369ab5b30bd5a79e5788df5a0756&v=4
url: https://github.com/manoelpqueiroz
- login: Artur-Galstyan
- - login: Artur-Galstyan
avatarUrl: https://avatars.githubusercontent.com/u/63471891?u=e8691f386037e51a737cc0ba866cd8c89e5cf109&v=4
url: https://github.com/Artur-Galstyan
- - login: pawamoy
@@ -251,9 +227,6 @@ sponsors:
- login: joshuatz
avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
url: https://github.com/joshuatz
- login: danielunderwood
avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4
url: https://github.com/danielunderwood
- login: my3
avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4
url: https://github.com/my3
@@ -305,12 +278,12 @@ sponsors:
- login: sdevkota
avatarUrl: https://avatars.githubusercontent.com/u/5250987?u=4ed9a120c89805a8aefda1cbdc0cf6512e64d1b4&v=4
url: https://github.com/sdevkota
- login: rangulvers
avatarUrl: https://avatars.githubusercontent.com/u/5235430?u=e254d4af4ace5a05fa58372ae677c7d26f0d5a53&v=4
url: https://github.com/rangulvers
- - login: mohammadi-hadi
avatarUrl: https://avatars.githubusercontent.com/u/50410241?u=1137b5ff9ea8585c0192fe9ddb4ae5e21bc3d2e8&v=4
url: https://github.com/mohammadi-hadi
- login: danielunderwood
avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4
url: https://github.com/danielunderwood
- - login: emrahbatigun
avatarUrl: https://avatars.githubusercontent.com/u/52425144?u=ddf9a50b6b5e9d32f0bb50650988ef64b09646e8&v=4
url: https://github.com/emrahbatigun
- login: morzan1001
avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4
url: https://github.com/morzan1001
@@ -332,12 +305,12 @@ sponsors:
- login: diogotoporcov
avatarUrl: https://avatars.githubusercontent.com/u/207575398?u=1fa7cf41b4181faa4d27f38bc37a374c17b5163b&v=4
url: https://github.com/diogotoporcov
- login: anandakrishnone
avatarUrl: https://avatars.githubusercontent.com/u/100110721?u=5d30e6fea1524bf3c8be3547027dbce59cc699af&v=4
url: https://github.com/anandakrishnone
- login: onestn
avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4
url: https://github.com/onestn
- login: gabe-santana
avatarUrl: https://avatars.githubusercontent.com/u/59267719?u=84b3472a9f82a7ccdf6fbd6788a12661990b66f4&v=4
url: https://github.com/gabe-santana
- login: Toothwitch
avatarUrl: https://avatars.githubusercontent.com/u/1710406?u=5eebb23b46cd26e48643b9e5179536cad491c17a&v=4
url: https://github.com/Toothwitch
-7
View File
@@ -12,10 +12,6 @@ gold:
img: /img/sponsors/propelauth.png
banner_url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=topbanner
banner_img: /img/sponsors/propelauth-banner.png
- url: https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi
title: Deploy & scale any full-stack web app on Render. Focus on building apps, not infra.
img: /img/sponsors/render.svg
banner_img: /img/sponsors/render-banner.svg
- url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi
title: Cut Code Review Time & Bugs in Half with CodeRabbit
img: /img/sponsors/coderabbit.png
@@ -45,9 +41,6 @@ silver:
- url: https://www.svix.com/
title: Svix - Webhooks as a service
img: /img/sponsors/svix.svg
- url: https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi
title: Fine-Grained Authorization for FastAPI
img: /img/sponsors/permit.png
- url: https://dribia.com/en/
title: Dribia - Data Science within your reach
img: /img/sponsors/dribia.png
+191 -191
View File
@@ -1,242 +1,232 @@
repos:
- name: headroom
html_url: https://github.com/headroomlabs-ai/headroom
stars: 68267
stars: 74217
owner_login: headroomlabs-ai
owner_html_url: https://github.com/headroomlabs-ai
- name: full-stack-fastapi-template
html_url: https://github.com/fastapi/full-stack-fastapi-template
stars: 45272
stars: 45830
owner_login: fastapi
owner_html_url: https://github.com/fastapi
- name: Hello-Python
html_url: https://github.com/mouredev/Hello-Python
stars: 37219
stars: 37617
owner_login: mouredev
owner_html_url: https://github.com/mouredev
- name: serve
html_url: https://github.com/jina-ai/serve
stars: 21860
stars: 21864
owner_login: jina-ai
owner_html_url: https://github.com/jina-ai
- name: HivisionIDPhotos
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos
stars: 21468
stars: 21582
owner_login: Zeyi-Lin
owner_html_url: https://github.com/Zeyi-Lin
- name: Douyin_TikTok_Download_API
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
stars: 19776
stars: 20422
owner_login: Evil0ctal
owner_html_url: https://github.com/Evil0ctal
- name: sqlmodel
html_url: https://github.com/fastapi/sqlmodel
stars: 18295
stars: 18354
owner_login: fastapi
owner_html_url: https://github.com/fastapi
- name: fastapi-best-practices
html_url: https://github.com/zhanymkanov/fastapi-best-practices
stars: 18006
stars: 18138
owner_login: zhanymkanov
owner_html_url: https://github.com/zhanymkanov
- name: SurfSense
html_url: https://github.com/MODSetter/SurfSense
stars: 16046
owner_login: MODSetter
owner_html_url: https://github.com/MODSetter
- name: machine-learning-zoomcamp
html_url: https://github.com/DataTalksClub/machine-learning-zoomcamp
stars: 14069
stars: 14648
owner_login: DataTalksClub
owner_html_url: https://github.com/DataTalksClub
- name: XHS-Downloader
html_url: https://github.com/JoeanAmier/XHS-Downloader
stars: 12563
stars: 12882
owner_login: JoeanAmier
owner_html_url: https://github.com/JoeanAmier
- name: fastapi_mcp
html_url: https://github.com/tadata-org/fastapi_mcp
stars: 11994
stars: 12014
owner_login: tadata-org
owner_html_url: https://github.com/tadata-org
- name: peewee
html_url: https://github.com/coleifer/peewee
stars: 11986
stars: 11997
owner_login: coleifer
owner_html_url: https://github.com/coleifer
- name: awesome-fastapi
html_url: https://github.com/mjhea0/awesome-fastapi
stars: 11633
stars: 11696
owner_login: mjhea0
owner_html_url: https://github.com/mjhea0
- name: WhisperLiveKit
html_url: https://github.com/QuentinFuxa/WhisperLiveKit
stars: 10983
stars: 11108
owner_login: QuentinFuxa
owner_html_url: https://github.com/QuentinFuxa
- name: polar
html_url: https://github.com/polarsource/polar
stars: 10225
stars: 10300
owner_login: polarsource
owner_html_url: https://github.com/polarsource
- name: pycaret
html_url: https://github.com/pycaret/pycaret
stars: 9833
stars: 9849
owner_login: pycaret
owner_html_url: https://github.com/pycaret
- name: FastUI
html_url: https://github.com/pydantic/FastUI
stars: 8953
stars: 8940
owner_login: pydantic
owner_html_url: https://github.com/pydantic
- name: FileCodeBox
html_url: https://github.com/vastsa/FileCodeBox
stars: 8498
stars: 8559
owner_login: vastsa
owner_html_url: https://github.com/vastsa
- name: hatchet
html_url: https://github.com/hatchet-dev/hatchet
stars: 7824
stars: 8039
owner_login: hatchet-dev
owner_html_url: https://github.com/hatchet-dev
- name: nonebot2
html_url: https://github.com/nonebot/nonebot2
stars: 7691
stars: 7727
owner_login: nonebot
owner_html_url: https://github.com/nonebot
- name: honcho
html_url: https://github.com/plastic-labs/honcho
stars: 6974
owner_login: plastic-labs
owner_html_url: https://github.com/plastic-labs
- name: Yuxi
html_url: https://github.com/xerrors/Yuxi
stars: 6604
stars: 7251
owner_login: xerrors
owner_html_url: https://github.com/xerrors
- name: dramaclaw
html_url: https://github.com/dramaclaw/dramaclaw
stars: 6615
owner_login: dramaclaw
owner_html_url: https://github.com/dramaclaw
- name: fastapi-users
html_url: https://github.com/fastapi-users/fastapi-users
stars: 6236
stars: 6248
owner_login: fastapi-users
owner_html_url: https://github.com/fastapi-users
- name: serge
html_url: https://github.com/serge-chat/serge
stars: 5712
stars: 5708
owner_login: serge-chat
owner_html_url: https://github.com/serge-chat
- name: YouDub-webui
html_url: https://github.com/liuzhao1225/YouDub-webui
stars: 5401
stars: 5563
owner_login: liuzhao1225
owner_html_url: https://github.com/liuzhao1225
- name: Kokoro-FastAPI
html_url: https://github.com/remsky/Kokoro-FastAPI
stars: 5392
stars: 5499
owner_login: remsky
owner_html_url: https://github.com/remsky
- name: dramaclaw
html_url: https://github.com/dramaclaw/dramaclaw
stars: 4892
owner_login: dramaclaw
owner_html_url: https://github.com/dramaclaw
- name: OpenExecutive
html_url: https://github.com/SenteLabsAI/OpenExecutive
stars: 5434
owner_login: SenteLabsAI
owner_html_url: https://github.com/SenteLabsAI
- name: tick-stock-panel
html_url: https://github.com/shy3130/tick-stock-panel
stars: 5353
owner_login: shy3130
owner_html_url: https://github.com/shy3130
- name: devpush
html_url: https://github.com/hunvreus/devpush
stars: 4747
stars: 4758
owner_login: hunvreus
owner_html_url: https://github.com/hunvreus
- name: strawberry
html_url: https://github.com/strawberry-graphql/strawberry
stars: 4710
stars: 4722
owner_login: strawberry-graphql
owner_html_url: https://github.com/strawberry-graphql
- name: mcp-context-forge
html_url: https://github.com/IBM/mcp-context-forge
stars: 4557
owner_login: IBM
owner_html_url: https://github.com/IBM
- name: logfire
html_url: https://github.com/pydantic/logfire
stars: 4449
stars: 4500
owner_login: pydantic
owner_html_url: https://github.com/pydantic
- name: poem
html_url: https://github.com/poem-web/poem
stars: 4438
stars: 4443
owner_login: poem-web
owner_html_url: https://github.com/poem-web
- name: mcp-context-forge
html_url: https://github.com/IBM/mcp-context-forge
stars: 4400
owner_login: IBM
owner_html_url: https://github.com/IBM
- name: huma
html_url: https://github.com/danielgtaylor/huma
stars: 4365
stars: 4433
owner_login: danielgtaylor
owner_html_url: https://github.com/danielgtaylor
- name: dynaconf
html_url: https://github.com/dynaconf/dynaconf
stars: 4325
stars: 4333
owner_login: dynaconf
owner_html_url: https://github.com/dynaconf
- name: chatgpt-web-share
html_url: https://github.com/chatpire/chatgpt-web-share
stars: 4273
stars: 4276
owner_login: chatpire
owner_html_url: https://github.com/chatpire
- name: tick-stock-panel
html_url: https://github.com/shy3130/tick-stock-panel
stars: 4101
owner_login: shy3130
owner_html_url: https://github.com/shy3130
- name: RVG
html_url: https://github.com/arvin341az-glitch/RVG
stars: 4140
owner_login: arvin341az-glitch
owner_html_url: https://github.com/arvin341az-glitch
- name: atrilabs-engine
html_url: https://github.com/Atri-Labs/atrilabs-engine
stars: 4066
stars: 4063
owner_login: Atri-Labs
owner_html_url: https://github.com/Atri-Labs
- name: datamodel-code-generator
html_url: https://github.com/koxudaxi/datamodel-code-generator
stars: 4008
owner_login: koxudaxi
owner_html_url: https://github.com/koxudaxi
html_url: https://github.com/datamodel-code-generator/datamodel-code-generator
stars: 4027
owner_login: datamodel-code-generator
owner_html_url: https://github.com/datamodel-code-generator
- name: LitServe
html_url: https://github.com/Lightning-AI/LitServe
stars: 3934
stars: 3943
owner_login: Lightning-AI
owner_html_url: https://github.com/Lightning-AI
- name: RVG
html_url: https://github.com/arvin341az-glitch/RVG
stars: 3906
owner_login: arvin341az-glitch
owner_html_url: https://github.com/arvin341az-glitch
- name: fastapi-admin
html_url: https://github.com/fastapi-admin/fastapi-admin
stars: 3819
stars: 3828
owner_login: fastapi-admin
owner_html_url: https://github.com/fastapi-admin
- name: tracecat
html_url: https://github.com/TracecatHQ/tracecat
stars: 3782
stars: 3823
owner_login: TracecatHQ
owner_html_url: https://github.com/TracecatHQ
- name: Rapid-MLX
html_url: https://github.com/raullenchai/Rapid-MLX
stars: 3630
owner_login: raullenchai
owner_html_url: https://github.com/raullenchai
- name: farfalle
html_url: https://github.com/rashadphz/farfalle
stars: 3543
stars: 3540
owner_login: rashadphz
owner_html_url: https://github.com/rashadphz
- name: OpenExecutive
html_url: https://github.com/SenteLabsAI/OpenExecutive
stars: 3322
owner_login: SenteLabsAI
owner_html_url: https://github.com/SenteLabsAI
- name: any-auto-register
html_url: https://github.com/lxf746/any-auto-register
stars: 3221
stars: 3322
owner_login: lxf746
owner_html_url: https://github.com/lxf746
- name: codex-lb
html_url: https://github.com/Soju06/codex-lb
stars: 3284
owner_login: Soju06
owner_html_url: https://github.com/Soju06
- name: opyrator
html_url: https://github.com/ml-tooling/opyrator
stars: 3131
stars: 3132
owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling
- name: docarray
@@ -246,72 +236,72 @@ repos:
owner_html_url: https://github.com/docarray
- name: fastapi-realworld-example-app
html_url: https://github.com/nsidnev/fastapi-realworld-example-app
stars: 3107
stars: 3104
owner_login: nsidnev
owner_html_url: https://github.com/nsidnev
- name: uvicorn-gunicorn-fastapi-docker
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
stars: 2916
stars: 2914
owner_login: tiangolo
owner_html_url: https://github.com/tiangolo
- name: codex-lb
html_url: https://github.com/Soju06/codex-lb
stars: 2904
owner_login: Soju06
owner_html_url: https://github.com/Soju06
- name: FastAPI-template
html_url: https://github.com/s3rius/FastAPI-template
stars: 2826
owner_login: s3rius
owner_html_url: https://github.com/s3rius
- name: sqladmin
html_url: https://github.com/smithyhq/sqladmin
stars: 2817
stars: 2837
owner_login: smithyhq
owner_html_url: https://github.com/smithyhq
- name: YC-Killer
html_url: https://github.com/sahibzada-allahyar/YC-Killer
stars: 2805
stars: 2834
owner_login: sahibzada-allahyar
owner_html_url: https://github.com/sahibzada-allahyar
- name: FastAPI-template
html_url: https://github.com/s3rius/FastAPI-template
stars: 2833
owner_login: s3rius
owner_html_url: https://github.com/s3rius
- name: NoteDiscovery
html_url: https://github.com/gamosoft/NoteDiscovery
stars: 2776
stars: 2815
owner_login: gamosoft
owner_html_url: https://github.com/gamosoft
- name: best-of-web-python
html_url: https://github.com/ml-tooling/best-of-web-python
stars: 2755
stars: 2763
owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling
- name: fastapi-langgraph-agent-production-ready-template
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
stars: 2630
stars: 2686
owner_login: wassim249
owner_html_url: https://github.com/wassim249
- name: fastapi-react
html_url: https://github.com/Buuntu/fastapi-react
stars: 2584
owner_login: Buuntu
owner_html_url: https://github.com/Buuntu
- name: supabase-py
html_url: https://github.com/supabase/supabase-py
stars: 2571
stars: 2596
owner_login: supabase
owner_html_url: https://github.com/supabase
- name: open-wearables
html_url: https://github.com/the-momentum/open-wearables
stars: 2591
owner_login: the-momentum
owner_html_url: https://github.com/the-momentum
- name: fastapi-react
html_url: https://github.com/Buuntu/fastapi-react
stars: 2591
owner_login: Buuntu
owner_html_url: https://github.com/Buuntu
- name: fastapi-best-architecture
html_url: https://github.com/fastapi-practices/fastapi-best-architecture
stars: 2530
stars: 2573
owner_login: fastapi-practices
owner_html_url: https://github.com/fastapi-practices
- name: 30-Days-of-Python
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
stars: 2511
stars: 2524
owner_login: codingforentrepreneurs
owner_html_url: https://github.com/codingforentrepreneurs
- name: AIstudioProxyAPI
html_url: https://github.com/CJackHwang/AIstudioProxyAPI
stars: 2496
stars: 2514
owner_login: CJackHwang
owner_html_url: https://github.com/CJackHwang
- name: RasaGPT
@@ -319,178 +309,188 @@ repos:
stars: 2463
owner_login: paulpierre
owner_html_url: https://github.com/paulpierre
- name: open-wearables
html_url: https://github.com/the-momentum/open-wearables
stars: 2432
owner_login: the-momentum
owner_html_url: https://github.com/the-momentum
- name: nextpy
html_url: https://github.com/dot-agent/nextpy
stars: 2349
stars: 2346
owner_login: dot-agent
owner_html_url: https://github.com/dot-agent
- name: langserve
html_url: https://github.com/langchain-ai/langserve
stars: 2329
stars: 2327
owner_login: langchain-ai
owner_html_url: https://github.com/langchain-ai
- name: fastapi-utils
html_url: https://github.com/fastapiutils/fastapi-utils
stars: 2309
stars: 2308
owner_login: fastapiutils
owner_html_url: https://github.com/fastapiutils
- name: kiro-gateway
html_url: https://github.com/jwadow/kiro-gateway
stars: 2251
stars: 2299
owner_login: jwadow
owner_html_url: https://github.com/jwadow
- name: vue-fastapi-admin
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
stars: 2245
stars: 2261
owner_login: mizhexiaoxiao
owner_html_url: https://github.com/mizhexiaoxiao
- name: creatorhub
html_url: https://github.com/3441293738/creatorhub
stars: 2200
owner_login: '3441293738'
owner_html_url: https://github.com/3441293738
- name: solara
html_url: https://github.com/widgetti/solara
stars: 2172
stars: 2179
owner_login: widgetti
owner_html_url: https://github.com/widgetti
- name: mangum
html_url: https://github.com/Kludex/mangum
stars: 2131
stars: 2138
owner_login: Kludex
owner_html_url: https://github.com/Kludex
- name: FastAPI-boilerplate
html_url: https://github.com/benavlabs/FastAPI-boilerplate
stars: 2070
stars: 2092
owner_login: benavlabs
owner_html_url: https://github.com/benavlabs
- name: xhs_ai_publisher
html_url: https://github.com/BetaStreetOmnis/xhs_ai_publisher
stars: 2068
stars: 2089
owner_login: BetaStreetOmnis
owner_html_url: https://github.com/BetaStreetOmnis
- name: slowapi
html_url: https://github.com/laurentS/slowapi
stars: 2052
stars: 2067
owner_login: laurentS
owner_html_url: https://github.com/laurentS
- name: openapi-python-client
html_url: https://github.com/openapi-generators/openapi-python-client
stars: 1985
stars: 1995
owner_login: openapi-generators
owner_html_url: https://github.com/openapi-generators
- name: agentkit
html_url: https://github.com/BCG-X-Official/agentkit
stars: 1949
owner_login: BCG-X-Official
owner_html_url: https://github.com/BCG-X-Official
- name: piccolo
html_url: https://github.com/piccolo-orm/piccolo
stars: 1936
stars: 1948
owner_login: piccolo-orm
owner_html_url: https://github.com/piccolo-orm
- name: manage-fastapi
html_url: https://github.com/ycd/manage-fastapi
stars: 1907
owner_login: ycd
owner_html_url: https://github.com/ycd
- name: fastapi-cache
html_url: https://github.com/long2ice/fastapi-cache
stars: 1866
owner_login: long2ice
owner_html_url: https://github.com/long2ice
- name: WebRPA
html_url: https://github.com/pmh1314520/WebRPA
stars: 1866
owner_login: pmh1314520
owner_html_url: https://github.com/pmh1314520
- name: agentkit
html_url: https://github.com/BCG-X-Official/agentkit
stars: 1946
owner_login: BCG-X-Official
owner_html_url: https://github.com/BCG-X-Official
- name: full-stack-ai-agent-template
html_url: https://github.com/vstorm-co/full-stack-ai-agent-template
stars: 1862
stars: 1926
owner_login: vstorm-co
owner_html_url: https://github.com/vstorm-co
- name: creatorhub
html_url: https://github.com/3441293738/creatorhub
- name: PanWatch
html_url: https://github.com/TNT-Likely/PanWatch
stars: 1915
owner_login: TNT-Likely
owner_html_url: https://github.com/TNT-Likely
- name: manage-fastapi
html_url: https://github.com/ycd/manage-fastapi
stars: 1905
owner_login: ycd
owner_html_url: https://github.com/ycd
- name: WebRPA
html_url: https://github.com/pmh1314520/WebRPA
stars: 1899
owner_login: pmh1314520
owner_html_url: https://github.com/pmh1314520
- name: fastapi-cache
html_url: https://github.com/long2ice/fastapi-cache
stars: 1867
owner_login: long2ice
owner_html_url: https://github.com/long2ice
- name: FileSync
html_url: https://github.com/polius/FileSync
stars: 1816
owner_login: '3441293738'
owner_html_url: https://github.com/3441293738
owner_login: polius
owner_html_url: https://github.com/polius
- name: ormar
html_url: https://github.com/ormar-orm/ormar
stars: 1802
stars: 1803
owner_login: ormar-orm
owner_html_url: https://github.com/ormar-orm
- name: python-week-2022
html_url: https://github.com/rochacbruno/python-week-2022
stars: 1797
stars: 1796
owner_login: rochacbruno
owner_html_url: https://github.com/rochacbruno
- name: termpair
html_url: https://github.com/cs01/termpair
stars: 1779
stars: 1778
owner_login: cs01
owner_html_url: https://github.com/cs01
- name: bracket
html_url: https://github.com/evroon/bracket
stars: 1728
stars: 1740
owner_login: evroon
owner_html_url: https://github.com/evroon
- name: fastapi-crudrouter
html_url: https://github.com/awtkns/fastapi-crudrouter
stars: 1696
stars: 1698
owner_login: awtkns
owner_html_url: https://github.com/awtkns
- name: docling-api
html_url: https://github.com/drmingler/docling-api
stars: 1688
owner_login: drmingler
owner_html_url: https://github.com/drmingler
- name: fastapi-pagination
html_url: https://github.com/uriyyo/fastapi-pagination
stars: 1680
stars: 1682
owner_login: uriyyo
owner_html_url: https://github.com/uriyyo
- name: langchain-serve
html_url: https://github.com/jina-ai/langchain-serve
stars: 1641
stars: 1637
owner_login: jina-ai
owner_html_url: https://github.com/jina-ai
- name: awesome-fastapi-projects
html_url: https://github.com/Kludex/awesome-fastapi-projects
stars: 1618
stars: 1620
owner_login: Kludex
owner_html_url: https://github.com/Kludex
- name: docling-api
html_url: https://github.com/drmingler/docling-api
stars: 1597
owner_login: drmingler
owner_html_url: https://github.com/drmingler
- name: fastcrud
html_url: https://github.com/benavlabs/fastcrud
stars: 1577
owner_login: benavlabs
owner_html_url: https://github.com/benavlabs
- name: coronavirus-tracker-api
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
stars: 1569
owner_login: ExpDev07
owner_html_url: https://github.com/ExpDev07
- name: fastapi-amis-admin
html_url: https://github.com/amisadmin/fastapi-amis-admin
stars: 1566
owner_login: amisadmin
owner_html_url: https://github.com/amisadmin
- name: tavily-key-generator
html_url: https://github.com/skernelx/tavily-key-generator
stars: 1553
owner_login: skernelx
owner_html_url: https://github.com/skernelx
- name: yubal
html_url: https://github.com/guillevc/yubal
stars: 1529
stars: 1597
owner_login: guillevc
owner_html_url: https://github.com/guillevc
- name: fastcrud
html_url: https://github.com/benavlabs/fastcrud
stars: 1592
owner_login: benavlabs
owner_html_url: https://github.com/benavlabs
- name: fastapi-amis-admin
html_url: https://github.com/amisadmin/fastapi-amis-admin
stars: 1568
owner_login: amisadmin
owner_html_url: https://github.com/amisadmin
- name: coronavirus-tracker-api
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
stars: 1568
owner_login: ExpDev07
owner_html_url: https://github.com/ExpDev07
- name: tavily-key-generator
html_url: https://github.com/skernelx/tavily-key-generator
stars: 1561
owner_login: skernelx
owner_html_url: https://github.com/skernelx
- name: fim-one
html_url: https://github.com/fim-ai/fim-one
stars: 1550
owner_login: fim-ai
owner_html_url: https://github.com/fim-ai
- name: RuoYi-Vue3-FastAPI
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
stars: 1516
stars: 1544
owner_login: insistence
owner_html_url: https://github.com/insistence
- name: FileSync
html_url: https://github.com/polius/FileSync
stars: 1494
owner_login: polius
owner_html_url: https://github.com/polius
- name: fastapi-boilerplate
html_url: https://github.com/teamhide/fastapi-boilerplate
stars: 1495
owner_login: teamhide
owner_html_url: https://github.com/teamhide
+158
View File
@@ -0,0 +1,158 @@
# OpenTelemetry { #opentelemetry }
When your API is running, you might want to know how much traffic it receives, which requests are slow, and when errors happen.
**Telemetry** is data about your application's behavior that helps you answer these questions. Common types include:
- **Metrics**: measurements you can summarize over time, such as response times and the number of requests being handled.
- **Traces**: records of individual requests and the operations performed to handle them. Each timed operation is called a **span**.
- **Logs**: timestamped records of events, such as an application starting or an operation failing.
[**OpenTelemetry**](https://opentelemetry.io/) is a set of standards and tools for collecting telemetry and sending it to a monitoring service, where you can explore it in dashboards.
**FastAPI provides OpenTelemetry support by default** for HTTP request traces, metrics, and logs. WebSocket connections also provide traces and logs. To see that data, configure a monitoring service to receive it.
## Install FastAPI { #install-fastapi }
Install FastAPI with the `standard` extras, which include the packages for sending telemetry:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## Create the app { #create-the-app }
Create a file `main.py`:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
You don't need to write any custom code to collect telemetry.
## FastAPI Cloud { #fastapi-cloud }
When you deploy to [FastAPI Cloud](https://fastapicloud.com) with `fastapi[standard]`, metrics work automatically. You don't have to configure anything else.
On Pro plans, you can view request counts, error rates, and response times in the [Metrics dashboard](https://fastapicloud.com/docs/monitoring-and-performance/metrics/).
<img src="/img/tutorial/opentelemetry/image01.png" alt="FastAPI Cloud Pro metrics dashboard with example data">
## Other monitoring services { #other-monitoring-services }
To send telemetry to another monitoring service, configure an endpoint that accepts **OTLP**, the OpenTelemetry protocol for sending telemetry. Use the service's HTTP/protobuf base endpoint.
Set these environment variables, replacing the example URL with your endpoint:
```bash
export FASTAPI_OTEL_AUTO_CONFIGURE=true
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`FASTAPI_OTEL_AUTO_CONFIGURE=true` enables FastAPI's automatic exporter setup. `OTEL_SERVICE_NAME` identifies your app in the monitoring service. The endpoint is the base URL for receiving data. Traces are sent to `/v1/traces`, metrics to `/v1/metrics`, and logs to `/v1/logs` under that URL.
If your service requires authentication, set `OTEL_EXPORTER_OTLP_HEADERS` to the headers it specifies, for example `api-key=YOUR_API_KEY`.
## Run the app { #run-the-app }
Start the app in the same terminal:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
In another terminal, send a request:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
Open your monitoring service and find `my-api`. After the next export, you can see a trace with a `GET /items/{item_id}` span, along with metrics for request counts, response duration, and active requests.
## Customize telemetry { #customize-telemetry }
### Configure providers and exporters { #configure-providers-and-exporters }
A **provider** supplies the objects that record traces, metrics, or logs. Its configuration controls how that data is processed and exported.
Telemetry libraries can configure OpenTelemetry's global providers. Configure the library before the app starts, and FastAPI uses those providers automatically.
By default, FastAPI uses configured providers without adding exporters. When automatic setup is enabled and an OTLP endpoint is set in the environment, FastAPI adds an exporter for that destination to each enabled provider. Existing exporters continue sending data to their destinations.
If another library already configures export to the same destination, leave `FASTAPI_OTEL_AUTO_CONFIGURE` unset or set it to `false` to avoid duplicate telemetry.
You can also pass a provider directly in the `telemetry` dictionary. For example, this provider uses OpenTelemetry's console exporter to print request spans in your terminal:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
The **exporter** sends the spans to their destination. `BatchSpanProcessor` groups spans and sends them in the background. Replace the console exporter with one supplied by your monitoring library to use its destination. See [OpenTelemetry's Python instrumentation guide](https://opentelemetry.io/docs/languages/python/instrumentation/) for more configuration options.
Use `meter_provider` or `logger_provider` in the same dictionary to supply a metrics or logs provider. The application or library creating a provider manages its shutdown. FastAPI manages the export components it adds.
/// warning
OpenTelemetry uses global providers by default. Independent telemetry configuration for [mounted sub-applications](sub-applications.md) is not guaranteed.
///
### Trace request operations { #trace-request-operations }
By default, request traces include spans for resolving dependencies, running your path operation function, serializing the response, and running each task in FastAPI's `BackgroundTasks`. These spans use the same provider and exporters.
Background task spans remain part of the request's trace. They run after the HTTP response span ends, so they do not increase the measured response time.
To record only the HTTP request span, set `operation_spans` to `False`:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### Trace WebSocket connections { #trace-websocket-connections }
Each WebSocket connection has a span such as `WS /ws/{room}`, covering the handler and dependency cleanup. It uses the same providers and settings, including `operation_spans` for dependency resolution and endpoint execution.
HTTP request metrics cover HTTP requests only. Normal WebSocket disconnects with codes `1000` or `1001` do not produce error logs.
### Inspect errors { #inspect-errors }
FastAPI records unhandled exceptions as OpenTelemetry logs, linked to the request's or connection's trace. Error logs are recorded even when the trace is not sampled.
Exception logs include the exception's type, message, and stack trace. Messages and stack traces can contain sensitive information. Use your provider's log processors to filter or redact them, or set `logs` to `False` to disable these logs.
FastAPI also records request validation failures as warning logs with the route and error count. These logs do not include the invalid input.
## Choose what to record { #choose-what-to-record }
The `telemetry` dictionary also accepts these settings:
| Setting | Purpose | Default |
| --- | --- | --- |
| `tracing` | Record HTTP request and WebSocket connection spans | `True` |
| `metrics` | Record HTTP request metrics | `True` |
| `logs` | Record validation failures and unhandled exceptions | `True` |
| `operation_spans` | Add spans for request operations | `True` |
| `exclude` | Skip requests when a function receiving the ASGI scope returns `True` | `None` |
| `auto_configure` | Add exporters for endpoints set in environment variables | `True` if `FASTAPI_OTEL_AUTO_CONFIGURE=true`, otherwise `False` |
For example, to collect metrics while excluding health checks:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
An explicit `auto_configure` value in the `telemetry` dictionary overrides `FASTAPI_OTEL_AUTO_CONFIGURE`. Use `telemetry={"auto_configure": True}` to enable automatic setup in code, or `telemetry={"auto_configure": False}` to disable it for an app even when the environment variable enables it.
+7
View File
@@ -549,3 +549,10 @@ Inspired by Termynal's CSS tricks with modifications
/* Hidden in MkDocs; rendered on GitHub (which doesn't load this stylesheet) */
.only-github { display: none; }
.newsletter-embed {
display: block;
width: calc(100% + 8px);
margin: -4px;
border: 0;
}
-1
View File
@@ -20,5 +20,4 @@ Some other cloud providers ✨ [**sponsor FastAPI**](https://github.com/sponsors
You might also want to consider them to follow their guides and try their services:
* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi)
* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi)
Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

+33
View File
@@ -238,12 +238,45 @@ function setupOpinionsTabs() {
});
}
let cleanupNewsletterEmbed = () => {};
function setupNewsletterEmbed() {
cleanupNewsletterEmbed();
const frame = document.querySelector('.newsletter-embed');
if (!frame) return;
const origin = new URL(frame.src).origin;
const configure = () => frame.contentWindow.postMessage({
type: 'fastapi-newsletter:configure',
theme: document.body.dataset.mdColorScheme === 'slate' ? 'dark' : 'light',
fontSize: parseFloat(getComputedStyle(frame.parentElement).fontSize),
}, origin);
const resize = (event) => {
if (event.origin !== origin || event.source !== frame.contentWindow) return;
const { type, height } = event.data ?? {};
if (type !== 'fastapi-newsletter:resize' || !Number.isFinite(height) || height <= 0 || height > 2000) return;
frame.style.height = `${Math.ceil(height)}px`;
};
window.addEventListener('message', resize);
frame.addEventListener('load', configure);
window.addEventListener('resize', configure);
const themeObserver = new MutationObserver(configure);
themeObserver.observe(document.body, { attributes: true, attributeFilter: ['data-md-color-scheme'] });
configure();
cleanupNewsletterEmbed = () => {
window.removeEventListener('message', resize);
frame.removeEventListener('load', configure);
window.removeEventListener('resize', configure);
themeObserver.disconnect();
};
}
async function main() {
setupTermynal();
showRandomAnnouncement('announce-left', 5000)
handleSponsorImages();
openLinksInNewTab();
setupOpinionsTabs();
setupNewsletterEmbed();
}
document$.subscribe(() => {
main()
+2 -2
View File
@@ -1,5 +1,5 @@
# FastAPI and friends newsletter
<iframe data-w-type="embedded" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://xr4n4.mjt.lu/wgt/xr4n4/hj5/form?c=40a44fa4" width="100%" style="height: 800px;"></iframe>
<iframe class="newsletter-embed" src="https://fastapiandfriends.com/embed/" width="100%" height="280"></iframe>
<script type="text/javascript" src="https://app.mailjet.com/pas-nc-embedded-v1.js"></script>
[Read previous issues](https://fastapiandfriends.com/newsletter) or [subscribe on the FastAPI and friends website](https://fastapiandfriends.com/#subscribe).
+80
View File
@@ -7,6 +7,83 @@ hide:
## Latest Changes
## 0.143.0 (2026-10-08)
Automatic OpenTelemetry exporter setup is now opt-in. If you rely on FastAPI to configure exporters from `OTEL_*` environment variables, set `FASTAPI_OTEL_AUTO_CONFIGURE=true` or use `FastAPI(telemetry={"auto_configure": True})` to retain the previous behavior.
Applications that configure their own providers and exporters require no changes. FastAPI Cloud enables automatic setup for you.
### Breaking Changes
* 💥 Require opt-in for automatic OpenTelemetry exporter setup. PR [#16476](https://github.com/fastapi/fastapi/pull/16476) by [@tiangolo](https://github.com/tiangolo).
## 0.142.4 (2026-10-07)
### Fixes
* 🐛 Isolate FastAPI telemetry for excluded requests. PR [#16470](https://github.com/fastapi/fastapi/pull/16470) by [@tiangolo](https://github.com/tiangolo).
## 0.142.3 (2026-10-07)
### Fixes
* 🐛 Cache OpenTelemetry tracers to preserve warning deduplication. PR [#16468](https://github.com/fastapi/fastapi/pull/16468) by [@tiangolo](https://github.com/tiangolo).
### Docs
* 📝 Remove HTML title from newsletter to avoid the tooltip. PR [#16461](https://github.com/fastapi/fastapi/pull/16461) by [@tiangolo](https://github.com/tiangolo).
* 📝 Embed the FastAPI and friends newsletter signup form. PR [#16459](https://github.com/fastapi/fastapi/pull/16459) by [@tiangolo](https://github.com/tiangolo).
* 📝 Update skill, use Asyncer for blocking code in threads. PR [#16420](https://github.com/fastapi/fastapi/pull/16420) by [@tiangolo](https://github.com/tiangolo).
### Translations
* 🌐 Update translations for fr (add-missing). PR [#16436](https://github.com/fastapi/fastapi/pull/16436) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for hi (add-missing). PR [#16435](https://github.com/fastapi/fastapi/pull/16435) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for tr (add-missing). PR [#16434](https://github.com/fastapi/fastapi/pull/16434) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for zh (add-missing). PR [#16433](https://github.com/fastapi/fastapi/pull/16433) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for zh-hant (add-missing). PR [#16432](https://github.com/fastapi/fastapi/pull/16432) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for pt (add-missing). PR [#16431](https://github.com/fastapi/fastapi/pull/16431) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for de (add-missing). PR [#16430](https://github.com/fastapi/fastapi/pull/16430) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for uk (add-missing). PR [#16429](https://github.com/fastapi/fastapi/pull/16429) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for ja (add-missing). PR [#16428](https://github.com/fastapi/fastapi/pull/16428) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for ko (add-missing). PR [#16425](https://github.com/fastapi/fastapi/pull/16425) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for es (add-missing). PR [#16426](https://github.com/fastapi/fastapi/pull/16426) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update translations for ru (add-missing). PR [#16427](https://github.com/fastapi/fastapi/pull/16427) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 🌐 Update Russian LLM-prompt. PR [#16449](https://github.com/fastapi/fastapi/pull/16449) by [@YuriiMotov](https://github.com/YuriiMotov).
### Internal
* 👷 Fix deprecated command in `bump-pre-commit-hooks` workflow. PR [#16463](https://github.com/fastapi/fastapi/pull/16463) by [@YuriiMotov](https://github.com/YuriiMotov).
* 🔧 Update sponsors: remove Render. PR [#16457](https://github.com/fastapi/fastapi/pull/16457) by [@tiangolo](https://github.com/tiangolo).
* 🔨 Use `gpt-6-astra` model for translations. PR [#16453](https://github.com/fastapi/fastapi/pull/16453) by [@YuriiMotov](https://github.com/YuriiMotov).
* ⬆ Bump the python-packages group across 1 directory with 14 updates. PR [#16447](https://github.com/fastapi/fastapi/pull/16447) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump starlette from 1.6.0 to 1.7.0. PR [#16440](https://github.com/fastapi/fastapi/pull/16440) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump pyjwt from 2.13.0 to 2.15.0. PR [#16423](https://github.com/fastapi/fastapi/pull/16423) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump gitpython from 3.1.60 to 3.1.62. PR [#16444](https://github.com/fastapi/fastapi/pull/16444) by [@dependabot[bot]](https://github.com/apps/dependabot).
* 👥 Update FastAPI GitHub topic repositories. PR [#16443](https://github.com/fastapi/fastapi/pull/16443) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* 👥 Update FastAPI People - Sponsors. PR [#16437](https://github.com/fastapi/fastapi/pull/16437) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* ⬆ Bump pre-commit hooks. PR [#16442](https://github.com/fastapi/fastapi/pull/16442) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* ⬆ Bump urllib3 from 2.7.0 to 2.8.0. PR [#16445](https://github.com/fastapi/fastapi/pull/16445) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump the github-actions group with 3 updates. PR [#16438](https://github.com/fastapi/fastapi/pull/16438) by [@dependabot[bot]](https://github.com/apps/dependabot).
## 0.142.2 (2026-09-30)
### Fixes
* 🐛 Allow startup when automatic OpenTelemetry configuration fails. PR [#16418](https://github.com/fastapi/fastapi/pull/16418) by [@tiangolo](https://github.com/tiangolo).
## 0.142.1 (2026-09-29)
### Fixes
* 🐛 Fix repeated endpoint wrapping in included routers. PR [#16414](https://github.com/fastapi/fastapi/pull/16414) by [@tiangolo](https://github.com/tiangolo).
## 0.142.0 (2026-09-29)
### Features
* ✨ Add native OpenTelemetry support. PR [#16403](https://github.com/fastapi/fastapi/pull/16403) by [@tiangolo](https://github.com/tiangolo).
### Refactors
* 📱 Improve mobile responsiveness of conference rail. PR [#16196](https://github.com/fastapi/fastapi/pull/16196) by [@alejsdev](https://github.com/alejsdev).
@@ -35,6 +112,9 @@ hide:
### Internal
* ✅ Fix frontend test timeout with Starlette Git. PR [#16408](https://github.com/fastapi/fastapi/pull/16408) by [@YuriiMotov](https://github.com/YuriiMotov).
* 🔧 Update sponsors: remove Permit.io. PR [#16406](https://github.com/fastapi/fastapi/pull/16406) by [@tiangolo](https://github.com/tiangolo).
* ⬆ Bump anyio from 4.12.1 to 4.14.2. PR [#16375](https://github.com/fastapi/fastapi/pull/16375) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump the python-packages group across 1 directory with 15 updates. PR [#16285](https://github.com/fastapi/fastapi/pull/16285) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump starlette from 1.3.1 to 1.6.0. PR [#16289](https://github.com/fastapi/fastapi/pull/16289) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump annotated-doc from 0.0.4 to 0.0.5. PR [#16288](https://github.com/fastapi/fastapi/pull/16288) by [@dependabot[bot]](https://github.com/apps/dependabot).
+1
View File
@@ -159,6 +159,7 @@ nav:
- advanced/templates.md
- advanced/websockets.md
- advanced/events.md
- advanced/opentelemetry.md
- advanced/testing-websockets.md
- advanced/testing-events.md
- advanced/testing-dependencies.md
@@ -10,12 +10,6 @@
<img class="sponsor-image" src="/img/sponsors/propelauth-banner.png" alt="Auth, user management and more for your B2B product" />
</a>
</div>
<div class="item">
<a title="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra." style="display: block; position: relative;" href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" target="_blank">
<span class="sponsor-badge">sponsor</span>
<img class="sponsor-image" src="/img/sponsors/render-banner.svg" alt="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra." />
</a>
</div>
<div class="item">
<a title="Cut Code Review Time & Bugs in Half with CodeRabbit" style="display: block; position: relative;" href="https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=banner&utm_campaign=fastapi" target="_blank">
<span class="sponsor-badge">sponsor</span>
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
Cuando tu API está en funcionamiento, puede que quieras saber cuánto tráfico recibe, qué requests son lentas y cuándo se producen errores.
La **telemetría** son datos sobre el comportamiento de tu aplicación que te ayudan a responder estas preguntas. Algunos tipos comunes son:
- **Métricas**: mediciones que puedes resumir a lo largo del tiempo, como los tiempos de response y el número de requests que se están procesando.
- **Trazas**: registros de requests individuales y de las operaciones realizadas para procesarlas. Cada operación cronometrada se llama **span**.
- **Logs**: registros de eventos con marcas de tiempo, como el inicio de una aplicación o el fallo de una operación.
[**OpenTelemetry**](https://opentelemetry.io/) es un conjunto de estándares y herramientas para recopilar telemetría y enviarla a un servicio de monitorización, donde puedes explorarla en paneles.
**FastAPI proporciona soporte para OpenTelemetry por defecto** para trazas, métricas y logs de requests HTTP. Las conexiones WebSocket también proporcionan trazas y logs. Para ver esos datos, configura un servicio de monitorización que los reciba.
## Instala FastAPI { #install-fastapi }
Instala FastAPI con los extras `standard`, que incluyen los paquetes para enviar telemetría:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## Crea la aplicación { #create-the-app }
Crea un archivo `main.py`:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
Ten en cuenta que todo funciona por defecto, no necesitas escribir ningún código personalizado para que funcione la telemetría.
## FastAPI Cloud { #fastapi-cloud }
Cuando despliegas en [FastAPI Cloud](https://fastapicloud.com) con `fastapi[standard]`, las métricas funcionan automáticamente. No tienes que configurar nada más.
En los planes Pro, puedes ver el número de requests, las tasas de error y los tiempos de response en el [panel de métricas](https://fastapicloud.com/docs/monitoring-and-performance/metrics/).
<img src="/img/tutorial/opentelemetry/image01.png" alt="Panel de métricas de FastAPI Cloud Pro con datos de ejemplo">
## Otros servicios de monitorización { #other-monitoring-services }
Para enviar telemetría a otro servicio de monitorización, configura un endpoint que acepte **OTLP**, el protocolo de OpenTelemetry para enviar telemetría. Usa el endpoint base HTTP/protobuf del servicio.
Establece estas variables de entorno, reemplazando la URL de ejemplo por tu endpoint:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` identifica tu aplicación en el servicio de monitorización. El endpoint es la URL base para recibir datos. Las trazas se envían a `/v1/traces`, las métricas a `/v1/metrics` y los logs a `/v1/logs` bajo esa URL.
Si tu servicio requiere autenticación, establece `OTEL_EXPORTER_OTLP_HEADERS` con los headers que especifique, por ejemplo `api-key=YOUR_API_KEY`.
## Ejecuta la aplicación { #run-the-app }
Inicia la aplicación en la misma terminal:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
En otra terminal, envía una request:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
Abre tu servicio de monitorización y busca `my-api`. Después de la siguiente exportación, podrás ver una traza con un span `GET /items/{item_id}`, junto con métricas del número de requests, la duración de las responses y las requests activas.
## Personaliza la telemetría { #customize-telemetry }
### Configura proveedores y exportadores { #configure-providers-and-exporters }
Un **proveedor** proporciona los objetos que registran trazas, métricas o logs. Su configuración controla cómo se procesan y exportan esos datos.
Los paquetes de telemetría pueden configurar los proveedores globales de OpenTelemetry. Configura el paquete antes de que se inicie la aplicación y FastAPI usará esos proveedores automáticamente.
Cuando se establece un endpoint OTLP en el entorno, FastAPI añade un exportador para ese destino a cada proveedor habilitado. Los exportadores existentes siguen enviando datos a sus destinos.
Configura cada destino una sola vez. Si otro paquete ya gestiona el destino del entorno, desactiva su exportación al destino del entorno o desactiva la configuración automática de FastAPI:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
También puedes pasar un proveedor directamente en el diccionario `telemetry`. Por ejemplo, este proveedor usa el exportador de consola de OpenTelemetry para imprimir los spans de las requests en tu terminal:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
El **exportador** envía los spans a su destino. `BatchSpanProcessor` agrupa los spans y los envía en segundo plano. Reemplaza el exportador de consola por uno proporcionado por tu paquete de monitorización para usar su destino. Consulta la [guía de instrumentación de Python de OpenTelemetry](https://opentelemetry.io/docs/languages/python/instrumentation/) para ver más opciones de configuración.
Usa `meter_provider` o `logger_provider` en el mismo diccionario para proporcionar un proveedor de métricas o logs. La aplicación o el paquete que crea un proveedor gestiona su cierre. FastAPI gestiona los componentes de exportación que añade.
/// warning | Advertencia
OpenTelemetry usa proveedores globales por defecto. No se garantiza una configuración de telemetría independiente para las [subaplicaciones montadas](sub-applications.md).
///
### Traza las operaciones de las requests { #trace-request-operations }
Por defecto, las trazas de las requests incluyen spans para resolver dependencias, ejecutar tu path operation function, serializar la response y ejecutar cada tarea de `BackgroundTasks` de FastAPI. Estos spans usan el mismo proveedor y los mismos exportadores.
Los spans de las tareas en segundo plano siguen formando parte de la traza de la request. Se ejecutan después de que termine el span de la response HTTP, por lo que no aumentan el tiempo de response medido.
Para registrar solo el span de la request HTTP, establece `operation_spans` en `False`:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### Traza las conexiones WebSocket { #trace-websocket-connections }
Cada conexión WebSocket tiene un span como `WS /ws/{room}`, que abarca el manejador y la limpieza de las dependencias. Usa los mismos proveedores y ajustes, incluido `operation_spans` para la resolución de dependencias y la ejecución del endpoint.
Las métricas de requests HTTP abarcan únicamente requests HTTP. Las desconexiones normales de WebSocket con los códigos `1000` o `1001` no generan logs de error.
### Inspecciona los errores { #inspect-errors }
FastAPI registra las excepciones no controladas como logs de OpenTelemetry, vinculados a la traza de la request o de la conexión. Los logs de error se registran incluso cuando la traza no se incluye en el muestreo.
Los logs de excepciones incluyen el tipo, el mensaje y la traza de la pila de la excepción. Los mensajes y las trazas de la pila pueden contener información sensible. Usa los procesadores de logs de tu proveedor para filtrarlos u ocultar la información sensible, o establece `logs` en `False` para desactivar estos logs.
FastAPI también registra los fallos de validación de las requests como logs de advertencia con la ruta y el número de errores. Estos logs no incluyen la entrada no válida.
## Elige qué registrar { #choose-what-to-record }
El diccionario `telemetry` también acepta estos ajustes:
| Ajuste | Propósito | Por defecto |
| --- | --- | --- |
| `tracing` | Registrar spans de requests HTTP y conexiones WebSocket | `True` |
| `metrics` | Registrar métricas de requests HTTP | `True` |
| `logs` | Registrar fallos de validación y excepciones no controladas | `True` |
| `operation_spans` | Añadir spans para las operaciones de las requests | `True` |
| `exclude` | Omitir requests cuando una función que recibe el scope de ASGI devuelve `True` | `None` |
| `auto_configure` | Añadir exportadores para los endpoints establecidos en variables de entorno | `True` |
Por ejemplo, para recopilar métricas excluyendo las verificaciones de estado:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
Establece `auto_configure` en `False` cuando tu aplicación gestione por sí misma la configuración de los proveedores, por ejemplo, dentro de su función lifespan.
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
Lorsque votre API est en cours d'exécution, vous pouvez vouloir savoir quel trafic elle reçoit, quelles requêtes sont lentes et quand des erreurs se produisent.
La **télémétrie** désigne les données sur le comportement de votre application qui vous aident à répondre à ces questions. Les types courants comprennent :
- **Métriques** : des mesures que vous pouvez agréger au fil du temps, comme les temps de réponse et le nombre de requêtes en cours de traitement.
- **Traces** : des enregistrements de requêtes individuelles et des opérations effectuées pour les traiter. Chaque opération chronométrée est appelée un **span**.
- **Logs** : des enregistrements horodatés d'événements, comme le démarrage d'une application ou l'échec d'une opération.
[**OpenTelemetry**](https://opentelemetry.io/) est un ensemble de standards et d'outils permettant de collecter la télémétrie et de l'envoyer à un service de supervision, où vous pouvez l'explorer dans des tableaux de bord.
**FastAPI prend en charge OpenTelemetry par défaut** pour les traces, les métriques et les logs des requêtes HTTP. Les connexions WebSocket fournissent également des traces et des logs. Pour consulter ces données, configurez un service de supervision pour les recevoir.
## Installer FastAPI { #install-fastapi }
Installez FastAPI avec les dépendances optionnelles `standard`, qui incluent les paquets permettant d'envoyer la télémétrie :
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## Créer l'application { #create-the-app }
Créez un fichier `main.py` :
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
Remarquez que tout fonctionne par défaut : vous n'avez pas besoin d'écrire de code personnalisé pour que la télémétrie fonctionne.
## FastAPI Cloud { #fastapi-cloud }
Lorsque vous déployez sur [FastAPI Cloud](https://fastapicloud.com) avec `fastapi[standard]`, les métriques fonctionnent automatiquement. Vous n'avez rien d'autre à configurer.
Avec les offres Pro, vous pouvez consulter le nombre de requêtes, les taux d'erreur et les temps de réponse dans le [tableau de bord des métriques](https://fastapicloud.com/docs/monitoring-and-performance/metrics/).
<img src="/img/tutorial/opentelemetry/image01.png" alt="Tableau de bord des métriques FastAPI Cloud Pro avec des exemples de données">
## Autres services de supervision { #other-monitoring-services }
Pour envoyer la télémétrie à un autre service de supervision, configurez un endpoint qui accepte **OTLP**, le protocole OpenTelemetry pour l'envoi de télémétrie. Utilisez l'endpoint de base HTTP/protobuf du service.
Définissez ces variables d'environnement en remplaçant l'URL d'exemple par votre endpoint :
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` identifie votre application dans le service de supervision. L'endpoint est l'URL de base pour recevoir les données. Les traces sont envoyées à `/v1/traces`, les métriques à `/v1/metrics` et les logs à `/v1/logs` sous cette URL.
Si votre service nécessite une authentification, définissez `OTEL_EXPORTER_OTLP_HEADERS` avec les en-têtes qu'il spécifie, par exemple `api-key=YOUR_API_KEY`.
## Exécuter l'application { #run-the-app }
Démarrez l'application dans le même terminal :
<div class="termy">
```console
$ uv run fastapi run
```
</div>
Dans un autre terminal, envoyez une requête :
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
Ouvrez votre service de supervision et recherchez `my-api`. Après le prochain export, vous pouvez voir une trace avec un span `GET /items/{item_id}`, ainsi que des métriques sur le nombre de requêtes, la durée des réponses et les requêtes actives.
## Personnaliser la télémétrie { #customize-telemetry }
### Configurer les fournisseurs et les exportateurs { #configure-providers-and-exporters }
Un **fournisseur** fournit les objets qui enregistrent les traces, les métriques ou les logs. Sa configuration contrôle la façon dont ces données sont traitées et exportées.
Les bibliothèques de télémétrie peuvent configurer les fournisseurs globaux d'OpenTelemetry. Configurez la bibliothèque avant le démarrage de l'application, et FastAPI utilise automatiquement ces fournisseurs.
Lorsqu'un endpoint OTLP est défini dans l'environnement, FastAPI ajoute un exportateur pour cette destination à chaque fournisseur activé. Les exportateurs existants continuent d'envoyer des données vers leurs destinations.
Configurez chaque destination une seule fois. Si une autre bibliothèque gère déjà la destination définie dans l'environnement, désactivez son export vers cette destination ou désactivez la configuration automatique de FastAPI :
```python
app = FastAPI(telemetry={"auto_configure": False})
```
Vous pouvez aussi passer un fournisseur directement dans le dictionnaire `telemetry`. Par exemple, ce fournisseur utilise l'exportateur console d'OpenTelemetry pour afficher les spans des requêtes dans votre terminal :
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
L'**exportateur** envoie les spans vers leur destination. `BatchSpanProcessor` regroupe les spans et les envoie en arrière-plan. Remplacez l'exportateur console par un exportateur fourni par votre bibliothèque de supervision pour utiliser sa destination. Consultez le [guide d'instrumentation Python d'OpenTelemetry](https://opentelemetry.io/docs/languages/python/instrumentation/) pour plus d'options de configuration.
Utilisez `meter_provider` ou `logger_provider` dans le même dictionnaire pour fournir un fournisseur de métriques ou de logs. L'application ou la bibliothèque qui crée un fournisseur gère son arrêt. FastAPI gère les composants d'export qu'il ajoute.
/// warning | Alertes
OpenTelemetry utilise des fournisseurs globaux par défaut. Une configuration indépendante de la télémétrie pour les [sous-applications montées](sub-applications.md) n'est pas garantie.
///
### Tracer les opérations des requêtes { #trace-request-operations }
Par défaut, les traces des requêtes incluent des spans pour la résolution des dépendances, l'exécution de votre fonction de chemin d'accès, la sérialisation de la réponse et l'exécution de chaque tâche dans `BackgroundTasks` de FastAPI. Ces spans utilisent le même fournisseur et les mêmes exportateurs.
Les spans des tâches en arrière-plan font toujours partie de la trace de la requête. Ils s'exécutent après la fin du span de la réponse HTTP et n'augmentent donc pas le temps de réponse mesuré.
Pour enregistrer uniquement le span de la requête HTTP, définissez `operation_spans` sur `False` :
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### Tracer les connexions WebSocket { #trace-websocket-connections }
Chaque connexion WebSocket possède un span tel que `WS /ws/{room}`, qui couvre le gestionnaire et le nettoyage des dépendances. Il utilise les mêmes fournisseurs et paramètres, notamment `operation_spans` pour la résolution des dépendances et l'exécution de l'endpoint.
Les métriques des requêtes HTTP couvrent uniquement les requêtes HTTP. Les déconnexions WebSocket normales avec les codes `1000` ou `1001` ne produisent pas de logs d'erreur.
### Examiner les erreurs { #inspect-errors }
FastAPI enregistre les exceptions non gérées sous forme de logs OpenTelemetry, liés à la trace de la requête ou de la connexion. Les logs d'erreur sont enregistrés même lorsque la trace n'est pas échantillonnée.
Les logs d'exception incluent le type, le message et la trace de pile de l'exception. Les messages et les traces de pile peuvent contenir des informations sensibles. Utilisez les processeurs de logs de votre fournisseur pour les filtrer ou masquer ces informations, ou définissez `logs` sur `False` pour désactiver ces logs.
FastAPI enregistre également les échecs de validation des requêtes sous forme de logs d'avertissement avec la route et le nombre d'erreurs. Ces logs n'incluent pas les données d'entrée invalides.
## Choisir les données à enregistrer { #choose-what-to-record }
Le dictionnaire `telemetry` accepte également ces paramètres :
| Paramètre | Fonction | Valeur par défaut |
| --- | --- | --- |
| `tracing` | Enregistrer les spans des requêtes HTTP et des connexions WebSocket | `True` |
| `metrics` | Enregistrer les métriques des requêtes HTTP | `True` |
| `logs` | Enregistrer les échecs de validation et les exceptions non gérées | `True` |
| `operation_spans` | Ajouter des spans pour les opérations des requêtes | `True` |
| `exclude` | Ignorer les requêtes lorsqu'une fonction recevant le scope ASGI renvoie `True` | `None` |
| `auto_configure` | Ajouter des exportateurs pour les endpoints définis dans les variables d'environnement | `True` |
Par exemple, pour collecter des métriques tout en excluant les vérifications de l'état de santé :
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
Définissez `auto_configure` sur `False` lorsque votre application gère elle-même la configuration des fournisseurs, par exemple dans sa fonction lifespan.
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
जब आपका API चल रहा होता है, तो आप शायद जानना चाहें कि उसे कितना ट्रैफ़िक मिल रहा है, कौन-से requests धीमे हैं और त्रुटियाँ कब होती हैं।
**Telemetry** आपके एप्लिकेशन के व्यवहार से जुड़ा data है, जो इन सवालों के जवाब देने में मदद करता है। इसके सामान्य प्रकार हैं:
- **Metrics**: ऐसे माप जिन्हें आप समय के साथ संक्षेप में देख सकते हैं, जैसे response में लगने वाला समय और संभाले जा रहे requests की संख्या।
- **Traces**: अलग-अलग requests और उन्हें संभालने के लिए किए गए ऑपरेशन के रिकॉर्ड। हर ऑपरेशन जिसका समय मापा जाता है, एक **span** कहलाता है।
- **Logs**: टाइमस्टैम्प के साथ event के रिकॉर्ड, जैसे किसी एप्लिकेशन का शुरू होना या किसी ऑपरेशन का विफल होना।
[**OpenTelemetry**](https://opentelemetry.io/) telemetry एकत्र करने और उसे किसी मॉनिटरिंग सेवा को भेजने के लिए standards और tools का एक समूह है, जहाँ आप उसे डैशबोर्ड में देख और जाँच सकते हैं।
**FastAPI, HTTP request traces, metrics और logs के लिए default रूप से OpenTelemetry support प्रदान करता है**। WebSocket कनेक्शन भी traces और logs प्रदान करते हैं। उस data को देखने के लिए, उसे प्राप्त करने वाली मॉनिटरिंग सेवा कॉन्फ़िगर करें।
## FastAPI install करें { #install-fastapi }
FastAPI को `standard` extras के साथ install करें, जिनमें telemetry भेजने के लिए packages शामिल हैं:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## ऐप बनाएँ { #create-the-app }
एक file `main.py` बनाएँ:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
ध्यान दें कि यह सब default रूप से काम करता है। Telemetry के काम करने के लिए आपको कोई कस्टम कोड लिखने की ज़रूरत नहीं है।
## FastAPI Cloud { #fastapi-cloud }
जब आप `fastapi[standard]` के साथ [FastAPI Cloud](https://fastapicloud.com) पर डिप्लॉय करते हैं, तो metrics अपने आप काम करते हैं। आपको कुछ और कॉन्फ़िगर नहीं करना पड़ता।
Pro प्लान पर, आप [Metrics डैशबोर्ड](https://fastapicloud.com/docs/monitoring-and-performance/metrics/) में requests की संख्या, त्रुटि दर और response में लगने वाला समय देख सकते हैं।
<img src="/img/tutorial/opentelemetry/image01.png" alt="उदाहरण data के साथ FastAPI Cloud Pro metrics डैशबोर्ड">
## अन्य मॉनिटरिंग सेवाएँ { #other-monitoring-services }
किसी अन्य मॉनिटरिंग सेवा को telemetry भेजने के लिए, ऐसा endpoint कॉन्फ़िगर करें जो **OTLP** स्वीकार करता हो। यह telemetry भेजने के लिए OpenTelemetry का प्रोटोकॉल है। सेवा के HTTP/protobuf बेस endpoint का उपयोग करें।
उदाहरण URL की जगह अपना endpoint डालकर, ये environment variables सेट करें:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` मॉनिटरिंग सेवा में आपके ऐप की पहचान करता है। Endpoint, data प्राप्त करने के लिए बेस URL है। उस URL के अंतर्गत traces को `/v1/traces`, metrics को `/v1/metrics` और logs को `/v1/logs` पर भेजा जाता है।
यदि आपकी सेवा को प्रमाणीकरण की ज़रूरत है, तो `OTEL_EXPORTER_OTLP_HEADERS` में उसके बताए गए headers सेट करें, उदाहरण के लिए `api-key=YOUR_API_KEY`।
## ऐप चलाएँ { #run-the-app }
उसी टर्मिनल में ऐप शुरू करें:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
दूसरे टर्मिनल में, एक request भेजें:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
अपनी मॉनिटरिंग सेवा खोलें और `my-api` खोजें। अगले एक्सपोर्ट के बाद, आप `GET /items/{item_id}` span वाला एक trace देख सकते हैं, साथ ही requests की संख्या, response की अवधि और सक्रिय requests के metrics भी देख सकते हैं।
## Telemetry को अपनी ज़रूरत के अनुसार बदलें { #customize-telemetry }
### Providers और exporters कॉन्फ़िगर करें { #configure-providers-and-exporters }
एक **provider** ऐसे ऑब्जेक्ट प्रदान करता है जो traces, metrics या logs रिकॉर्ड करते हैं। उसका कॉन्फ़िगरेशन नियंत्रित करता है कि उस data को कैसे प्रोसेस और एक्सपोर्ट किया जाता है।
Telemetry लाइब्रेरी OpenTelemetry के ग्लोबल providers को कॉन्फ़िगर कर सकती हैं। ऐप शुरू होने से पहले लाइब्रेरी को कॉन्फ़िगर करें, और FastAPI अपने आप उन providers का उपयोग करता है।
जब environment में कोई OTLP endpoint सेट होता है, तो FastAPI हर सक्षम provider में उस गंतव्य के लिए एक exporter जोड़ता है। मौजूदा exporters अपने गंतव्यों पर data भेजना जारी रखते हैं।
हर गंतव्य को एक बार कॉन्फ़िगर करें। यदि कोई दूसरी लाइब्रेरी पहले से ही environment में दिए गए गंतव्य को संभाल रही है, तो उसका environment export अक्षम करें या FastAPI का स्वचालित setup बंद करें:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
आप `telemetry` डिक्शनरी में सीधे एक provider भी पास कर सकते हैं। उदाहरण के लिए, यह provider आपके टर्मिनल में request spans प्रिंट करने के लिए OpenTelemetry के console exporter का उपयोग करता है:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
**Exporter**, spans को उनके गंतव्य पर भेजता है। `BatchSpanProcessor`, spans को समूहों में बाँटता है और उन्हें बैकग्राउंड में भेजता है। अपनी मॉनिटरिंग लाइब्रेरी के गंतव्य का उपयोग करने के लिए console exporter की जगह उस लाइब्रेरी द्वारा प्रदान किया गया exporter लगाएँ। कॉन्फ़िगरेशन के और विकल्पों के लिए [OpenTelemetry की Python instrumentation गाइड](https://opentelemetry.io/docs/languages/python/instrumentation/) देखें।
Metrics या logs provider प्रदान करने के लिए उसी डिक्शनरी में `meter_provider` या `logger_provider` का उपयोग करें। Provider बनाने वाला एप्लिकेशन या लाइब्रेरी उसके shutdown को संभालता है। FastAPI अपने जोड़े गए एक्सपोर्ट घटकों को संभालता है।
/// warning | चेतावनी
OpenTelemetry default रूप से ग्लोबल providers का उपयोग करता है। [माउंट किए गए उप-एप्लिकेशन](sub-applications.md) के लिए स्वतंत्र telemetry कॉन्फ़िगरेशन की गारंटी नहीं है।
///
### Request ऑपरेशन को ट्रेस करें { #trace-request-operations }
Default रूप से, request traces में dependencies रिज़ॉल्व करने, आपका path operation function चलाने, response को serialize करने और FastAPI के `BackgroundTasks` में हर टास्क को चलाने के spans शामिल होते हैं। ये spans उसी provider और उन्हीं exporters का उपयोग करते हैं।
बैकग्राउंड टास्क के spans, request के trace का हिस्सा बने रहते हैं। वे HTTP response span समाप्त होने के बाद चलते हैं, इसलिए वे मापे गए response समय को नहीं बढ़ाते।
केवल HTTP request span रिकॉर्ड करने के लिए, `operation_spans` को `False` पर सेट करें:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### WebSocket कनेक्शन को ट्रेस करें { #trace-websocket-connections }
हर WebSocket कनेक्शन का एक span होता है, जैसे `WS /ws/{room}`, जो हैंडलर और dependency cleanup को कवर करता है। यह उन्हीं providers और सेटिंग्स का उपयोग करता है, जिनमें dependency resolution और endpoint के निष्पादन के लिए `operation_spans` भी शामिल है।
HTTP request metrics में केवल HTTP requests शामिल होते हैं। कोड `1000` या `1001` के साथ होने वाले सामान्य WebSocket डिस्कनेक्ट, error logs नहीं बनाते।
### त्रुटियों की जाँच करें { #inspect-errors }
FastAPI, संभाले न गए exceptions को OpenTelemetry logs के रूप में रिकॉर्ड करता है, जो request या कनेक्शन के trace से जुड़े होते हैं। Error logs तब भी रिकॉर्ड किए जाते हैं जब trace को सैंपल नहीं किया जाता।
Exception logs में exception का प्रकार, संदेश और stack trace शामिल होते हैं। संदेशों और stack traces में संवेदनशील जानकारी हो सकती है। उन्हें फ़िल्टर करने या उनमें से संवेदनशील जानकारी हटाने के लिए अपने provider के log processors का उपयोग करें, या इन logs को अक्षम करने के लिए `logs` को `False` पर सेट करें।
FastAPI, request validation की विफलताओं को भी route और त्रुटियों की संख्या के साथ warning logs के रूप में रिकॉर्ड करता है। इन logs में अमान्य इनपुट शामिल नहीं होता।
## चुनें कि क्या रिकॉर्ड करना है { #choose-what-to-record }
`telemetry` डिक्शनरी इन सेटिंग्स को भी स्वीकार करती है:
| सेटिंग | उद्देश्य | Default |
| --- | --- | --- |
| `tracing` | HTTP request और WebSocket कनेक्शन के spans रिकॉर्ड करना | `True` |
| `metrics` | HTTP request metrics रिकॉर्ड करना | `True` |
| `logs` | Validation की विफलताएँ और संभाले न गए exceptions रिकॉर्ड करना | `True` |
| `operation_spans` | Request ऑपरेशन के लिए spans जोड़ना | `True` |
| `exclude` | जब ASGI scope प्राप्त करने वाला function `True` लौटाए, तो requests छोड़ देना | `None` |
| `auto_configure` | Environment variables में सेट endpoints के लिए exporters जोड़ना | `True` |
उदाहरण के लिए, health checks को छोड़कर metrics एकत्र करने के लिए:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
जब आपका एप्लिकेशन provider setup खुद संभालता हो, जैसे अपने lifespan function के अंदर, तो `auto_configure` को `False` पर सेट करें।
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
APIを実行しているとき、受信するトラフィックの量、遅いリクエスト、エラーが発生するタイミングを把握したくなることがあります。
**テレメトリー**は、こうした疑問に答えるためのアプリケーションの動作に関するデータです。一般的には、次の種類があります:
- **メトリクス**: レスポンス時間や処理中のリクエスト数など、時間の経過に沿って集計できる測定値です。
- **トレース**: 個々のリクエストと、それを処理するために実行された操作の記録です。時間を計測する各操作を**スパン**と呼びます。
- **ログ**: アプリケーションの起動や操作の失敗など、イベントのタイムスタンプ付きの記録です。
[**OpenTelemetry**](https://opentelemetry.io/)は、テレメトリーを収集して監視サービスに送信するための標準とツールのセットです。監視サービスのダッシュボードで、そのデータを確認できます。
**FastAPIはデフォルトでOpenTelemetryをサポートしており**、HTTPリクエストのトレース、メトリクス、ログを提供します。WebSocket接続でもトレースとログを提供します。このデータを確認するには、受信する監視サービスを設定してください。
## FastAPIのインストール { #install-fastapi }
テレメトリーを送信するためのパッケージを含む`standard`オプションを指定してFastAPIをインストールします:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## アプリの作成 { #create-the-app }
`main.py`ファイルを作成します:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
すべてデフォルトで動作するため、テレメトリーを有効にするための独自のコードを書く必要はありません。
## FastAPI Cloud { #fastapi-cloud }
`fastapi[standard]`を使用して[FastAPI Cloud](https://fastapicloud.com)にデプロイすると、メトリクスは自動的に機能します。追加の設定は不要です。
Proプランでは、[メトリクスダッシュボード](https://fastapicloud.com/docs/monitoring-and-performance/metrics/)でリクエスト数、エラー率、レスポンス時間を確認できます。
<img src="/img/tutorial/opentelemetry/image01.png" alt="サンプルデータを表示したFastAPI Cloud Proのメトリクスダッシュボード">
## その他の監視サービス { #other-monitoring-services }
別の監視サービスにテレメトリーを送信するには、テレメトリー送信用のOpenTelemetryプロトコルである**OTLP**を受け付けるエンドポイントを設定します。サービスのHTTP/protobufベースエンドポイントを使用してください。
例のURLを自分のエンドポイントに置き換えて、次の環境変数を設定します:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME`は、監視サービス内でアプリを識別するための名前です。エンドポイントはデータを受信するためのベースURLです。そのURL配下の`/v1/traces`にトレース、`/v1/metrics`にメトリクス、`/v1/logs`にログが送信されます。
サービスで認証が必要な場合は、`OTEL_EXPORTER_OTLP_HEADERS`にサービスが指定するヘッダー(例: `api-key=YOUR_API_KEY`)を設定してください。
## アプリの実行 { #run-the-app }
同じターミナルでアプリを起動します:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
別のターミナルでリクエストを送信します:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
監視サービスを開き、`my-api`を探します。次のエクスポート後に、`GET /items/{item_id}`スパンを含むトレースと、リクエスト数、レスポンス時間、処理中のリクエスト数のメトリクスを確認できます。
## テレメトリーのカスタマイズ { #customize-telemetry }
### プロバイダーとエクスポーターの設定 { #configure-providers-and-exporters }
**プロバイダー**は、トレース、メトリクス、ログを記録するオブジェクトを提供します。その設定によって、データの処理方法とエクスポート方法を制御します。
テレメトリーライブラリは、OpenTelemetryのグローバルプロバイダーを設定できます。アプリの起動前にライブラリを設定すると、FastAPIはそれらのプロバイダーを自動的に使用します。
環境変数にOTLPエンドポイントが設定されている場合、FastAPIは有効な各プロバイダーに、その送信先のエクスポーターを追加します。既存のエクスポーターは、それぞれの送信先にデータを送信し続けます。
各送信先は一度だけ設定してください。別のライブラリがすでに環境変数で指定された送信先への送信を処理している場合は、そのライブラリの環境変数に基づくエクスポートを無効にするか、FastAPIの自動設定を無効にします:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
`telemetry`辞書にプロバイダーを直接渡すこともできます。例えば、次のプロバイダーはOpenTelemetryのコンソールエクスポーターを使用して、リクエストのスパンをターミナルに出力します:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
**エクスポーター**は、スパンを送信先に送ります。`BatchSpanProcessor`はスパンをまとめ、バックグラウンドで送信します。監視ライブラリの送信先を使用するには、コンソールエクスポーターをそのライブラリが提供するエクスポーターに置き換えてください。その他の設定オプションについては、[OpenTelemetryのPython計装ガイド](https://opentelemetry.io/docs/languages/python/instrumentation/)を参照してください。
メトリクスやログのプロバイダーを指定するには、同じ辞書内で`meter_provider`または`logger_provider`を使用します。プロバイダーを作成したアプリケーションまたはライブラリが、そのシャットダウンを管理します。FastAPIは、自身が追加したエクスポートコンポーネントを管理します。
/// warning | 注意
OpenTelemetryはデフォルトでグローバルプロバイダーを使用します。[マウントされたサブアプリケーション](sub-applications.md)ごとに独立したテレメトリー設定は保証されません。
///
### リクエスト操作のトレース { #trace-request-operations }
デフォルトでは、リクエストのトレースには、依存関係の解決、path operation関数の実行、レスポンスのシリアライズ、FastAPIの`BackgroundTasks`内の各タスクの実行に対応するスパンが含まれます。これらのスパンは同じプロバイダーとエクスポーターを使用します。
バックグラウンドタスクのスパンも、リクエストのトレースの一部として扱われます。これらはHTTPレスポンスのスパンが終了した後に実行されるため、測定されるレスポンス時間は増加しません。
HTTPリクエストのスパンのみを記録するには、`operation_spans`を`False`に設定します:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### WebSocket接続のトレース { #trace-websocket-connections }
各WebSocket接続には、`WS /ws/{room}`のようなスパンがあり、ハンドラーと依存関係のクリーンアップを対象とします。同じプロバイダーと設定を使用し、依存関係の解決とエンドポイントの実行には`operation_spans`の設定も適用されます。
HTTPリクエストのメトリクスは、HTTPリクエストのみを対象とします。コード`1000`または`1001`による正常なWebSocket切断では、エラーログは生成されません。
### エラーの確認 { #inspect-errors }
FastAPIは、未処理の例外をOpenTelemetryのログとして記録し、リクエストまたは接続のトレースに関連付けます。トレースがサンプリングされていない場合でも、エラーログは記録されます。
例外ログには、例外の型、メッセージ、スタックトレースが含まれます。メッセージやスタックトレースには機密情報が含まれる可能性があります。プロバイダーのログプロセッサーを使用してフィルタリングやマスキングを行うか、`logs`を`False`に設定してこれらのログを無効にしてください。
FastAPIは、リクエストのバリデーション失敗も、ルートとエラー数を含む警告ログとして記録します。これらのログに無効な入力値は含まれません。
## 記録対象の選択 { #choose-what-to-record }
`telemetry`辞書では、次の設定も指定できます:
| 設定 | 目的 | デフォルト |
| --- | --- | --- |
| `tracing` | HTTPリクエストとWebSocket接続のスパンを記録します | `True` |
| `metrics` | HTTPリクエストのメトリクスを記録します | `True` |
| `logs` | バリデーション失敗と未処理の例外を記録します | `True` |
| `operation_spans` | リクエスト操作のスパンを追加します | `True` |
| `exclude` | ASGIスコープを受け取る関数が`True`を返した場合、そのリクエストを除外します | `None` |
| `auto_configure` | 環境変数に設定されたエンドポイントのエクスポーターを追加します | `True` |
例えば、ヘルスチェックを除外してメトリクスを収集するには、次のようにします:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
lifespan関数内などで、アプリケーション自身がプロバイダーの設定を行う場合は、`auto_configure`を`False`に設定してください。
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
API가 실행 중일 때 얼마나 많은 트래픽을 받는지, 어떤 요청이 느린지, 언제 오류가 발생하는지 알고 싶을 수 있습니다.
**텔레메트리**는 이러한 질문에 답하는 데 도움이 되는 애플리케이션 동작에 관한 데이터입니다. 일반적인 유형은 다음과 같습니다:
- **메트릭**: 응답 시간이나 처리 중인 요청 수처럼 시간에 따라 요약할 수 있는 측정값입니다.
- **트레이스**: 개별 요청과 해당 요청을 처리하기 위해 수행한 작업의 기록입니다. 소요 시간을 측정하는 각 작업을 **스팬**이라고 합니다.
- **로그**: 애플리케이션 시작이나 작업 실패와 같은 이벤트에 타임스탬프를 붙인 기록입니다.
[**OpenTelemetry**](https://opentelemetry.io/)는 텔레메트리를 수집하여 모니터링 서비스로 보내기 위한 표준과 도구 모음입니다. 모니터링 서비스에서는 대시보드를 통해 데이터를 살펴볼 수 있습니다.
**FastAPI는 기본적으로 OpenTelemetry를 지원**하며, HTTP 요청의 트레이스, 메트릭, 로그를 제공합니다. WebSocket 연결도 트레이스와 로그를 제공합니다. 이 데이터를 보려면 모니터링 서비스에서 데이터를 수신하도록 설정하세요.
## FastAPI 설치하기 { #install-fastapi }
텔레메트리 전송용 패키지가 포함된 `standard` 추가 옵션으로 FastAPI를 설치하세요:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## 애플리케이션 만들기 { #create-the-app }
`main.py` 파일을 만드세요:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
이 모든 기능은 기본적으로 작동하며, 텔레메트리를 사용하기 위해 별도의 코드를 작성할 필요가 없습니다.
## FastAPI Cloud { #fastapi-cloud }
`fastapi[standard]`를 사용하여 [FastAPI Cloud](https://fastapicloud.com)에 배포하면 메트릭이 자동으로 작동합니다. 다른 설정은 필요하지 않습니다.
Pro 요금제에서는 [메트릭 대시보드](https://fastapicloud.com/docs/monitoring-and-performance/metrics/)에서 요청 수, 오류율, 응답 시간을 확인할 수 있습니다.
<img src="/img/tutorial/opentelemetry/image01.png" alt="예제 데이터가 표시된 FastAPI Cloud Pro 메트릭 대시보드">
## 다른 모니터링 서비스 { #other-monitoring-services }
다른 모니터링 서비스로 텔레메트리를 보내려면 텔레메트리 전송을 위한 OpenTelemetry 프로토콜인 **OTLP**를 지원하는 엔드포인트를 설정하세요. 해당 서비스의 HTTP/protobuf 기본 엔드포인트를 사용하세요.
예제 URL을 사용할 엔드포인트로 바꾸고 다음 환경 변수를 설정하세요:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME`은 모니터링 서비스에서 애플리케이션을 식별합니다. 엔드포인트는 데이터를 수신하는 기본 URL입니다. 트레이스는 해당 URL 아래의 `/v1/traces`로, 메트릭은 `/v1/metrics`로, 로그는 `/v1/logs`로 전송됩니다.
서비스에서 인증을 요구하는 경우, `OTEL_EXPORTER_OTLP_HEADERS`를 해당 서비스에서 지정한 헤더로 설정하세요. 예를 들면 `api-key=YOUR_API_KEY`입니다.
## 애플리케이션 실행하기 { #run-the-app }
같은 터미널에서 애플리케이션을 시작하세요:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
다른 터미널에서 요청을 보내세요:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
모니터링 서비스를 열고 `my-api`를 찾으세요. 다음 내보내기가 이루어진 후, `GET /items/{item_id}` 스팬이 포함된 트레이스와 함께 요청 수, 응답 소요 시간, 활성 요청에 대한 메트릭을 확인할 수 있습니다.
## 텔레메트리 사용자 정의하기 { #customize-telemetry }
### 프로바이더와 익스포터 설정하기 { #configure-providers-and-exporters }
**프로바이더**는 트레이스, 메트릭 또는 로그를 기록하는 객체를 제공합니다. 프로바이더 설정은 해당 데이터의 처리 및 내보내기 방식을 제어합니다.
텔레메트리 라이브러리는 OpenTelemetry의 전역 프로바이더를 설정할 수 있습니다. 애플리케이션이 시작되기 전에 라이브러리를 설정하면 FastAPI가 해당 프로바이더를 자동으로 사용합니다.
환경 변수에 OTLP 엔드포인트가 설정되어 있으면, FastAPI는 활성화된 각 프로바이더에 해당 대상으로 데이터를 보내는 익스포터를 추가합니다. 기존 익스포터는 계속해서 각자의 대상으로 데이터를 보냅니다.
각 대상은 한 번만 설정하세요. 다른 라이브러리가 이미 환경 변수에 지정된 대상으로의 전송을 처리하고 있다면, 해당 라이브러리의 환경 변수 기반 내보내기를 비활성화하거나 FastAPI의 자동 설정을 끄세요:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
`telemetry` 딕셔너리에 프로바이더를 직접 전달할 수도 있습니다. 예를 들어, 다음 프로바이더는 OpenTelemetry의 콘솔 익스포터를 사용하여 터미널에 요청 스팬을 출력합니다:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
**익스포터**는 스팬을 대상으로 보냅니다. `BatchSpanProcessor`는 스팬을 그룹으로 묶어 백그라운드에서 보냅니다. 모니터링 라이브러리의 대상으로 보내려면 콘솔 익스포터를 해당 라이브러리에서 제공하는 익스포터로 바꾸세요. 더 많은 설정 옵션은 [OpenTelemetry의 Python 계측 가이드](https://opentelemetry.io/docs/languages/python/instrumentation/)를 참고하세요.
같은 딕셔너리에서 `meter_provider` 또는 `logger_provider`를 사용하여 메트릭 또는 로그 프로바이더를 제공하세요. 프로바이더를 생성한 애플리케이션이나 라이브러리가 해당 프로바이더의 종료를 관리합니다. FastAPI는 자신이 추가한 내보내기 구성 요소를 관리합니다.
/// warning | 경고
OpenTelemetry는 기본적으로 전역 프로바이더를 사용합니다. [마운트된 하위 애플리케이션](sub-applications.md)에 대한 독립적인 텔레메트리 설정은 보장되지 않습니다.
///
### 요청 작업 추적하기 { #trace-request-operations }
기본적으로 요청 트레이스에는 의존성 해결, 경로 처리 함수 실행, 응답 직렬화, FastAPI의 `BackgroundTasks`에 있는 각 작업 실행에 대한 스팬이 포함됩니다. 이 스팬들은 동일한 프로바이더와 익스포터를 사용합니다.
백그라운드 작업의 스팬도 해당 요청의 트레이스에 포함됩니다. 백그라운드 작업은 HTTP 응답 스팬이 끝난 후에 실행되므로 측정된 응답 시간을 늘리지 않습니다.
HTTP 요청 스팬만 기록하려면 `operation_spans`를 `False`로 설정하세요:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### WebSocket 연결 추적하기 { #trace-websocket-connections }
각 WebSocket 연결에는 `WS /ws/{room}`과 같은 스팬이 있으며, 핸들러 실행과 의존성 정리 작업을 포함합니다. 이 스팬은 동일한 프로바이더와 설정을 사용하며, 여기에는 의존성 해결과 엔드포인트 실행을 위한 `operation_spans`도 포함됩니다.
HTTP 요청 메트릭은 HTTP 요청만 다룹니다. 코드 `1000` 또는 `1001`로 정상 종료된 WebSocket 연결은 오류 로그를 생성하지 않습니다.
### 오류 확인하기 { #inspect-errors }
FastAPI는 처리되지 않은 예외를 OpenTelemetry 로그로 기록하고, 해당 요청이나 연결의 트레이스에 연결합니다. 트레이스가 샘플링되지 않은 경우에도 오류 로그는 기록됩니다.
예외 로그에는 예외 유형, 메시지, 스택 트레이스가 포함됩니다. 메시지와 스택 트레이스에는 민감한 정보가 포함될 수 있습니다. 프로바이더의 로그 프로세서를 사용하여 이를 필터링하거나 민감한 정보를 가리세요. 또는 `logs`를 `False`로 설정하여 이 로그를 비활성화하세요.
FastAPI는 요청 유효성 검사 실패도 경로와 오류 수가 포함된 경고 로그로 기록합니다. 이 로그에는 유효하지 않은 입력값이 포함되지 않습니다.
## 기록할 항목 선택하기 { #choose-what-to-record }
`telemetry` 딕셔너리는 다음 설정도 지원합니다:
| 설정 | 용도 | 기본값 |
| --- | --- | --- |
| `tracing` | HTTP 요청 및 WebSocket 연결 스팬 기록 | `True` |
| `metrics` | HTTP 요청 메트릭 기록 | `True` |
| `logs` | 유효성 검사 실패 및 처리되지 않은 예외 기록 | `True` |
| `operation_spans` | 요청 작업에 대한 스팬 추가 | `True` |
| `exclude` | ASGI 스코프를 전달받는 함수가 `True`를 반환하면 해당 요청 제외 | `None` |
| `auto_configure` | 환경 변수에 설정된 엔드포인트에 대한 익스포터 추가 | `True` |
예를 들어, 상태 확인 요청을 제외하고 메트릭을 수집하려면 다음과 같이 설정하세요:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
애플리케이션이 lifespan 함수 내부 등에서 프로바이더 설정을 직접 처리하는 경우 `auto_configure`를 `False`로 설정하세요.
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
Quando sua API está em execução, você pode querer saber quanto tráfego ela recebe, quais requests são lentos e quando ocorrem erros.
**Telemetria** são dados sobre o comportamento da sua aplicação que ajudam a responder a essas perguntas. Os tipos comuns incluem:
- **Métricas**: medições que você pode resumir ao longo do tempo, como os tempos de response e o número de requests em processamento.
- **Traces**: registros de requests individuais e das operações realizadas para processá-los. Cada operação cronometrada é chamada de **span**.
- **Logs**: registros de eventos com marcação de tempo, como a inicialização de uma aplicação ou a falha de uma operação.
[**OpenTelemetry**](https://opentelemetry.io/) é um conjunto de padrões e ferramentas para coletar telemetria e enviá-la a um serviço de monitoramento, onde você pode explorá-la em painéis.
**O FastAPI oferece suporte a OpenTelemetry por padrão** para traces de requests HTTP, métricas e logs. As conexões WebSocket também fornecem traces e logs. Para visualizar esses dados, configure um serviço de monitoramento para recebê-los.
## Instale o FastAPI { #install-fastapi }
Instale o FastAPI com os extras `standard`, que incluem os pacotes para enviar telemetria:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## Crie a aplicação { #create-the-app }
Crie um arquivo `main.py`:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
Observe que tudo funciona por padrão, sem precisar escrever código personalizado para a telemetria funcionar.
## FastAPI Cloud { #fastapi-cloud }
Ao fazer o deploy no [FastAPI Cloud](https://fastapicloud.com) com `fastapi[standard]`, as métricas funcionam automaticamente. Não é necessário configurar mais nada.
Nos planos Pro, você pode visualizar contagens de requests, taxas de erro e tempos de response no [painel de métricas](https://fastapicloud.com/docs/monitoring-and-performance/metrics/).
<img src="/img/tutorial/opentelemetry/image01.png" alt="Painel de métricas do FastAPI Cloud Pro com dados de exemplo">
## Outros serviços de monitoramento { #other-monitoring-services }
Para enviar telemetria a outro serviço de monitoramento, configure um endpoint que aceite **OTLP**, o protocolo do OpenTelemetry para enviar telemetria. Use o endpoint base HTTP/protobuf do serviço.
Defina estas variáveis de ambiente, substituindo a URL de exemplo pelo seu endpoint:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` identifica sua aplicação no serviço de monitoramento. O endpoint é a URL base para receber dados. Os traces são enviados para `/v1/traces`, as métricas para `/v1/metrics` e os logs para `/v1/logs` nessa URL.
Se o serviço exigir autenticação, defina `OTEL_EXPORTER_OTLP_HEADERS` com os cabeçalhos especificados por ele, por exemplo, `api-key=YOUR_API_KEY`.
## Execute a aplicação { #run-the-app }
Inicie a aplicação no mesmo terminal:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
Em outro terminal, envie um request:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
Abra seu serviço de monitoramento e procure `my-api`. Após a próxima exportação, você poderá ver um trace com um span `GET /items/{item_id}`, junto com métricas de contagem de requests, duração de responses e requests ativos.
## Personalize a telemetria { #customize-telemetry }
### Configure provedores e exportadores { #configure-providers-and-exporters }
Um **provedor** fornece os objetos que registram traces, métricas ou logs. Sua configuração controla como esses dados são processados e exportados.
Bibliotecas de telemetria podem configurar os provedores globais do OpenTelemetry. Configure a biblioteca antes de iniciar a aplicação, e o FastAPI usará esses provedores automaticamente.
Quando um endpoint OTLP é definido no ambiente, o FastAPI adiciona um exportador para esse destino a cada provedor habilitado. Os exportadores existentes continuam enviando dados aos seus destinos.
Configure cada destino uma única vez. Se outra biblioteca já cuida do destino definido no ambiente, desabilite a exportação dela para esse destino ou desative a configuração automática do FastAPI:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
Você também pode passar um provedor diretamente no dicionário `telemetry`. Por exemplo, este provedor usa o exportador de console do OpenTelemetry para exibir spans de requests no seu terminal:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
O **exportador** envia os spans ao destino. `BatchSpanProcessor` agrupa spans e os envia em segundo plano. Substitua o exportador de console por um fornecido pela sua biblioteca de monitoramento para usar o destino dela. Consulte o [tutorial de instrumentação Python do OpenTelemetry](https://opentelemetry.io/docs/languages/python/instrumentation/) para mais opções de configuração.
Use `meter_provider` ou `logger_provider` no mesmo dicionário para fornecer um provedor de métricas ou logs. A aplicação ou biblioteca que cria um provedor gerencia seu encerramento. O FastAPI gerencia os componentes de exportação que adiciona.
/// warning | Atenção
O OpenTelemetry usa provedores globais por padrão. A configuração independente de telemetria para [subaplicações montadas](sub-applications.md) não é garantida.
///
### Rastreie operações de requests { #trace-request-operations }
Por padrão, os traces de requests incluem spans para resolver dependências, executar sua função de operação de rota, serializar a response e executar cada tarefa em `BackgroundTasks` do FastAPI. Esses spans usam o mesmo provedor e os mesmos exportadores.
Os spans de tarefas em segundo plano continuam fazendo parte do trace do request. Eles são executados após o término do span da response HTTP, portanto não aumentam o tempo de response medido.
Para registrar apenas o span do request HTTP, defina `operation_spans` como `False`:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### Rastreie conexões WebSocket { #trace-websocket-connections }
Cada conexão WebSocket tem um span como `WS /ws/{room}`, que abrange o manipulador e a limpeza das dependências. Ele usa os mesmos provedores e configurações, incluindo `operation_spans` para a resolução de dependências e a execução do endpoint.
As métricas de requests HTTP abrangem apenas requests HTTP. Desconexões normais de WebSocket com os códigos `1000` ou `1001` não produzem logs de erro.
### Inspecione erros { #inspect-errors }
O FastAPI registra exceções não tratadas como logs do OpenTelemetry, vinculados ao trace do request ou da conexão. Os logs de erro são registrados mesmo quando o trace não é selecionado na amostragem.
Os logs de exceções incluem o tipo, a mensagem e o stack trace da exceção. Mensagens e stack traces podem conter informações sensíveis. Use os processadores de logs do seu provedor para filtrar ou ocultar essas informações, ou defina `logs` como `False` para desabilitar esses logs.
O FastAPI também registra falhas de validação de requests como logs de aviso com a rota e a contagem de erros. Esses logs não incluem os dados de entrada inválidos.
## Escolha o que registrar { #choose-what-to-record }
O dicionário `telemetry` também aceita estas configurações:
| Configuração | Finalidade | Padrão |
| --- | --- | --- |
| `tracing` | Registrar spans de requests HTTP e conexões WebSocket | `True` |
| `metrics` | Registrar métricas de requests HTTP | `True` |
| `logs` | Registrar falhas de validação e exceções não tratadas | `True` |
| `operation_spans` | Adicionar spans para operações de requests | `True` |
| `exclude` | Ignorar requests quando uma função que recebe o escopo ASGI retorna `True` | `None` |
| `auto_configure` | Adicionar exportadores para endpoints definidos em variáveis de ambiente | `True` |
Por exemplo, para coletar métricas excluindo verificações de integridade:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
Defina `auto_configure` como `False` quando sua aplicação cuidar da configuração dos provedores por conta própria, por exemplo, dentro da função lifespan.
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
Когда ваш API запущен, вам может понадобиться узнать, сколько трафика он получает, какие HTTP-запросы выполняются медленно и когда происходят ошибки.
**Телеметрия** — это данные о поведении вашего приложения, которые помогают ответить на эти вопросы. Распространённые типы включают:
- **Метрики**: измерения, которые можно агрегировать за период времени, например время ответа и количество обрабатываемых HTTP-запросов.
- **Трейсы**: записи отдельных HTTP-запросов и операций, выполненных для их обработки. Каждая операция с измеренным временем называется **спан**.
- **Логи**: записи событий с временными метками, например запуск приложения или сбой операции.
[**OpenTelemetry**](https://opentelemetry.io/) — это набор стандартов и инструментов для сбора телеметрии и отправки её в сервис мониторинга, где её можно просматривать на дашбордах.
**FastAPI по умолчанию предоставляет поддержку OpenTelemetry** для трейсов HTTP-запросов, метрик и логов. WebSocket-соединения также предоставляют трейсы и логи. Чтобы увидеть эти данные, настройте сервис мониторинга для их получения.
## Установите FastAPI { #install-fastapi }
Установите FastAPI с дополнительными зависимостями `standard`, которые включают пакеты для отправки телеметрии:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## Создайте приложение { #create-the-app }
Создайте файл `main.py`:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
Обратите внимание, что всё это работает по умолчанию, вам не нужно писать какой-либо пользовательский код, чтобы телеметрия работала.
## FastAPI Cloud { #fastapi-cloud }
Когда вы развёртываете приложение в [FastAPI Cloud](https://fastapicloud.com) с `fastapi[standard]`, метрики работают автоматически. Вам не нужно настраивать что-либо ещё.
На тарифах Pro вы можете просматривать количество HTTP-запросов, долю ошибок и время ответа в [дашборде метрик](https://fastapicloud.com/docs/monitoring-and-performance/metrics/).
<img src="/img/tutorial/opentelemetry/image01.png" alt="Дашборд метрик FastAPI Cloud Pro с примером данных">
## Другие сервисы мониторинга { #other-monitoring-services }
Чтобы отправлять телеметрию в другой сервис мониторинга, настройте эндпоинт, который принимает **OTLP**, протокол OpenTelemetry для отправки телеметрии. Используйте базовый HTTP/protobuf-эндпоинт сервиса.
Задайте эти переменные окружения, заменив пример URL на ваш эндпоинт:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` идентифицирует ваше приложение в сервисе мониторинга. Эндпоинт — это базовый URL для получения данных. Трейсы отправляются в `/v1/traces`, метрики — в `/v1/metrics`, а логи — в `/v1/logs` по этому URL.
Если ваш сервис требует аутентификации, задайте `OTEL_EXPORTER_OTLP_HEADERS` со значением HTTP-заголовков, которые он указывает, например `api-key=YOUR_API_KEY`.
## Запустите приложение { #run-the-app }
Запустите приложение в том же терминале:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
В другом терминале отправьте HTTP-запрос:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
Откройте ваш сервис мониторинга и найдите `my-api`. После следующего экспорта вы сможете увидеть трейс со спаном `GET /items/{item_id}`, а также метрики количества HTTP-запросов, длительности ответа и активных HTTP-запросов.
## Настройте телеметрию { #customize-telemetry }
### Настройте провайдеры и экспортеры { #configure-providers-and-exporters }
**Провайдер** предоставляет объекты, которые записывают трейсы, метрики или логи. Его конфигурация управляет тем, как эти данные обрабатываются и экспортируются.
Библиотеки телеметрии могут настраивать глобальные провайдеры OpenTelemetry. Настройте библиотеку до запуска приложения, и FastAPI будет использовать эти провайдеры автоматически.
Когда OTLP-эндпоинт задан в окружении, FastAPI добавляет экспортер для этого получателя к каждому включённому провайдеру. Существующие экспортеры продолжают отправлять данные своим получателям.
Настраивайте каждого получателя один раз. Если другая библиотека уже отправляет данные получателю, заданному в окружении, отключите у неё экспорт по настройкам из окружения или выключите автоматическую настройку FastAPI:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
Вы также можете передать провайдер напрямую в словаре `telemetry`. Например, этот провайдер использует консольный экспортер OpenTelemetry, чтобы печатать спаны HTTP-запросов в вашем терминале:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
**Экспортер** отправляет спаны их получателю. `BatchSpanProcessor` группирует спаны и отправляет их в фоне. Замените консольный экспортер на экспортер, предоставленный вашей библиотекой мониторинга, чтобы использовать её получателя. См. [руководство OpenTelemetry по инструментированию Python](https://opentelemetry.io/docs/languages/python/instrumentation/) для дополнительных вариантов настройки.
Используйте `meter_provider` или `logger_provider` в том же словаре, чтобы предоставить провайдер метрик или логов. Приложение или библиотека, создающая провайдер, управляет его завершением работы. FastAPI управляет компонентами экспорта, которые он добавляет.
/// warning | Предупреждение
OpenTelemetry по умолчанию использует глобальные провайдеры. Независимая настройка телеметрии для [монтированных подприложений](sub-applications.md) не гарантируется.
///
### Трассировка операций HTTP-запроса { #trace-request-operations }
По умолчанию трейсы HTTP-запросов включают спаны для разрешения зависимостей, запуска вашей функции-обработчика пути, сериализации HTTP-ответа и запуска каждой задачи в `BackgroundTasks` FastAPI. Эти спаны используют тот же провайдер и экспортеры.
Спаны фоновых задач остаются частью трейса HTTP-запроса. Они выполняются после завершения спана HTTP-ответа, поэтому не увеличивают измеренное время ответа.
Чтобы записывать только спан HTTP-запроса, установите `operation_spans` в `False`:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### Трассировка WebSocket-соединений { #trace-websocket-connections }
У каждого WebSocket-соединения есть спан, например `WS /ws/{room}`, охватывающий обработчик и очистку зависимостей. Он использует тех же провайдеров и те же настройки, включая `operation_spans` для разрешения зависимостей и выполнения эндпоинта.
Метрики HTTP-запросов охватывают только HTTP-запросы. Обычные отключения WebSocket с кодами `1000` или `1001` не создают логи ошибок.
### Анализ ошибок { #inspect-errors }
FastAPI записывает необработанные исключения как логи OpenTelemetry, связанные с трейсом HTTP-запроса или соединения. Логи ошибок записываются даже тогда, когда трейс не попал в выборку.
Логи исключений включают тип исключения, сообщение и трассировку стека. Сообщения и трассировки стека могут содержать конфиденциальную информацию. Используйте процессоры логов вашего провайдера, чтобы фильтровать или редактировать их, либо установите `logs` в `False`, чтобы отключить эти логи.
FastAPI также записывает ошибки валидации HTTP-запросов как логи уровня предупреждения с маршрутом и количеством ошибок. Эти логи не включают невалидные входные данные.
## Выберите, что записывать { #choose-what-to-record }
Словарь `telemetry` также принимает следующие настройки:
| Настройка | Назначение | По умолчанию |
| --- | --- | --- |
| `tracing` | Записывать спаны HTTP-запросов и WebSocket-соединений | `True` |
| `metrics` | Записывать метрики HTTP-запросов | `True` |
| `logs` | Записывать ошибки валидации и необработанные исключения | `True` |
| `operation_spans` | Добавлять спаны для операций HTTP-запроса | `True` |
| `exclude` | Пропускать HTTP-запросы, когда функция, получающая ASGI scope, возвращает `True` | `None` |
| `auto_configure` | Добавлять экспортеры для эндпоинтов, заданных в переменных окружения | `True` |
Например, чтобы собирать метрики, исключая проверки работоспособности:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
Установите `auto_configure` в `False`, когда ваше приложение самостоятельно выполняет настройку провайдера, например внутри своей lifespan-функции.
+11
View File
@@ -8,6 +8,8 @@ Use a neutral tone (not overly formal or informal).
Use correct Russian grammar — appropriate cases, suffixes, and endings depending on context.
Translate technical terms in prose unless explicitly instructed otherwise below. If there is no commonly used Russian equivalent, use a Russified English term, optionally adding a short Russian explanation. Preserve code identifiers, API names, and protocol names.
For the following technical terms, use these specific translations to ensure consistency and clarity across the documentation:
* production (meaning production software or environment): продакшн (do not change the ending, for example, translate `in production` as `в продакшн` (not `в продакшене`))
@@ -48,6 +50,15 @@ For the following technical terms, use these specific translations to ensure con
* media type: тип содержимого (or `медиа-тип`)
* request: HTTP-запрос
* response: HTTP-ответ
* endpoint: эндпоинт (for example, `OTLP-эндпоинт`)
* handler: обработчик
* span (in tracing): спан (add `отрезок трассировки` if clarification is needed)
* stack trace: трассировка стека
* warning logs: логи уровня предупреждения
* destination (meaning a telemetry destination): получатель (for example, `отправлять данные получателю`, not `отправлять данные в назначение`)
* trace is not sampled: трейс не попал в выборку
* sensitive information: конфиденциальная информация
* health check: проверка работоспособности (or `проверка состояния`)
* type hints: аннотации типов
* type annotations: аннотации типов
* context manager: менеджер контекста
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
API'niz çalışırken ne kadar trafik aldığını, hangi request'lerin yavaş olduğunu ve hataların ne zaman oluştuğunu bilmek isteyebilirsiniz.
**Telemetri**, uygulamanızın davranışı hakkında bu soruları yanıtlamanıza yardımcı olan verilerdir. Yaygın türleri şunlardır:
- **Metrikler**: Response süreleri ve işlenen request sayısı gibi zaman içinde özetleyebileceğiniz ölçümler.
- **Trace'ler**: Tek tek request'lerin ve bunları işlemek için gerçekleştirilen işlemlerin kayıtları. Süresi ölçülen her işleme **span** denir.
- **Log'lar**: Uygulamanın başlatılması veya bir işlemin başarısız olması gibi olayların zaman damgalı kayıtları.
[**OpenTelemetry**](https://opentelemetry.io/), telemetri verilerini toplamak ve bunları panolarda inceleyebileceğiniz bir izleme hizmetine göndermek için kullanılan standartlar ve araçlar bütünüdür.
**FastAPI, HTTP request trace'leri, metrikleri ve log'ları için varsayılan olarak OpenTelemetry desteği sunar**. WebSocket bağlantıları da trace ve log üretir. Bu verileri görmek için onları alacak bir izleme hizmeti yapılandırın.
## FastAPI'yi Yükleyin { #install-fastapi }
FastAPI'yi, telemetri göndermek için gereken paketleri içeren `standard` ek bağımlılıklarıyla yükleyin:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## Uygulamayı Oluşturun { #create-the-app }
`main.py` adlı bir dosya oluşturun:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
Her şeyin varsayılan olarak çalıştığına dikkat edin; telemetrinin çalışması için özel bir kod yazmanız gerekmez.
## FastAPI Cloud { #fastapi-cloud }
Uygulamanızı `fastapi[standard]` ile [FastAPI Cloud](https://fastapicloud.com)'a dağıttığınızda metrikler otomatik olarak çalışır. Başka bir yapılandırma yapmanız gerekmez.
Pro planlarında request sayılarını, hata oranlarını ve response sürelerini [Metrikler panosunda](https://fastapicloud.com/docs/monitoring-and-performance/metrics/) görüntüleyebilirsiniz.
<img src="/img/tutorial/opentelemetry/image01.png" alt="Örnek veriler içeren FastAPI Cloud Pro metrikler panosu">
## Diğer İzleme Hizmetleri { #other-monitoring-services }
Telemetri verilerini başka bir izleme hizmetine göndermek için OpenTelemetry'nin telemetri gönderme protokolü olan **OTLP**'yi kabul eden bir endpoint yapılandırın. Hizmetin HTTP/protobuf temel endpoint'ini kullanın.
Örnek URL'yi kendi endpoint'inizle değiştirerek şu ortam değişkenlerini ayarlayın:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME`, izleme hizmetinde uygulamanızı tanımlar. Endpoint, verilerin alınacağı temel URL'dir. Trace'ler bu URL altındaki `/v1/traces` adresine, metrikler `/v1/metrics` adresine ve log'lar `/v1/logs` adresine gönderilir.
Hizmetiniz kimlik doğrulaması gerektiriyorsa `OTEL_EXPORTER_OTLP_HEADERS` değerini, hizmetin belirttiği header'lara göre ayarlayın. Örneğin: `api-key=YOUR_API_KEY`.
## Uygulamayı Çalıştırın { #run-the-app }
Uygulamayı aynı terminalde başlatın:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
Başka bir terminalden bir request gönderin:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
İzleme hizmetinizi açıp `my-api` uygulamasını bulun. Bir sonraki veri aktarımından sonra `GET /items/{item_id}` span'i içeren bir trace ile birlikte request sayısı, response süresi ve etkin request metriklerini görebilirsiniz.
## Telemetriyi Özelleştirin { #customize-telemetry }
### Provider ve Exporter'ları Yapılandırın { #configure-providers-and-exporters }
**Provider** (sağlayıcı), trace, metrik veya log kaydeden nesneleri sağlar. Yapılandırması, bu verilerin nasıl işleneceğini ve dışa aktarılacağını belirler.
Telemetri kütüphaneleri, OpenTelemetry'nin global provider'larını yapılandırabilir. Kütüphaneyi uygulama başlamadan önce yapılandırın; FastAPI bu provider'ları otomatik olarak kullanır.
Ortam değişkenlerinde bir OTLP endpoint'i ayarlandığında FastAPI, etkin olan her provider'a bu hedef için bir exporter ekler. Mevcut exporter'lar kendi hedeflerine veri göndermeye devam eder.
Her hedefi yalnızca bir kez yapılandırın. Ortam değişkenlerinde belirtilen hedefe gönderimi zaten başka bir kütüphane yönetiyorsa o kütüphanenin bu hedefe veri aktarımını devre dışı bırakın veya FastAPI'nin otomatik yapılandırmasını kapatın:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
Ayrıca `telemetry` sözlüğünde doğrudan bir provider da iletebilirsiniz. Örneğin aşağıdaki provider, request span'lerini terminalinize yazdırmak için OpenTelemetry'nin konsol exporter'ını kullanır:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
**Exporter** (dışa aktarıcı), span'leri hedeflerine gönderir. `BatchSpanProcessor`, span'leri gruplandırıp arka planda gönderir. İzleme kütüphanenizin hedefini kullanmak için konsol exporter'ını, o kütüphanenin sağladığı bir exporter ile değiştirin. Daha fazla yapılandırma seçeneği için [OpenTelemetry'nin Python enstrümantasyon rehberine](https://opentelemetry.io/docs/languages/python/instrumentation/) bakın.
Bir metrik veya log provider'ı sağlamak için aynı sözlükte `meter_provider` ya da `logger_provider` kullanın. Provider'ın kapatılmasını, onu oluşturan uygulama veya kütüphane yönetir. FastAPI ise kendisinin eklediği dışa aktarma bileşenlerini yönetir.
/// warning | Uyarı
OpenTelemetry varsayılan olarak global provider'ları kullanır. [Bağlanan alt uygulamalar](sub-applications.md) için bağımsız telemetri yapılandırması garanti edilmez.
///
### Request İşlemlerini İzleyin { #trace-request-operations }
Varsayılan olarak request trace'leri; bağımlılıkların çözümlenmesi, path işlemi fonksiyonunuzun çalıştırılması, response'un serileştirilmesi ve FastAPI'nin `BackgroundTasks` sınıfındaki her görevin çalıştırılması için span'ler içerir. Bu span'ler aynı provider ve exporter'ları kullanır.
Arka plan görevlerinin span'leri, request'in trace'inin bir parçası olmaya devam eder. HTTP response span'i bittikten sonra çalıştıkları için ölçülen response süresini artırmazlar.
Yalnızca HTTP request span'ini kaydetmek için `operation_spans` değerini `False` olarak ayarlayın:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### WebSocket Bağlantılarını İzleyin { #trace-websocket-connections }
Her WebSocket bağlantısının, handler'ı ve bağımlılık temizliğini kapsayan `WS /ws/{room}` gibi bir span'i vardır. Bağımlılık çözümleme ve endpoint'in çalıştırılması için kullanılan `operation_spans` dahil olmak üzere aynı provider'ları ve ayarları kullanır.
HTTP request metrikleri yalnızca HTTP request'lerini kapsar. `1000` veya `1001` kodlarıyla normal şekilde sonlanan WebSocket bağlantıları hata log'u üretmez.
### Hataları İnceleyin { #inspect-errors }
FastAPI, yakalanmamış istisnaları request'in veya bağlantının trace'iyle ilişkilendirilmiş OpenTelemetry log'ları olarak kaydeder. Trace örneklemeye dahil edilmese bile hata log'ları kaydedilir.
İstisna log'ları; istisnanın türünü, mesajını ve stack trace'ini içerir. Mesajlar ve stack trace'ler hassas bilgiler içerebilir. Bunları filtrelemek veya hassas bilgileri maskelemek için provider'ınızın log işlemcilerini kullanın ya da bu log'ları devre dışı bırakmak için `logs` değerini `False` olarak ayarlayın.
FastAPI, request doğrulama hatalarını da route ve hata sayısını içeren uyarı log'ları olarak kaydeder. Bu log'lar geçersiz girdiyi içermez.
## Nelerin Kaydedileceğini Seçin { #choose-what-to-record }
`telemetry` sözlüğü şu ayarları da kabul eder:
| Ayar | Amaç | Varsayılan |
| --- | --- | --- |
| `tracing` | HTTP request ve WebSocket bağlantı span'lerini kaydetmek | `True` |
| `metrics` | HTTP request metriklerini kaydetmek | `True` |
| `logs` | Doğrulama hatalarını ve yakalanmamış istisnaları kaydetmek | `True` |
| `operation_spans` | Request işlemleri için span eklemek | `True` |
| `exclude` | ASGI scope'unu alan bir fonksiyon `True` döndürdüğünde request'leri atlamak | `None` |
| `auto_configure` | Ortam değişkenlerinde ayarlanan endpoint'ler için exporter eklemek | `True` |
Örneğin, sağlık kontrollerini hariç tutarak metrik toplamak için:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
Uygulamanız provider kurulumunu kendisi yönetiyorsa, örneğin lifespan fonksiyonu içinde yapıyorsa, `auto_configure` değerini `False` olarak ayarlayın.
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
Коли ваш API працює, вам може бути потрібно знати, скільки трафіку він отримує, які запити повільні та коли виникають помилки.
**Телеметрія** - це дані про поведінку вашого застосунку, які допомагають відповісти на ці запитання. Поширені типи:
- **Метрики**: вимірювання, які можна узагальнювати за певний час, як-от час відповіді та кількість оброблюваних запитів.
- **Трасування**: записи окремих запитів і операцій, виконаних для їх обробки. Кожна операція з виміряною тривалістю називається **span**.
- **Журнали**: записи подій із часовими мітками, як-от запуск застосунку або збій операції.
[**OpenTelemetry**](https://opentelemetry.io/) - це набір стандартів та інструментів для збирання телеметрії та надсилання її до сервісу моніторингу, де ви можете переглядати її на інформаційних панелях.
**FastAPI надає підтримку OpenTelemetry за замовчуванням** для трасувань, метрик і журналів HTTP-запитів. З'єднання WebSocket також надають трасування та журнали. Щоб переглядати ці дані, налаштуйте сервіс моніторингу для їх отримання.
## Встановіть FastAPI { #install-fastapi }
Встановіть FastAPI з додатковими залежностями `standard`, які включають пакети для надсилання телеметрії:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## Створіть застосунок { #create-the-app }
Створіть файл `main.py`:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
Зверніть увагу: усе працює за замовчуванням, вам не потрібно писати власний код для роботи телеметрії.
## FastAPI Cloud { #fastapi-cloud }
Коли ви розгортаєте застосунок у [FastAPI Cloud](https://fastapicloud.com) із `fastapi[standard]`, метрики працюють автоматично. Вам не потрібно нічого додатково налаштовувати.
На тарифних планах Pro ви можете переглядати кількість запитів, частоту помилок і час відповіді на [панелі метрик](https://fastapicloud.com/docs/monitoring-and-performance/metrics/).
<img src="/img/tutorial/opentelemetry/image01.png" alt="Панель метрик FastAPI Cloud Pro з прикладами даних">
## Інші сервіси моніторингу { #other-monitoring-services }
Щоб надсилати телеметрію до іншого сервісу моніторингу, налаштуйте кінцеву точку, яка приймає **OTLP**, протокол OpenTelemetry для надсилання телеметрії. Використовуйте базову кінцеву точку HTTP/protobuf цього сервісу.
Задайте ці змінні оточення, замінивши URL із прикладу на вашу кінцеву точку:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` ідентифікує ваш застосунок у сервісі моніторингу. Кінцева точка - це базовий URL для отримання даних. Трасування надсилаються до `/v1/traces`, метрики - до `/v1/metrics`, а журнали - до `/v1/logs` за цим URL.
Якщо ваш сервіс вимагає автентифікації, задайте в `OTEL_EXPORTER_OTLP_HEADERS` заголовки, які він визначає, наприклад `api-key=YOUR_API_KEY`.
## Запустіть застосунок { #run-the-app }
Запустіть застосунок у тому самому терміналі:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
В іншому терміналі надішліть запит:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
Відкрийте ваш сервіс моніторингу та знайдіть `my-api`. Після наступного експорту ви зможете побачити трасування зі span `GET /items/{item_id}`, а також метрики кількості запитів, тривалості відповіді та активних запитів.
## Налаштуйте телеметрію { #customize-telemetry }
### Налаштуйте провайдери та експортери { #configure-providers-and-exporters }
**Провайдер** надає об'єкти, які записують трасування, метрики або журнали. Його конфігурація визначає, як ці дані обробляються та експортуються.
Бібліотеки телеметрії можуть налаштовувати глобальні провайдери OpenTelemetry. Налаштуйте бібліотеку перед запуском застосунку, і FastAPI автоматично використовуватиме ці провайдери.
Коли кінцеву точку OTLP задано в оточенні, FastAPI додає експортер для цього місця призначення до кожного ввімкненого провайдера. Наявні експортери продовжують надсилати дані до своїх місць призначення.
Налаштовуйте кожне місце призначення лише один раз. Якщо інша бібліотека вже обробляє місце призначення, задане в оточенні, вимкніть у ній експорт за налаштуваннями оточення або вимкніть автоматичне налаштування FastAPI:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
Ви також можете передати провайдер безпосередньо у словнику `telemetry`. Наприклад, цей провайдер використовує консольний експортер OpenTelemetry для виведення span запитів у вашому терміналі:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
**Експортер** надсилає span до їхнього місця призначення. `BatchSpanProcessor` групує span і надсилає їх у фоновому режимі. Замініть консольний експортер на той, який надає ваша бібліотека моніторингу, щоб використовувати її місце призначення. Додаткові параметри налаштування наведено в [посібнику з інструментування Python для OpenTelemetry](https://opentelemetry.io/docs/languages/python/instrumentation/).
Використовуйте `meter_provider` або `logger_provider` у тому самому словнику, щоб надати провайдер метрик або журналів. Застосунок або бібліотека, що створює провайдер, керує його вимкненням. FastAPI керує компонентами експорту, які додає.
/// warning | Попередження
OpenTelemetry за замовчуванням використовує глобальні провайдери. Незалежне налаштування телеметрії для [змонтованих підзастосунків](sub-applications.md) не гарантоване.
///
### Трасуйте операції запитів { #trace-request-operations }
За замовчуванням трасування запитів включають span для розв'язання залежностей, виконання вашої функції операції шляху, серіалізації відповіді та виконання кожного завдання у `BackgroundTasks` FastAPI. Ці span використовують ті самі провайдер і експортери.
Span фонових завдань залишаються частиною трасування запиту. Вони виконуються після завершення span HTTP-відповіді, тому не збільшують виміряний час відповіді.
Щоб записувати лише span HTTP-запиту, задайте `operation_spans` значення `False`:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### Трасуйте з'єднання WebSocket { #trace-websocket-connections }
Кожне з'єднання WebSocket має span, наприклад `WS /ws/{room}`, що охоплює обробник і очищення залежностей. Він використовує ті самі провайдери й налаштування, включно з `operation_spans` для розв'язання залежностей і виконання кінцевої точки.
Метрики HTTP-запитів охоплюють лише HTTP-запити. Звичайні від'єднання WebSocket із кодами `1000` або `1001` не створюють записів про помилки в журналах.
### Переглядайте помилки { #inspect-errors }
FastAPI записує необроблені винятки як журнали OpenTelemetry, пов'язані з трасуванням запиту або з'єднання. Помилки записуються в журнали, навіть коли трасування не потрапляє до вибірки.
Записи винятків у журналах містять тип винятку, повідомлення та трасування стека. Повідомлення та трасування стека можуть містити конфіденційну інформацію. Використовуйте процесори журналів вашого провайдера для фільтрування або приховування такої інформації або задайте `logs` значення `False`, щоб вимкнути ці журнали.
FastAPI також записує помилки валідації запитів як попередження в журналах із маршрутом і кількістю помилок. Ці записи не містять некоректних вхідних даних.
## Виберіть, що записувати { #choose-what-to-record }
Словник `telemetry` також приймає такі налаштування:
| Налаштування | Призначення | За замовчуванням |
| --- | --- | --- |
| `tracing` | Записувати span HTTP-запитів і з'єднань WebSocket | `True` |
| `metrics` | Записувати метрики HTTP-запитів | `True` |
| `logs` | Записувати помилки валідації та необроблені винятки | `True` |
| `operation_spans` | Додавати span для операцій запитів | `True` |
| `exclude` | Пропускати запити, коли функція, що отримує ASGI scope, повертає `True` | `None` |
| `auto_configure` | Додавати експортери для кінцевих точок, заданих у змінних оточення | `True` |
Наприклад, щоб збирати метрики, виключаючи перевірки працездатності:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
Задайте `auto_configure` значення `False`, коли ваш застосунок самостійно налаштовує провайдери, наприклад у своїй функції тривалості життя.
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
當你的 API 運作時,你可能會想知道它收到多少流量、哪些請求較慢,以及何時發生錯誤。
**遙測(Telemetry)**是關於應用程式行為的資料,能協助你回答這些問題。常見類型包括:
- **指標(Metrics)**:可隨時間彙整的測量值,例如回應時間和正在處理的請求數量。
- **追蹤(Traces)**:個別請求及其處理過程中所執行操作的記錄。每個計時的操作稱為一個 **span**。
- **日誌(Logs)**:附有時間戳記的事件記錄,例如應用程式啟動或操作失敗。
[**OpenTelemetry**](https://opentelemetry.io/) 是一套標準與工具,用於收集遙測資料並將其傳送到監控服務,讓你能在儀表板中查看這些資料。
**FastAPI 預設提供 OpenTelemetry 支援**,涵蓋 HTTP 請求的追蹤、指標和日誌。WebSocket 連線也提供追蹤和日誌。若要查看這些資料,請設定監控服務來接收它們。
## 安裝 FastAPI { #install-fastapi }
安裝 FastAPI 時加上 `standard` 額外選項,其中包含傳送遙測資料所需的套件:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## 建立應用程式 { #create-the-app }
建立一個 `main.py` 檔案:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
請注意,這些功能預設就能運作,你不需要撰寫任何自訂程式碼來啟用遙測。
## FastAPI Cloud { #fastapi-cloud }
當你使用 `fastapi[standard]` 部署到 [FastAPI Cloud](https://fastapicloud.com) 時,指標功能會自動運作。你不需要做任何額外設定。
使用 Pro 方案時,你可以在[指標儀表板](https://fastapicloud.com/docs/monitoring-and-performance/metrics/)中查看請求數量、錯誤率和回應時間。
<img src="/img/tutorial/opentelemetry/image01.png" alt="含有範例資料的 FastAPI Cloud Pro 指標儀表板">
## 其他監控服務 { #other-monitoring-services }
若要將遙測資料傳送到其他監控服務,請設定一個接受 **OTLP** 的端點。OTLP 是 OpenTelemetry 用於傳送遙測資料的協定。請使用該服務的 HTTP/protobuf 基礎端點。
設定以下環境變數,並將範例 URL 替換為你的端點:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` 用於在監控服務中識別你的應用程式。端點是接收資料的基礎 URL。追蹤會傳送到該 URL 下的 `/v1/traces`,指標傳送到 `/v1/metrics`,日誌則傳送到 `/v1/logs`。
如果你的服務需要驗證身分,請將 `OTEL_EXPORTER_OTLP_HEADERS` 設定為該服務指定的標頭,例如 `api-key=YOUR_API_KEY`。
## 執行應用程式 { #run-the-app }
在同一個終端機中啟動應用程式:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
在另一個終端機中傳送請求:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
開啟你的監控服務並找到 `my-api`。下一次匯出後,你就能看到包含 `GET /items/{item_id}` span 的追蹤,以及請求數量、回應時間和處理中請求的指標。
## 自訂遙測 { #customize-telemetry }
### 設定提供者和匯出器 { #configure-providers-and-exporters }
**提供者(provider)**提供用於記錄追蹤、指標或日誌的物件。其設定控制這些資料的處理與匯出方式。
遙測函式庫可以設定 OpenTelemetry 的全域提供者。在應用程式啟動前設定好函式庫,FastAPI 就會自動使用這些提供者。
當環境中設定了 OTLP 端點時,FastAPI 會為每個已啟用的提供者新增一個指向該目的地的匯出器。現有的匯出器會繼續將資料傳送到各自的目的地。
每個目的地只需設定一次。如果另一個函式庫已經負責處理環境變數指定的目的地,請停用該函式庫依環境變數進行匯出的功能,或關閉 FastAPI 的自動設定:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
你也可以直接在 `telemetry` 字典中傳入提供者。例如,這個提供者使用 OpenTelemetry 的主控台匯出器,在終端機中印出請求的 span:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
**匯出器(exporter)**會將 span 傳送到目的地。`BatchSpanProcessor` 會將 span 分組,並在背景傳送。將主控台匯出器替換成監控函式庫提供的匯出器,即可使用該函式庫的目的地。更多設定選項請參閱 [OpenTelemetry 的 Python instrumentation 指南](https://opentelemetry.io/docs/languages/python/instrumentation/)。
在同一個字典中使用 `meter_provider` 或 `logger_provider`,即可提供指標或日誌的提供者。建立提供者的應用程式或函式庫負責管理其關閉流程。FastAPI 則管理它所新增的匯出元件。
/// warning | 警告
OpenTelemetry 預設使用全域提供者。不保證[掛載的子應用程式](sub-applications.md)能使用獨立的遙測設定。
///
### 追蹤請求操作 { #trace-request-operations }
預設情況下,請求追蹤會包含解析相依性、執行路徑操作函式、序列化回應,以及執行 FastAPI `BackgroundTasks` 中各個任務的 span。這些 span 使用相同的提供者和匯出器。
背景任務的 span 仍屬於該請求的追蹤。它們在 HTTP 回應 span 結束後才執行,因此不會增加測得的回應時間。
若只想記錄 HTTP 請求 span,請將 `operation_spans` 設為 `False`:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### 追蹤 WebSocket 連線 { #trace-websocket-connections }
每個 WebSocket 連線都有一個 span,例如 `WS /ws/{room}`,涵蓋處理函式及相依性清理。它使用相同的提供者和設定,包括用於相依性解析和端點執行的 `operation_spans`。
HTTP 請求指標僅涵蓋 HTTP 請求。使用代碼 `1000` 或 `1001` 正常中斷的 WebSocket 連線不會產生錯誤日誌。
### 檢查錯誤 { #inspect-errors }
FastAPI 會將未處理的例外記錄為 OpenTelemetry 日誌,並連結到該請求或連線的追蹤。即使追蹤未被取樣,仍會記錄錯誤日誌。
例外日誌包含例外的類型、訊息和堆疊追蹤。訊息與堆疊追蹤可能包含敏感資訊。請使用提供者的日誌處理器來篩選或遮蔽這些資訊,或將 `logs` 設為 `False` 以停用這些日誌。
FastAPI 也會將請求驗證失敗記錄為警告日誌,其中包含路由和錯誤數量。這些日誌不會包含無效的輸入。
## 選擇要記錄的內容 { #choose-what-to-record }
`telemetry` 字典也接受以下設定:
| 設定 | 用途 | 預設值 |
| --- | --- | --- |
| `tracing` | 記錄 HTTP 請求和 WebSocket 連線的 span | `True` |
| `metrics` | 記錄 HTTP 請求指標 | `True` |
| `logs` | 記錄驗證失敗和未處理的例外 | `True` |
| `operation_spans` | 為請求操作新增 span | `True` |
| `exclude` | 當接收 ASGI scope 的函式回傳 `True` 時,略過該請求 | `None` |
| `auto_configure` | 為環境變數中設定的端點新增匯出器 | `True` |
例如,若要收集指標,但排除健康檢查:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
當你的應用程式自行處理提供者設定時,例如在 lifespan 函式中設定,請將 `auto_configure` 設為 `False`。
+161
View File
@@ -0,0 +1,161 @@
# OpenTelemetry { #opentelemetry }
当你的 API 运行时,你可能想知道它接收了多少流量、哪些请求较慢,以及何时发生错误。
**遥测**是反映应用行为的数据,可以帮助你回答这些问题。常见类型包括:
- **指标(Metrics)**:可以按时间汇总的测量值,例如响应时间和正在处理的请求数。
- **追踪(Traces)**:记录单个请求及处理该请求所执行的操作。每个计时的操作称为一个 **span**。
- **日志(Logs)**:带有时间戳的事件记录,例如应用启动或操作失败。
[**OpenTelemetry**](https://opentelemetry.io/) 是一套用于收集遥测数据并将其发送到监控服务的标准和工具,你可以在监控服务的仪表板中查看这些数据。
**FastAPI 默认提供 OpenTelemetry 支持**,用于 HTTP 请求的追踪、指标和日志。WebSocket 连接也提供追踪和日志。要查看这些数据,请配置监控服务来接收它们。
## 安装 FastAPI { #install-fastapi }
安装 FastAPI 时启用 `standard` 扩展依赖,其中包含发送遥测数据所需的包:
<div class="termy">
```console
$ uv add "fastapi[standard]"
---> 100%
```
</div>
## 创建应用 { #create-the-app }
创建文件 `main.py`:
{* ../../docs_src/opentelemetry/tutorial001_py310.py *}
注意,这一切默认就能工作,你无需编写任何自定义代码即可使用遥测功能。
## FastAPI Cloud { #fastapi-cloud }
使用 `fastapi[standard]` 部署到 [FastAPI Cloud](https://fastapicloud.com) 时,指标功能会自动工作。你无需进行其他配置。
使用 Pro 套餐时,你可以在[指标仪表板](https://fastapicloud.com/docs/monitoring-and-performance/metrics/)中查看请求数、错误率和响应时间。
<img src="/img/tutorial/opentelemetry/image01.png" alt="显示示例数据的 FastAPI Cloud Pro 指标仪表板">
## 其他监控服务 { #other-monitoring-services }
要将遥测数据发送到其他监控服务,请配置一个接受 **OTLP** 的端点,OTLP 是 OpenTelemetry 用于发送遥测数据的协议。请使用该服务的 HTTP/protobuf 基础端点。
设置以下环境变量,将示例 URL 替换为你的端点:
```bash
export OTEL_SERVICE_NAME=my-api
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.example.com
```
`OTEL_SERVICE_NAME` 用于在监控服务中标识你的应用。端点是接收数据的基础 URL。追踪会发送到该 URL 下的 `/v1/traces`,指标发送到 `/v1/metrics`,日志发送到 `/v1/logs`。
如果你的服务需要身份验证,请将 `OTEL_EXPORTER_OTLP_HEADERS` 设置为该服务指定的请求头,例如 `api-key=YOUR_API_KEY`。
## 运行应用 { #run-the-app }
在同一个终端中启动应用:
<div class="termy">
```console
$ uv run fastapi run
```
</div>
在另一个终端中发送请求:
```console
$ curl http://127.0.0.1:8000/items/1
{"item_id":1}
```
打开你的监控服务,找到 `my-api`。下一次导出后,你就能看到一条包含 `GET /items/{item_id}` span 的追踪,以及请求数、响应耗时和活跃请求数的指标。
## 自定义遥测 { #customize-telemetry }
### 配置 provider 和 exporter { #configure-providers-and-exporters }
**provider** 提供用于记录追踪、指标或日志的对象。其配置决定了这些数据的处理和导出方式。
遥测库可以配置 OpenTelemetry 的全局 provider。在应用启动之前配置好该库,FastAPI 就会自动使用这些 provider。
当环境中设置了 OTLP 端点时,FastAPI 会为每个已启用的 provider 添加一个向该目标发送数据的 exporter。现有的 exporter 会继续向各自的目标发送数据。
每个目标只需配置一次。如果另一个库已经负责向环境变量指定的目标导出数据,请禁用该库基于环境变量的导出功能,或关闭 FastAPI 的自动配置:
```python
app = FastAPI(telemetry={"auto_configure": False})
```
你也可以直接在 `telemetry` 字典中传入 provider。例如,下面的 provider 使用 OpenTelemetry 的控制台 exporter,在终端中打印请求 span:
{* ../../docs_src/opentelemetry/tutorial002_py310.py hl[2:8] *}
**exporter** 将 span 发送到目标位置。`BatchSpanProcessor` 将 span 分组,并在后台发送。要使用监控库的目标位置,请将控制台 exporter 替换为该库提供的 exporter。更多配置选项请参阅 [OpenTelemetry 的 Python 插桩指南](https://opentelemetry.io/docs/languages/python/instrumentation/)。
在同一个字典中使用 `meter_provider` 或 `logger_provider` 来提供指标或日志 provider。创建 provider 的应用或库负责管理其关闭过程。FastAPI 负责管理它所添加的导出组件。
/// warning | 警告
OpenTelemetry 默认使用全局 provider。不保证[挂载的子应用](sub-applications.md)可以拥有独立的遥测配置。
///
### 追踪请求操作 { #trace-request-operations }
默认情况下,请求追踪包含以下操作的 span:解析依赖项、运行路径操作函数、序列化响应,以及运行 FastAPI 的 `BackgroundTasks` 中的每个任务。这些 span 使用相同的 provider 和 exporter。
后台任务的 span 仍属于该请求的追踪。它们在 HTTP 响应 span 结束后运行,因此不会增加测得的响应时间。
要仅记录 HTTP 请求 span,请将 `operation_spans` 设置为 `False`:
{* ../../docs_src/opentelemetry/tutorial003_py310.py hl[3] *}
### 追踪 WebSocket 连接 { #trace-websocket-connections }
每个 WebSocket 连接都有一个类似 `WS /ws/{room}` 的 span,涵盖处理函数和依赖项清理过程。它使用相同的 provider 和设置,包括用于依赖项解析和端点执行的 `operation_spans`。
HTTP 请求指标仅涵盖 HTTP 请求。使用代码 `1000` 或 `1001` 正常断开的 WebSocket 连接不会产生日志错误。
### 检查错误 { #inspect-errors }
FastAPI 将未处理的异常记录为 OpenTelemetry 日志,并关联到请求或连接的追踪。即使追踪未被采样,也会记录错误日志。
异常日志包含异常类型、消息和堆栈追踪。消息和堆栈追踪可能包含敏感信息。请使用 provider 的日志处理器对其进行过滤或脱敏,或将 `logs` 设置为 `False` 来禁用这些日志。
FastAPI 还会将请求验证失败记录为警告日志,其中包含路由和错误数量。这些日志不包含无效的输入。
## 选择要记录的内容 { #choose-what-to-record }
`telemetry` 字典还接受以下设置:
| 设置 | 用途 | 默认值 |
| --- | --- | --- |
| `tracing` | 记录 HTTP 请求和 WebSocket 连接的 span | `True` |
| `metrics` | 记录 HTTP 请求指标 | `True` |
| `logs` | 记录验证失败和未处理的异常 | `True` |
| `operation_spans` | 为请求操作添加 span | `True` |
| `exclude` | 当接收 ASGI scope 的函数返回 `True` 时跳过请求 | `None` |
| `auto_configure` | 为环境变量中设置的端点添加 exporter | `True` |
例如,要收集指标,同时排除健康检查:
```python
from fastapi import FastAPI
app = FastAPI(
telemetry={
"tracing": False,
"exclude": lambda scope: scope["path"] == "/health",
}
)
```
当应用自行配置 provider 时,例如在其 lifespan 函数中配置,请将 `auto_configure` 设置为 `False`。
@@ -0,0 +1,8 @@
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
@@ -0,0 +1,13 @@
from fastapi import FastAPI
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
tracer_provider = TracerProvider()
tracer_provider.add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
app = FastAPI(telemetry={"tracer_provider": tracer_provider})
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
@@ -0,0 +1,8 @@
from fastapi import FastAPI
app = FastAPI(telemetry={"operation_spans": False})
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}