La corrección está integrada en el TP (Ver los recuadros verdes)
De las consultas costosas a las series registradas #
Contexto. Tu panel recalcula los mismos agregados en cada actualización. Vas a registrarlos en series dedicadas, con las métricas del propio Prometheus y sin ninguna otra dependencia.
Requisitos: Docker Compose, curl y jq · Duración estimada: 40 min
1. Iniciar Prometheus
¿Por qué? Prometheus se recopila a sí mismo: dispones de inmediato de métricas HTTP reales.
Escribedocker-compose.ymlyprometheus.yml. Activa la recarga en caliente y referencia un archivorules.yml.Ver la corrección
services: prometheus: image: prom/prometheus:latest command: - --config.file=/etc/prometheus/prometheus.yml - --web.enable-lifecycle ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./rules.yml:/etc/prometheus/rules.yml:ro - ./tests.yml:/etc/prometheus/tests.yml:roglobal: scrape_interval: 5s evaluation_interval: 15s rule_files: - /etc/prometheus/rules.yml scrape_configs: - job_name: prometheus static_configs: - targets: ["localhost:9090"]2. Registrar un primer agregado
¿Por qué? Agregar por etapas evita volver a leer las series en bruto en cada nivel.
Crearules.ymlcon la tasa porjobyhandlery después la tasa porjob, reutilizando la regla anterior. Crea también untests.ymlvacío (touch tests.yml), comprueba, inicia y consulta la nueva serie al cabo de un minuto.Ver la corrección
groups: - name: http_prometheus rules: - record: job_handler:prometheus_http_requests:rate5m expr: sum by (job, handler) (rate(prometheus_http_requests_total[5m])) - record: job:prometheus_http_requests:rate5m expr: sum by (job) (job_handler:prometheus_http_requests:rate5m)docker compose up -d docker compose exec prometheus promtool check rules /etc/prometheus/rules.yml curl -X POST http://localhost:9090/-/reload curl -s --get --data-urlencode 'query=job:prometheus_http_requests:rate5m' http://localhost:9090/api/v1/query3. Añadir un ratio de errores robusto y un percentil
¿Por qué? Sin precaución, el ratio queda vacío mientras no exista ningún error.
Añade la tasa de errores5xx, el ratio de errores (que debe valer 0 sin errores) y el percentil 95 de la duración. Recarga y comprueba el estado de las reglas.Ver la corrección
groups: - name: http_prometheus rules: - record: job_handler:prometheus_http_requests:rate5m expr: sum by (job, handler) (rate(prometheus_http_requests_total[5m])) - record: job:prometheus_http_requests:rate5m expr: sum by (job) (job_handler:prometheus_http_requests:rate5m) - record: job:prometheus_http_requests_errors:rate5m expr: sum by (job) (rate(prometheus_http_requests_total{code=~"5.."}[5m])) - record: job:prometheus_http_requests_errors:ratio_rate5m expr: | (job:prometheus_http_requests_errors:rate5m or job:prometheus_http_requests:rate5m * 0) / job:prometheus_http_requests:rate5m - record: job:prometheus_http_request_duration_seconds:p95_rate5m expr: | histogram_quantile(0.95, sum by (job, le) (rate(prometheus_http_request_duration_seconds_bucket[5m])))curl -s http://localhost:9090/api/v1/rules | jq '.data.groups[].rules[] | {name, health, evaluationTime}'4. Escribir las pruebas unitarias
¿Por qué? Una regla errónea da un panel creíble pero falso: solo una prueba lo revela.
Entests.yml, cubre dos casos: 10 % de errores (ratio 0,1) y ningún error (ratio 0). Lanza las pruebas, quita la parteor ... * 0del ratio, observa cómo falla la segunda prueba y vuelve a ponerla.Ver la corrección
rule_files: - rules.yml evaluation_interval: 1m tests: - name: 10 % de errores interval: 1m input_series: - series: 'prometheus_http_requests_total{job="api",handler="/a",code="200"}' values: '0+54x10' - series: 'prometheus_http_requests_total{job="api",handler="/a",code="500"}' values: '0+6x10' promql_expr_test: - expr: job:prometheus_http_requests:rate5m eval_time: 10m exp_samples: - labels: 'job:prometheus_http_requests:rate5m{job="api"}' value: 1 - expr: job:prometheus_http_requests_errors:ratio_rate5m eval_time: 10m exp_samples: - labels: 'job:prometheus_http_requests_errors:ratio_rate5m{job="api"}' value: 0.1 - name: sin errores, el ratio vale 0 y no está vacío interval: 1m input_series: - series: 'prometheus_http_requests_total{job="api",handler="/a",code="200"}' values: '0+60x10' promql_expr_test: - expr: job:prometheus_http_requests_errors:ratio_rate5m eval_time: 10m exp_samples: - labels: 'job:prometheus_http_requests_errors:ratio_rate5m{job="api"}' value: 0docker compose exec prometheus promtool test rules /etc/prometheus/tests.yml5. Medir la ganancia
¿Por qué? Una optimización se mide.
Compara las muestras leídas por la consulta original y por la serie registrada, y localiza el tiempo de evaluación de tus reglas conprometheus_rule_group_last_duration_seconds. Debes ver una sola muestra para la serie registrada y varios centenares para la consulta original (el valor depende de tu instancia).Ver la corrección
for q in 'sum by (job) (rate(prometheus_http_requests_total[5m]))' 'job:prometheus_http_requests:rate5m'; do curl -s --get --data-urlencode "query=$q" --data-urlencode 'stats=all' \ http://localhost:9090/api/v1/query | jq .data.stats.samples.totalQueryableSamples done
Nivel de dificultad : ●●●○○ (3/5)
Mi seguimiento
Inicia sesión para seguir tu progreso y tomar notas. Iniciar sesión
Glossaire de la formation
Observabilidad
La capacidad de conocer el estado interno de un sistema a partir de los datos que emite.Estos datos se clasifican en 3 pilares: logs (registros)métric...
Métricas
Medidas numéricas recopiladas a intervalos regulares (ej: CPU, RAM, tiempo de respuesta) utilizadas para evaluar el estado de salud general de un sist...
Alerting (Alertas)
Proceso que consiste en notificar a los equipos (vía email, Slack, Teams) cuando se detecta un evento específico, un umbral superado o una anomalía.
Arquitectura
Diseño global y estructural de un sistema informático, definiendo sus diferentes componentes, sus relaciones y los principios que guían su evolución.
OpenTelemetry
Framework de código abierto que proporciona estándares, APIs y SDKs para recopilar y exportar datos de observabilidad (trazas, métricas, logs) de mane...
Artículos recomendados
Recording rules Prometheus : accélérer ses requêtes et ses tableaux de bord
Comprendre et maîtriser les recording rules de Prometheus : évaluation, convention de nommage, pi...
Bonnes pratiques Prometheus : métriques, cardinalité, règles et exploitation
Bonnes pratiques Prometheus : nommage des métriques, labels et cardinalité, intervalles de scrape...
Mesurer des SLI avec Prometheus
Implémenter des SLI de disponibilité et de latence avec Prometheus : métriques nécessaires, requê...
Mimir : ruler, Alertmanager et mimirtool
Évaluer des règles d'enregistrement et d'alerte dans Mimir, configurer l'Alertmanager multi-tenan...
Thanos Ruler : règles et alertes sur la vue globale
Évaluer des règles d'enregistrement et d'alerte sur l'ensemble des clusters avec Thanos Ruler : c...
Alerter sur les logs avec le Ruler de Loki
Mettre en place des alertes et des recording rules LogQL avec le Ruler Loki : configuration, fich...
Générer ses SLO Prometheus avec Sloth
Décrire un SLO en quelques lignes avec Sloth et générer automatiquement règles d'enregistrement m...
Écrire de bonnes règles d'alerte Prometheus (et les tester)
Concevoir des alertes utiles : alerter sur les symptômes, choisir for et les seuils, labels de sé...
Prometheus sur Kubernetes et l'interface web de Prometheus
Déployer Prometheus sur Kubernetes avec kube-prometheus-stack (Prometheus Operator, ServiceMonito...