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:
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:
Habilitamos los servicios:
sysrc grafana_enable=YES
Arrancamos los servicios:
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:
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:
...
scrape_configs:
...
  - job_name: 'node_exporter'
    scrape_interval: 30s
    static_configs:
      - targets:
        - mightymax:9100
...
Reiniciamos el servicio:
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:
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:
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:
Habilitamos y arrancamos el servicio:
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:
[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:
...
http {
    include 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:
openssl passwd -apr1 >> /usr/local/etc/nginx/.htpasswd
chown www /usr/local/etc/nginx/.htpasswd
chmod 600 /usr/local/etc/nginx/.htpasswd
Reiniciamos Nginx:
En el servidor a monitorizar instalamos node exporter que nos proporcionará las métricas básicas del SO:
Habilitamos el servicio:
Arrancamos el servicio:
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:
