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
-
Chargez les skills requis :
skill: axiom-sre skill: building-dashboardsBuilding-dashboards fournit :
dashboard-list,dashboard-get,dashboard-create,dashboard-update,dashboard-delete -
Trouvez le dataset d'audit. Essayez d'abord
axiom-audit:['axiom-audit'] | where _time > ago(1h) | summarize count() by action | where action in ('usageCalculated', 'runAPLQueryCost')- Si non trouvé → demandez à l'utilisateur. Noms courants :
axiom-audit-logs-view,audit-logs - Si trouvé mais pas d'événements
usageCalculated→ mauvais dataset, demandez à l'utilisateur
- Si non trouvé → demandez à l'utilisateur. Noms courants :
-
Vérifiez l'accès à
axiom-history(requis pour Phase 4) :['axiom-history'] | where _time > ago(1h) | take 1Si non trouvé, l'optimisation Phase 4 ne fonctionnera pas.
-
Confirmez avec l'utilisateur :
- Nom du déploiement ?
- Nom du dataset d'audit ?
- Limite du contrat en TB/jour ? (requise pour les moniteurs Phase 3)
-
Remplacez
<deployment>et<audit-dataset>dans toutes les commandes ci-dessous.
Astuces :
- Exécutez n'importe quel script avec
-hpour l'usage complet - Ne pipez PAS la sortie du script vers
headoutail— provoque des erreurs SIGPIPE - Nécessite
jqpour le parsing JSON - Utilisez
axiom-querydu skill axiom-sre pour les requêtes APL ad-hoc, pas l'CLI direct
Quelles phases exécuter
| Demande de l'utilisateur | Exécutez ces phases |
|---|---|
| « réduire les coûts » / « trouver les gaspillages » | 0 → 1 → 4 |
| « configurer 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 seulement |
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é, récupérez avec dashboard-get et comparez à templates/dashboard.json pour détecter la dérive.
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 consommation, 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 à l'étape de préflight 4.
Étape 1 : Lister les notificateurs disponibles
scripts/list-notifiers -d <deployment>
Présentez la liste à l'utilisateur et demandez quel notificateur il souhaite pour les alertes de coûts.
S'il ne souhaite pas de notifications, continuez 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 lorsque l'ingestion quotidienne >1,2x contrat OU la moyenne 7j croît >15% vs baseline
- Per-Dataset Spike — détection z-score robuste, alerte par dataset avec attribution
- Query Cost Spike — z-score renforcé avec baseline 30j, écart d'exclusion 5j, gating basé sur la persistance (median_z > 3, p25_z > 2,5)
Les moniteurs de pic utilisent notifyByGroup: true pour 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écutez scripts/baseline-stats si pas déjà fait. Il retourne une liste priorisée :
| Priorité | Signification |
|---|---|
| P0⛔ | Top 3 par ingestion OU >10% du total — OBLIGATOIRE |
| P1 | Jamais interrogé — candidat solide pour suppression |
| P2 | Rarement interrogé (Work/GB < 100) — probable gaspillage |
Work/GB = coût de requête (GB·ms) / ingestion (GB). Plus bas = moins de valeur des données.
Analyser les datasets dans l'ordre
Travaillez 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êtes → recommandez DROP, passez au suivant.
Étape 2 : Analyse des valeurs de champs
Choisissez un champ de 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>
Notez les valeurs avec volume élevé mais jamais interrogées (marqueurs ⚠️).
Étape 3 : Traiter les valeurs vides
Si (empty) a >5% de volume, vous DEVEZ explorer avec un champ alternatif (ex. kubernetes.namespace_name).
Étape 4 : Enregistrer la recommandation
Pour chaque dataset, notez : nom, volume d'ingestion, Work/GB, valeurs principales non interrogées, action (DROP/SAMPLE/KEEP), économies estimées.
Terminé quand
Tous les datasets P0⛔ et P1 analysés. Compilez ensuite le rapport en utilisant 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. Supprimez d'abord les moniteurs existants si vous redéployez.
Référence
Champs du dataset d'audit
| Champ | Description |
|---|---|
action |
usageCalculated ou runAPLQueryCost |
properties.hourly_ingest_bytes |
Ingestion horaire en bytes |
properties.hourly_billable_query_gbms |
Coût de requête horaire |
properties.dataset |
Nom du dataset |
resource.id |
ID de l'organisation |
actor.email |
Email de l'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 applicatifs | 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 non interrogées avec volume élevé | Réduire l'échantillonnage ou le niveau de log |
| Valeurs vides provenant des espaces de noms système | Filtrer à l'ingestion ou accepter |
| Pic WoW | Vérifier les déploiements récents |