Skip to main content

Instalación de Prometheus

Inicialmente la instalación de Prometheus es solo de Prometheus y no el stack completo con Grafana y AlertManager que son servicios aparte y esto debe quedar muy claro.

Grafana puede configurarse con una entrada de datos viniendo de Prometheus así como AlertManager también se configura para que Prometheus envíe la alerta.

Instalación local

En la página de releases podemos descargar el proyecto de Prometheus. https://github.com/prometheus/prometheus/releases/

# Creando usuario y grupo de servicio de prometheus
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin --system -g prometheus

# Creando árbol de directorios en /etc/prometheus
# /etc/prometheus/files_sd
# /etc/prometheus/rules
# /etc/prometheus/rules.d
for i in rules rules.d files_sd; do sudo mkdir -p /etc/prometheus/${i}; done

# Haciendo la descarga de prometheus en /tmp/prometheus
mkdir -p /tmp/prometheus && cd /tmp/prometheus
curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi -

# unzip
tar xvf prometheus*.tar.gz
# Moviendo el binario al path del sistema
cd prometheus*/
sudo mv prometheus promtool /usr/local/bin/
# Moviendo archivo de configuración y carpetas a /etc/prometheus
sudo mv prometheus.yml /etc/prometheus/prometheus.yml
sudo mv consoles/ console_libraries/ /etc/prometheus/

# Corrigiendo los permisos
sudo mkdir /var/lib/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus/
sudo chmod -R 775 /etc/prometheus/
sudo chown -R prometheus:prometheus /var/lib/prometheus/
sudo chown -R prometheus:prometheus /var/log/prometheus/

# Eliminando la basura
rm -rf /tmp/prometheus

prometheus --version
promtool --version

# Si es necesario modifica el archivo de configuración de /etc/prometheus/prometheus.yml

# Creando el servicio
sudo tee /etc/systemd/system/prometheus.service<<EOF
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/docs/introduction/overview/
Wants=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/prometheus/prometheus.yml

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP \$MAINPID
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=0.0.0.0:9090 \
--web.external-url=
SyslogIdentifier=prometheus
Restart=always
pid_file="/var/lib/prometheus/prometheus.pid"
StandardOutput=append:/var/log/prometheus/output.log
StandardError=append:/var/log/prometheus/error.log

[Install]
WantedBy=multi-user.target
EOF

# Liberando el puerto 9090 en el firewall
sudo ufw allow 9090/tcp

# Activando el servicio
sudo systemctl daemon-reload
sudo systemctl enable prometheus --now
sudo systemctl status prometheus

En teoría Prometheus ya está instalado respondiendo en localhost:9090, pero no está recopilando ninguna métrica. Sin embargo, si quieres instalar Prometheus en tu máquina Linux, ella no tiene integración natural para que Prometheus vaya a buscar las métricas. Por eso necesitamos un node exporter. En este caso es el servicio que va a leer el /proc de Linux y disponibilizarlo formateado para que Prometheus recopile.

sudo useradd -M -r -s /bin/false node_exporter
mkdir -p /tmp/node_exporter && cd /tmp/node_exporter
curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest| grep browser_download_url| grep linux-amd64| cut -d '"' -f 4| wget -qi -
tar -xvf node_exporter*.tar.gz
cd node_exporter*/
sudo cp node_exporter /usr/local/bin
node_exporter --version

cat << EOF | sudo tee /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=default.target
EOF

sudo ufw allow 9100

sudo systemctl daemon-reload
sudo systemctl enable node_exporter --now
sudo systemctl status node_exporter.service

Tenemos el node exporter funcionando, pero Prometheus aún no sabe que necesita hacer el scrape para el node exporter. Es necesario modificar la configuración de Prometheus en /etc/prometheus/prometheus.yml.

Necesitamos añadir un job en Prometheus en la etiqueta scrape_config como se muestra a continuación:

...
scrape_configs:
# El nombre del job se añade como etiqueta `job=<job_name>` a cualquier serie temporal scrapeada de esta configuración.
- job_name: 'prometheus'

# metrics_path por defecto es '/metrics'
# scheme por defecto es 'http'.

static_configs:
- targets: ['localhost:9090']

####### Esta parte #######
- job_name: david-pc
static_configs:
- targets: ['localhost:9100']

Ahora reinicia Prometheus para que tome las configuraciones.

sudo systemctl restart prometheus

prometheus targets prometheus search

Instalación docker

Para instalar vía Docker, una vez que ya tenemos un archivo de configuración hecho y un node exporter instalado localmente, podemos solo levantar el servicio en otro puerto para prueba. Pero esta vez necesitamos apuntar la IP, pues localhost no va a funcionar.

# -v path_origen:/etc/prometheus/prometheus.yml
# -p puerto
# Recuerda cambiar el archivo /docs/monitoring/prometheus/resources/prometheus.yml a la ip de tu máquina
docker run \
-p 9091:9090 \
-v /home/dprata/Desktop/personal/study-prometheus//docs/monitoring/prometheus/resources/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

docker

Instalación en Kubernetes

https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

Para Kubernetes vamos a hacer la instalación de Prometheus utilizando Helm con un chart que instala un stack completo de Prometheus con AlertManager y Grafana.

Es necesario tener un cluster Kubernetes y Helm instalado.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

Vamos solo a instalar el estándar sin modificar nada, pues más adelante vamos a configurar mejor esto.

helm install prometheus-stack prometheus-community/kube-prometheus-stack --create-namespace --namespace monitoring

kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-stack-prometheus-node-exporter-mbfkh 1/1 Running 0 34s
prometheus-stack-prometheus-node-exporter-28ct7 1/1 Running 0 34s
prometheus-stack-prometheus-node-exporter-5s75j 1/1 Running 0 34s
prometheus-stack-grafana-bd7d589f-ch6sg 3/3 Running 0 34s
prometheus-stack-kube-prom-operator-947444c9b-vpg4d 1/1 Running 0 34s
prometheus-stack-kube-state-metrics-676cffd69c-tjxgp 1/1 Running 0 34s
alertmanager-prometheus-stack-kube-prom-alertmanager-0 2/2 Running 0 29s
prometheus-prometheus-stack-kube-prom-prometheus-0 2/2 Running 0 29s

Observa que tenemos 3 node exporters, uno para cada nodo del cluster que tengo.

Extras

¿Lectura complementaria de los books?