Consultas PromQL¶
PromQL, abreviatura de Prometheus Query Language, es el lenguaje utilizado para consultar, filtrar, transformar y agrupar las métricas almacenadas en Prometheus.
En esta práctica se utilizarán métricas de:
- Prometheus.
- Node Exporter.
- CPU.
- Memoria.
- Sistemas de ficheros.
- Interfaces de red.
- Disponibilidad de objetivos.
El recorrido será:
Métrica almacenada
|
v
Selector PromQL
|
v
Filtros y etiquetas
|
v
Funciones y operadores
|
v
Resultado numérico o serie temporal
|
v
Tabla, gráfico o dashboard
Objetivos¶
Al finalizar esta práctica, el alumno podrá:
- Explicar qué es PromQL.
- Consultar una métrica instantánea.
- Consultar una serie temporal.
- Filtrar métricas mediante etiquetas.
- Utilizar operadores aritméticos y lógicos.
- Utilizar selectores de igualdad y expresiones regulares.
- Diferenciar entre métricas
counterygauge. - Utilizar funciones como
rate(),irate(),avg(),sum()ycount(). - Agrupar resultados mediante
byywithout. - Calcular porcentajes de CPU, memoria y almacenamiento.
- Consultar tráfico de red.
- Utilizar rangos temporales.
- Combinar varias métricas en una expresión.
- Consultar Prometheus desde la interfaz web.
- Consultar Prometheus mediante la API HTTP.
- Diagnosticar consultas que no devuelven datos.
- Preparar consultas para paneles de Grafana.
Introducción¶
Prometheus almacena métricas como series temporales.
Cada serie está formada por:
- Un nombre de métrica.
- Un conjunto de etiquetas.
- Un valor.
- Una marca temporal.
Ejemplo:
En este ejemplo:
node_memory_MemAvailable_byteses el nombre de la métrica.instanceidentifica el objetivo.jobidentifica el trabajo.2414534656es el valor actual.- Prometheus asocia el valor a una marca temporal.
Una consulta PromQL puede devolver:
- Un único valor.
- Varias series.
- Una tabla.
- Una serie temporal.
- Un resultado booleano.
- Un valor calculado a partir de varias métricas.
Requisitos previos¶
Antes de comenzar, Prometheus debe estar activo y debe haber objetivos disponibles.
Comprobar Prometheus¶
Resultado esperado:
Comprobar Node Exporter¶
Si Node Exporter se instaló manualmente:
Si se instaló mediante el paquete de Ubuntu:
Resultado esperado:
Comprobar los objetivos¶
curl -s http://localhost:9090/api/v1/targets \
| jq -r '
.data.activeTargets[]
| [
.labels.job,
.labels.instance,
.health,
.lastError
]
| @tsv
'
Resultado esperado:
Comprobar la consulta básica¶
Acceder al editor de PromQL¶
Abrir la interfaz web:
En la sección de consultas se puede:
- Introducir una expresión PromQL.
- Ejecutarla.
- Consultar el resultado como tabla.
- Consultar el resultado como gráfico.
- Cambiar el rango temporal.
- Revisar las etiquetas devueltas.
La primera consulta recomendada es:
Tipos de consultas¶
Consulta de una métrica¶
Una consulta sencilla consiste en escribir el nombre de una métrica:
Consulta instantánea¶
Una consulta instantánea devuelve el valor más reciente disponible.
Ejemplo:
Resultado conceptual:
up{instance="localhost:9090",job="prometheus"} 1
up{instance="localhost:9100",job="node_exporter"} 1
Consulta de rango¶
Una consulta de rango devuelve la evolución temporal de una o varias series.
En la interfaz web se puede seleccionar:
- Últimos 5 minutos.
- Últimos 15 minutos.
- Última hora.
- Últimas 6 horas.
- Últimas 24 horas.
- Rango personalizado.
La consulta puede ser la misma:
La diferencia está en el tipo de ejecución y en el intervalo temporal seleccionado.
Selectores de métricas¶
Selector simple¶
Este selector devuelve todas las series cuyo nombre de métrica es up.
Selector con etiquetas¶
También puede escribirse en una sola línea:
Varias etiquetas¶
Seleccionar una instancia¶
Seleccionar un dispositivo¶
Operadores de etiquetas¶
PromQL admite cuatro operadores principales para seleccionar etiquetas.
| Operador | Significado | Ejemplo |
|---|---|---|
= |
Igual | job="node_exporter" |
!= |
Distinto | device!="lo" |
=~ |
Coincide con una expresión regular | device=~"en.*" |
!~ |
No coincide con una expresión regular | device!~"lo|docker.*" |
Igualdad exacta¶
Desigualdad¶
Expresión regular¶
Exclusión mediante expresión regular¶
Etiquetas habituales de Node Exporter¶
| Etiqueta | Significado |
|---|---|
job |
Trabajo de Prometheus |
instance |
Objetivo consultado |
cpu |
Identificador de CPU |
mode |
Modo de CPU |
device |
Dispositivo o interfaz |
mountpoint |
Punto de montaje |
fstype |
Tipo de sistema de ficheros |
Consultar las etiquetas de CPU:
Consultar las etiquetas de red:
Consultar las etiquetas de almacenamiento:
La métrica up¶
La métrica up indica si Prometheus pudo realizar correctamente el último scraping.
Interpretación:
| Valor | Significado |
|---|---|
1 |
El objetivo respondió correctamente |
0 |
El objetivo no respondió correctamente |
Consultar todos los objetivos¶
Consultar Node Exporter¶
Consultar Prometheus¶
Buscar objetivos caídos¶
Esta expresión devuelve únicamente las series cuyo valor sea 0.
Contar objetivos¶
Contar objetivos disponibles¶
Calcular el porcentaje de disponibilidad¶
Consultar un objetivo concreto¶
Tipos de métricas¶
Gauge¶
Un gauge representa un valor que puede aumentar o disminuir.
Ejemplos:
Estos valores pueden cambiar en cualquier dirección.
Counter¶
Un counter representa un valor acumulativo.
Normalmente aumenta con el tiempo y vuelve a comenzar cuando se reinicia el proceso o el sistema.
Ejemplos:
Para obtener la velocidad de cambio de un counter se utilizan funciones como:
Rangos temporales¶
Las funciones que calculan cambios necesitan un rango temporal.
Ejemplo:
El selector [5m] significa:
Rangos habituales:
| Rango | Significado |
|---|---|
[30s] |
Últimos 30 segundos |
[1m] |
Último minuto |
[5m] |
Últimos 5 minutos |
[15m] |
Últimos 15 minutos |
[1h] |
Última hora |
[1d] |
Último día |
Ejemplos:
Un rango demasiado corto puede producir resultados inestables o insuficientes. Un rango más largo suaviza las variaciones, pero responde más lentamente a los cambios.
Operadores aritméticos¶
PromQL permite realizar cálculos con métricas.
Operadores principales:
| Operador | Función |
|---|---|
+ |
Suma |
- |
Resta |
* |
Multiplicación |
/ |
División |
% |
Módulo |
^ |
Potencia |
Restar métricas¶
Dividir métricas¶
Convertir a porcentaje¶
Calcular memoria utilizada¶
Calcular el porcentaje utilizado¶
Operadores de comparación¶
PromQL admite las siguientes comparaciones:
| Operador | Función |
|---|---|
== |
Igual |
!= |
Distinto |
> |
Mayor que |
< |
Menor que |
>= |
Mayor o igual |
<= |
Menor o igual |
Objetivos caídos¶
Memoria superior al 80 %¶
Sistemas de ficheros superiores al 90 %¶
100 * (
1 -
node_filesystem_avail_bytes{
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
fstype!~"tmpfs|overlay"
}
) > 90
Estas consultas devuelven únicamente las series que cumplen la condición.
Funciones de agregación¶
sum()¶
Suma los valores de varias series.
Suma el tráfico recibido por instancia:
avg()¶
Calcula la media:
Media del tiempo de CPU inactiva por instancia:
min()¶
Devuelve el valor mínimo:
max()¶
Devuelve el valor máximo:
count()¶
Cuenta las series:
Cuenta las series de CPU:
Agrupación con by¶
La cláusula by permite definir las etiquetas que deben conservarse en el resultado.
Media por instancia¶
Suma por interfaz¶
Suma por instancia y dispositivo¶
Media por modo de CPU¶
Agrupación con without¶
without elimina determinadas etiquetas del resultado y conserva las demás.
Ejemplo:
Esta consulta elimina las etiquetas cpu y mode del resultado.
Comparación:
Ambas consultas pueden producir resultados parecidos, pero by y without expresan la intención de forma diferente.
Uso de CPU¶
La métrica principal es:
Esta métrica es un contador y se divide por modo:
idleusersystemiowaitirqsoftirqsteal- Otros modos disponibles
Tiempo de CPU inactiva¶
Porcentaje de CPU inactiva¶
Porcentaje de CPU utilizada¶
Uso de CPU por núcleo¶
Esta consulta conserva las etiquetas de cada CPU.
Uso de CPU del sistema¶
Uso de CPU de usuario¶
Uso de memoria¶
Memoria total¶
Memoria disponible¶
Memoria libre¶
Memoria utilizada en bytes¶
Porcentaje de memoria utilizado¶
Porcentaje de memoria disponible¶
Memoria utilizada en gibibytes¶
En Grafana se recomienda configurar la unidad del panel como:
o:
Uso de sistemas de ficheros¶
Tamaño total¶
Espacio disponible¶
Espacio libre¶
Consultar la raíz¶
Excluir sistemas virtuales¶
Uso en bytes¶
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
-
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
Porcentaje utilizado¶
100 * (
1 -
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
)
Sistemas de ficheros con más del 80 % de uso¶
100 * (
1 -
node_filesystem_avail_bytes{
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
fstype!~"tmpfs|overlay"
}
) > 80
Agrupar por punto de montaje¶
max by (instance, mountpoint) (
100 * (
1 -
node_filesystem_avail_bytes{
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
fstype!~"tmpfs|overlay"
}
)
)
Tráfico de red¶
Las métricas de tráfico son contadores.
Bytes recibidos¶
Bytes enviados¶
Tráfico recibido por segundo¶
Tráfico enviado por segundo¶
Excluir loopback¶
Sumar tráfico recibido por instancia¶
Sumar tráfico enviado por instancia¶
Tráfico total recibido y enviado¶
sum by (instance) (
rate(node_network_receive_bytes_total{
device!="lo"
}[5m])
)
+
sum by (instance) (
rate(node_network_transmit_bytes_total{
device!="lo"
}[5m])
)
rate() e irate()¶
rate()¶
rate() calcula la velocidad media de cambio de un contador durante un intervalo.
Es apropiada para:
- Dashboards.
- Gráficos estables.
- Consultas de tendencias.
- Reglas de alerta.
irate()¶
irate() calcula una velocidad utilizando las muestras más recientes del rango.
Es más sensible a cambios rápidos y puede resultar más irregular.
Comparación¶
| Función | Comportamiento | Uso habitual |
|---|---|---|
rate() |
Más estable | Dashboards y alertas |
irate() |
Más sensible | Cambios rápidos y análisis puntual |
Tiempo de actividad¶
Tiempo de actividad en segundos¶
Tiempo de actividad en días¶
Tiempo de actividad de Prometheus¶
Carga del sistema¶
Carga a un minuto¶
Carga a cinco minutos¶
Carga a quince minutos¶
Comparar la carga con el número de CPUs¶
La interpretación de la carga depende del número de CPUs disponibles. Una carga de 2 no significa lo mismo en un sistema con dos CPUs que en uno con dieciséis.
Operadores lógicos y de conjunto¶
PromQL permite utilizar operadores como:
andorunless
Objetivos disponibles de Node Exporter¶
Objetivos caídos de Node Exporter¶
Combinar condiciones¶
Utilizar or¶
Utilizar unless¶
Los operadores de conjunto deben utilizarse comprendiendo las etiquetas de las series implicadas.
Comparación entre series¶
Cuando se combinan métricas, PromQL utiliza las etiquetas para relacionar las series.
División directa¶
Ambas métricas deben compartir etiquetas compatibles.
Agrupación previa¶
La agrupación permite obtener un resultado con etiquetas conocidas y facilita operaciones posteriores.
Ignorar etiquetas¶
En casos más avanzados pueden utilizarse modificadores como:
o:
Ejemplo conceptual:
rate(node_network_receive_bytes_total[5m])
/ ignoring(device)
sum by (instance) (
rate(node_network_receive_bytes_total[5m])
)
Estos modificadores deben utilizarse con cuidado, porque una combinación incorrecta puede producir resultados vacíos o duplicados.
Métricas de Prometheus¶
Información de compilación¶
Series actuales¶
Muestras añadidas¶
Memoria del proceso¶
CPU del proceso¶
Tiempo de actividad de Prometheus¶
Objetivos disponibles¶
Objetivos totales¶
Consultas para Grafana¶
Las siguientes consultas pueden utilizarse como base para paneles.
Panel de disponibilidad¶
Tipo recomendado:
Unidad:
Panel de CPU¶
Tipo recomendado:
Unidad:
Panel de memoria¶
Tipo recomendado:
Unidad:
Panel de almacenamiento¶
100 * (
1 -
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
)
Tipo recomendado:
Unidad:
Panel de tráfico recibido¶
Tipo recomendado:
Unidad:
Panel de carga¶
Tipo recomendado:
Unidad:
Consultar PromQL mediante la API¶
Consulta instantánea¶
Mostrar job, instancia y valor¶
curl -sG http://localhost:9090/api/v1/query \
--data-urlencode 'query=up' \
| jq -r '
.data.result[]
| [
.metric.job,
.metric.instance,
.value[1]
]
| @tsv
'
Consultar el uso de memoria¶
curl -sG http://localhost:9090/api/v1/query \
--data-urlencode \
'query=100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)' \
| jq
Consultar un rango temporal¶
START=$(date -d '15 minutes ago' +%s)
END=$(date +%s)
curl -sG http://localhost:9090/api/v1/query_range \
--data-urlencode 'query=up' \
--data-urlencode "start=$START" \
--data-urlencode "end=$END" \
--data-urlencode 'step=15' \
| jq
Guardar una consulta¶
Sesiones prácticas¶
Sesión 1: ejecutar consultas básicas¶
Objetivo¶
Familiarizarse con el editor de consultas.
Consultas¶
Actividades¶
- Ejecuta cada consulta.
- Cambia entre tabla y gráfico.
- Anota cuántas series devuelve cada una.
- Identifica las etiquetas.
- Indica si la métrica procede de Prometheus o de Node Exporter.
Completar:
| Consulta | Número de series | Tipo de información |
|---|---|---|
up |
||
prometheus_build_info |
||
process_resident_memory_bytes |
||
node_memory_MemAvailable_bytes |
Sesión 2: practicar filtros de etiquetas¶
Objetivo¶
Filtrar resultados utilizando etiquetas.
Consultas¶
Actividades¶
- Ejecuta la consulta sin filtros.
- Añade un filtro por
job. - Añade un filtro por
mode. - Excluye la interfaz
lo. - Utiliza una expresión regular.
- Explica la diferencia entre
=y=~.
Sesión 3: analizar la métrica up¶
Objetivo¶
Comprobar el estado de los objetivos mediante PromQL.
Consultas¶
Actividades¶
- Cuenta los objetivos configurados.
- Cuenta los objetivos disponibles.
- Calcula el porcentaje de disponibilidad.
- Detén temporalmente Node Exporter:
- Si utilizas el paquete de Ubuntu, ejecuta:
- Espera varios intervalos de scraping.
- Ejecuta:
- Inicia de nuevo el servicio:
- Si utilizas el paquete de Ubuntu:
- Comprueba la recuperación.
Sesión 4: calcular el uso de memoria¶
Objetivo¶
Crear consultas derivadas a partir de dos métricas.
Consultas¶
Memoria total:
Memoria disponible:
Memoria utilizada:
Porcentaje disponible:
Porcentaje utilizado:
Porcentaje redondeado:
Actividades¶
- Ejecuta cada consulta.
- Compara el resultado con:
- Comprueba las unidades.
- Explica la diferencia entre memoria libre y memoria disponible.
- Indica qué consulta utilizarías en un panel de Grafana.
Sesión 5: calcular el uso de CPU¶
Objetivo¶
Calcular el porcentaje de CPU utilizada.
Paso 1: consultar la métrica original¶
Paso 2: filtrar el tiempo inactivo¶
Paso 3: calcular la velocidad de cambio¶
Paso 4: agrupar por instancia¶
Paso 5: calcular el uso¶
Actividades¶
- Ejecuta las consultas en orden.
- Explica qué cambia en cada paso.
- Observa el resultado como gráfico.
- Genera carga temporal:
- Comprueba el uso de CPU.
- Detén los procesos:
- Observa la recuperación del gráfico.
Esta actividad debe realizarse únicamente en un entorno de laboratorio.
Sesión 6: analizar el almacenamiento¶
Objetivo¶
Calcular el espacio utilizado por los sistemas de ficheros.
Consultas¶
Uso de /:
100 * (
1 -
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
)
Actividades¶
- Consulta los sistemas de ficheros.
- Identifica el punto de montaje raíz.
- Excluye sistemas virtuales.
- Compara el resultado con:
- Añade un umbral conceptual:
100 * (
1 -
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
) > 80
Sesión 7: analizar la red¶
Objetivo¶
Consultar el tráfico de red y calcular su velocidad.
Consultas¶
Excluir loopback:
Agrupar por interfaz:
Actividades¶
- Identifica las interfaces.
- Excluye
lo. - Calcula el tráfico recibido.
- Calcula el tráfico enviado.
- Genera tráfico mediante una descarga o navegación controlada.
- Observa el cambio en el gráfico.
- Compara con:
Sesión 8: utilizar agregaciones¶
Objetivo¶
Practicar sum, avg, min, max y count.
Consultas¶
Actividades¶
- Cuenta las series de CPU.
- Calcula la carga media.
- Consulta el mínimo de memoria disponible.
- Consulta el máximo de memoria disponible.
- Suma el tráfico por instancia.
- Explica qué etiquetas se conservan en cada resultado.
Sesión 9: utilizar rate() e irate()¶
Objetivo¶
Comparar dos funciones utilizadas con contadores.
Consultas¶
Actividades¶
- Ejecuta ambas consultas.
- Represéntalas en gráficos.
- Compara la estabilidad de los resultados.
- Explica cuál utilizarías en un dashboard.
- Explica cuál puede mostrar cambios más bruscos.
Sesión 10: preparar consultas para Grafana¶
Objetivo¶
Crear consultas reutilizables en paneles.
Panel de disponibilidad¶
Panel de CPU¶
Panel de memoria¶
Panel de disco¶
100 * (
1 -
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
)
Panel de red¶
Actividades¶
- Ejecuta cada consulta en Prometheus.
- Comprueba que devuelve datos.
- Anota las unidades.
- Identifica las etiquetas del resultado.
- Copia las consultas para utilizarlas posteriormente en Grafana.
Diagnóstico de consultas¶
La consulta no devuelve datos¶
Comprobar primero:
Después:
Y, si Node Exporter está instalado:
Posibles causas:
- El nombre de la métrica es incorrecto.
- Node Exporter está detenido.
- El target está en estado
DOWN. - La etiqueta no existe.
- La etiqueta está escrita incorrectamente.
- El rango temporal no contiene muestras.
- El objetivo todavía no ha sido consultado.
- La métrica no está disponible en esa versión.
Comprobar las métricas disponibles¶
Desde Node Exporter:
Desde Prometheus:
Consultar nombres de métricas mediante la API:
curl -s http://localhost:9090/api/v1/label/__name__/values \
| jq -r '.data[]' \
| grep '^node_memory_'
Comprobar las etiquetas¶
Consultar una métrica amplia:
Observar las etiquetas devueltas:
device.instance.job.
Si una consulta utiliza:
pero el sistema utiliza ens33, el resultado puede estar vacío.
El resultado contiene demasiadas series¶
Reducir la consulta mediante:
- Filtros.
- Agregaciones.
sum by.avg by.- Exclusión de interfaces.
- Exclusión de sistemas de ficheros.
Ejemplo:
El resultado parece incorrecto¶
Comprobar:
- El tipo de métrica.
- Si es un
countero ungauge. - Si se necesita
rate(). - El rango temporal.
- Las etiquetas.
- Las unidades.
- La agrupación utilizada.
- La compatibilidad de etiquetas entre métricas.
No se debe aplicar rate() a una métrica que ya representa un valor instantáneo, como:
El gráfico aparece vacío¶
Comprobar:
- El rango temporal.
- El intervalo de scraping.
- El estado del target.
- La sintaxis de la consulta.
- La existencia de la métrica.
- Que no se está consultando un rango futuro.
- Que Prometheus lleva suficiente tiempo recopilando datos.
Ejemplo de sesión completa¶
$ systemctl is-active prometheus
active
$ systemctl is-active node_exporter
active
$ curl -sG http://localhost:9090/api/v1/query \
--data-urlencode 'query=up' \
| jq -r '
.data.result[]
| [
.metric.job,
.metric.instance,
.value[1]
]
| @tsv
'
prometheus localhost:9090 1
node_exporter localhost:9100 1
En la interfaz web se ejecutan las siguientes consultas:
100 * (
1 -
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
)
Resultado esperado:
updevuelve1.- La memoria devuelve un valor numérico.
- El uso de CPU se muestra como porcentaje.
- El uso de
/se muestra como porcentaje. - El tráfico de red se muestra como bytes por segundo.
- Las consultas devuelven series temporales cuando se visualizan como gráficos.
Actividad integradora¶
Objetivo¶
Crear y documentar un conjunto de consultas PromQL para monitorizar un servidor Linux.
Consultas obligatorias¶
Disponibilidad¶
Uso de CPU¶
Uso de memoria¶
Uso del sistema de ficheros raíz¶
100 * (
1 -
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
)
Tráfico recibido¶
Tareas¶
- Ejecutar cada consulta en Prometheus.
- Comprobar que devuelve datos.
- Identificar las unidades.
- Identificar las etiquetas.
- Ejecutar cada consulta en la API HTTP.
- Guardar los resultados.
- Preparar las consultas para Grafana.
- Explicar el significado de cada consulta.
- Indicar qué consulta utilizarías para una alerta.
- Documentar cualquier problema encontrado.
Guardar evidencias¶
Crear el directorio:
Guardar la consulta up:
curl -sG http://localhost:9090/api/v1/query \
--data-urlencode 'query=up' \
| jq \
> ~/laboratorio-grafana/evidencias/promql/up.json
Guardar el uso de memoria:
curl -sG http://localhost:9090/api/v1/query \
--data-urlencode \
'query=100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)' \
| jq \
> ~/laboratorio-grafana/evidencias/promql/memoria.json
Guardar el uso de CPU:
curl -sG http://localhost:9090/api/v1/query \
--data-urlencode \
'query=100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)' \
| jq \
> ~/laboratorio-grafana/evidencias/promql/cpu.json
Crear un fichero con las consultas:
cat > ~/laboratorio-grafana/evidencias/promql/consultas.txt <<'EOF'
Disponibilidad:
up{job="node_exporter"}
Uso de CPU:
100 - (
avg by (instance) (
rate(node_cpu_seconds_total{mode="idle"}[5m])
) * 100
)
Uso de memoria:
100 * (
1 -
node_memory_MemAvailable_bytes
/
node_memory_MemTotal_bytes
)
Uso del sistema de ficheros:
100 * (
1 -
node_filesystem_avail_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
/
node_filesystem_size_bytes{
mountpoint="/",
fstype!~"tmpfs|overlay"
}
)
EOF
Tabla de resultados¶
| Consulta | ¿Devuelve datos? | Unidad | Tipo de métrica | Observaciones |
|---|---|---|---|---|
up{job="node_exporter"} |
||||
| Uso de CPU | % |
|||
| Uso de memoria | % |
|||
Uso de / |
% |
|||
| Tráfico recibido | bytes/sec |
|||
| Carga del sistema |
Puntos clave¶
- PromQL es el lenguaje de consultas de Prometheus.
- Una consulta puede devolver una o varias series temporales.
- Las etiquetas permiten filtrar y clasificar las series.
=selecciona una coincidencia exacta.=~permite utilizar expresiones regulares.upindica si un objetivo está disponible.- Los
gaugerepresentan valores que pueden subir o bajar. - Los
counterrepresentan valores acumulativos. rate()calcula la velocidad media de cambio de un contador.irate()responde más rápidamente a cambios recientes.sum()suma series.avg()calcula medias.count()cuenta series.bydefine las etiquetas que se conservan en una agregación.- Los porcentajes se calculan mediante operaciones aritméticas.
- Las métricas de CPU y red suelen requerir
rate(). - Las métricas de memoria y capacidad suelen consultarse directamente.
- Las consultas deben probarse antes de incorporarlas a Grafana.
- Una consulta vacía puede deberse a un nombre incorrecto, una etiqueta incorrecta o un objetivo no disponible.
- El rango temporal debe ser adecuado para la frecuencia de recopilación.
- Las unidades deben configurarse correctamente en los dashboards.
Preguntas de comprobación¶
- ¿Qué significa PromQL?
- ¿Para qué sirve PromQL?
- ¿Qué es una serie temporal?
- ¿Qué información contiene una serie temporal?
- ¿Qué consulta permite comprobar la disponibilidad de los objetivos?
- ¿Qué diferencia existe entre
=y=~? - ¿Qué diferencia existe entre un
gaugey uncounter? - ¿Para qué sirve
rate()? - ¿Cuándo utilizarías
irate()? - ¿Qué función cumple
sum()? - ¿Qué función cumple
avg()? - ¿Qué función cumple
count()? - ¿Qué finalidad tiene
by? - ¿Cómo calcularías el porcentaje de memoria utilizado?
- ¿Cómo calcularías el uso de CPU?
- ¿Por qué
node_cpu_seconds_totalsuele utilizarse conrate()? - ¿Por qué no se aplica normalmente
rate()anode_memory_MemAvailable_bytes? - ¿Cómo excluirías la interfaz
lo? - ¿Cómo consultarías solamente el sistema de ficheros raíz?
- ¿Qué puede provocar que una consulta no devuelva datos?
- ¿Cómo consultarías Prometheus desde la terminal?
- ¿Qué diferencia existe entre una consulta instantánea y una consulta de rango?
- ¿Qué rango temporal utilizarías para calcular el uso de CPU?
- ¿Qué consulta utilizarías para mostrar el tráfico recibido?
- ¿Qué consulta utilizarías como panel de disponibilidad en Grafana?
Criterios de finalización¶
La práctica se considera completada cuando el alumno puede:
- Ejecutar consultas básicas.
- Consultar métricas de Prometheus.
- Consultar métricas de Node Exporter.
- Filtrar por
job. - Filtrar por
instance. - Filtrar por
device. - Utilizar expresiones regulares.
- Interpretar la métrica
up. - Diferenciar
gaugeycounter. - Utilizar
rate(). - Calcular el uso de CPU.
- Calcular el uso de memoria.
- Calcular el uso de almacenamiento.
- Calcular el tráfico de red.
- Utilizar agregaciones.
- Consultar mediante la API HTTP.
- Diagnosticar una consulta sin resultados.
- Preparar consultas para Grafana.
- Guardar las evidencias de las consultas.
El flujo que debe dominar el alumno es: