Prometheus – Introducción e instalación en una Raspberry

Prometheus es una solución Open Source de monitorización cada vez más popular, programada en Go y basada en métricas, que proporciona una base de datos de series temporales (TSDB) con un potente modelo de datos basado en etiquetas, un lenguaje de consulta (PromQL), y un sistema de alertas (Prometheus Alertmanager) para la gestión de las notificaciones. ¿Quieres conocerlo e instalarlo en una Raspberry o en Ubuntu?

Con este Post comenzamos una serie sobre Prometheus, a través de la cual iremos conociendo poco a poco, a Prometheus, una de las principales soluciones actuales de monitorización y del paradigma de la observabilidad.

Introducción a Prometheus

Prometheus recoge las métricas por HTTP a través de los Exporters (realmente hace un Web Scraping), que son los procesos que se encargan de exportar las métricas de los elementos que deseamos monitorizar, y que los tendremos que instalar y configurar (pueden ser proporcionados por Prometheus o por terceros). Existen una gran cantidad de Exporters, como podemos observar en la documentación oficial: Prometheus – Exporters and Integrations

Este es un detalle importante, ya que Prometheus sigue un modelo pull, donde el servidor de Prometheus se conecta a los Exporters para hacer Web Scraping y obtener las métricas, a diferencia de otros servicios de monitorización como Zabbix, que siguen un modelo push, donde un agente de Zabbix envía las métricas al servidor Zabbix para su almacenamiento e indexación.

También podemos instrumentalizar nuestras aplicaciones (WhiteBox monitoring) para que exporten métricas a Prometheus y que las podamos monitorizar. Para este fin, Prometheus proporciona librerías de cliente para diferentes lenguajes, para que podamos trackear qué ocurre en nuestra aplicación y exponerlo a Prometheus. Otra alternativa es construir nuestros propios Exporters.

Instalaremos los Exporters que necesitemos en las máquinas, que se convertirán en los Targets, es decir, los destinos a los que se conectará Prometheus para ingestar sus métricas. Tendremos que dar de alta en el fichero de configuración de Prometheus todos los Targets a los que nos queramos conectar, salvo que utilicemos algún sistema de Service Discovery (para así no tener que modificar la configuración de Prometheus tan a menudo, resultando mucho más dinámico y fundamental en algunos casos de uso).

Prometheus está diseñado para trabajar en entornos dinámicos como Kubernetes y Proveedores de Cloud, para lo cual se apoya en los Service Discovery, que resultan una pieza clave en estos escenarios.

Prometheus proporciona una sencilla y muy básica interfaz gráfica, con la cual podemos hacer alguna consulta, revisar el estado de Prometheus, y algunas cosas más, pero lo habitual es utilizar Grafana como herramienta de visualización de Prometheus, de tal modo que nuestros Dashboards utilicen Prometheus como un origen de datos.

La base de datos de series temporales (TSDB) de Prometheus suele almacenar en memoria la información más reciente (ej: últimas 2-3 horas) y persistir en disco la información más antigua en bloques de 2 horas, que más adelante puede compactar en bloques más grandes. De esta forma intenta optimizar el rendimiento, con foco en los datos más recientes.

Prometheus no proporciona ningún sistema de autenticación ni de gestión de usuarios, por lo que se considera una aplicación single-user, salvo que construyamos nosotros alguna capa por encima para este fin (ej: autenticación y terminación SSL en un NGINX).

Pruedes encontrar mucho más detalle en la documentación oficial de Prometheus: Prometheus – Overview

Bueno, con esto nos hacemos una idea, pero lo mejor para aprender es instalarlo y empezar a trastear con él.

Instalación de Prometheus

A continuación vamos a explicar la instalación de Prometheus paso a paso.

Lo primero, actualizamos el sistema operativo, instalamos algunas utilidades (wget, gurl, y vim), y creamos un grupo y un usuario (que no permite login) para Prometheus, con la intención de evitar que el demonio de Prometheus se ejecute con un superusuario como root (por motivos de seguridad).

sudo apt update -y && sudo apt upgrade
sudo apt -y install wget curl vim
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin --system --no-create-home -g prometheus prometheus

Creamos los directorios de datos (aquí se almacenarán los datos de la base de datos de series temporales que usa Prometheus) y confitguracion de Prometheus.

sudo mkdir /var/lib/prometheus
for i in rules rules.d file_sd; do sudo mkdir -p /etc/prometheus/${i}; done

