Prometheus es un sistema de monitoreo y base de datos de series temporales diseñado para recopilar métricas de sistemas y aplicaciones, con capacidades de consulta y alertas.

¿Qué es Prometheus?

Prometheus es una herramienta de monitoreo de código abierto que recopila métricas de sistemas y aplicaciones, las almacena en una base de datos de series temporales y proporciona capacidades de consulta y alertas.

Arquitectura de Prometheus

Componentes Principales

  • Prometheus Server: Servidor principal de recopilación
  • Exporters: Agentes que exponen métricas
  • Pushgateway: Gateway para métricas push
  • Alertmanager: Gestión de alertas
  • Service Discovery: Descubrimiento automático de servicios

Flujo de Datos

Aplicaciones → Exporters → Prometheus Server → Alertmanager → Alertas
                    ↓
              Base de Datos TSDB
                    ↓
              PromQL Queries

Métricas y Tipos

Tipos de Métricas

  • Counter: Valores que solo incrementan
  • Gauge: Valores que pueden subir o bajar
  • Histogram: Distribución de valores
  • Summary: Cuantiles y sumas

Ejemplo de Métricas

# Counter
http_requests_total{method="GET", status="200"} 1024

# Gauge
memory_usage_bytes{instance="server1"} 1073741824

# Histogram
http_request_duration_seconds_bucket{le="0.1"} 100
http_request_duration_seconds_bucket{le="0.5"} 200
http_request_duration_seconds_bucket{le="1.0"} 250
http_request_duration_seconds_bucket{le="+Inf"} 300
http_request_duration_seconds_sum 150.5
http_request_duration_seconds_count 300

Configuración

Configuración Básica

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - "alert_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['localhost:9100']

Service Discovery

1
2
3
4
5
6
7
8
scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true

PromQL - Lenguaje de Consulta

Consultas Básicas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Consulta simple
up

# Filtrado por etiquetas
http_requests_total{method="GET"}

# Agregaciones
sum(http_requests_total) by (method)

# Funciones de tiempo
rate(http_requests_total[5m])

# Operadores matemáticos
cpu_usage_percent / 100

Consultas Avanzadas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Percentiles
histogram_quantile(0.95, http_request_duration_seconds_bucket)

# Cambios en el tiempo
increase(http_requests_total[1h])

# Comparaciones
cpu_usage_percent > 80

# Funciones de ventana
avg_over_time(cpu_usage_percent[5m])

Alertas

Configuración de Alertas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
groups:
- name: example
  rules:
  - alert: HighCPUUsage
    expr: cpu_usage_percent > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU usage detected"
      description: "CPU usage is above 80% for more than 5 minutes"

Alertmanager

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'

receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'

Exporters Populares

Sistema

  • Node Exporter: Métricas del sistema operativo
  • Windows Exporter: Métricas de Windows
  • SNMP Exporter: Métricas SNMP

Aplicaciones

  • JMX Exporter: Métricas Java
  • MySQL Exporter: Métricas MySQL
  • PostgreSQL Exporter: Métricas PostgreSQL
  • Redis Exporter: Métricas Redis

Cloud

  • AWS CloudWatch Exporter: Métricas AWS
  • Azure Monitor Exporter: Métricas Azure
  • GCP Exporter: Métricas Google Cloud

Integración con Kubernetes

ServiceMonitor

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example-app
spec:
  selector:
    matchLabels:
      app: example-app
  endpoints:
  - port: metrics
    interval: 30s

PrometheusRule

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: example-rules
spec:
  groups:
  - name: example
    rules:
    - alert: PodDown
      expr: up == 0
      for: 5m

Mejores Prácticas

Métricas

  • Nomenclatura: Usar convenciones consistentes
  • Cardinalidad: Evitar alta cardinalidad
  • Retención: Configurar retención apropiada
  • Etiquetas: Usar etiquetas de manera eficiente

Rendimiento

  • Scrape Interval: Intervalos apropiados
  • Query Performance: Optimizar consultas
  • Storage: Configurar almacenamiento adecuado
  • Memory: Monitorear uso de memoria

Seguridad

  • Authentication: Implementar autenticación
  • Authorization: Control de acceso
  • TLS: Usar conexiones seguras
  • Network: Segmentación de red

Conceptos Relacionados

Referencias