Arquitectura de Prometheus y el modelo pull
Por qué Prometheus recopila en lugar de recibir, y cómo encajan los targets, los exporters y el service discovery.
La mayoría de las herramientas de logging y monitorización son sistemas a los que envías datos. Prometheus, en cambio, se construye en torno a hacer pull: sale a buscar a las cosas que monitoriza según un calendario y les pide sus números actuales. Esa decisión de diseño da forma a casi todo lo demás sobre cómo se despliega y se configura, y esta guía cubre la arquitectura que se deriva de ella.
Scraping: un pull en lugar de un push
Prometheus envía periódicamente una petición HTTP a cada sistema que monitoriza y lee de vuelta una instantánea de los valores de métricas actuales de ese sistema. Prometheus llama a esto scraping, y a cada cosa que consulta target. Un scrape lleva solo los valores de ese momento; no hay historial en la respuesta: Prometheus es lo que convierte una secuencia de scrapes, tomados a intervalos, en un historial.
El modelo pull tiene una consecuencia práctica: todo lo que Prometheus monitoriza necesita exponer un endpoint HTTP (/metrics por convención) que devuelva sus valores actuales en un formato que Prometheus entienda, en lugar de que Prometheus necesite un listener de entrada para cada posible fuente que le envíe datos.
Targets: aplicaciones instrumentadas y exporters
Un target cae en una de dos categorías:
- Aplicaciones instrumentadas directamente. Tu propio servicio, usando una de las librerías cliente oficiales de Prometheus, rastrea y expone sus propias métricas de forma nativa en un endpoint
/metrics. - Exporters, para todo lo que no expone (o no puede exponer) métricas de Prometheus por sí mismo: una base de datos, un host Linux, un dispositivo de red. Un exporter es un pequeño proceso que se ejecuta junto a lo que se monitoriza, traduciendo sus estadísticas nativas al formato de Prometheus.
node_exporterpara métricas a nivel de host (CPU, memoria, disco, red) ycAdvisorpara métricas por contenedor son dos de los más usados.
Como el formato de exposición es deliberadamente un texto simple (que cubre la siguiente guía), escribir un exporter, o incluso construir métricas a mano sin librería cliente, es realista incluso para algo sin soporte oficial de Prometheus.
Encontrar targets: configuración estática o service discovery
Prometheus necesita una lista de targets que consultar. Para un puñado de hosts estables, listarlos a mano en el archivo de configuración de Prometheus está bien. Para cualquier cosa más grande o más dinámica, máquinas y contenedores que van y vienen, eso se vuelve rápidamente impracticable de mantener a mano. Prometheus se integra en cambio con mecanismos de service discovery, DNS, la API server de Kubernetes, APIs de proveedores de nube y otros, para construir y actualizar continuamente su lista de targets de forma automática a medida que cambia el entorno.
Almacenamiento: la base de datos local de series temporales
Las muestras recopiladas aterrizan en la propia base de datos local de series temporales (TSDB) de Prometheus en disco. Por defecto, Prometheus retiene 15 días de datos; es un flag configurable (--storage.tsdb.retention.time), no un límite rígido, pero 15 días bastan para la inmensa mayoría de la resolución de problemas real, ya que la mayoría de los incidentes se comparan con minutos u horas atrás, rara vez con meses. Para retención a largo plazo o un almacén centralizado entre muchos servidores Prometheus, Prometheus también puede configurarse para reenviar (remote-write) muestras a un sistema de almacenamiento externo con compromisos distintos a los de su propia TSDB local.
Qué rodea al servidor central
Unos cuantos componentes completan una configuración típica:
- Alertmanager es un componente aparte al que Prometheus entrega las alertas que se están disparando. Deduplica, agrupa y las enruta a correo, Slack, PagerDuty o lo que configures, desacoplando “detectar un problema” de “decidir a quién se notifica y cómo”.
- Grafana (o la interfaz web incluida de Prometheus, u otras herramientas) es como normalmente explorarías y visualizarías los datos; Prometheus en sí se centra en recopilar y almacenar métricas de forma fiable, no en ser la capa de dashboards.
- PromQL, el lenguaje de consultas de Prometheus, es sobre lo que se construyen tanto los dashboards de Grafana como las propias reglas de alertas de Prometheus. Las alertas y los dashboards no son dos sistemas distintos pegados entre sí; son dos consumidores del mismo lenguaje de consultas sobre los mismos datos. Las guías posteriores de esta serie cubren directamente el modelo de datos y PromQL.
Juntando las piezas
┌──────────────┐ recopila (scrape) por HTTP ┌──────────────┐
│ Servidor │ ───────────────────────────────▶ │ Target │
│ Prometheus │ │ (/metrics) │
└──────┬───────┘ └──────────────┘
│ almacena las muestras en
▼
TSDB local (retención de 15 d por defecto)
│
┌──────┴───────────────┬───────────────────────┐
▼ ▼ ▼
reglas de alerta consultas PromQL remote write
que se disparan (Grafana, ad hoc) (opcional, almacenamiento externo)
│
▼
Alertmanager → correo / Slack / PagerDuty / ...
Todo lo que viene después, alertas, dashboards, depuración ad hoc, lee de la misma TSDB que llena el scraping. El resto de esta serie empieza por lo que realmente se almacena en ella.
Guías populares
-
El modelo de datos de Prometheus: métricas, etiquetas y tipos de métrica Qué es realmente una serie temporal en Prometheus y el formato de texto plano en el que los targets las exponen. -
Primeros pasos con PromQL: seleccionar, calcular tasas y agregar Construye desde un simple selector de métrica hasta una consulta real: la tasa de errores por ruta, calculada en vivo. -
Monitoriza un host y sus contenedores con node_exporter y cAdvisor Ejecuta juntos Prometheus, node_exporter y cAdvisor, recopila métricas de ambos y confirma que los targets están sanos.