Prometheus es un sistema open source para el monitoreo de sistemas, colecta datos de los llamados Exporters para guardarlos en una base de datos de tipo time-series y poder consultarlos mediante un flexible y poderoso sistema de consultas. Podemos visualizar esta información en reportes, gráficos, etc. mediante el mismo servidor de Prometheus o con ayuda de otras herramientas como Grafana.
Existen Exporters para una larga lista de tareas desde las más generales a las más específicas, puedes darte una idea de ello en la siguiente lista de exporters: https://prometheus.io/docs/instrumenting/exporters/. Lo bueno no acaba ahí, sino que tú mismo puedes desarrollar el tuyo propio para lo que sea que necesites.
Pero dejemos hasta aquí la introducción de éste sistema para poner manos a la obra.
Existen muchos enfoques de cómo podemos instalar nuestro sistema de monitoreo, generalmente éste será de tipo distribuido, sin embargo, y a fin de que podamos comprender fácilmente su funcionamiento, veremos aquí cómo instalar y configurar Prometheus en nuestra máquina local para obtener datos de la misma. Más adelante, en otros post, veremos cómo trasladar esto a sistemas distribuidos.
Estaremos utilizando un sistema con Ubuntu 16.04.
1. Obtener Prometheus
Vamos a crear un directorio en nuestra carpeta personal que contendrá todos los servicios que necesitamos, e instalaremos Prometheus primeramente.
$ cd ~
$ mkdir Prometheus
$ cd Prometheus
$ wget https://github.com/prometheus/prometheus/releases/download/v1.7.2/prometheus-1.7.2.linux-amd64.tar.gz
$ tar xvfz prometheus-1.7.2.linux-amd64.tar.gz
$ rm prometheus-1.7.2.linux-amd64.tar.gz
$ mv prometheus-1.7.2.linux-amd64/ server
2. Configurar Prometheus para monitorearse a sí mismo
Por defecto, al instalar el servidor de Prometheus, éste viene con métricas del mismo servidor, por lo que vamos a configurarlo para que obtenga datos de sí mismo.
$ cd server
$ nano configuration.yml
En nuestro archivo de configuración ponemos lo siguiente:
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# 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=` to any timeseries scraped from this config.
- job_name: 'prometheus'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
Si eres un desesperado, ya podrías lanzar el servidor con el siguiente comando:
$ ./prometheus -config.file=configuration.yml
Prometheus inicia el servidor, al que podemos entrar desde http://localhost:9090, además comenzará a proveer métricas desde http://localhost:9090/metrics, mismas que son del mismo servidor de Prometheus.
Prometheus ofrece algunos servidores de ejemplo simulados, pero vamos a ignorarlo y obtengamos métricas reales de nuestra propia máquina.
3. Prometheus como Servicio
Para facilitar nuestro trabajo, vamos a configurar Prometheus para que se ejecute comos servicio en nuestro sistema. Por seguridad no vamos a correr el servidor como root, creamos un nuevo usuario dedicado para ello.
$ sudo useradd -r -s /bin/false prometheus
Es necesario darle permisos de lectura y escritura a nuestro nuevo usuario para la carpeta data:
$ mkdir -p data
$ setfacl -R -m u:prometheus:rwx data
$ setfacl -dR -m u:prometheus:rwx data
En la ruta del servidor de Prometheus vamos a crear un script para ejecutarlo con su archivo de configuración y con el usuario correcto:
$ nano init_prometheus
Que contendrá, recuerda cambiar path_to_prometheus con la ruta donde se encuentra nuestro script:
#!/bin/sh
cd path_to_prometheus
sudo -u prometheus ./prometheus --config.file=configuration.yml
Permisos:
$ sudo chmod 700 init_prometheus
Creamos el servicio:
$ sudo nano /etc/systemd/system/prometheus.service
Con el siguiente contenido, recuerda cambiar path_to_prometheus por la ruta donde se encuentra nuestro script:
[Unit]
Description=Prometheus Service
After=network-online.target
[Service]
ExecStart=path_to_prometheus/init_prometheus
Type=simple
[Install]
WantedBy=multi-user.target
Iniciamos el servicio:
$ sudo systemctl daemon-reload
$ sudo systemctl start prometheus
Si deseas que se ejecute al iniciar el sistema
$ sudo systemctl enable prometheus
4. Instalar y configurar Node Exporter localmente
Generalmente las métricas que nos interesan a todos, de primer momento, nos las puede dar Node Exporter, que es un módulo que nos dará datos como uso de disco, carga de la CPU, uso de RAM, SWAP, estadísticas de red, entre otros. De manera que vamos a instalar y configurarlo para que nos de estos datos sobre nuestra propia máquina local.
Instalamos en la ruta de Prometheus:
$ cd ~/Prometheus
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.14.0/node_exporter-0.14.0.linux-amd64.tar.gz
$ tar xvfz node_exporter-0.14.0.linux-amd64.tar.gz
$ rm node_exporter-0.14.0.linux-amd64.tar.gz
$ mv node_exporter-0.14.0.linux-amd64/ node_exporter
Probemos que funciona:
$ cd node_exporter
$ ./node_exporter
Deberá comenzar a darnos datos a través de http://localhost:9100/metrics.
5. Node Exporter como servicio
Creamos usuario:
$ sudo useradd -r -s /bin/false node_exporter
En la ruta del servidor de Node Exporter vamos a crear un script para ejecutarlo con su archivo de configuración y con el usuario correcto:
$ nano init_node_exporter
Con el siguiente contenido, recuerda reemplazar path_to_node_exporter con la ruta hacia nuestro scrpit:
#!/bin/sh
cd path_to_node_exporter
sudo -u node_exporter ./node_exporter
Permisos:
$ sudo chmod 700 init_node_exporter
Creamos el servicio
$ sudo nano /etc/systemd/system/node_exporter.service
Con el contenido siguiente, recuerda reemplazar path_to_node_exporter con la ruta hacia nuestro scrpit:
[Unit]
Description=Node Exporter
[Service]
ExecStart=path_to_node_exporter/init_node_exporter
[Install]
WantedBy=multi-user.target
Iniciamos el servicio:
$ sudo systemctl daemon-reload
$ sudo systemctl start node_exporter
Para que se ejecute al iniciar el sistema
$ sudo systemctl enable node_exporter
6. Configurar Prometheus para que obtenga datos de Node Exporter
Ahora que tenemos a nuestro servidor de Prometheus y a Node Exporter ejecutándose como servicios, vamos a configurar el servidor para que obtenga los datos que Node Exporter obtiene de nuestra propia máquina local.
Volvamos a editar el archivo de configuración de Prometheus:
$ cd ~/Prometheus/server
$ nano configuration.yml
En la sección scrape_configs agregaremos el siguiente nodo:
- job_name: 'local_node_exporter'
static_configs:
- targets: ['localhost:9100']
7. Instalación de Grafana y su configuración con Prometheus
Como habíamos mencionado, Grafana es una herramienta que nos servirá para poder visualizar de una mejor manera los datos entregados por Prometheus, entre otras cosas útiles que veremos después.
$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.5.2_amd64.deb
$ sudo apt-get install -y adduser libfontconfig
$ sudo dpkg -i grafana_4.5.2_amd64.deb
Iniciar el servidor de Grafana:
$ sudo systemctl daemon-reload
$ sudo systemctl start grafana-server
Para que el servidor inicie con el sistema:
$ sudo systemctl enable grafana-server.service
Ahora el servidor está instalado y corriendo, nos dirigimos a http://localhost:3000 para ingresar al sistema:
Nos pedirá que iniciemos sesión, para ingresar a la cuenta de administrador, el usuario y password serán admin:admin.
Ahora que estamos dentro del sistema, lo primero que debemos hacer es crear un nuevo Data Source que estará ligado a Prometheus, para ello nos dirigimos a Data Sources > Add New donde ingresamos los siguientes datos:
Lo siguiente es importar un dashboard ya creado para mostrar los datos de Node Exporter, nos dirigimos a Dashboard > Import, donde ingresamos el id 1860.
Ahora nos pedirá que ingresemos un nombre para nuestro nuevo dashboard y que seleccionemos un Data Source, donde usamos el que hemos creado:
Nos dirige a nuestro dashboard donde ya podemos visualizar los gráficos que ofrece, pero aún no tenemos datos.
En nuestro dashboard vamos a Configuración > Templating donde modificaremos la variable $node de donde eliminaremos el filtro “{job="node"}” de manera que nos quede de la siguiente manera:
Con estos parámetros, podemos ahora seleccionar ‘localhost’ de nuestra lista de Host, podremos entonces ver los datos de nuestro equipo local.
8. Conclusión
Como vemos es bastante sencillo tener nuestro propio sistema de monitoreo, extrapolar esto a un sistema distribuido creo yo que no será tan difícil con lo que acabamos de ver, pero dedicaremos un post para ello, además de cómo podemos configurar el sistema de alertas de Grafana, entre otras cosas.
No olvides dejar tus dudas o comentarios.
Luis Manuel Ramírez
+DEIMOS+