Prometheus, Grafana y exporters

  1. Objetivo
  2. Arquitectura
  3. Configuración de IPs en Ubuntu
  4. Instalando grafana en Windows
  5. Instalando Prometheus en Ubuntu
  6. Instalando Node Exporter
  7. Obteniendo y Configurando JMX Exporter
  8. Iniciando Grafana
  9. Iniciando Node Exporter
  10. Ejecutando JMX Exporter
  11. Configurando y Ejecutando Prometheus
  12. Creando un Data Source en Grafana
  13. Creando los Dashboards
  14. Conclusiones

Objetivo

El objetivo es instalar Prometheus, Grafana, Node Exporter y JMX Exporter para luego verificar como se puede recolectar y visualizar métricas de una manera muy simple. Esta guía está indicada para quienes recién comienzan en el mundo de Grafana y Prometheus.

Arquitectura

La instalación será realizada en una Laptop de la siguiente forma.

ProductoSistema OperativoComentarios
GrafanaWindowsPara visualizar las métricas almacenadas por Prometheus
PrometheusUbuntu sobre VirtualBoxPara almacenar las métricas recolectadas por los exporters
Node ExporterUbuntu sobre VirtualBoxPara recolectar métricas a nivel de la máquina donde se ejecuta Linux
JMX ExporterUbuntu sobre VirtualBoxPara recolectar métricas de aplicaciones Java

El siguiente diagrama muestra la arquitectura usada en esta publicación

Para aquellos que no tengan un servidor Ubuntu a la mano, les recomiendo esta guía que está en inglés, pero es muy fácil de seguir https://hibbard.eu/install-ubuntu-virtual-box/

Configuración de IPs en Ubuntu

Para los que creen sus servidores Ubuntu desde cero siguiendo la guía compartida en la sección anterior y que tengan problemas de comunicación entre sus servidores, no olviden configurar sus máquinas usando la misma subnet, la configuración de IPs que he usado se describe a continuación.

En la configuración de red “Network” de sus máquinas virtuales elijan “Bridged Adapter”

Luego pueden configurar la IP estática con estos pasos.

vi /etc/netplan/50-cloud-init.yaml

Luego reemplazarán el contenido original con una entrada similar a esta.

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      addresses:
        - 192.168.0.24/24
      routes:
        - to: default
          via: 192.168.0.1
      nameservers:
          addresses: [10.10.10.1, 1.1.1.1]

En la entrada anterior mi subnet es 192.168.0.0/24, la IP que estoy definiendo es la 192.168.0.24 y mi router es 192.168.0.1. Además, en cuanto al DNS se refiere estoy usando 10.10.10.1, 1.1.1.1.

Luego de realizar la configuración de IPs deberán ejecutar este comando.

netplan apply

Instalando grafana en Windows

Ir al sitio Web de Grafana https://grafana.com/

Escogemos Downloads

Luego “Self-managed”

Luego hacemos click en Download

Escogemos la versión y la edición que en este caso es OSS y el sistema operativo que en esta guía es Windows y descargamos el archivo conteniendo los archivos para ejecutar el servicio.

Descomprimimos Grafana y levantaremos el servicio más tarde.

Instalando Prometheus en Ubuntu

Visitamos el sitio web de Prometheus https://prometheus.io/

Vamos a Download

Escogemos Linux, amd64 y copiamos el enlace correspondiente a prometheus-2.55.0.linux-amd64.tar.gz para luego descargarlo con wget.

En el servidor Linux que hayamos destinado para Prometheus ejecutamos los siguientes comandos.

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

mv node_exporter-1.8.2.linux-amd64 node

Luego configuraremos la comunicación con los exporters para obtener métricas de los hosts y de una aplicación Java.

Instalando Node Exporter

A continuación se comparten los comandos usados para instalar Node Exporter; estos pasos han sido obtenidos de https://prometheus.io/docs/guides/node-exporter/

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

mv node_exporter-1.8.2.linux-amd64 node 

Obteniendo y Configurando JMX Exporter

La documentación oficial de JXM Exporter se encuentra disponible en https://github.com/prometheus/jmx_exporter/tree/release-1.0.1/docs

Estos son los pasos que utilicé para obtener y configurar JMX Exporter para obtener todas las métricas dispobibles de una aplicación Java.

wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jar

Para configurar creamos el archivo config.yaml como se muestra a continuación.

vi config.yaml
--
startDelaySeonds: 0
ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false

Iniciando Grafana

En esta publicación Grafana se encuentra desplegado en Windows y ahora nos toca levantar el servicio.

cd C:\grafana\grafana-v10.4.11\bin\

C:\grafana\grafana-v10.4.11\bin>grafana-server.exe

Como se observa a continuación Grafana está disponible en el puerto 3000.

Ahora podemos probar si Grafana está disponible usando la IP de la Laptop donde he instalado Grafana y el puerto 3000, también puedo usar localhost como se indica en la siguiente figura.

Iniciando Node Exporter

En este caso ingresamos al servidor Linux donde Node Exporter fue instalado y lo ejecutamos; en este caso la IP del servidor es 192.168.0.25.

cd node/

./node_exporter

Si todo va bien veremos lo siguiente donde se indica que Node Exporter está recibiendo peticiones a través del puerto 9100.


Node Exporter está configurado en la IP 192.168.0.25 y puerto 9100; este dato es importante dado que lo necesitaremos para configurar Prometheus de tal forma que pueda leer y almancenar las métricas publicadas en este nodo.

Ejecutando JMX Exporter

JMX exporter es un agente Java que recolecta métricas en tiempo de ejecución. Por tanto, en esta publicación uso una aplicación Java disponible en https://github.com/renaissance-benchmarks/renaissance

A continuación ejecutamos el comando para descargar la aplicación Java y el comando para ejecutarla donde además se incluye el flag -javaagent para correr el JMX Exporter; no ol

wget https://github.com/renaissance-benchmarks/renaissance/releases/download/v0.15.0/renaissance-gpl-0.15.0.jar

java -javaagent:./jmx_prometheus_javaagent-1.0.1.jar=192.168.0.26:7001:config.yaml -jar renaissance-gpl-0.15.0.jar finagle-http -r 100

En el comando anterior vemos que el JMX Exporter estará corriendo en el nodo con IP 192.168.0.26 y puerto 7001. Además, Node Exporter también es ejecutado en este nodo aunque no se muestra el comando dado que ya me mostró como hacerlo anteriormente.

Configurando y Ejecutando Prometheus

Llegado este punto tenemos Grafana y los exporters corriendo en nuestros nodos; ahora necesitamos Prometheus el cual lee los datos publicados por los exporters y los guarda en su base de datos. Grafana es una herramienta de visualización que usa muchas fuentes de datos y una de ellas es Prometheus.

Ahora tenemos que configurar Prometheus para que pueda almacenar las métricas compartidas por los exporters; esto se muestra a continuación.

vi  prometheus/prometheus.yml

Configuramos los targets como se muestra en la siguiente figura.

Si recuerdan bien en las secciones anteriores definimos dos Node Exporter identificados con los siguientes sockets 192.168.0.25:9100, 192.168.0.26:9100 y un JMX exporter con socket 192.168.0.26:7001.

Ahora iniciamos el servicio.

cd /some/path/prometheus

./prometheus

A continuación se muestra que Prometheus ha sido iniciado y recibe peticiones por el puerto 9090.

Ahora podemos revisar el serivicio usando el browser.

Creando un Data Source en Grafana

En este caso vamos a crear un Data Source que leerá la información contenida en Prometheus de tal manera que se encuentre disponible para poder crear visualizaciones, alertas, etc. en Grafana.

Primero que nada ingresamos a nuestra instalación de Grafana y escogemos las opciones que se resaltan en la siguiente figura, que son Add new connection > Prometheus.

Le damos un nombre y le indicamos la URL de Prometheus.

Esta publicación es solo un demo así que dejamos todos los valores por defecto y nos vamos a la última sección de la página donde le damos clic a “Save & test”. Si todo está bien deberían ver un mensaje como este.

Ahora configuremos un dashboard para mostrar dos paneles uno con métricas del servidor y otro con métricas de la aplicación Java.

Creando los Dashboards

Ahora crearemos un Dashboard.

Luego añadimos un panel que será usado para medir la carga de CPU.

Escogemos el data source.

Ahora ejecutaremos un query Promql para obtener el promedio de la carga (avg load) en uno de nuestros servidores Linux y le damos clic en apply para ver los resultados.

avg by(instance, job) (node_load5{instance="192.168.0.25:9100"})

Antes de ver los resultados generemos carga con el comando

stress --cpu 1000

Aquí tenemos el resultado

De la misma manera podemos añdir otro panel en el mismo dashboard para medir un parámetro clave en una aplicación Java, la cantidad de heap memory usado por la aplicación; en este caso el panel contiene a este query.

max by(instance) (java_lang_Memory_HeapMemoryUsage_used{instance="192.168.0.26:7001"})

Aquí vemos el resultado final.

Conclusiones

Este manual no es una guía definitiva de Grafana y Prometheus, hay muchos temas que no se han tratado aquí para crear instancias seguras y de alta disponibilidad. Sin embargo, es un primer paso que espero sirve de ayuda a los hispanohablantes que se inician en este tema.

Leave a comment