Prometheus

Monitoreo basado en metricas - modelo pull, consultas PromQL, alertas, ideal para cloud-native y Kubernetes

TL;DR

Qué: Un toolkit de monitoreo y alertas open-source.

Por qué: Métricas basadas en pull, lenguaje de consulta potente (PromQL), descubrimiento de servicios, alertas.

Quick Start

Instalar con Docker:

docker run -d --name prometheus \
  -p 9090:9090 \
  prom/prometheus

Abre http://localhost:9090

O con archivo de configuración:

# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
docker run -d -p 9090:9090 \
  -v ./prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

Cheatsheet

PromQLDescripción
metric_nameSeleccionar métrica
metric{label="value"}Filtrar por etiqueta
rate(metric[5m])Tasa por segundo
sum(metric)Suma agregada
avg by (label)(metric)Promedio agrupado
histogram_quantile(0.95, metric)Percentil 95

Gotchas

Consultas PromQL

# HTTP request rate per second
rate(http_requests_total[5m])

# Error rate percentage
sum(rate(http_requests_total{status=~"5.."}[5m])) /
sum(rate(http_requests_total[5m])) * 100

# CPU usage
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Memory usage
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes

Instrumentar tu app

# Python with prometheus_client
from prometheus_client import Counter, start_http_server

requests_total = Counter('http_requests_total', 'Total requests', ['method', 'path'])

@app.route('/')
def hello():
    requests_total.labels(method='GET', path='/').inc()
    return 'Hello'

start_http_server(8000)  # Metrics endpoint

Reglas de alertas

# alert.rules.yml
groups:
  - name: example
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status="500"}[5m]) > 0.1
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: High error rate detected

Configuración de scrape

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

  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod

Next Steps