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?