Alertes et tableaux de bord avec Cloud Monitoring
Du journal à la métrique
Sur Google Cloud, le chemin le plus court ne demande aucun code en plus : les métriques basées sur les journaux (log-based metrics) comptent ou mesurent des champs des journaux déjà écrits par le wrapper.
flowchart LR A["Cloud Run : ligne JSON llm_call"] --> L["Cloud Logging"] L --> M1["Métrique compteur : lab-llmops-erreurs"] L --> M2["Métrique distribution : lab-llmops-latence"] M1 --> D["Tableau de bord"] M2 --> D M1 --> AL["Règle d'alerte"] M2 --> AL AL --> N["Notification : e-mail, chat, astreinte"]
| Type de métrique | Ce qu'elle mesure | Exemple |
|---|---|---|
| compteur | nombre de lignes qui correspondent à un filtre | appels en erreur |
| distribution | la répartition d'un champ numérique, d'où les percentiles | latency_ms, tokens_in, cost_usd |
Un compteur se crée en une ligne :
gcloud logging metrics create lab-llmops-erreurs --project=MON_PROJET \
--description="Appels LLM en erreur" \
--log-filter='jsonPayload.message="llm_call" AND jsonPayload.ok=false'Une distribution demande un fichier de configuration, avec un libellé extrait du journal pour séparer les versions de prompt :
description: "Latence des appels LLM (ms), par version de prompt"
filter: 'jsonPayload.message="llm_call"'
valueExtractor: EXTRACT(jsonPayload.latency_ms)
labelExtractors:
prompt_version: EXTRACT(jsonPayload.prompt_version)
metricDescriptor:
metricKind: DELTA
valueType: DISTRIBUTION
unit: ms
labels:
- key: prompt_version
valueType: STRING
bucketOptions:
exponentialBuckets:
numFiniteBuckets: 40
growthFactor: 1.3
scale: 50gcloud logging metrics create lab-llmops-latence --config-from-file=logmetric-latence.yaml --project=MON_PROJETQuelle métrique choisir pour suivre le p95 du coût par appel ?
Un compteur compte des lignes ; seule une distribution conserve la répartition des valeurs, ce qui permet de calculer des percentiles.
Le tableau de bord
Un tableau de bord Cloud Monitoring se décrit en JSON (dashboard.json) et se crée avec gcloud monitoring dashboards create --config-from-file=dashboard.json. Le premier graphique affiche le p95 de latence par version de prompt :
"filter": "metric.type=\"logging.googleapis.com/user/lab-llmops-latence\"",
"aggregation": {"alignmentPeriod": "300s", "perSeriesAligner": "ALIGN_PERCENTILE_95",
"crossSeriesReducer": "REDUCE_MAX", "groupByFields": ["metric.label.prompt_version"]}Une ligne par version : au moment d'un déploiement, on voit immédiatement si la nouvelle version se comporte différemment. Ajoutez sur le même modèle des graphiques pour tokens_in, le coût cumulé du jour et le taux d'erreur.
Les alertes
Une bonne alerte est actionnable : quand elle sonne, quelqu'un sait quoi faire. Exemples de règles et de seuils de départ, à ajuster à votre trafic :
| Alerte | Condition | Action attendue |
|---|---|---|
| Taux d'erreur | erreurs / appels > 5 % pendant 10 min | vérifier quota (429), statut du fournisseur, dernier déploiement |
| Latence | p95 > 2 × la valeur habituelle pendant 15 min | regarder les tokens de sortie et les tentatives |
| Coût | tokens d'entrée moyens + 50 % sur 1 h | un prompt a grossi : quelle version ? |
| Budget | budget de facturation à 80 % | décision humaine, pas d'astreinte la nuit |
Les règles se créent dans la console (Monitoring › Alerting) ou avec gcloud monitoring policies create --policy-from-file=.... Pour l'argent, ajoutez une alerte de budget dans la facturation du projet : elle couvre aussi ce que vos métriques ne voient pas.
Quelle alerte est la moins actionnable ?
Une alerte par erreur sonne en permanence (quelques 503 sont normaux) et finit ignorée. On alerte sur un taux et une durée, qui distinguent un incident d'un bruit.
Exercice : alerter sur le coût
Écrivez le filtre de journal et la commande pour créer une métrique de distribution sur tokens_in, par version de prompt, nommée lab-llmops-tokens-in.
Voir la solution
Copiez logmetric-latence.yaml en logmetric-tokens.yaml et changez deux lignes :
description: "Tokens d'entrée par appel LLM, par version de prompt"
valueExtractor: EXTRACT(jsonPayload.tokens_in)Remplacez aussi unit: ms par unit: "1", puis :
gcloud logging metrics create lab-llmops-tokens-in --config-from-file=logmetric-tokens.yaml --project=MON_PROJETL'alerte se pose ensuite sur ALIGN_PERCENTILE_50 de cette métrique, groupée par metric.label.prompt_version, avec un seuil à environ 1,5 × la valeur habituelle.
Résultat obtenu
Test réel du 2026-10-15 sur un projet de test : création des deux métriques et du tableau de bord à partir des fichiers du lab, vérification, puis suppression.
$ gcloud logging metrics create lab-llmops-latence --config-from-file=logmetric-latence.yaml
Created [lab-llmops-latence].
$ gcloud logging metrics create lab-llmops-erreurs --log-filter='jsonPayload.message="llm_call" AND jsonPayload.ok=false'
Created [lab-llmops-erreurs].
$ gcloud monitoring dashboards create --config-from-file=dashboard.json
Created [2afeaa63-fae7-46d3-aa7c-f4f9ce38619b].
# nettoyage
Deleted dashboard [2afeaa63-fae7-46d3-aa7c-f4f9ce38619b].
Deleted [lab-llmops-latence].
Deleted [lab-llmops-erreurs].Les règles d'alerte n'ont pas été créées (elles peuvent être facturées) : leur configuration est décrite ci-dessus. Pour nettoyer chez vous : gcloud logging metrics delete NOM, gcloud monitoring dashboards delete ID, gcloud monitoring policies delete ID, toujours avec --project.
Je sais faire
- Créer une métrique compteur et une métrique distribution à partir des journaux
- Construire un graphique p95 par version de prompt
- Écrire des alertes actionnables sur taux, durée et coût
- Nettoyer métriques, tableaux de bord et règles créés