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: