Leçon 5 — Tester, évaluer, exploiter

Coûts, nettoyage et exploitation

5 min de lecture

Coûts, nettoyage et exploitation

Mesurer le coût réel avec les labels

Chaque job lancé par le toolset ou par estimer() porte le label formation-lab=analyste-bigquery. La vue INFORMATION_SCHEMA.JOBS_BY_USER (l'historique de vos jobs BigQuery, interrogeable en SQL) permet de les additionner :

cout_du_lab.sql
SELECT COUNT(*) AS requetes,
       ROUND(SUM(total_bytes_billed) / 1e6, 1)    AS mo_factures,
       ROUND(SUM(total_bytes_processed) / 1e6, 1) AS mo_traites
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_USER, UNNEST(labels) AS l
WHERE l.key = "formation-lab" AND l.value = "analyste-bigquery"
  AND creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND job_type = "QUERY"
ColonneSens
total_bytes_processedoctets réellement lus
total_bytes_billedoctets facturés : arrondis au Mo, minimum 10 Mo par table lue

L'écart entre les deux est attendu : nos requêtes lisent souvent 1 à 2 Mo, mais chaque table référencée compte pour 10 Mo au moins. Sur des tables de plusieurs Go, cet écart devient négligeable.

pie title "Lab complet du 2026-10-15 : Mo traités et Mo facturés"
  "Mo traités (47,4)" : 47.4
  "Écart dû au minimum de 10 Mo par table (193,8)" : 193.8

Une requête lit 1,9 Mo dans une seule table. Combien d'octets sont facturés à la demande ?

Nettoyage : ce que le lab a créé

ÉlémentCréé par le lab ?Action
dataset, table, vuenonrien à supprimer
jobs de requête (historique)oui, 44 jobsrien à faire : ce n'est pas une ressource facturée, l'historique est conservé par BigQuery
dry-runsnon enregistrés comme jobs—
service Cloud Run, bucket, Agent Enginenon—
identifiants ADC sur votre posteouigcloud auth application-default revoke si vous ne vous en servez plus

Vérification que le projet ne contient aucun dataset créé par le lab :

terminal
bq ls --project_id=VOTRE_PROJET          # sortie vide : aucun dataset

Passer en production

flowchart LR
  U["Équipe e-commerce"] --> APP["Agent sur Cloud Run ou Agent Engine"]
  APP -->|"compte de service lab-analyste"| VA["Vertex AI : Gemini"]
  APP -->|"compte de service lab-analyste"| BQ["BigQuery"]
  BQ --> VUES["Dataset reporting : vues autorisées"]
  BQ --> Q["Quotas personnalisés par jour"]
  BQ --> LOG["INFORMATION_SCHEMA + labels : suivi des coûts"]
SujetEn local (ce lab)En production
identitévotre compte (ADC)un compte de service dédié
droits BigQueryceux de votre compteBigQuery Job User sur le projet + BigQuery Data Viewer sur le seul dataset de reporting
liste blancheTABLES_AUTORISEES dans le codela même, plus les droits IAM (le compte ne peut pas lire le reste)
plafondmaximum_bytes_billed par requêteidem + quotas personnalisés de BigQuery par jour (projet ou utilisateur)
suivirequête INFORMATION_SCHEMA à la maintableau de bord planifié sur les labels

Quels rôles donner au compte de service de l'agent en production ?

Exercice : alerter sur une dérive de coût

Écrivez une requête qui liste, pour les 7 derniers jours, les jobs du lab ayant facturé plus de 500 Mo, avec leur texte SQL, pour repérer les questions qui coûtent cher.

Voir la solution
jobs_chers.sql
SELECT creation_time, ROUND(total_bytes_billed / 1e6) AS mo_factures,
       LEFT(query, 200) AS requete
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_USER, UNNEST(labels) AS l
WHERE l.key = "formation-lab" AND l.value = "analyste-bigquery"
  AND creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND total_bytes_billed > 500 * 1000 * 1000
ORDER BY total_bytes_billed DESC

Planifiez-la (requête programmée BigQuery) et envoyez le résultat à l'équipe : chaque ligne est une question à mieux cadrer dans l'instruction ou une table à partitionner. Pour une vue à l'échelle de l'organisation, utilisez JOBS_BY_PROJECT (droits plus larges nécessaires).

Résultat obtenu

Coût réel mesuré le 2026-10-15 sur toutes les exécutions du lab (smoke tests, 3 passages d'évaluation, traces), puis vérification qu'aucun dataset n'existe dans le projet :

+----------+-------------+------------+
| requetes | mo_factures | mo_traites |
+----------+-------------+------------+
|       44 |       241.2 |       47.4 |
+----------+-------------+------------+

$ bq ls --project_id=<projet>
(aucune sortie : aucun dataset)

241 Mo facturés au total : au tarif à la demande en vigueur, c'est de l'ordre d'un millième de dollar, et cela reste dans le To gratuit mensuel.

Je sais faire

  • Mesurer le coût réel d'un agent grâce aux labels de jobs et à INFORMATION_SCHEMA
  • Expliquer l'écart entre octets traités et octets facturés
  • Vérifier qu'un lab n'a laissé aucune ressource et savoir quoi nettoyer
  • Définir l'identité, les droits et les quotas d'un agent BigQuery en production