OpenTelemetry¶
đ Traduction par IA et humains
Cette traduction a Ă©tĂ© rĂ©alisĂ©e par une IA guidĂ©e par des humains. đ€
Elle peut contenir des erreurs d'interprĂ©tation du sens original, ou paraĂźtre peu naturelle, etc. đ€
Vous pouvez améliorer cette traduction en nous aidant à mieux guider le LLM d'IA.
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 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¶
Installez FastAPI avec les dépendances optionnelles standard, qui incluent les paquets permettant d'envoyer la télémétrie :
$ uv add "fastapi[standard]"
---> 100%
CrĂ©er l'application¶
Créez un fichier main.py :
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
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¶
Lorsque vous déployez sur FastAPI Cloud 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.

Autres services de supervision¶
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 :
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¶
DĂ©marrez l'application dans le mĂȘme terminal :
$ uv run fastapi run
Dans un autre terminal, envoyez une requĂȘte :
$ 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¶
Configurer les fournisseurs et les exportateurs¶
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 :
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 :
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}
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 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.
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 n'est pas garantie.
Tracer les opĂ©rations des requĂȘtes¶
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 :
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}
Tracer les connexions WebSocket¶
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¶
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¶
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é :
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.