Des logs au tableau de bord : métriques, graphiques et alertes
Le gain du jour : transformer les logs de ton API en un tableau de bord de quatre graphiques que l’équipe ouvre vraiment, versionné dans git, avec une alerte qui ne sonne que quand il faut.
Un tableau de bord, c’est quoi ?
Un tableau de bord (dashboard) est une page qui regroupe des graphiques. Chaque graphique répond à une question : « combien d’erreurs ? », « est-ce lent ? ». Dans Google Cloud, ils vivent dans Cloud Monitoring, pas dans Cloud Logging.
Un graphique a besoin d’une série temporelle (des chiffres dans le temps). Un log est une ligne de texte. Il faut un pont. On construit le chemin pas à pas.
D’abord, tes logs arrivent dans Cloud Logging :
🐍 API ──▶ 🗂 Cloud Logging
Ensuite, une métrique basée sur les logs compte les entrées qui correspondent à un filtre et produit une série temporelle :
🐍 API ──▶ 🗂 Cloud Logging ──▶ 🔢 Métrique basée sur les logs
(1 point par minute)
Puis Cloud Monitoring dessine cette série dans un graphique :
🐍 API ──▶ 🗂 Cloud Logging ──▶ 🔢 Métrique ──▶ 📈 Graphique
(tableau de bord)
Enfin, une alerte surveille la même série et te prévient :
🐍 API ──▶ 🗂 Cloud Logging ──▶ 🔢 Métrique ──▶ 📈 Graphique
│
└──▶ 🔔 Alerte ──▶ 📨 Canal (mail, Slack…)
La leçon 2 a présenté métriques et alertes en deux lignes. Ici, on les construit pour de bon.
Les métriques basées sur les logs en détail
Il en existe deux familles :
- Système : fournies par Google, en lecture seule. Exemple :
logging.googleapis.com/log_entry_count, le nombre d’entrées par log et par sévérité. - Définies par l’utilisateur (user-defined) : celles que tu crées. Leur type
Cloud Monitoring est toujours
logging.googleapis.com/user/NOM.
Une métrique utilisateur a l’un de ces deux types :
| Type | Ce qu’elle enregistre | Exemple |
|---|---|---|
| Compteur (counter) | Le nombre d’entrées qui correspondent au filtre | Les réponses 5xx par minute |
| Distribution | Des valeurs extraites des entrées, rangées dans un histogramme | La latence de chaque requête |
Un compteur simple se crée en une commande :
gcloud logging metrics create api_5xx_count \
--description="Réponses 5xx de api-commandes" \
--log-filter='resource.type="cloud_run_revision"
resource.labels.service_name="api-commandes"
httpRequest.status>=500'
gcloud logging metrics list
gcloud logging metrics describe api_5xx_count
Pour une distribution ou des labels, il faut un fichier de configuration (YAML ou
JSON, au format LogMetric) passé avec --config-from-file. Voici la latence de
l’API, découpée par code HTTP :
# latence.yaml
name: api_latency
description: Latence des requêtes de api-commandes (secondes)
filter: |
resource.type="cloud_run_revision"
resource.labels.service_name="api-commandes"
httpRequest.latency:*
valueExtractor: REGEXP_EXTRACT(httpRequest.latency, "([0-9.]+)s")
labelExtractors:
status: EXTRACT(httpRequest.status)
bucketOptions:
exponentialBuckets:
numFiniteBuckets: 64
growthFactor: 2.0
scale: 0.01
metricDescriptor:
metricKind: DELTA
valueType: DISTRIBUTION
unit: s
labels:
- key: status
valueType: STRING
gcloud logging metrics create api_latency --config-from-file=latence.yaml
valueExtractor: la valeur à ranger.EXTRACT(champ)prend tout le champ,REGEXP_EXTRACT(champ, regex)en garde le groupe capturant. Une valeur qui ne se convertit pas en nombre est ignorée.labelExtractors: une série par valeur distincte. Ici, une par code HTTP.bucketOptions: les tranches de l’histogramme (10 ms, 20 ms, 40 ms…).
Une métrique ne compte qu’à partir de sa création, jamais les logs déjà stockés. Génère un peu de trafic, attends quelques minutes, puis vérifie via le menu ⋮ de la page Log-based Metrics, entrée View in Metrics Explorer.
Chaque combinaison de valeurs de labels est une série temporelle à part. Limites : environ 30 000 séries actives et 10 labels par métrique, et un label créé ne se supprime plus. Les séries en trop coûtent cher et peuvent être bridées.
- Bon label : peu de valeurs possibles. Code HTTP, méthode, région.
- Mauvais label : URL complète, ID utilisateur, IP, message libre, et surtout
insertIdoutimestamp(une série par entrée).
Le « top des messages d’erreur » se fait en SQL, pas avec un label.
Construire le tableau de bord dans la console
Le chemin dans la console Google Cloud :
- Monitoring > Dashboards, puis Create custom dashboard.
- Add widget, type Metric, puis cherche
logging/user/api_5xx_count. - Règle l’agrégation (somme par minute, ou 95e percentile pour la latence), puis Apply.
- Add widget encore, cette fois un widget de logs : les entrées d’un filtre, affichées dans le tableau de bord.
- Save.
Depuis Metrics Explorer, Save as > Dashboard chart fait la même chose.
Le tableau de bord en code
Pour l’équipe, mieux vaut un fichier JSON dans git : relu en revue, recréé à l’identique ailleurs. Le squelette, avec les 5xx et le panneau de logs :
{
"displayName": "api-commandes : santé",
"mosaicLayout": {
"columns": 48,
"tiles": [
{
"width": 24, "height": 16,
"widget": {
"title": "Réponses 5xx par minute",
"xyChart": {
"dataSets": [{
"plotType": "LINE",
"minAlignmentPeriod": "60s",
"timeSeriesQuery": {
"timeSeriesFilter": {
"filter": "metric.type=\"logging.googleapis.com/user/api_5xx_count\" resource.type=\"cloud_run_revision\"",
"aggregation": {
"alignmentPeriod": "60s",
"perSeriesAligner": "ALIGN_DELTA",
"crossSeriesReducer": "REDUCE_SUM"
}
}
}
}]
}
}
},
{
"xPos": 24, "width": 24, "height": 16,
"widget": {
"title": "Erreurs récentes",
"logsPanel": {
"filter": "resource.labels.service_name=\"api-commandes\" severity>=ERROR",
"resourceNames": ["projects/mon-projet-dev"]
}
}
}
]
}
}
# Valider sans rien créer, puis créer
gcloud monitoring dashboards create --config-from-file=dashboard.json --validate-only
gcloud monitoring dashboards create --config-from-file=dashboard.json
La grille mosaicLayout fait ici 48 colonnes. Chaque tuile a une position (xPos,
yPos), une taille et un widget. Pour la latence : api_latency et
ALIGN_PERCENTILE_95.
Le tableau de bord concret d’une API
Quatre graphiques, quatre questions. Pas plus pour commencer.
| Question | Graphique | Source |
|---|---|---|
| Ça casse ? | Nombre de 5xx par minute | Compteur api_5xx_count |
| C’est lent ? | Latence p50 et p95 | Distribution api_latency |
| Quelle erreur ? | Top 10 des messages d’erreur | Requête SQL Observability Analytics |
| Je veux voir | Les dernières entrées severity>=ERROR | Widget de logs |
Le troisième graphique vient d’Observability Analytics, vu en leçon 3. Tu écris la requête, tu affiches le résultat en graphique, puis Save to dashboard :
SELECT JSON_VALUE(json_payload.message) AS message, COUNT(*) AS nb
FROM `mon-projet-dev.global._Default._AllLogs`
WHERE severity = 'ERROR'
GROUP BY message
ORDER BY nb DESC
LIMIT 10
Pas de métrique, donc pas de risque de cardinalité. Attention : les filtres au niveau du tableau de bord ne s’appliquent pas à ces graphiques SQL.
Alerte sur un log ou alerte sur une métrique ?
Deux sortes d’alertes se créent à partir des logs :
| Alerte basée sur les logs | Alerte sur une métrique basée sur les logs | |
|---|---|---|
| Se déclenche | Dès qu’une entrée correspond au filtre | Quand la série dépasse un seuil pendant une durée |
| Peut compter ? | Non | Oui |
| Bon pour | Un événement rare et grave : un secret lu, une migration ratée | Un taux : « plus de 10 erreurs 5xx par minute pendant 5 min » |
| Où la créer | Logs Explorer, Create alert | Log-based Metrics, menu ⋮, Create alert from metric |
Les deux envoient vers des canaux de notification (notification channels) : e-mail, Slack, PagerDuty, webhook, Pub/Sub. On les configure une fois dans Monitoring > Alerting, puis on les réutilise.
Contre la fatigue d’alerte (les alertes qu’on finit par ignorer) :
- Alerte sur un symptôme vu par l’utilisateur (taux de 5xx, latence), pas sur
chaque ligne
ERROR. - Limite les notifications d’une alerte basée sur les logs : une toutes les 5 minutes au plus, pas une par entrée.
- Mets une durée au seuil d’une alerte métrique, pour ignorer un pic isolé.
- Écris la documentation de l’alerte : quoi regarder, quel tableau de bord ouvrir.
Les bonnes pratiques
- Peu de graphiques, chacun répond à une question.
- Nomme les métriques de façon régulière (
api_5xx_count,api_latency) : on les retrouve d’un coup dans Metrics Explorer. - Versionne
dashboard.jsonet les fichiers de métriques dans git, et teste d’abord sur un projet de dev avec--validate-only.
Vérifie ta compréhension
Tu crées ce matin la métrique api_5xx_count. Le graphique ne montre rien pour l'incident d'hier soir. Pourquoi ?
Un collègue veut ajouter un label userId à api_5xx_count pour savoir qui subit les erreurs. Que lui réponds-tu ?
À toi de jouer
Crée le compteur
api_5xx_countavecgcloud logging metrics createet—log-filter, puis vérifie-le avecgcloud logging metrics describe.Génère quelques erreurs, attends quelques minutes, puis ouvre la métrique avec View in Metrics Explorer.
Crée la distribution
api_latencydepuis un fichier YAML et affiche son 95e percentile.Écris
dashboard.json, valide-le avec—validate-only, crée-le, puis commite le fichier.Ajoute le top 10 des messages d’erreur avec Save to dashboard depuis Observability Analytics.
Crée une alerte sur
api_5xx_countavec un seuil et une durée, reliée à un canal de notification.
🗂 Fiche de référence associée : Google Cloud et Cloud Logging — antisèche.