docker logo
En prometheus podemos configurar reglas que se irán evaluando. Tenemos dos tipos de reglas, las recording rules y las alerting rules.

Recording Rules

Estas reglas nos sirven para ir almacenando resultados que pueden tener un alto coste computacional, así se irán ejecutando periodicamente y guardando como una métrica que podemos usar, lo cual hará que sea mucho mas rápido a la hora de consultarla o usarla en cálculo de otras consultas. Són muy útiles para usar en paneles que se refrescan automáticamente, ya que se generará el calculo por detrás y no tendrá que ser el panel el que espere a la ejecución del cálculo.

Crear una Recording Rule

Para crear reglas debemos crear un fichero yaml y añadirlo en nuestro fichero de configuración de Prometheus, en rule_files . En mi fichero de configuración podemos ver como tengo añadido un fichero prometheus.rules.yml

global:
  scrape_interval:     15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
  - static_configs:
    - targets:

rule_files:
  - 'prometheus.rules.yml'

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'system'
    static_configs:
    - targets: ['192.168.1.30:9100', '192.168.1.31:9100', '192.168.1.32:9100']
      labels:
        group: "production"

Dentro de este fichero nuevo, prometheus.rules.yml, almacenaremos nuestras reglas de la siguiente forma:

groups:
  - name: nombre del grupo
    rules:
    - record: nombre:de:la:regla
      expr: expresión de consulta.

Ejemplo de Recording Rule

Os dejo un ejemplo sencillo y como se usa. Este ejemplo lo que hace es calcular el porcentaje de uso de CPU de todas las instancias para poder consultarlo luego, no es una consulta pesada pero como ejemplo es bastante útil.

La consulta que devuelve el valor es: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) , podemos ejecutarla dentro de Prometheus para ver qué es lo que devuelve.

<div style="text-align: center;"> <a href="/prometheus/recording_rule_1.png"><img src="/prometheus/recording_rule_1.png" alt="prometheus recording rule" title="prometheus recording rule" /></a> </div>

Creamos el fichero de rutas. Este es el contenido de la prueba que he estado haciendo.

groups:
- name: Systems CPU Percentage
  rules:
  - record: systems:cpu_percentage_usage
    expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)

Posteriormente hay que añadir este fichero en el de configuración de Prometheus y reiniciamos el servicio de Prometheus.

Con esto ya tenemos la regla como una métrica mas para consultar en nuestro servidor.

prometheus recording rule

Alerting Rules

Son reglas que queremos que lancen alertas si se cumplen las condiciones que establezcamos. Para crear estas reglas se hace de la misma forma que con las recording, con un fichero de reglas y añadiéndolo al fichero de configuración de Prometheus.

El formato de estas reglas es el siguiente:

- name: Nombre
  rules:
  - alert: NombreAlerta
    expr: Expresión de consulta
    for: 5m #tiempo en el que tiene que cumplirse la regla para saltar
    labels:
      severity: page
    annotations:
      summary: Texto de resumen

Y aquí va un ejemplo sobre la regla anterior, voy a hacer que salte una alerta si durante un minuto alguna CPU está a mas del 30% durante 5 minutos. Es una alerta tonta, pero es para ver el ejemplo rápidamente.

groups:
- name: Systems CPU Percentage
  rules:
  - record: systems:cpu_percentage_usage
    expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
  - alert: HighCPUUsage
    expr: systems:cpu_percentage_usage > 30
    for: 5m
    labels:
      severity: page
    annotations:
      summary: High CPU Usage

Cómo veis se puede usar la recording rule en la expresión.

Una vez reiniciamos el servicio podemos consultar nuestras alertas en http://192.168.1.31:9090/alerts, en la pestaña alerts.

En la siguiente imagen podemos ver la alerta creada

prometheus alerting rule

Si pinchamos en ella podremos ver que está en amarillo porque está pendiente. Ha encontrado una instancia que cumple la condición y está esperando los 5 minutos que le hemos dicho para ver si dispararse o no.

prometheus alerting rule

Si durante los 5 minutos se ha mantenido la condición la alerta se disparará, cambiando su color a rojo.

prometheus alerting rule

Validar el fichero de reglas

Si el fichero de reglas no es válido nos dará un error y no podremos ejecutar el servidor de Prometheus, así que existe una herramienta para validar los ficheros, eso si, necesitaremos tener go instalado en la máquina en la que la ejecutemos. Se usa de la siguiente manera:

go get github.com/prometheus/prometheus/cmd/promtool
promtool check rules /path/to/example.rules.yml

Yo no he sido capaz de hacerla funcionar en Raspbian, aunque tampoco lo he intentado demasiado.

Mas Info

Todo lo que cuento aquí es una base sobre la que empezar a trabajar, por ahora es lo único que he probado sobre reglas y alertas así que lo mejor es que sigáis investigando por vuestra cuenta si queréis saber mas sobre el tema. Para mas ejemplos y todas las opciones posibles lo mejor es leer la documentación oficial.

Cualquier duda puedes preguntarme por gnusocial.net.