Contrôle des coûts Axiom
Tableaux de bord, moniteurs et identification des gaspillages pour l'optimisation de l'utilisation d'Axiom.
Avant de commencer
-
Charger les skills requis :
skill: axiom-sre skill: axiom-build-dashboardaxiom-build-dashboard fournit :
dashboard-list,dashboard-get,dashboard-create,dashboard-update,dashboard-delete -
Trouver le dataset d'audit. Essayer d'abord
axiom-audit:['axiom-audit'] | where _time > ago(1h) | summarize count() by action | where action in ('usageCalculated', 'runAPLQueryCost')- Si non trouvé → demander à l'utilisateur. Noms courants :
axiom-audit-logs-view,audit-logs - Si trouvé mais pas d'événements
usageCalculated→ mauvais dataset, demander à l'utilisateur
- Si non trouvé → demander à l'utilisateur. Noms courants :
-
Vérifier l'accès à
axiom-history(requis pour Phase 4) :['axiom-history'] | where _time > ago(1h) | take 1S'il n'est pas trouvé, l'optimisation Phase 4 ne fonctionnera pas.
-
Confirmer avec l'utilisateur :
- Nom du déploiement ?
- Nom du dataset d'audit ?
- Limite du contrat en TB/jour ? (requis pour les moniteurs Phase 3)
-
Remplacer
<deployment>et<audit-dataset>dans toutes les commandes ci-dessous.
Astuces :
- Exécuter n'importe quel script avec
-hpour la syntaxe complète - Ne PAS rediriger la sortie du script vers
headoutail— provoque des erreurs SIGPIPE - Nécessite
jqpour l'analyse JSON - Utiliser
axiom-querydu skill axiom-sre pour les APL ad-hoc, pas le CLI directe
Quelles phases exécuter
| Demande utilisateur | Phases à exécuter |
|---|---|
| « réduire les coûts » / « trouver du gaspillage » | 0 → 1 → 4 |
| « mettre en place le contrôle des coûts » | 0 → 1 → 2 → 3 |
| « déployer un tableau de bord » | 0 → 2 |
| « créer des moniteurs » | 0 → 3 |
| « vérifier la dérive » | 0 uniquement |
Phase 0 : Vérifier la configuration existante
# Tableau de bord existant ?
dashboard-list <deployment> | grep -i cost
# Moniteurs existants ?
axiom-api <deployment> GET "/v2/monitors" | jq -r '.[] | select(.name | startswith("Cost Control:")) | "\(.id)\t\(.name)"'
Si trouvés, les récupérer avec dashboard-get et comparer à templates/dashboard.json pour détecter des dérives.
Phase 1 : Découverte
scripts/baseline-stats -d <deployment> -a <audit-dataset>
Capture les statistiques d'ingestion quotidiennes et produit la File d'analyse (nécessaire pour Phase 4).
Phase 2 : Tableau de bord
scripts/deploy-dashboard -d <deployment> -a <audit-dataset>
Crée un tableau de bord avec : tendances d'ingestion, taux de brûlure, projections, candidats au gaspillage, utilisateurs principaux. Voir reference/dashboard-panels.md pour les détails.
Phase 3 : Moniteurs
Le contrat est requis. Vous devez avoir la limite du contrat de l'étape de vérification préalable 4.
Étape 1 : Lister les notificateurs disponibles
scripts/list-notifiers -d <deployment>
Présenter la liste à l'utilisateur et demander quel notificateur il souhaite pour les alertes de coûts.
S'il ne souhaite pas de notifications, procéder sans -n.
Étape 2 : Créer les moniteurs
scripts/create-monitors -d <deployment> -a <audit-dataset> -c <contract_tb> [-n <notifier_id>]
Crée 3 moniteurs :
- Total Ingest Guard — alerte quand l'ingestion quotidienne >1,2x le contrat OU la moyenne 7 jours augmente >15% vs baseline
- Per-Dataset Spike — détection robuste par z-score, alerte par dataset avec attribution
- Query Cost Spike — z-score renforcé avec baseline 30j, exclusion 5j, gating basé sur la persistance (median_z > 3, p25_z > 2,5)
Les moniteurs de spike utilisent notifyByGroup: true afin que chaque dataset déclenche une alerte séparée.
Voir reference/monitor-strategy.md pour la dérivation des seuils.
Phase 4 : Optimisation
Obtenir la File d'analyse
Exécuter scripts/baseline-stats si pas déjà fait. Il produit une liste priorisée :
| Priorité | Signification |
|---|---|
| P0⛔ | Top 3 par ingestion OU >10% du total — OBLIGATOIRE |
| P1 | Jamais interrogé — candidat de suppression fort |
| P2 | Rarement interrogé (Work/GB < 100) — gaspillage probable |
Work/GB = coût de requête (GB·ms) / ingestion (GB). Plus faible = moins de valeur des données.
Analyser les datasets dans l'ordre
Travailler de haut en bas. Pour chaque dataset :
Étape 1 : Analyse des colonnes
scripts/analyze-query-coverage -d <deployment> -D <dataset> -a <audit-dataset>
Si 0 requête → recommander DROP, passer au suivant.
Étape 2 : Analyse des valeurs de champs
Choisir un champ parmi la liste suggérée (généralement app, service, ou kubernetes.labels.app) :
scripts/analyze-query-coverage -d <deployment> -D <dataset> -a <audit-dataset> -f <field>
Noter les valeurs avec grand volume mais jamais interrogées (marqueurs ⚠️).
Étape 3 : Gérer les valeurs vides
Si (empty) a >5% du volume, vous DEVEZ analyser avec un champ alternatif (p. ex. kubernetes.namespace_name).
Étape 4 : Enregistrer la recommandation
Pour chaque dataset, noter : nom, volume d'ingestion, Work/GB, principales valeurs non interrogées, action (DROP/SAMPLE/KEEP), économies estimées.
Terminé quand
Tous les datasets P0⛔ et P1 analysés. Ensuite compiler le rapport avec reference/analysis-report-template.md.
Nettoyage
# Supprimer les moniteurs
axiom-api <deployment> GET "/v2/monitors" | jq -r '.[] | select(.name | startswith("Cost Control:")) | "\(.id)\t\(.name)"'
axiom-api <deployment> DELETE "/v2/monitors/<id>"
# Supprimer le tableau de bord
dashboard-list <deployment> | grep -i cost
dashboard-delete <deployment> <id>
Note : Exécuter create-monitors deux fois crée des doublons. Supprimer les moniteurs existants d'abord en cas de re-déploiement.
Référence
Champs du Dataset d'audit
| Champ | Description |
|---|---|
action |
usageCalculated ou runAPLQueryCost |
properties.hourly_ingest_bytes |
Ingestion horaire en octets |
properties.hourly_billable_query_gbms |
Coût de requête horaire |
properties.dataset |
Nom du dataset |
resource.id |
ID d'organisation |
actor.email |
Email utilisateur |
Champs courants pour l'analyse de valeur
| Type de dataset | Champ principal | Alternatives |
|---|---|---|
| Logs Kubernetes | kubernetes.labels.app |
kubernetes.namespace_name, kubernetes.container_name |
| Logs application | app ou service |
level, logger, component |
| Infrastructure | host |
region, instance |
| Traces | service.name |
span.kind, http.route |
Unités et conversions
- Les scripts utilisent TB/jour
- Le filtre du tableau de bord utilise GB/mois
| Contrat | TB/jour | GB/mois |
|---|---|---|
| 5 PB/mois | 167 | 5 000 000 |
| 10 PB/mois | 333 | 10 000 000 |
| 15 PB/mois | 500 | 15 000 000 |
Actions d'optimisation
| Signal | Action |
|---|---|
| Work/GB = 0 | Supprimer ou arrêter l'ingestion |
| Valeurs à haut volume non interrogées | Échantillonner ou réduire le niveau de log |
| Valeurs vides provenant d'espaces de noms système | Filtrer à l'ingestion ou accepter |
| Pic WoW | Vérifier les déploiements récents |