Laboratorio - Fundamentos de telemetría¶
Objetivos¶
Al finalizar este laboratorio podrás:
- Identificar los componentes básicos de una arquitectura de telemetría.
- Instalar y comprobar Node Exporter en Ubuntu.
- Configurar Prometheus para recopilar métricas mediante el modelo pull.
- Consultar series temporales utilizando PromQL.
- Analizar el efecto del intervalo de muestreo.
- Configurar una política básica de retención de datos.
- Crear consultas agregadas y reglas de grabación.
- Conectar Grafana con Prometheus.
- Crear un dashboard básico de monitorización.
- Verificar el estado de los objetivos y detectar problemas de recopilación.
Introducción¶
En este laboratorio se pondrán en práctica los conceptos estudiados en el módulo de fundamentos de telemetría.
Se construirá una arquitectura sencilla formada por:
Ubuntu
│
│ Métricas del sistema
▼
Node Exporter
│
│ Endpoint /metrics
▼
Prometheus
│
│ Consultas PromQL
▼
Grafana
│
▼
Dashboard de monitorización
Durante el ejercicio se trabajará con los siguientes conceptos:
- Modelo pull.
- Exporters.
- Series temporales.
- Etiquetas.
- Muestreo.
- Retención.
- Agregación.
- Downsampling.
- Consultas PromQL.
- Visualización en Grafana.
El laboratorio está planteado para un entorno Ubuntu. Los nombres de host, las direcciones IP y las rutas pueden adaptarse a la infraestructura disponible.
Contenido¶
Arquitectura del laboratorio¶
Utilizaremos los siguientes componentes:
| Componente | Función | Puerto habitual |
|---|---|---|
| Node Exporter | Expone métricas del sistema operativo | 9100 |
| Prometheus | Recopila y almacena métricas | 9090 |
| Grafana | Consulta y visualiza métricas | 3000 |
La arquitectura lógica será:
En este laboratorio, Prometheus iniciará las conexiones contra Node Exporter. Por tanto, se utilizará el modelo pull.
Requisitos previos¶
Antes de comenzar, comprueba que dispones de:
- Una máquina Ubuntu con acceso administrativo mediante
sudo. - Conexión a Internet para descargar los componentes.
- Al menos 2 GB de memoria RAM disponibles.
- Al menos 10 GB de espacio libre.
- Un navegador web.
- Acceso a los puertos
3000,9090y9100, según la topología utilizada.
Comprueba la versión del sistema:
Comprueba la arquitectura del sistema:
Comprueba el espacio disponible:
Comprueba la memoria disponible:
Actualiza la información de paquetes:
Instala algunas herramientas útiles:
La instalación mediante paquetes puede proporcionar una versión diferente de la utilizada en otros entornos. Comprueba siempre las rutas y los nombres de los servicios instalados:
Instalar Node Exporter¶
Node Exporter recopila métricas del sistema operativo y las expone mediante HTTP.
Crea un usuario específico:
Descarga una versión de Node Exporter desde la página oficial de releases de Prometheus.
Ejemplo:
cd /tmp
VERSION="1.8.2"
wget \
"https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.linux-amd64.tar.gz"
Extrae el archivo:
Instala el binario:
sudo install \
-m 0755 \
"node_exporter-${VERSION}.linux-amd64/node_exporter" \
/usr/local/bin/node_exporter
Comprueba que funciona:
Crear el servicio de Node Exporter¶
Crea una unidad systemd:
Contenido:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
Recarga las unidades:
Activa el servicio para que se inicie automáticamente:
Inicia Node Exporter:
Comprueba el estado:
Comprueba que escucha en el puerto 9100:
Consulta el endpoint de métricas:
Filtra algunas métricas conocidas:
curl -s http://localhost:9100/metrics \
| grep -E "^node_cpu_seconds_total|^node_memory_MemAvailable_bytes|^node_filesystem_avail_bytes" \
| head -20
La salida debe contener métricas similares a:
node_cpu_seconds_total{cpu="0",mode="idle"} ...
node_memory_MemAvailable_bytes ...
node_filesystem_avail_bytes ...
Comprobar la disponibilidad de Node Exporter¶
Comprueba que el endpoint responde con código HTTP 200:
El resultado esperado es:
Si no responde, revisa:
También puedes comprobar si el firewall está activo:
Si Prometheus está instalado en otro servidor, Node Exporter debe ser accesible desde ese servidor. No es suficiente con que responda únicamente a través de localhost.
Configurar Prometheus¶
Realiza una copia de seguridad del fichero de configuración:
Edita la configuración:
Utiliza una configuración mínima como esta:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets:
- "localhost:9090"
- job_name: "node"
static_configs:
- targets:
- "localhost:9100"
Esta configuración indica que:
- Prometheus recopilará métricas cada 15 segundos.
- Las reglas se evaluarán cada 15 segundos.
- Prometheus se monitorizará a sí mismo.
- Node Exporter se identificará con el trabajo
node.
Comprueba la configuración:
El resultado esperado debe indicar que la configuración es válida.
Reinicia Prometheus:
Comprueba el estado:
Consulta los logs:
Comprueba que Prometheus escucha en el puerto 9090:
Consultar Prometheus¶
Abre en el navegador:
Si Prometheus está instalado en otro servidor:
Comprueba que el servicio está preparado:
La respuesta esperada es similar a:
Accede a:
Deberían aparecer al menos estos objetivos:
El estado esperado es:
Si un objetivo aparece como DOWN, selecciona el enlace correspondiente y revisa el error mostrado.
Consultar la métrica up¶
En la interfaz de Prometheus ejecuta:
La respuesta debería incluir:
El valor:
indica que el objetivo respondió correctamente durante el último scraping.
Consulta únicamente Node Exporter:
Consulta objetivos que no responden:
Calcula el porcentaje global de disponibilidad:
Calcula la disponibilidad agrupada por trabajo:
Explorar las series temporales¶
Consulta la memoria disponible:
Convierte el valor a gigabytes:
Consulta la memoria total:
Calcula el porcentaje de memoria utilizada:
Consulta la carga del sistema:
Consulta el número de series relacionadas con Node Exporter:
Consulta las series de CPU:
Consulta únicamente el tiempo de CPU en modo inactivo:
Observa cómo las etiquetas instance, job, cpu y mode identifican distintas series temporales.
Calcular el uso de CPU¶
node_cpu_seconds_total es un contador. Para calcular su velocidad de cambio se utiliza rate.
Consulta el porcentaje de CPU utilizado:
La consulta:
- Selecciona las series de CPU en modo
idle. - Calcula la tasa media durante cinco minutos.
- Agrupa el resultado por instancia.
- Calcula la proporción no inactiva.
- Convierte el resultado a porcentaje.
Para calcular el uso por CPU:
Para calcular el uso medio por instancia:
Analizar el muestreo¶
El intervalo configurado en Prometheus es:
Por tanto, cada objetivo debería recibir aproximadamente cuatro consultas por minuto.
Puedes observar el número de muestras recientes de Prometheus:
Consulta la duración de las operaciones de scraping:
Consulta el número de muestras devueltas por cada scraping:
Consulta el número de muestras almacenadas:
Estas métricas permiten analizar:
- Cuánto tarda cada scraping.
- Cuántas métricas devuelve cada objetivo.
- Si el volumen de datos cambia con el tiempo.
- Si un exporter está generando demasiadas series.
Configurar una retención de laboratorio¶
Para un laboratorio pequeño se puede utilizar una retención de 15 días.
Comprueba cómo se inicia Prometheus:
También puedes localizar el proceso:
La unidad debe incluir un parámetro similar a:
Si deseas establecer además un límite de tamaño:
La configuración conceptual sería:
--storage.tsdb.path=/var/lib/prometheus
--storage.tsdb.retention.time=15d
--storage.tsdb.retention.size=5GB
Después de modificar la unidad:
Comprueba los argumentos activos:
Comprueba el tamaño actual de la TSDB:
Comprueba el espacio disponible:
No elimines manualmente ficheros del directorio de datos mientras Prometheus esté en ejecución.
Crear una regla de grabación¶
Las reglas de grabación permiten almacenar el resultado de consultas frecuentes.
Crea el directorio de reglas:
Crea el fichero:
Contenido:
groups:
- name: laboratorio
interval: 1m
rules:
- record: instance:node_cpu_usage:ratio5m
expr: |
1 -
avg by (instance) (
rate(node_cpu_seconds_total{
mode="idle"
}[5m])
)
- record: instance:node_memory_available:bytes
expr: |
node_memory_MemAvailable_bytes
- record: job:up:count
expr: |
count by (job) (up)
Incluye el fichero en /etc/prometheus/prometheus.yml:
La configuración completa puede quedar así:
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- /etc/prometheus/rules/*.yml
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets:
- "localhost:9090"
- job_name: "node"
static_configs:
- targets:
- "localhost:9100"
Comprueba las reglas:
Comprueba la configuración completa:
Reinicia Prometheus:
Consulta las nuevas series:
Analizar el downsampling¶
Consulta el promedio de carga de los últimos cinco minutos:
Consulta el máximo de carga de los últimos cinco minutos:
Consulta el mínimo de memoria disponible durante los últimos diez minutos:
Consulta la memoria disponible media:
Compara el promedio y el mínimo:
El promedio muestra una tendencia general.
El mínimo permite detectar periodos de presión de memoria que podrían quedar ocultos en el promedio.
Instalar Grafana¶
Instala Grafana siguiendo el método definido para el laboratorio.
Una vez instalado, inicia el servicio:
Comprueba el estado:
Comprueba el puerto:
Accede desde el navegador:
Si Grafana está instalado en otro servidor:
Completa el acceso inicial y cambia las credenciales predeterminadas.
Añadir Prometheus como fuente de datos¶
En Grafana:
- Abre Connections o Data sources.
- Selecciona Add new data source.
- Elige Prometheus.
- Introduce la URL de Prometheus.
- Selecciona acceso mediante servidor.
- Pulsa Save & test.
Si ambos servicios están en el mismo servidor:
Si están en servidores diferentes:
Si se ejecutan en Docker Compose:
La URL debe ser accesible desde Grafana, no necesariamente desde el navegador del usuario.
Crear el dashboard del laboratorio¶
Crea un dashboard nuevo con los siguientes paneles:
| Panel | Consulta | Visualización |
|---|---|---|
| Estado de objetivos | up |
Stat o Table |
| Uso de CPU | Consulta de CPU | Time series |
| Memoria disponible | node_memory_MemAvailable_bytes |
Time series |
| Carga del sistema | node_load1 |
Time series |
| Series activas | prometheus_tsdb_head_series |
Stat |
| Muestras por segundo | rate(prometheus_tsdb_head_samples_appended_total[5m]) |
Time series |
Panel de estado de objetivos¶
Consulta:
Configuración:
Incluye las etiquetas:
El valor esperado para objetivos disponibles es:
Panel de uso de CPU¶
Consulta:
Configuración:
Panel de memoria disponible¶
Consulta:
Configuración:
Panel de carga del sistema¶
Consulta:
Configuración:
Panel de series activas¶
Consulta:
Configuración:
Panel de muestras por segundo¶
Consulta:
Configuración:
Crear una variable de instancia¶
En la configuración del dashboard, crea una variable llamada:
Utiliza la etiqueta instance de la métrica up como origen de valores.
Después, modifica la consulta de CPU:
100 *
(
1 -
avg by (instance) (
rate(node_cpu_seconds_total{
mode="idle",
instance=~"$instance"
}[5m])
)
)
Modifica la consulta de memoria:
Configura la variable para permitir:
Comprueba que puedes seleccionar:
- Una instancia concreta.
- Varias instancias.
- Todas las instancias.
Crear una alerta básica¶
Crea una regla de alerta para detectar un objetivo no disponible.
Expresión:
Condición recomendada:
Etiquetas:
Anotaciones:
Para probar la alerta, detén temporalmente Node Exporter:
Comprueba desde Prometheus:
El resultado debería cambiar a:
Después de que transcurra la duración configurada, la alerta debería activarse.
Vuelve a iniciar Node Exporter:
Comprueba el estado:
Verifica que el objetivo vuelve a estar disponible:
El resultado esperado es:
Ejemplo¶
Investigación de un aumento de CPU¶
Supongamos que el panel de Grafana muestra un aumento del uso de CPU.
Primero se consulta el valor actual:
Después se consulta el máximo reciente:
max_over_time(
(
100 *
(
1 -
avg by (instance) (
rate(node_cpu_seconds_total{
mode="idle"
}[5m])
)
)
)[15m:]
)
También se consulta la carga del sistema:
Y la memoria disponible:
La investigación puede seguir este orden:
- Comprobar si el objetivo está disponible.
- Revisar el uso de CPU.
- Revisar la carga del sistema.
- Revisar la memoria disponible.
- Comparar el momento del incidente con otros paneles.
- Consultar logs del sistema.
- Determinar si el problema fue puntual o persistente.
En Ubuntu se pueden consultar procesos con mayor consumo:
También se puede utilizar:
si está instalado.
Consultar los últimos mensajes del sistema:
Investigación de un objetivo caído¶
Si un panel muestra que up vale 0:
Comprueba desde el servidor de Prometheus:
Si Node Exporter está en otro servidor:
Comprueba el estado del servicio:
Consulta los logs:
Comprueba la escucha del puerto:
Comprueba la conectividad desde Prometheus:
Si el servicio está activo, el endpoint responde y el puerto es accesible, revisa la configuración de Prometheus:
Después de corregir la configuración:
Entregables¶
Al finalizar el laboratorio, entrega o conserva los siguientes elementos:
- Fichero de configuración de Prometheus.
- Fichero de reglas de grabación.
- Captura o exportación del dashboard de Grafana.
- Resultado de la comprobación de
promtool. - Consulta PromQL utilizada para el uso de CPU.
- Consulta PromQL utilizada para la memoria.
- Evidencia de que Node Exporter aparece como
UP. - Evidencia de la alerta de objetivo no disponible.
- Respuestas a las preguntas de comprobación.
- Breve explicación de la arquitectura implementada.
Una estructura de entrega posible sería:
laboratorio-fundamentos-telemetria/
├── prometheus.yml
├── rules/
│ └── laboratorio.yml
├── dashboards/
│ └── fundamentos-telemetria.json
├── evidencias/
│ ├── targets-up.png
│ ├── dashboard-cpu.png
│ ├── alerta-node-down.png
│ └── promtool-check.png
└── respuestas.md
Criterios de evaluación¶
| Criterio | Resultado esperado |
|---|---|
| Node Exporter | Está instalado y responde en /metrics |
| Prometheus | Está activo y recopila métricas |
| Configuración | Es válida según promtool |
| Objetivos | Aparecen en estado UP |
| PromQL | Las consultas devuelven datos |
| Muestreo | Se comprende el efecto de scrape_interval |
| Retención | Existe una política configurada |
| Reglas | Se ha creado al menos una regla de grabación |
| Grafana | Está conectado a Prometheus |
| Dashboard | Contiene paneles de CPU, memoria y disponibilidad |
| Alertas | Se ha probado una alerta básica |
| Documentación | Se explican los pasos y resultados |
Puntos clave¶
- Node Exporter expone métricas del sistema operativo.
- Prometheus recopila las métricas mediante el modelo pull.
- Grafana consulta Prometheus utilizando PromQL.
- El endpoint
/metricspermite comprobar las métricas expuestas. - La métrica
uppermite verificar la disponibilidad de un objetivo. - Un valor
up = 1indica que el último scraping fue correcto. - Un valor
up = 0indica que el objetivo no respondió correctamente. scrape_intervaldetermina la frecuencia de recopilación.- Las series temporales se identifican mediante nombres y etiquetas.
ratepermite calcular la velocidad de cambio de un contador.avg_over_time,min_over_timeymax_over_timeresumen ventanas temporales.- La retención limita el tiempo o el tamaño de los datos almacenados.
- Las reglas de grabación permiten conservar resultados de consultas frecuentes.
- Las reglas de grabación generan nuevas series y utilizan almacenamiento.
- Grafana no almacena normalmente las métricas principales.
- Las fuentes de datos conectan Grafana con sistemas como Prometheus.
- Las variables permiten reutilizar un dashboard para varias instancias.
- Las alertas deben probarse provocando de forma controlada una condición de error.
- Los logs y las comprobaciones de red son esenciales para diagnosticar fallos.
- Una arquitectura de telemetría debe vigilar tanto los sistemas monitorizados como la propia plataforma de monitorización.
Preguntas de comprobación¶
- ¿Qué función cumple Node Exporter?
- ¿Qué protocolo utiliza Prometheus para recopilar las métricas de Node Exporter?
- ¿En qué puerto escucha normalmente Node Exporter?
- ¿En qué puerto escucha normalmente Prometheus?
- ¿En qué puerto escucha normalmente Grafana?
- ¿Qué diferencia existe entre un exporter y Prometheus?
- ¿Qué indica la métrica
up? - ¿Qué significa que
up{job="node"}devuelva el valor0? - ¿Qué parámetro define el intervalo de scraping?
- ¿Qué efecto tendría cambiar
scrape_intervalde15sa60s? - ¿Por qué se utiliza
rateconnode_cpu_seconds_total? - ¿Qué diferencia existe entre
avg_over_timeymax_over_time? - ¿Qué función cumple una política de retención?
- ¿Qué es una regla de grabación?
- ¿Por qué una regla de grabación puede aumentar el almacenamiento utilizado?
- ¿Qué problema puede aparecer si Prometheus no puede acceder al endpoint
/metrics? - ¿Por qué
localhostpuede ser incorrecto en una instalación basada en contenedores? - ¿Qué consulta utilizarías para calcular el porcentaje de CPU utilizada?
- ¿Qué consulta utilizarías para comprobar los objetivos caídos?
- ¿Qué ventajas ofrece utilizar una variable de instancia en Grafana?
- ¿Qué pasos seguirías para investigar un objetivo con estado
DOWN? - ¿Cómo comprobarías que Prometheus está preparado para recibir consultas?
- ¿Qué diferencia existe entre la fuente de datos de Grafana y un panel?
- ¿Qué precauciones deben tomarse al detener un exporter para probar una alerta?
- Describe el recorrido de una métrica desde Node Exporter hasta un panel de Grafana.