Prometheus - Monitoring Tool - Centos7
Installazione di Prometheus Alertmonitor Grafana Node-exporter con docker come servizio e cartelle montate localmente per mantenere le configurazioni ed i dati dei servizi. La configurazione comprende anche l'uso di Telegram per le notificheAzioni
- Prerequisiti (Docker Docker-Composer)
- Installazione immagini (Docker Pull)
- Configurazione avvio immagini
- Configurazione servizi
- Configurazione avvio servizi
- Test (configurazione ed architettura)
Prerequisiti
- docker
- docker-compose
Riferimenti
installazione e configurazione di sistema- https://www.digitalocean.com/community/tutorials/how-to-install-prometheus-using-docker-on-centos-7
- http://www.tutorialspoint.com/articles/how-to-install-and-configure-prometheus-using-docker-on-centos-7
- https://www.shellhacks.com/prometheus-monitoring-install-docker-ubuntu-centos/
- https://awesome-prometheus-alerts.grep.to/rules.html
- https://www.fabernovel.com/en/engineering/alerting-in-prometheus-or-how-i-can-sleep-well-at-night
- https://www.robustperception.io/irate-graphs-are-better-graphs
- https://sudonull.com/posts/194-Prometheus-Grafana-Node-Exporter-Docker-in-Azure-with-notifications-in-Telegram
Installazione immagini Docker
$ sudo docker pull prom/prometheus
$ sudo docker pull prom/alertmanager
$ sudo docker pull prom/node-exporter
$ sudo docker pull google/cadvisor # TODO
$ sudo docker pull grafana/grafana
$ sudo docker pull metalmatze/alertmanager-bot
Configurazioni permessi sulle cartelle
Sono le cartelle che conterranno le configurazioni dei vari servizi in maniera permanente anche con un riavvio di Docker# prometheus folder settings
$ mkdir /dati/prometheus/data
$ sudo chown 65534:65534 /dati/prometheus/data
# grafana folder setting
$ /dati/grafana
$ id # get the $uid number
$ sudo shown $uid:$uid /dati/grafana/
# alertmanager-bot Telegram
$ mkdir /dati/prometheus/alertmanager-bot
Configurazione Prometheus
E' configurato per raccogliere i dati da diverse sorgenti (scrape_configs)/dati/prometheus/conf/prometheus.yml
global:
scrape_interval: 15s
external_labels:
monitor: 'codelab-monitor'
# configurazione degli alert
rule_files:
- 'alert.rules.yml'
alerting:
alertmanagers:
- scheme: http
static_configs:
- targets:
- "HOST_ALERT_MANAGER:9093"
scrape_configs:
# sorgenti da cui recupera le metriche
# controlla se stesso
- job_name: 'prometheus-service'
scrape_interval: 5s
static_configs:
- targets: ['IP_HOST_LOCALE:9090']
# controlla una applicazione NodeJS in con swagger
- job_name: 'swagger-SRS'
scrape_interval: '10s'
metrics_path: '/swagger-stats/metrics'
static_configs:
- targets: ['IP_NODE_SERVER:8010']
# controlla l'host locale
- job_name: 'localhost-stats'
scrape_interval: '20s'
static_configs:
- targets: ['IP_HOST_LOCALE:9100']
# controlla grafana TODO
Configurazione regole alerts in Prometheus
Sono configurati due alert standard. Il primo si aziona se qualsiasi sorgente non è up per più di 30 sec. Il secondo se il carico dell'host supera 0.5/dati/prometheus/alert.rules.yml
groups:
- name: example
rules:
# Alert for any instance that is unreachable for >2 minutes.
- alert: service_down
expr: up == 0
for: 30s
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 2 minutes."
- alert: high_load
expr: node_load1 > 0.5
for: 2m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} under high load"
description: "{{ $labels.instance }} of job {{ $labels.job }} is under high load."
# Alert too many 500 api error on rate
- alert: SRSHttpErrors5xx
expr: sum(rate(api_request_total{code=~"^5.."}[1m])) / sum(rate(api_request_total[1m])) * 100 > 5
for: 30s
labels:
severity: error
annotations:
summary: "HTTP errors 5xx (instance {{ $labels.instance }}) for 30 sec."
description: "Too many HTTP requests with status 5xx (> 5%)\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
Configurazione AlertManager
Per tutti gli alert è configurato un unico destinatario via email o Telegramglobal:
smtp_smarthost: 'smtp.__.__.it:25'
smtp_from: 'alertmanager@:__.__.it'
smtp_require_tls: false
route:
group_by: ['alertname','priority','example']
# Send all notifications to me.
receiver: email-me
group_wait: 30s
group_interval: 5m
repeat_interval: 10m
routes:
- receiver: "email-me"
group_wait: 10s
match_re:
severity: error|warning
continue: true
- receiver: "alertmanager-bot"
group_wait: 10s
match_re:
severity: error
continue: true
receivers:
- name: email-me
email_configs:
- to: alert.destination@__.__.it
- name: alertmanager-bot
webhook_configs:
- send_resolved: true
url: 'http://hostname.it:8088'
Configurazione Docker compose per avvio servizi
Viene configurato l'avvio dei vari container docker con il mount delle cartelle. Per Grafana sono impostati diversi parametri di avvio./dati/prometheus/docker-compose.yml
version: '3'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- /dati/prometheus/conf:/etc/prometheus
- /dati/prometheus/data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
ports:
- '9090:9090'
# restart: always
node-exporter:
container_name: prometheus-node-exporter
image: prom/node-exporter
ports:
- '9100:9100'
alertmanager:
container_name: prometheus-alertmanager
image: prom/alertmanager
volumes:
- /dati/prometheus/conf/alertmanager.yml:/alertmanager.yml
command:
- '--config.file=/alertmanager.yml'
ports:
- '9093:9093'
grafana:
container_name: grafana-service
image: grafana/grafana
user: # $uid es: '140'
volumes:
- /dati/grafana:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=password
- https_proxy=https://proxy.__.__.it:8080
- http_proxy=http://proxy.__.__.it:8080
- GF_SMTP_ENABLED=true
- GF_SMTP_HOST=smtp.__.__.it:25
- GF_SMTP_FROM_ADDRESS=grafana-alert@__.__.it
ports:
- '3000:3000'
# TODO google/cadvisor
# telegram bot alert
alertmanager-bot:
image: metalmatze/alertmanager-bot
environment:
- ALERTMANAGER_URL=http://hostname:9093
- https_proxy=http://proxy._._.it:8080
- http_proxy=http://proxy._._.it:8080
- LISTEN_ADDR=0.0.0.0:8088
- BOLT_PATH=/data/bot.db
- STORE=bolt
- TELEGRAM_ADMIN=99999
- TELEGRAM_TOKEN=999999:QQ__QQ
- TEMPLATE_PATHS=/templates/default.tmpl
volumes:
- /dati/prometheus/alertmanager-bot:/data
ports:
- '8088:8088'
Per verificare che il file sia correttamente digitato eseguire:$ docker-compose up -d
Configurazione come servizio di sistema
/etc/systemd/system/prometheus.service[Unit]
Description=Prometheus monitoring docker container
After=docker.service
BindsTo=docker.service
[Service]
Restart=always
WorkingDirectory=/dati/prometheus/
# Ubuntu
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
# CentOS
#ExecStart=/usr/bin/docker-compose up
#ExecStop=/usr/bin/docker-compose down
[Install]
WantedBy=multi-user.target
Impostazione e controllo funzionamento come servizio di sistema ed analisi avvio# impostazione
$ sudo systemctl daemon-reload
$ sudo systemctl enable prometheus
# controllo servizi
$ sudo systemctl start prometheus
$ sudo systemctl stop prometheus
$ sudo systemctl restart prometheus
Analisi avvio dei container docker (esempio)# lista dei container
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1abc1e837fa3 prom/node-exporter "/bin/node_exporter" About a minute ago Up About a minute 0.0.0.0:9100->9100/tcp prometheus-node-exporter
becfde05313f prom/prometheus:latest "/bin/prometheus -..." About a minute ago Up About a minute 0.0.0.0:9090->9090/tcp prometheus
53b3323e7d52 prom/alertmanager "/bin/alertmanager..." About a minute ago Up About a minute 0.0.0.0:9093->9093/tcp prometheus-alertmanager
75e610620c07 prom/prometheus "/bin/prometheus -..." 25 hours ago Exited (2) 25 hours ago
# ATTENZIONE il container 75e610620c07 è in stato "Exited" i logs sono da verificare
$ sudo docker logs 75e610620c07
Configurazione Grafana
TODO - TODO
Ambiente a runtime
Console Prometheus- http://IP_HOST:9090
- http://IP_HOST:9093
- http://IP_HOST:9100
- http://IP_HOST:3000
Tutorial per PromQL per creazioni alert (note rate e irate)
Regola "too many 5xx error" legata ad una finestra temporale# rapporto fra il "burst" delle chiamate con errore (5xx) e le chiamate totali
# l'alert si attiva se la % è maggiore di 5 (ovvero se gli numero di errori
# sono più del 5% delle chiamate totali nell'ultimo minuto
sum(rate(api_request_total{code=~"^5.."}[1m])) / sum(rate(api_request_total[1m])) * 100 > 5
rate() ritorna per secondo la media del cambiamento sul tuo intervallo usando il primo e l'ultimo punto dell'intervallo qualsiasi esso sia e qualsiasi timestamp abbia, può nascondere degli spikes (picchi di attività)Suggerimento : intervallo minimo è doppio di quello si scrape ad esempio
irate() come rate() ma è calcolato sugli ultimi due data point
scrape : 20sec interval : 1mSidebar: The minimum range interval versus the minimum query step Suppose that you have a continuously updating metric that Prometheus scrapes every fifteen seconds. To do a rate() or irate() of this, you need at least two metric points and thus a range interval of thirty seconds (at least; in practice you need a somewhat larger interval). However, you get a new metric value roughly every fifteen seconds and thus a potentially new rate of change every fifteen seconds as well (due to your new metric point). This means it's reasonable to look at a graph with a query step of fifteen seconds and an interval of thirty seconds.
FINE DOCUMENTO
Comments