Saltar a contenido

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])