Prometheus¶
Prometheus recolecta métricas de Keycloak y de los servicios Spring WebFlux mediante scraping HTTP. Las métricas permiten detectar degradación del rendimiento, errores de autenticación y saturación de recursos antes de que impacten a los usuarios.
Métricas de Keycloak¶
Keycloak expone métricas en el puerto de management (9000 por defecto):
# Verificar que el endpoint está disponible (solo desde red interna)
curl -s http://localhost:9000/metrics | grep -E "keycloak_" | head -20
Métricas clave de Keycloak:
| Métrica | Descripción |
|---|---|
keycloak_logins_total |
Total de logins por realm y proveedor de identidad |
keycloak_login_errors_total |
Errores de login por tipo |
keycloak_tokens_total |
Tokens emitidos por tipo (access, refresh, code) |
keycloak_client_logins_total |
Logins M2M por cliente |
keycloak_sessions_active_total |
Sesiones activas por realm |
jvm_memory_used_bytes |
Uso de memoria JVM |
jvm_gc_pause_seconds |
Pausas del Garbage Collector |
Métricas de Spring Boot (Actuator)¶
# Spring expone métricas en formato Prometheus
curl -s http://localhost:8081/actuator/prometheus | head -30
Métricas clave de Spring WebFlux:
| Métrica | Descripción |
|---|---|
http_server_requests_seconds |
Latencia de requests por uri, method, status |
http_server_requests_seconds_count |
Número de requests |
jvm_memory_used_bytes |
Uso de memoria por área |
process_cpu_usage |
CPU del proceso |
spring_security_filterchains |
Filtros de seguridad activos |
Configuración de Prometheus¶
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: keycloak
scrape_interval: 30s
static_configs:
- targets: ['keycloak:9000']
metrics_path: /metrics
- job_name: identity-api
scrape_interval: 15s
static_configs:
- targets: ['identity-api:8081']
metrics_path: /actuator/prometheus
- job_name: traefik
scrape_interval: 15s
static_configs:
- targets: ['traefik:8082']
metrics_path: /metrics
# compose.yml — fragmento
keycloak:
environment:
KC_METRICS_ENABLED: "true"
KC_HEALTH_ENABLED: "true"
# Exponer puerto de métricas solo en red interna
expose:
- "9000"
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
networks:
- frontend
Alertas recomendadas¶
# alerts/identity-platform.yml
groups:
- name: identity-platform
rules:
- alert: KeycloakDown
expr: up{job="keycloak"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Keycloak no está disponible"
description: "El scraping de Keycloak ha fallado durante más de 1 minuto"
- alert: HighLoginErrorRate
expr: |
rate(keycloak_login_errors_total[5m]) /
(rate(keycloak_logins_total[5m]) + rate(keycloak_login_errors_total[5m])) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "Tasa de errores de login superior al 5%"
- alert: HighApiLatency
expr: |
histogram_quantile(0.95,
rate(http_server_requests_seconds_bucket{job="identity-api"}[5m])
) > 2
for: 5m
labels:
severity: warning
annotations:
summary: "Latencia p95 de la API superior a 2 segundos"
- alert: KeycloakHighMemory
expr: |
jvm_memory_used_bytes{job="keycloak", area="heap"} /
jvm_memory_max_bytes{job="keycloak", area="heap"} > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "Keycloak usando más del 85% del heap JVM"
Queries PromQL útiles¶
# Tasa de logins exitosos por realm (últimos 5 min)
rate(keycloak_logins_total[5m])
# Tasa de errores de login
rate(keycloak_login_errors_total[5m])
# Latencia p95 de endpoints de la API
histogram_quantile(0.95,
rate(http_server_requests_seconds_bucket{job="identity-api"}[5m])
)
# Sesiones activas en Keycloak
keycloak_sessions_active_total
# Uso de CPU del proceso Keycloak
process_cpu_usage{job="keycloak"}
# Requests por segundo a la API
rate(http_server_requests_seconds_count{job="identity-api"}[1m])
# Errores HTTP 5xx en la API
rate(http_server_requests_seconds_count{job="identity-api", status=~"5.."}[5m])