Descargamos la última versión de Prometheus para Raspberry (armv7) sobre un directorio temporal (Prometheus – Download), lo descomprimimos, movemos los binarios a /usr/local/bin (así los podemos ejecutar sin añadir nada al PATH), y movemos el fichero de configuración prometheus.yml y los directorios consoles/ y console_libraries/ al directorio /etc/prometheus. Cambiamos también el propietario de los binarios, por motivos de seguridad.

NOTA: Si se deseas instalar Prometheus en Ubuntu, en lugar de filtrar por linux-armv7 bastaría con filtrar por linux-amd64 en el siguiente comando, y ya está. El resto de las instrucciones indicadas en este Post serían válidas.

curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep browser_download_url | grep linux-armv7 | cut -d '"' -f 4 | wget -qi -

tar xvf prometheus*.tar.gz
cd prometheus*/
sudo mv prometheus promtool /usr/local/bin/
sudo mv prometheus.yml consoles/ console_libraries/ /etc/prometheus/

for i in rules rules.d file_sd; do sudo chown -R prometheus:prometheus /etc/prometheus/${i}; done
for i in rules rules.d file_sd; do sudo chmod -R 775 /etc/prometheus/${i}; done
sudo chown -R prometheus:prometheus /var/lib/prometheus/
sudo chown root:root /usr/local/bin/prometheus
sudo chown root:root /usr/local/bin/promtool

Realizado esto podemos ejecutar los siguientes dos comandos para comprobar la versión instalada de los binarios de Prometheus:

prometheus --version
promtool --version

Editamos el fichero de configuración de Prometheus, que lo hemos dejado en /etc/prometheus/prometheus.yml con un comando como el siguiente:

vi /etc/prometheus/prometheus.yml

De momento lo vamos a dejar por defecto, tendrá un aspecto similar al siguiente y que básicamente: hace scraping cada 15 seg y tan sólo obtiene las métricas del propio Prometheus.

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

Para poder manejar Prometheus como un servicio o demonio, vamos a crear su fichero de configuración de systemd.

sudo tee /etc/systemd/system/prometheus.service<<EOF
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/docs/introduction/overview/
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP \$MAINPID
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --web.listen-address=0.0.0.0:9090 \
  --web.external-url=

SyslogIdentifier=prometheus
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Hecho esto, activamos y arrancamos el servicio de Prometheus (así queda configurado para arrancar automáticamente con el inicio del sistema):

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus

A continuación vemos el resultado de ejecución de los anteriores comando, y comprobamos como Prometheus está arrancado correctamente.

Realizado esto, si accedemos al puerto 9090 a través de un navegador, podremos acceder a la interfaz Web de Prometheus. Podemos acceder a varias URLs como las siguientes, aunque realmente, una vez accedemos a la interfaz Web de Prometheus podemos también llegar a ellas desde los menús:

  • http://superpi8:9090/graph
  • http://superpi8:9090/status
  • http://superpi8:9090/metrics
  • http://superpi8:9090/targets

Realizado esto, ya tenemos instalado Prometheus en nuestra Raspberry.

Monitorización de Prometheus

Al instalar Prometheus, por defecto, suele quedar configurado para monitorizarse a sí mismo, al margen de que más adelante queramos definirnos alguna alerta concreta que nos notifique a través de Alert Manager, o queramos prepararnos un Dashboard en Grafana para ver detalles específicos.

Si necesitamos más detalles, Prometheus registra sus errores y warnings en stderr, y en caso necesario podemos aumentar la verbosidad con la opción –log.level=debug temporalmente para obtener un mayor detalle en los lgos, y resolver algún problema puntual. Si tenemos configurado Prometheus como un servicio, podemos consultar sus logs con el comando journalctl, por ejemplo así:

sudo journalctl --no-pager --boot --unit prometheus.service

Prometheus también incluye un endpoint /debug/pprof para debuging y profiling, que puede ser de utilidad cuando nos encontremos con problermas de rendimiento o bugs. Podemos comprobar este endpoint manualmente, o podemos utilizar la heramienta go toot pprof para ayudarnos a analizarlo.

Despedida y cierre

Hasta aquí llega nuestro primer Post sobre Prometheus, en el que hemos instalado un servidor Prometheus, que irémos completando en los siguientes Posts, donde hablaremos de la instalación y configuración de varios Exporters como el Node Exporter y el Blackbox Exporter, la instalación de Grafana y Dashboards para Prometheus, etc..

Poco más por hoy. Como siempre, confío que la lectura resulte de interés.