Dashboard de Grafana mostrando metricas de infraestructura con Prometheus
|

Prometheus y Grafana: monitoriza tu infraestructura paso a paso

Sin monitorizacion no hay DevOps real. Puedes tener los mejores pipelines de CI/CD y la infraestructura mas elegante, pero si no sabes lo que pasa en produccion en tiempo real, eres reactivo en vez de proactivo. Prometheus y Grafana son el stack de monitorizacion estandar en el mundo Kubernetes y DevOps. En este post te explico como instalarlos y configurarlos desde cero. Si no tienes claro como funcionan los recursos en Kubernetes, repasa antes el post de OOMKilled en Kubernetes.

Que es Prometheus y para que sirve

Prometheus es una herramienta de monitorizacion y alertas de codigo abierto parte de la CNCF. Funciona con un modelo de pull: en vez de que las aplicaciones envien metricas a un servidor central, Prometheus va a buscarlas periodicamente a cada servicio. Consulta la documentacion oficial de Prometheus.

  • Metricas: datos numericos con marca de tiempo (CPU, memoria, peticiones por segundo, errores)
  • PromQL: lenguaje de consulta para analizar esas metricas
  • Alertmanager: gestiona las alertas y las envia a Slack, email, PagerDuty, etc.
  • Exporters: agentes que exponen metricas de sistemas externos (node_exporter para Linux, mysqld_exporter para MySQL)

Que es Grafana y para que sirve

Grafana es una plataforma de visualizacion de datos. Se conecta a Prometheus y te permite crear dashboards interactivos con graficas, tablas y alertas visuales. Grafana no almacena metricas, solo las visualiza. Consulta la documentacion oficial de Grafana.

Opcion 1: Instalar con Docker Compose

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - 9090:9090
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.retention.time=15d
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    ports:
      - 3000:3000
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    ports:
      - 9100:9100
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

Archivo prometheus.yml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: [localhost:9090]

  - job_name: node-exporter
    static_configs:
      - targets: [node-exporter:9100]

  - job_name: mi-app
    static_configs:
      - targets: [mi-app:8080]
docker compose up -d

Prometheus: http://localhost:9090
Grafana: http://localhost:3000 (admin/admin, cambiar en produccion)

Opcion 2: Instalar en Kubernetes con Helm

En Kubernetes la forma recomendada es el kube-prometheus-stack, el chart de Helm que incluye Prometheus, Grafana, Alertmanager y dashboards preconfigurados. Si no tienes claro Helm, revisa el post de Helm charts en Kubernetes.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

kubectl create namespace monitoring

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --set grafana.adminPassword=mi-password-seguro \
  --set prometheus.prometheusSpec.retention=15d
kubectl get pods -n monitoring

NAME                                                   READY   STATUS
alertmanager-kube-prometheus-stack-0                   2/2     Running
kube-prometheus-stack-grafana-xxxx                     3/3     Running
kube-prometheus-stack-prometheus-0                     2/2     Running
kube-prometheus-stack-node-exporter-xxxx               1/1     Running

Acceder a Grafana:
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80
Grafana en: http://localhost:3000

Consultas PromQL esenciales

PromQL es el lenguaje de consulta de Prometheus. Estas son las consultas que mas usaras en el dia a dia:

Uso de CPU por pod (ultimos 5 minutos):
rate(container_cpu_usage_seconds_total{namespace="default"}[5m])

Uso de memoria por pod:
container_memory_working_set_bytes{namespace="default"}

Porcentaje de uso de memoria respecto al limit:
container_memory_working_set_bytes / kube_pod_container_resource_limits{resource="memory"} * 100

Pods cerca del limite de memoria (alerta cuando supera el 80%):
container_memory_working_set_bytes / kube_pod_container_resource_limits{resource="memory"} > 0.8

Tasa de errores HTTP 5xx:
rate(http_requests_total{status=~"5.."}[5m])

Latencia P99 de una API:
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

Nodos del cluster con mas del 85% de CPU:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85

Configurar alertas con Alertmanager

Las alertas se definen en reglas de Prometheus y se envian al Alertmanager, que las enruta a Slack, email u otros destinos:

Regla de alerta para OOMKilled:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: memoria-alertas
  namespace: monitoring
spec:
  groups:
  - name: memoria
    rules:
    - alert: PodCercaDelLimiteMemoria
      expr: container_memory_working_set_bytes / kube_pod_container_resource_limits{resource="memory"} > 0.85
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: Pod cerca del limite de memoria
        description: El pod ha superado el 85% del limite de memoria durante 5 minutos

    - alert: PodOOMKilled
      expr: kube_pod_container_status_last_terminated_reason{reason="OOMKilled"} == 1
      for: 0m
      labels:
        severity: critical
      annotations:
        summary: Pod terminado por OOMKilled

Dashboards de Grafana listos para importar

Grafana tiene un catalogo de dashboards de la comunidad en grafana.com/grafana/dashboards. Los mas utiles para empezar:

DashboardIDPara que sirve
Kubernetes Cluster Monitoring315Vista general del cluster: CPU, memoria, red por nodo
Node Exporter Full1860Metricas detalladas de cada nodo Linux
Kubernetes Pod Monitoring6417CPU y memoria por pod y namespace
Nginx Ingress Controller9614Trafico HTTP, latencia y errores del ingress

Para importarlos: en Grafana ve a Dashboards > Import, pega el ID y selecciona Prometheus como data source.

Exponer metricas desde tu propia aplicacion

Para que Prometheus pueda recoger metricas de tu app, necesita un endpoint /metrics en formato Prometheus. Las librerias cliente existen para todos los lenguajes principales:

Node.js con prom-client:
npm install prom-client

const client = require(prom-client);
client.collectDefaultMetrics();

app.get(/metrics, async (req, res) => {
  res.set(Content-Type, client.register.contentType);
  res.end(await client.register.metrics());
});

Python con prometheus_client:
pip install prometheus_client

from prometheus_client import Counter, start_http_server
peticiones = Counter(http_requests_total, Peticiones HTTP totales)
start_http_server(8080)  # expone /metrics en el puerto 8080

Conclusion

Prometheus y Grafana son el stack de monitorizacion estandar por una razon: son potentes, flexibles y gratuitos. Con kube-prometheus-stack tienes un sistema de monitorizacion completo en Kubernetes listo en 10 minutos. Lo mas importante es empezar a monitorizar — con el tiempo vas afinando las alertas y los dashboards segun lo que tu infraestructura necesite.

Si tienes pods con OOMKilled, ahora tienes las alertas para detectarlos antes de que ocurran — revisa el post de OOMKilled en Kubernetes. Tienes dudas sobre Prometheus o Grafana? Cuentamelo en los comentarios.

¡No te pierdas los próximos posts!

¡No hacemos spam! Lee nuestra política de privacidad para obtener más información.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *