Con la versión v0.7.22 del demonio polkadot se han incorporado una serie de métricas para prometheus que podemos aprovechar directamente.

Esto no es un tutorial de copiar y pegar sin entender nada.

Tabla de contenidos

  1. Introducción
  2. Firewall
  3. Reverse proxy
  4. Prometheus flags
  5. Autentificación Básica
  6. Prometheus Jobs

Introducción

Si ya hemos seguido las guias de monitoreo que puedes encontrar en este mismo blog ahora toca darle una vuelta de tuerca. Vamos a securizar nuestro sistema y añadir las métricas nuevas que nos ofrece el binario de polkadot.

Para securizar el sistema vamos a utilizar las características de reverse proxy que nos ofrece nginx. También vamos a añadir un sistema sencillo de autentificación a nuestro prometheus.

Recordamos las partes de nuestro setup:

- Servidor de monitoreo:  VPC, en nuestro caso 4GB de RAM y 3 vCPU
Este server contiene 2 servicios de sistema: Prometheus y Grafana
- Equipos clientes: Son nuestros nodos de blockchain que queremos monitorizar. En nuestro caso una mezcla de máquinas físicas y VPCs

Firewall

En la mayoría de nuestros nodos clientes que van a ser monitorizados instalamos un firewall de manera que sólo nuestros servidores de monitoreo puedan hacer consultas a los puertos de interés. Podemos usar ufw para añadir las reglas necesarias en nuestros clientes.

ufw allow proto tcp from [IP_Monitor] to any port 9615
ufw allow proto tcp from [IP_Monitor] to any port 9100

Hay que sustituir [IP_Monitor] por la ip de nuestro servidor de monitoreo. Con esas dos reglas de firewall estamos permitiendo las consultas al demonio de polkadot (9615) y al node_exporter (9100). El primero nos dará información de la blockchain y el segundo sobre métricas comunes de sistema del nodo (CPU, RAM, disco... )

Reverse proxy

Ya en nuestro servidor de monitoreo vamos a instalar nginx para colocarlo frente a prometheus.

Este sería un ejemplo del archivo de configuración de nginx:

server {
  root /usr/share/nginx/www;
  index index.html index.htm;
  server_name mysub.mydomain.com;

  location /prometheus/ {
   auth_basic           "Prometheus";
   auth_basic_user_file /etc/nginx/.htpasswd;
   proxy_pass http://localhost:9090/;
  }

  location / {
   proxy_pass http://localhost:3000/;
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mysub.mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mysub.mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = mysub.mydomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


  listen 80;
  server_name mysub.mydomain.com;
    return 404; # managed by Certbot


}


Como podéis observar estamos haciendo 2 reverse proxy, cada uno en un location diferente. El location "/prometheus/" hará que cuando naveguemos por nuestra web a la URI  https://mysub.mydomain.com/prometheus  por detrás estará accediendo a localhost:9090 que es el puerto por defecto que expone prometheus.

Prometheus flags

La configuración que tenemos que añadir a prometheus para que lo anterior funcione sería como sigue:

--web.listen-address=127.0.0.1:9090 \
--web.external-url=https://localhost:9090/prometheus/ \
--web.route-prefix=/

Con esos flags añadidos a nuestro servicio de sistema prometheus.service estaremos sirviendo su panel de control en la URI mencionada arriba.

Por otro lado, el location  "/" , nos redirige el resto del tráfico a nuestro Grafana-server que está escuchando en el puerto 3000.

Auth Basic

Con todo lo anterior no tenemos aun todo el sistema protegido. Cualquiera podría acceder a nuestras métricas usando la URL   mysub.mydomain.com/prometheus

De manera que vamos a añadir un sistema de autentificación de usuarios. De eso se encargan las líneas que comienzan por "auth_basic" en el fichero de configuración de nginx.
Lo que tenemos que hacer es generar un archivo con nuestra clave encriptada. Para ello usaremos el comando htpasswd de la siguente forma:

htpasswd -c /etc/nginx/.htpasswd admin

Nos solicitará la contraseña del usuario admin y creará el archivo .htpasswd al que hace referencia la configuración de nginx. Cuando reiniciemos nuestro nginx y tratemos de acceder a la URL veréis que os solicita un usuario (admin) y la password que acabáis de usar.

Prometheus jobs

Lo siguiente que vamos a hacer es añadir un nuevo "job" a prometheus para que haga las consultas a nuestro nodo de polkadot / kusama y recopile las métricas.

En el archivo de configuración de prometheus  (prometheus.yml) añadiremos un job por cada máquina y conjunto de métricas. Este sería un ejemplo de bloque de configuración:

  - job_name: 'polkadot_kusama-public-4'
    static_configs:
    - targets: ['IP_DEL_NODO:9615']
      labels:
        network: 'kusama'
        hostname: 'kusama-public-4'

Me parece interesante el uso de etiquetas (labels) porque nos permite filtrar equipos en nuestro panel de Grafana. Cuando tienes muchas máquinas que vigilar es una buena opción.
Recordad que "job_name" debe ser único por cada bloque de configuración.

Finalmente reiniciamos nginx y prometheus y ya podremos acceder a nuestra URL de forma segura.

La lista de nuevas métricas que nos aparecen en prometheus es enorme. No entran bien en esta captura de pantalla. Son más de 50. Como véis todas ellas comienzan con "polkadot".

Ya podéis jugar con ellas!

AQUÍ tenéis una lista de todas ellas con una breve descripción de cada una. Esta lista la podéis generar ustedes mismos lanzando en el nodo de polkadot este comando:

curl localhost:9516/metrics

Más adelante escribiremos cómo aprovecharlas desde Grafana.