Aller au contenu principal

Monitoring & Alerting

STOA s'intègre avec Prometheus et Grafana pour la collecte de métriques, les tableaux de bord et les alertes. Ce guide couvre la mise en place, les métriques personnalisées, les règles SLO et la configuration des alertes.

Architecture

Prérequis

Installez le chart Helm kube-prometheus-stack (inclut Prometheus, Grafana et Alertmanager) :

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
-n monitoring --create-namespace \
-f prometheus-values.yaml

ServiceMonitors

STOA fournit des CRDs ServiceMonitor dans le chart Helm. Activez-les dans values.yaml :

stoaGateway:
serviceMonitor:
enabled: true
interval: 15s
scrapeTimeout: 10s

ServiceMonitors Déployés

CiblePortCheminIntervalleLabels
STOA Gatewayhttp/metrics15sapp.kubernetes.io/name: stoa-gateway
MCP Gatewayhttp/metrics15sapp.kubernetes.io/name: mcp-gateway
Pushgatewayhttp/metrics30sapp: pushgateway

Tous les ServiceMonitors utilisent le label prometheus: kube-prometheus-stack pour correspondre au sélecteur de l'opérateur Prometheus.

Vérifier les Cibles de Scraping

Vérifiez que Prometheus découvre les cibles STOA :

# Redirection de port vers Prometheus
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090

# Ouvrez http://localhost:9090/targets et cherchez la cible stoa-gateway

Métriques Personnalisées

STOA Gateway (Rust)

Le gateway expose 12 familles de métriques personnalisées sur /metrics :

Métriques HTTP

MétriqueTypeLabelsDescription
stoa_http_requests_totalCompteurmethod, path, statusTotal des requêtes HTTP
stoa_http_request_duration_secondsHistogrammemethod, pathLatence des requêtes

Métriques d'Invocation des Outils MCP

MétriqueTypeLabelsDescription
stoa_mcp_tools_calls_totalCompteurtool, tenant, statusInvocations d'outils
stoa_mcp_tool_duration_secondsHistogrammetool, tenant, statusLatence d'exécution des outils

Métriques de Connexion SSE

MétriqueTypeLabelsDescription
stoa_mcp_sse_connections_activeJauge--Connexions SSE actives
stoa_mcp_sse_connection_duration_secondsHistogrammetenantDurée de session SSE
stoa_mcp_sessions_activeJauge--Sessions MCP actives

Métriques de Rate Limiting

MétriqueTypeLabelsDescription
stoa_rate_limit_hits_totalCompteurtenantRejets pour limite de débit
stoa_rate_limit_bucketsJauge--Buckets de rate limiting actifs

Métriques de Circuit Breaker

MétriqueTypeLabelsDescription
stoa_circuit_breaker_stateJaugeupstreamÉtat du CB : 0=fermé, 1=ouvert, 2=semi-ouvert

Métriques de Quota et Upstream

MétriqueTypeLabelsDescription
stoa_quota_remainingJaugeconsumer, periodQuota restant
stoa_upstream_latency_secondsHistogrammeupstream, statusLatence du backend

Buckets d'Histogramme

Tous les histogrammes de latence utilisent les mêmes limites de buckets :

[0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0] secondes

La durée de connexion SSE utilise des buckets plus larges :

[1.0, 5.0, 10.0, 30.0, 60.0, 120.0, 300.0, 600.0, 1800.0] secondes

Règles d'Enregistrement SLO

STOA fournit des règles d'enregistrement pour le suivi des SLO. Appliquez-les comme une PrometheusRule :

kubectl apply -f deploy/prometheus/stoa-slo-rules.yaml -n monitoring

SLO de Disponibilité

