Esta pagina se ve mejor con JavaScript habilitado

Sistema de monitorización Prometheus/Grafana bajo FreeBSD

 ·  🎃 kr0m

En este manual veremos como instalar y configurar Prometheus y Grafana de tal forma que seremos capaces de monitorizar métricas de servidores remotos mediante node_exporter, pero antes de empezar debemos tener claro que tareas va a llevar a cabo cada uno de los elementos implicados:

  • Prometheus : Sistema de recolección y almacenamiento de métricas obtenidas de los exporters, también es capaz de generar alertas en base a la métricas obtenidas.
  • Grafana : Sistema de visualización de las métricas almacenadas en la base de datos de Prometehus.
  • Node Exporter : Agente capaz de colectar ciertas métricas y exponerlas en una interfaz web para ser consultadas desde el servidor Prometheus.

Consultamos la última versión de Grafana:

pkg search grafana

grafana7-7.5.15_5              Dashboard and graph editor for multiple data stores
grafana8-8.5.15                Dashboard and graph editor for multiple data stores
grafana9-9.2.7                 Dashboard and graph editor for multiple data stores

En cuanto a Prometheus solo hay una versión disponible, instalamos Prometheus y Grafana:

pkg install prometheus grafana9

Habilitamos los servicios:

sysrc prometheus_enable=YES
sysrc grafana_enable=YES

Arrancamos los servicios:

service prometheus start
service grafana start

En mi red local no tengo ningún servidor DNS montado así que para hacer referencia a los equipos por nombre debo darlos de alta en el fichero /etc/hosts del servidor Prometheus:

vi /etc/hosts

192.168.69.2        mightymax
192.168.69.4        garrus
192.168.69.16		baudbeauty
192.168.69.17		hellstorm
192.168.69.18		paradox
192.168.69.19		atlas
192.168.69.20		metacortex

Damos de alta el servidor a monitorizar:

vi /usr/local/etc/prometheus.yml

...
scrape_configs:
...
  - job_name: 'node_exporter'
    scrape_interval: 30s
    static_configs:
      - targets:
        - mightymax:9100
...

Reiniciamos el servicio:

service prometheus restart

En mi caso el acceso desde el exterior pasará por un HAProxy, por lo tanto las reglas de firewall deben permitir el acceso a este:

# HTTP + HTTPS: INET - HAProxy
$cmd 00801 allow tcp from any to 192.168.69.19 80 in via $wanif
$cmd 00801 allow tcp from 192.168.69.19 80 to any out via $wanif

$cmd 00802 allow tcp from any to 192.168.69.19 443 in via $wanif
$cmd 00802 allow tcp from 192.168.69.19 443 to any out via $wanif

La configuración del HAProxy quedaría del siguiente modo, permitiendo el acceso al puerto 80 solo si se trata de LetsEncrypt renovando el certificado:

vi /usr/local/etc/haproxy.conf

frontend HTTP
    bind :80
    option forwardfor

    # Allow http access only for LetsEncrypt:
    acl letsencrypt path_beg /.well-known/acme-challenge/
    http-request redirect scheme https unless letsencrypt

    acl prometheus hdr(host) -i prometheus.alfaexploit.com
    acl grafana hdr(host) -i grafana.alfaexploit.com

    http-request deny if !prometheus !grafana

    use_backend prometheus if prometheus
    use_backend prometheus if grafana

frontend HTTP-SSL
    bind :443
    mode tcp

    acl prometheus_ssl req.ssl_sni -i prometheus.alfaexploit.com
    acl grafana_ssl req.ssl_sni -i grafana.alfaexploit.com

    tcp-request inspect-delay 2s
    tcp-request content reject if !prometheus_ssl !grafana_ssl

    use_backend prometheus_ssl if prometheus_ssl
    use_backend prometheus_ssl if grafana_ssl

backend prometheus
    server prometheus 192.168.69.21:80 check

backend prometheus_ssl
    mode tcp
    option ssl-hello-chk
    server prometheus 192.168.69.21:443 check sni req.ssl_sni send-proxy-v2

Reiniciamos el servicio:

service haproxy restart

Tanto la interfaz de Prometheus como la de Grafana funcionan en claro, si queremos dar acceso desde fuera debemos instalar algún servidor web como Nginx y configurar el SSL:

