Monitoring pomocí Grafana + Loki + Prometheus
Instalace
Server (ten, který sbírá data)
Prometheus
V případě Debianu a jemu podobných stačí nainstalovat balíček prometheus:
apt -y update
apt -y install prometheus
Nastavení se nachází na dvou místech:
-
/etc/default/prometheus=> Nastavení jak se má server spouštět. Já doARGSdoplnil--storage.tsdb.retention.time=90d, aby se mi uchovávalo "pouze"90dní dat. -
/etc/prometheus/prometheus.yml=> Nastavení collectoru, sběrače dat. Zde nastavujeme odkud chceme tahat metriky a jaké.
prometheus.yml
V základu používám node_exporter na Linux a Windows s touto konfigurací. Data sbírám každou minutu, monitoruji i sám sebe a to každou minutu. Každou minutu také zpracovávám pravidla (které tady žádné nemám), alertmanager vystavuji na portu 9093 a adresy serverů ukládám do labelu instance.
# Sample config for Prometheus.
global:
scrape_interval: 1m # Set the scrape interval. Default is every 1 minute.
evaluation_interval: 1m # Evaluate rules every x seconds. The default is every 1 minute.
scrape_timeout: 30s # scrape_timeout. Global default is (10s).
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'promgraf'
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
- job_name: 'linux_nodes'
metrics_path: /metrics
static_configs:
- targets:
- localhost:9100
- mujlinux.bali.cz
relabel_configs:
- source_labels: [__address__]
regex: (.*):(9100)
target_label: instance
replacement: '${1}'
- job_name: 'windows_nodes'
metrics_path: /metrics
static_configs:
- targets:
- mojewidle.bali.cz:9100
relabel_configs:
- source_labels: [__address__]
regex: (.*):(9100)
target_label: instance
replacement: '${1}'
No.. a aby nám to celé fungovalo tak ještě potřebuji aby se Prometheus dostal ke klientům. nftables pravidlo vypadá takto:
#!/usr/sbin/nft -f
table inet filter {
chain OUTPUT {
tcp dport 9100 accept comment "Allow connection to prometheus exporter targets - OUT"
}
}
Grafana + Loki
Grafanu a Lokiho instalujeme z repozitářů grafany dle našeho systému.
Pro Debian Linux potřebuji přidat repozitář s gpg klíčem a poté mohu instalovat:
echo 'deb https://apt.grafana.com stable main' | sudo tee /etc/apt/sources.list.d/grafana-oss.list
curl https://apt.grafana.com/gpg.key | gpg --dearmor > /etc/apt/trusted.gpg.d/grafana.gpg
apt -y update
apt -y install grafana loki
Grafana
Grafana má konfiguraci v /etc/grafana. Přistupujeme na <adresu serveru>:3001, takže např.: http://10.66.0.81:3100. Výchozí login je admin / admin.
Provisioned datasources
Grafaně dokážeme přednastavit zdroje dat pomocí yaml konfiguračních souborů. V následujících ukázkových souborech nastavuji Prometheus a Loki jako zdroje dat běžící na stejném serveru jako Grafana (localhost).
Prometheus
# Configuration file version
apiVersion: 1
# Localhost loki datasource
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://localhost:9090
isDefault: true
jsonData:
timeInterval: 60s
timeout: 60
Loki
# Configuration file version
apiVersion: 1
# Localhost loki datasource
datasources:
- name: Loki
type: loki
access: proxy
url: http://localhost:3100
jsonData:
timeout: 60
maxLines: 5000
Loki
Loki má konfiguraci v /etc/loki/config.yml. Má základní konfigurace:
- Poslouchá na portu
3100 - Ukládá data do
/var/lib/loki - Odstraňuje data starší
90 dníauth_enabled: false server: http_listen_port: 3100 grpc_listen_port: 9096 log_level: warn grpc_server_max_concurrent_streams: 2000 common: instance_addr: 127.0.0.1 path_prefix: /var/lib/loki storage: filesystem: chunks_directory: /var/lib/loki/chunks rules_directory: /var/lib/loki/rules replication_factor: 1 ring: kvstore: store: inmemory query_range: results_cache: cache: embedded_cache: enabled: true max_size_mb: 2048 limits_config: metric_aggregation_enabled: true max_query_lookback: 2160h #90d retention_period: 2160h #90d compactor: working_directory: /tmp/loki/retention retention_enabled: true retention_delete_delay: 24h delete_request_store: filesystem schema_config: configs: - from: 2020-10-24 store: tsdb object_store: filesystem schema: v13 index: prefix: index_ period: 24h pattern_ingester: enabled: true metric_aggregation: loki_address: localhost:3100 ruler: alertmanager_url: http://localhost:9093 frontend: encoding: protobuf
⚠️ Před Lokiho je potřeba přidat proxy s autentizací protože sám Loki tuto vrstvu nemá (viz Grafana docs). Základní zabezpečení pomocí
nginxje popsáno zde. Mimo jiné je možné si jej alespoň v rámci interní sítě omezit pomocí firewallu:#!/usr/sbin/nft -f table inet filter { chain INPUT { ip saddr 10.66.0.0/24 tcp dport 3100 accept comment "Allow Loki target from my services subnet - IN" } }
Klient (monitorovaný server)
Prometheus
Balíčky Promethea jsou u Debianu a z něj vycházejících distribucí většinou přímo v repozitářích. Základem je node_exporter který nám exportuje základní údaje o stavu operačního systému (packages.debian.org)
apt -y update
apt -y install prometheus-node-exporter
V případě používání nftables je potřeba vytvořit příchozí pravidlo pro port 9100 aby si mohl Prometheus vyzvedávat metriky.
Příklad, ve kterém je 10.66.0.81 náš Prometheus collector (server který sbírá data a jmenuje se promgraf dle komentáře pravidla).
#!/usr/sbin/nft -f
table inet filter {
chain INPUT {
ip saddr 10.66.0.81 tcp dport 9100 accept comment "Allow Prometheus metrics access from promgraf - IN"
}
Alloy
Linux
TBD ;-)
Windows
TBD ;-)