El monitoreo de sistemas y aplicaciones es esencial para mantener la estabilidad y el rendimiento de servidores y aplicaciones. Prometheus y Grafana son dos herramientas líderes en este campo que, cuando trabajan en conjunto, ofrecen una solución robusta y flexible para la recolección, almacenamiento y visualización de métricas en tiempo real. En esta guía te guiaremos paso a paso en la instalación y configuración de Prometheus y Grafana en un servidor Ubuntu 22.04 y mostraremos cómo recolectar métricas del sistema operativo como ilustración.
Prometheus es un sistema de monitoreo y alerta de código abierto que se caracteriza por su modelo de datos basado en una base de datos de series temporales (time-series database) y su capacidad para recolectar métricas a través de consultas HTTP. Por otro lado, Grafana permite la visualización y análisis desde una gran variedad de fuentes de datos, pero su integración con Prometheus es una de las más comunes. De esta forma, es posible realizar un monitoreo centralizado, crear alertas personalizadas y acceder a métricas que brindan una visión clara del sistema.
Requisitos Previos para utilizar Prometheus y Grafana
- Disponer de un servidor Ubuntu 22.04 con un usuario que tenga acceso a
sudo
como explicamos en Configuración inicial de un servidor con Ubuntu 22.04. En nuestro caso este usuario llevará el nombre gabriel. - Verificar que exista una regla en el cortafuegos de Donweb que permita el tráfico entrante a los puertos 3000 y 9090 de TCP. Si necesitas asistencia, puedes consultar el artículo Firewall en la sección de ayuda.
Paso 1a: Instalación y Configuración de Prometheus
Debido a que Prometheus no está disponible en los repositorios predeterminados de Ubuntu, necesitarás descargarlo desde su repositorio oficial de GitHub. Al momento de escribir este artículo, la versión más reciente es la 2.54.1 pero para asegurarte, siempre puedes consultar la información disponible en el repositorio y adaptar los siguientes comandos con la versión que corresponda en el futuro. Para empezar, descarguemos el tarball de Prometheus utilizando curl
en el directorio /tmp y extraigamos su contenido:
cd /tmp
curl -LO https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
tar -xvf prometheus-2.54.1.linux-amd64.tar.gz
A continuación, mueve los archivos binarios de Prometheus a una ubicación adecuada (/usr/local/bin en este caso), crea el directorio /etc/prometheus donde guardaremos la configuración y genera un usuario específico para ejecutar el servicio. Por seguridad, esta cuenta no podrá emplearse para iniciar sesión en el sistema y tampoco contará con un directorio personal.
sudo mv prometheus-2.54.1.linux-amd64/prometheus /usr/local/bin/
sudo mv prometheus-2.54.1.linux-amd64/promtool /usr/local/bin/
sudo mkdir /etc/prometheus
sudo mkdir -p /var/lib/prometheus
sudo mv prometheus-2.54.1.linux-amd64/consoles /etc/prometheus
sudo mv prometheus-2.54.1.linux-amd64/console_libraries /etc/prometheus
sudo mv prometheus-2.54.1.linux-amd64/prometheus.yml /etc/prometheus
sudo useradd --no-create-home --shell /bin/false prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
A fin de que Prometheus corra como un servicio necesitarás crear el archivo de configuración para que systemd pueda administrarlo:
sudo nano /etc/systemd/system/prometheus.service
con el siguiente contenido:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
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
[Install]
WantedBy=multi-user.target
Si deseas evitar la conexión a la interfaz web de Prometheus desde la red (incluyendo Internet), agrega la línea --web.listen-address=127.0.0.1:9090 \
en el ExecStart
de arriba, reinicia el daemon de systemd y también el servicio con sudo systemctl daemon-reload && sudo systemctl restart prometheus
.
Por último, recarga el daemon de systemd para que el servicio entre en efecto y luego habilita e inicia Prometheus:
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
sudo systemctl status prometheus
El último comando debería indicar que el inicio fue exitoso:
Prometheus estará disponible en el puerto 9090 por defecto, lo que puedes verificar utilizando un navegador web empleando la dirección IP pública de tu cloud server:
Paso 1b: Instalación y Configuración de Node Exporter
Para que podamos hacer uso del servicio rápidamente, descargaremos Node Exporter, una herramienta que permite exportar métricas del hardware y del sistema operativo hacia Prometheus. También está disponible en un repositorio oficial y al escribir este artículo la versión más reciente es la 1.8.2:
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar -xvf node_exporter-1.8.2.linux-amd64.tar.gz
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin
Como próximo paso, crearemos una cuenta para ejecutar Node Exporter:
sudo useradd --no-create-home --shell /bin/false node_exporter
y también un archivo de servicio para que corra en segundo plano:
sudo nano /etc/systemd/system/node_exporter.service
E incluiremos el siguiente contenido:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=default.target
Finalmente, agregaremos a Node exporter en la lista de los scrape targets (fuentes desde las cuales recogeremos datos) en el archivo de configuración:
sudo nano /etc/prometheus/prometheus.yml
mediante las últimas 3 líneas que se muestran abajo. Es importante tener en cuenta que, al tratarse de un archivo YAML, debemos respetar los niveles de indentación.
# 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"]
- job_name: "node_exporter"
static_configs:
- targets: ["localhost:9100"]
y habilitaremos el servicio de la misma forma en que lo hicimos anteriormente:
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
Una vez completado este paso, podemos ahora continuar con Grafana.
Paso 2: Instalación y Configuración de Grafana
Como Grafana proporciona su propio repositorio de paquetes, con estos comandos podremos añadirlo e instalar la herramienta:
sudo apt install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt update
sudo apt install -y grafana
A esta altura, Grafana no está en ejecución todavía. Por ese motivo, será preciso habilitarlo e iniciarlo manualmente:
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
sudo systemctl status grafana-server
Una vez que el servicio está en ejecución, podrás acceder a la interfaz web de Grafana en el puerto 3000 a través del navegador web. Por defecto, tanto el usuario y contraseña de Grafana es admin. Te recomendamos cambiar la contraseña tan pronto como inicies sesión desde el menú que indica la imagen de abajo:
En el próximo paso veremos cómo integrar Prometheus con Grafana, así como algunas consideraciones de seguridad relacionadas.
Paso 3: Integración de Prometheus y Graphana
Para agregar a Prometheus como fuente de datos, ve a Connections –> Data sources –> Add data source:
y elige Prometheus de la lista:
Luego de ingresar la URL de Prometheus (en nuestro caso será http://localhost:9090 ya que ambos servicios residen en el mismo host), haz clic en el botón Save & test que aparece en la parte inferior de la página. Si la conexión se realizó correctamente, verás el mensaje de confirmación que aparece en la imagen siguiente:
Grafana provee muchos paneles predeterminados para las integraciones más comunes. Al escribir node en el campo de búsqueda, haremos clic en Node Exporter Full y luego en uno de los botones Copy ID to clipboard o en Download JSON.
Esto nos permitirá acceder al identificador del panel o descargar el archivo con la plantilla que luego importaremos en Grafana. Si copiamos el ID, lo ingresaremos donde lo indica la imagen de abajo y presionaremos Load. En caso de que hayamos descargado el archivo JSON, podremos importarlo con el botón Upload dashboard JSON file.
En cualquiera de los dos casos, finalizaremos haciendo clic en Import:
Después de algunos minutos, deberías comenzar a visualizar los indicadores de las métricas en el panel:
En la imagen de arriba, podemos observar que el panel agrupa las medidas en categorías para nuestra conveniencia. Esto nos permitirá monitorear el cloud server y tomar decisiones informadas en datos recolectados en tiempo real.
Conclusión
En esta guía hemos desarrollado el proceso paso a paso para instalar, configurar e integrar Prometheus y Grafana en Ubuntu 22.04. Ya sea que estés monitoreando servidores y aplicaciones en producción o sistemas de prueba, la combinación de Prometheus y Grafana te permitirá estar siempre al tanto del rendimiento y la estabilidad y así evitar problemas o minimizar su impacto.