pkg install socat nginx

Habilitamos y arrancamos el servicio:

sysrc nginx_enable=YES
service nginx start

Instalamos ACME:

Configuramos los DNS para que los subdominios prometheus.alfaexploit.com y grafana.alfaexploit.com apunten al servidor de monitorización, acto seguido generamos el certificado:

/root/.acme.sh/acme.sh --issue -d prometheus.alfaexploit.com -d grafana.alfaexploit.com -w /usr/local/www/nginx/ --renew-hook 'service nginx restart'

[Tue Jan  3 11:40:36 CET 2023] Your cert is in: /root/.acme.sh/prometheus.alfaexploit.com/prometheus.alfaexploit.com.cer
[Tue Jan  3 11:40:36 CET 2023] Your cert key is in: /root/.acme.sh/prometheus.alfaexploit.com/prometheus.alfaexploit.com.key
[Tue Jan  3 11:40:36 CET 2023] The intermediate CA cert is in: /root/.acme.sh/prometheus.alfaexploit.com/ca.cer
[Tue Jan  3 11:40:36 CET 2023] And the full chain certs is there: /root/.acme.sh/prometheus.alfaexploit.com/fullchain.cer

Configuramos Nginx para que sirva la interfaz de Prometheus y Grafana con el certificado obtenido:

vi /usr/local/etc/nginx/nginx.conf

...
http {
    include prometheus.conf;
...
vi /usr/local/etc/nginx/prometheus.conf
server {
    listen 443 ssl proxy_protocol;
    server_name prometheus.alfaexploit.com;

    set_real_ip_from 192.168.69.19;
    real_ip_header proxy_protocol;

    ssl_certificate "/root/.acme.sh/prometheus.alfaexploit.com/fullchain.cer";
    ssl_certificate_key "/root/.acme.sh/prometheus.alfaexploit.com/prometheus.alfaexploit.com.key";

    location / {
        auth_basic "Restricted Content";
        auth_basic_user_file /usr/local/etc/nginx/.htpasswd;
        proxy_pass http://localhost:9090;
    }
}

server {
    listen 443 ssl proxy_protocol;
    server_name grafana.alfaexploit.com;

    set_real_ip_from 192.168.69.11;
    real_ip_header proxy_protocol;

    ssl_certificate "/root/.acme.sh/prometheus.alfaexploit.com/fullchain.cer";
    ssl_certificate_key "/root/.acme.sh/prometheus.alfaexploit.com/prometheus.alfaexploit.com.key";

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:3000;
    }
}

Generamos el fichero de passwords para el dominio prometheus.alfaexploit.com, para grafana.alfaexploit.com no es necesario ya que dispone de login propio:

echo -n 'kr0m:' >> /usr/local/etc/nginx/.htpasswd
openssl passwd -apr1 >> /usr/local/etc/nginx/.htpasswd
chown www /usr/local/etc/nginx/.htpasswd
chmod 600 /usr/local/etc/nginx/.htpasswd

Reiniciamos Nginx:

service nginx restart


En el servidor a monitorizar instalamos node exporter que nos proporcionará las métricas básicas del SO:

pkg install node_exporter

Habilitamos el servicio:

sysrc node_exporter_enable=YES

Arrancamos el servicio:

service node_exporter start


Ya podemos acceder tanto a Grafana como a Prometheus:
https://grafana.alfaexploit.com

admin/admin

Preguntará un nuevo password.

Añadimos un data source, le damos al engranaje de la izquierda:

Añadimos una fuente de datos:

Indicamos que se trata de una base de datos Prometheus:

Indicamos la URL:

Y guardamos:

Para visualizar las métricas recolectadas del node_exporter es necesario importar un dashboard de Grafana:
https://grafana.com/grafana/dashboards/4260

Clickamos sobre Dashboards -> Import:

Indicamos la URL de la dashboard y le damos a Load:

Indicamos el Prometheus data source y procedemos con la importación:

Nos debería de aparecer algo parecido a esto:

Comprobamos que también podemos acceder a la interfaz de Prometheus con un login previo:

Si te ha gustado el artículo puedes invitarme a un RedBull aquí