Sistemi di metriche#
Health gate e analisi canary possono leggere le metriche dal sistema che i tuoi team usano già. Ogni metrica di un gate sceglie il proprio sistema con provider, quindi un gate può combinarli: errori da Prometheus, latenza da Datadog, throughput del load balancer da CloudWatch.
provider |
Sistema | Linguaggio delle query |
|---|---|---|
prometheus (default) |
Prometheus, Thanos, Mimir, VictoriaMetrics | PromQL. Vedi Prometheus e Alertmanager. |
datadog |
Datadog | Metric query |
newrelic |
New Relic | NRQL tramite NerdGraph |
elastic |
Elasticsearch, Elastic Cloud | ES|QL |
cloudwatch |
Amazon CloudWatch | Metric math o Metrics Insights |
azure-monitor |
Azure Monitor Logs, Application Insights (basato su workspace) | KQL |
Regole che valgono per tutti i sistemi
- Le credenziali sono riferimenti a segreti nella sezione
rolloutdimanent.yml, letti a ogni lettura. - Le metriche le legge il worker che orchestra il deploy, che deve raggiungere l'API del sistema.
- Nessun dato è rosso, come con Prometheus: un gate che non vede nulla non può dire che la release è sana.
- I segnaposto
{application},{environment},{region},{az}e, nei rilasci per percentuale,{track}vengono sostituiti in ogni query.
Datadog#
- In Organization Settings crea una API key e una Application key per un service account. Limita l'application key a
timeseries_queryse la tua organizzazione usa chiavi con scope. - Salva entrambe le chiavi e configura il sito della tua organizzazione:
rollout:
datadog:
url: https://api.datadoghq.eu # default https://api.datadoghq.com; usa il tuo sito
api_key_ref: "vault:secret/data/manent/datadog#api_key"
app_key_ref: "vault:secret/data/manent/datadog#app_key"
- name: error-rate
provider: datadog
query: 'sum:trace.http.request.errors{service:{application},env:{environment},availability-zone:{az}}.as_rate() / sum:trace.http.request.hits{service:{application},env:{environment},availability-zone:{az}}.as_rate()'
max: 0.01
Datadog sceglie la risoluzione in base alla finestra letta; .rollup(avg, 15) la fissa.
New Relic#
- Crea una User key (API keys → Create a key → User) per un utente con accesso in lettura ai dati dell'account, e annota l'account ID.
rollout:
newrelic:
url: https://api.eu.newrelic.com/graphql # default https://api.newrelic.com/graphql
account_id: "1234567"
api_key_ref: "vault:secret/data/manent/newrelic#user_key"
- name: error-rate
provider: newrelic
query: "SELECT percentage(count(*), WHERE error IS true) / 100 FROM Transaction WHERE appName = '{application}'"
max: 0.01
Scrivi l'NRQL senza SINCE, UNTIL e TIMESERIES: li aggiunge manent per la finestra che legge. Il valore è il primo campo numerico del risultato.
Elastic#
- Crea una API key con privilegi di lettura sugli indici o sui data stream che contengono le metriche (
readeview_index_metadata), oppure usa un utente con gli stessi privilegi.
rollout:
elastic:
url: https://es.example.com:9200
api_key_ref: "vault:secret/data/manent/elastic#api_key"
# username: manent
# password_ref: "vault:secret/data/manent/elastic#password"
# ca_file: /etc/ssl/certs/corp-ca.pem
- name: error-rate
provider: elastic
query: |
FROM metrics-shop*
| WHERE service.name == "{application}" AND @timestamp >= "{start}" AND @timestamp < "{end}"
| STATS rate = AVG(http.error_rate)
max: 0.01
Le query ES|QL ricevono anche {start}, {end} (RFC 3339) e {step} (per esempio 15 seconds). Il valore è l'ultima colonna numerica; per le serie (analisi canary), una riga per intervallo di tempo, ordinate per tempo.
Amazon CloudWatch#
- Concedi all'identità del worker
cloudwatch:GetMetricData: tramite la catena dell'SDK (IRSA, ruolo del task o dell'istanza), chiavi statiche, o un ruolo da assumere.
rollout:
cloudwatch:
region: eu-west-1
# access_key_id_ref: "vault:secret/data/manent/aws#access_key_id"
# secret_access_key_ref: "vault:secret/data/manent/aws#secret_access_key"
# role_arn: arn:aws:iam::123456789012:role/manent-metrics-reader
# external_id: manent
- name: target-5xx
provider: cloudwatch
query: "SELECT SUM(HTTPCode_Target_5XX_Count) FROM \"AWS/ApplicationELB\" WHERE TargetGroup = 'targetgroup/{application}-{environment}/0123456789abcdef'"
max: 5
Le query vengono lette con GetMetricData, in Metrics Insights (SELECT …) o in metric math; il periodo viene arrotondato a un valore accettato da CloudWatch (1, 5, 10, 30 secondi o multipli di 60).
Azure Monitor#
- Assegna a un'identità il ruolo Log Analytics Reader sul workspace: un service principal (tenant, client ID e segreto) oppure la workload o managed identity del worker.
rollout:
azure_monitor:
workspace_id: 00000000-0000-0000-0000-000000000000
tenant_id: <tenant-id>
client_id: <client-id>
client_secret_ref: "vault:secret/data/manent/azure#client_secret"
# senza tenant_id/client_id: workload identity o managed identity del worker
- name: error-rate
provider: azure-monitor
query: |
AppRequests
| where AppRoleName == "{application}"
| summarize rate = todouble(countif(Success == false)) / count()
max: 0.01
La finestra viene passata come timespan della query; per le serie usa bin(TimeGenerated, {step}). Il valore è l'ultima colonna numerica. endpoint e authority coprono i cloud sovrani.
Verifica i gate#
manent validate -f deploy/prod.yml # un provider senza configurazione dà 422
manent deploy -f deploy/prod.yml --dry-run
Durante un rollout reale lo stato mostra l'ultima lettura rossa di ogni stadio, per esempio metric error-rate (eu-1/eu-1a): valore 0.034 fuori soglia, e con l'analisi canary il punteggio e le metriche fallite con medie, rapporto e p-value.
Riferimento: Configurazione di manent, Rilasci per percentuale.