Objectif : 99,9% (budget d'erreur de 0,1%)

# Règle d'enregistrement : slo:api_availability:ratio
sum(rate(stoa_http_requests_total{status!~"5.."}[5m]))
/
sum(rate(stoa_http_requests_total[5m]))

SLO de Latence

Objectif : P95 < 500ms

# Règle d'enregistrement : slo:api_latency_p95:seconds
histogram_quantile(0.95,
sum(rate(stoa_http_request_duration_seconds_bucket[5m])) by (le)
)

Score APDEX

Objectif : >= 0,85 (satisfait < 250ms, tolérance < 1s)

# Règle d'enregistrement : slo:apdex:score
(
sum(rate(stoa_http_request_duration_seconds_bucket{le="0.25"}[5m]))
+ sum(rate(stoa_http_request_duration_seconds_bucket{le="1.0"}[5m]))
)
/ (2 * sum(rate(stoa_http_request_duration_seconds_count[5m])))

Budget d'Erreur

# Règle d'enregistrement : slo:error_budget:remaining_ratio
1 - (
sum(increase(stoa_http_requests_total{status=~"5.."}[30d]))
/ (sum(increase(stoa_http_requests_total[30d])) * 0.001)
)

Métriques Métier

RègleIntervalleDescription
business:active_tenants:count5mNombre de tenants actifs distincts
business:api_calls:hourly_rate5mTaux horaire d'appels API
business:tool_usage:1h_rate5mTaux horaire d'invocations d'outils
business:billable_requests_by_tenant:daily5mRequêtes facturables quotidiennes par tenant

Règles d'Alertes

Alertes Gateway

groups:
- name: stoa.stoa-gateway.rules
rules:
- alert: StoaGatewayHighErrorRate
expr: |
sum(rate(stoa_http_requests_total{status=~"5.."}[5m]))
/ sum(rate(stoa_http_requests_total[5m])) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "Taux d'erreur STOA Gateway supérieur à 5%"

- alert: StoaGatewayHighLatency
expr: |
histogram_quantile(0.99,
sum(rate(stoa_http_request_duration_seconds_bucket[5m])) by (le)
) > 2
for: 5m
labels:
severity: warning
annotations:
summary: "Latence P99 STOA Gateway supérieure à 2s"

- alert: StoaGatewayDown
expr: up{job=~".*stoa-gateway.*"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "STOA Gateway est hors service"

Alertes SLO

      - alert: ErrorBudgetLow
expr: slo:error_budget:remaining_ratio < 0.2
for: 5m
labels:
severity: warning
annotations:
summary: "Budget d'erreur sous 20% — ralentir les déploiements"

- alert: ErrorBudgetExhausted
expr: slo:error_budget:remaining_ratio < 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "Budget d'erreur épuisé — geler les changements"

- alert: SLOAvailabilityBreach
expr: slo:api_availability_30d:ratio < 0.999
for: 10m
labels:
severity: critical
annotations:
summary: "Disponibilité sur 30 jours inférieure au SLO de 99,9%"

Alertes Kubernetes

      - alert: PodCrashLooping
expr: |
increase(kube_pod_container_status_restarts_total{
namespace="stoa-system"
}[15m]) > 3
labels:
severity: critical

- alert: PodHighMemory
expr: |
container_memory_usage_bytes{namespace="stoa-system"}
/ container_spec_memory_limit_bytes > 0.9
for: 5m
labels:
severity: warning

Inventaire Complet des Alertes

GroupeAlertesSévérités
STOA GatewayTaux d'erreur, latence, hors service, échec OIDCcritique, avertissement
Control Plane APITaux d'erreur, latence, hors servicecritique, avertissement
Base de donnéesHors service, connexions élevées, requêtes lentescritique, avertissement
KubernetesPod non prêt, boucles de redémarrage, mémoire/CPU élevéscritique, avertissement
DisqueEspace élevé (sous 20%), critique (sous 10%), PVCavertissement, critique
KeycloakHors service, échecs de connexion élevéscritique, avertissement
RedpandaHors service, lag consommateur >10kcritique, avertissement
SLOBudget d'erreur faible/épuisé, violation de disponibilitéavertissement, critique

Tableaux de Bord Grafana

STOA fournit 12 tableaux de bord préconstruits. Importez-les depuis docker/observability/grafana/dashboards/ :

Tableau de BordObjectifPanneaux Clés
Vue d'Ensemble PlateformeSanté généraleRequêtes/sec, taux d'erreur, latence P95, statut des services
Control Plane APIPerformance backendLatence par endpoint, erreurs, débit
MCP GatewayMétriques gatewayInvocations d'outils, consommation de tokens, connexions SSE
Tableau de Bord SLOConformité SLOScore APDEX, budget d'erreur, disponibilité dans le temps
Gateway Méthode REDDébit/Erreurs/DuréeVisualisation RED par endpoint
Gateway ArenaClassement benchmarkScores STOA vs Kong vs Gravitee
Santé des ServicesSanté des podsRedémarrages, disponibilité, utilisation des ressources
InfrastructureRessources nœudsCPU, mémoire, réseau, disque par nœud
Suivi des ErreursAnalyse des erreursCatégories d'erreurs, traces de pile, tendances
Explorateur de LogsRecherche de logsRequêtes Loki avec filtres
Optimisation des TokensUtilisation des tokensTaux de consommation par tenant, projection des coûts
Migration MCPPython vers RustComparaison mode shadow, métriques canary

Importer les Tableaux de Bord

# Via l'API Grafana
for f in docker/observability/grafana/dashboards/*.json; do
curl -X POST "${GRAFANA_URL}/api/dashboards/db" \
-H "Authorization: Bearer ${GRAFANA_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"dashboard\": $(cat "$f"), \"overwrite\": true, \"folderId\": 0}"
done

Ou utilisez le provisionnement Grafana (recommandé pour GitOps) :

# grafana-values.yaml
grafana:
dashboardProviders:
dashboardproviders.yaml:
apiVersion: 1
providers:
- name: STOA
folder: STOA
type: file
options:
path: /var/lib/grafana/dashboards
dashboardsConfigMaps:
stoa: stoa-grafana-dashboards

Requêtes PromQL Utiles

Taux de Requêtes par Statut

sum by (status) (rate(stoa_http_requests_total[5m]))

Latence P95 par Endpoint

histogram_quantile(0.95,
sum by (path, le) (rate(stoa_http_request_duration_seconds_bucket[5m]))
)

Connexions SSE Actives dans le Temps

stoa_mcp_sse_connections_active

Top 10 des Outils par Taux d'Invocation

topk(10, sum by (tool) (rate(stoa_mcp_tools_calls_total[1h])))

Statut du Circuit Breaker

stoa_circuit_breaker_state
# 0 = fermé (sain), 1 = ouvert (déclenché), 2 = semi-ouvert (en test)

Taux de Consommation du Budget d'Erreur

slo:error_budget:burn_rate_1h
# Valeurs > 1,0 signifient une consommation plus rapide que soutenable

Dépannage

ProblèmeCauseSolution
Pas de métriques depuis le gatewayServiceMonitor non correspondantVérifier le label prometheus: kube-prometheus-stack
Métriques obsolètesPod redémarré, compteurs réinitialisésComportement attendu ; rate() gère les réinitialisations
Tableau de bord affiche "Pas de données"Mauvaise source de données ou namespaceVérifier que la source Grafana pointe vers le bon Prometheus
Alertes non déclenchéesPrometheusRule non appliquéekubectl get prometheusrule -n monitoring
Avertissement de cardinalité élevéeTrop de valeurs de labels uniquesRéduire la cardinalité du label path avec le groupement de routes
SSO Grafana ne fonctionne pasClient Keycloak manquantCréer le client stoa-observability (voir Administration Keycloak)

Voir Aussi