Prometheus permite descubrir dinámicamente los servicios (Exporters) desde los que tiene que obtener métricas (scraping), a través de un fichero JSON, en lugar de configurarlo de forma estática en el propio fichero de configuración de Prometheus, con la ventaja adicional que una simple modificación del fichero actualizará a Prometheus los cambios, que aplicará sin necesidad de tener que reiniciar el servicio.
Continuando con nuestra serie sobre Prometheus, ahora que ya hemos explicado qué es Prometheus y cómo instalarlo en una Raspberry (o en Ubuntu), así como del Node Exporter, el Blackbox Exporter, Grafana como herramienta de visualización para Prometheus, y la gestión de alertas con AlertManager, toca el turno de conocer los principales métodos para el descubrimiento de los servidores (Exporters) a monitorizar: el File Based Service Discovery (file_sd) y el HTTP Service Discovery (http_sd)
Ambos métodos son muy parecidos, quizás la principal diferencia es que con file_sd una simple modificación del fichero notificará a Prometheus de la existencia de cambios (event based), que aplicará sin necesidad de tener que reiniciar Prometheus, mientras que http_sd comprobará los cambios periódicamente (refresh_interval, por defecto 1 min), que aplicará igualmente sin necesidad de tener que reiniciar Prometheus.
Otra pequeña diferencia adicional, sería que file_sd permite utilizar un fichero JSOM o YAML mientras que http_sd sólo permite el formato YAML. Para más detalles (ej: tipos de autenticación soportados por http_sd), podemos consultar la documentación oficial: Prometheus – Comparison between File-Based SD and HTTP SD
El descubrimiento de servicios en Prometheus es fundamental, al tratarse de un sistema de monitorización que sigue un modelo pull, donde el propio servidor Prometheus se conecta a los Exporters para hacer Web Scraping y obtener las métricas, y por el hecho de facilitar la actualización de la infra a monitorizar, una tarea tan tediosa como necesaria. De este modo, al poder apoyarnos en un fichero JSON separado del propio fichero de configuración Prometheus, podemos construir una integración (quizás un simple Script) que leyendo de nuestro sistema de configuración o CMDB, actualice automática y dinámicamente el contenido de dicho fichero JSON.
De hecho existen otros métodos de descubrimiento de servicios en Prometheus (hay más de 20), como azure_sd, ec2_sd, digitalocean_sd, gce_sd, kubernetes_sd, etc. Podemos hacernos una mejor idea de todas las opciones de descubrimiento de servicios que tenemos, comprobando la documentación oficial: Prometheus – Configuration
Ejemplo de configuración con File Based Service Discovery (file_sd)
Partimos de un fichero de configuración de Prometheus que incluye una configuración estática de varios Targets como la siguiente, que ya vimos en el anterior Post acerca del Node Exporter.
# Linux Servers
- job_name: node_exporter
static_configs:
- targets:
- '192.168.30.2:9100' # securepi
- '192.168.30.3:9100' # superpi8
- '192.168.30.4:9100' # superpi4
Creamos un nuevo fichero de configuración para el File Service Discovery (file_sd), donde añadiremos la configuración de los anteriores Targets.
sudo vi /etc/prometheus/file_sd/targets.json
Su contenido sería similar al siguiente, que al final, representa la misma configuración, pero utilizando un fichero separado para file_sd. Realmente, el punto es doble:
- Este fichero se puede generar de forma automática desde nuestro inventario o CMDB, y que así sea más fácil de gestionar la monitorización de toda nuestra infra, por ejemplo con un Script «side-car» que se ejecute como un cron.
- Podemos sobrescribir la etiqueta job, para que el cambio desde la configuración estática sea transparente. Es interesante tener picardía con las etiquetas, para poder indicar cuál es el datatacenter, el entorno (ej: dev, prod, test, etc), y cualquier otra información de valor.
[
{
"targets": ["192.168.30.2:9100", "192.168.30.3:9100", "192.168.30.4:9100"],
"labels": {
"job": "node_exporter",
"__meta_datacenter": "cigarral"
}
}
]
Seguidamente editamos el fichero de configuración de Prometheus, para sustituir la configuración stática anterior, por la siguiente, en la que referenciamos el fichero que acabamos de crear:
scrape_configs:
# File Service Discovery
- job_name: "file_sd_targets"
file_sd_configs:
- files:
- file_sd/targets.json
Comprobaremos que el fichero de configuración es válido (con promtool) y tras comprobar que está OK, refrescamos la configuración de Prometheus con un killall.
promtool check config /etc/prometheus/prometheus.yml
sudo killall -HUP prometheus
Realizado esto, podremos comprobar en Prometheus (Status -> Targets), que pasados unos segundos ya empieza a obtener las métricas a través de la nueva configuración realizada a través del File Service Discovery, manteniendo los mismos valores de etiquetas que había con la configuración estática.
Podemos encontrar más detalles en Prometheus (Status -> Service Discovery), como las meta etiquetas.
Ejemplo de configuración con HTTP Based Service Discovery (http_sd)
Básicamente sería igual que en el anterior ejemplo de file_sd, salvo la configuración del fichero de configuración de Prometheus, que sería algo similar a lo siguiente (hay varias opciones de autenticación, este ejemplo, muestra la autenticación básica), y algún otro detalle (la respuesta debe incluir el encabezado Content-Type: application/json).
scrape_configs:
# File Service Discovery
- job_name: "http_sd_targets"
http_sd_configs:
- url: https://mycmdb.company.local/http-sd-targets
basic_auth:
username: prometheus
password: secret
Despedida y Cierre
Hasta aquí llega este Post, en el que hemos explicado las ventajas de utilizar el descubrimiento de servicios en Prometheus, tanto con file_sd como http_sd, a través de un ejemplo dónde comprender los cambios de configuración necesarios y otros detalles e implicaciones.
Poco más por hoy. Como siempre, confío que la lectura resulte de interés.