Apa yang dibangun
Satu instance kecil yang memindai setiap mesin lain yang Anda miliki, melalui tunnel pribadi, dan mengirim email kepada Anda ketika ada sesuatu yang akan rusak. Metrik node, probe blackbox antar situs, aturan alert dengan ambang batas yang masuk akal, dan konfigurasi Alertmanager yang mengelompokkan notifikasi alih-alih mengirim empat ratus notifikasi kepada Anda pada pukul tiga pagi.
Tidak ada dashboard dalam build ini. Dashboard itu menyenangkan dan bukan monitoring; grafik yang tidak dilihat siapa pun tidak akan pernah membangunkan siapa pun. Tambahkan satu nanti jika Anda mau, di atas data yang sama.
Sebelum memulai
- Sebuah R-4 untuk monitor. Seratus node dengan interval lima belas detik berarti beberapa ratus ribu sampel per menit, yang dapat ditangani tanpa terasa.
- Letakkan di tempat yang berbeda dari fleet Anda. Monitor mana pun yang berbagi gedung dengan semua yang dipantaunya akan tetap diam pada hari yang sama persis ketika Anda membutuhkannya untuk berteriak. Jika estate Anda di Eropa, Toronto atau Singapura adalah tempat yang tepat untuk itu.
- Tunnel ke setiap node yang dipantau, dari panduan WireGuard. Exporter mengekspos banyak hal tentang mesin dan tidak seharusnya berada di dekat antarmuka publik.
1. Pada setiap node yang dipantau
apt update && apt install -y prometheus-node-exporter
mkdir -p /etc/systemd/system/prometheus-node-exporter.service.d
cat > /etc/systemd/system/prometheus-node-exporter.service.d/bind.conf <<EOF
[Service]
Environment=ARGS=--web.listen-address=10.7.0.11:9100 --collector.systemd --collector.processes
EOF
systemctl daemon-reload && systemctl restart prometheus-node-exporter
ss -ltn | grep 9100Ganti dengan alamat tunnel masing-masing node. Mengikat ke tunnel alih-alih ke segala sesuatu berarti firewall adalah lini pertahanan kedua, bukan satu-satunya.
2. Pada monitor
apt install -y prometheus prometheus-alertmanager prometheus-blackbox-exporterTulis /etc/prometheus/prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
fleet: main
alerting:
alertmanagers:
- static_configs:
- targets: ['127.0.0.1:9093']
rule_files:
- /etc/prometheus/rules/*.yml
scrape_configs:
- job_name: nodes
file_sd_configs:
- files: ['/etc/prometheus/targets/*.yml']
- job_name: probe_https
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://app.example.com/health
- https://cloud.example.com/status.php
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115Discovery berbasis file daripada daftar statis sepadan dengan direktori tambahan. Menambahkan node menjadi satu file, dan file tersebut dapat ditulis oleh apa pun yang menyediakan mesin Anda. /etc/prometheus/targets/ams.yml:
- targets: ['10.7.0.11:9100']
labels: { site: AMS-01, role: web }
- targets: ['10.7.0.12:9100']
labels: { site: AMS-01, role: db }Label-label itu yang membuat alert mudah dibaca nanti. Alert yang mengatakan db in AMS-01 dapat ditindaklanjuti; yang mengatakan 10.7.0.12 mengirim Anda ke spreadsheet.
3. Aturan yang layak dimiliki
/etc/prometheus/rules/fleet.yml:
groups:
- name: fleet
rules:
- alert: NodeDown
expr: up{job="nodes"} == 0
for: 3m
labels: { severity: page }
annotations:
summary: "{{ $labels.instance }} in {{ $labels.site }} stopped answering"
- alert: DiskFillingUp
expr: predict_linear(node_filesystem_avail_bytes{fstype=~"ext4|xfs|zfs|btrfs"}[6h], 4*3600) < 0
for: 30m
labels: { severity: page }
annotations:
summary: "{{ $labels.instance }} fills {{ $labels.mountpoint }} within four hours"
- alert: MemoryPressure
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.10
for: 15m
labels: { severity: warn }
- alert: IOWaitHigh
expr: avg by (instance) (rate(node_cpu_seconds_total{mode="iowait"}[5m])) > 0.25
for: 20m
labels: { severity: warn }
- alert: CertificateExpiring
expr: probe_ssl_earliest_cert_expiry - time() < 10*86400
labels: { severity: warn }
- alert: ProbeFailing
expr: probe_success == 0
for: 5m
labels: { severity: page }predict_linear adalah aturan yang membuat build ini bermanfaat. Ambang batas pada ruang kosong memberi tahu Anda bahwa disk penuh; tren enam jam yang diekstrapolasi ke depan memberi tahu Anda bahwa disk akan penuh sekitar pukul empat sore ini, yang merupakan masalah yang masih bisa Anda selesaikan dengan tenang. Alert disk berdasarkan persentase tetap berisik pada volume kecil atau tidak berguna pada volume besar.
4. Alertmanager
route:
receiver: mail
group_by: [alertname, site]
group_wait: 45s
group_interval: 5m
repeat_interval: 12h
routes:
- matchers: [severity="warn"]
repeat_interval: 72h
inhibit_rules:
- source_matchers: [alertname="NodeDown"]
target_matchers: [severity="warn"]
equal: [instance]
receivers:
- name: mail
email_configs:
- to: [email protected]
from: [email protected]
smarthost: mail.example.com:587
auth_username: [email protected]
auth_password: "<the mailbox password>"Aturan inhibit adalah perbedaan antara satu pesan dan empat puluh. Ketika sebuah node mati, setiap peringatan tentang node tersebut ditekan, karena Anda sudah tahu: node nya mati.
Pengelompokan berdasarkan alertname dan site berarti seluruh situs yang kehilangan daya menghasilkan satu email yang mendaftar setiap mesin, bukan satu email per mesin. Server email itu adalah yang dari panduan email, dan memiliki jalur alerting yang bergantung pada infrastruktur yang juga Anda pantau adalah trade yang diketahui; receiver kedua yang menunjuk ke webhook di tempat lain adalah asuransi murah.
systemctl enable --now prometheus prometheus-alertmanager prometheus-blackbox-exporterRetensi layak diatur dengan sengaja. Sembilan puluh hari dari seratus node adalah beberapa puluh gigabyte:
echo 'ARGS="--storage.tsdb.retention.time=90d --storage.tsdb.retention.size=40GB"' > /etc/default/prometheus
systemctl restart prometheusVerifikasi
Sintaks dulu, karena file aturan dengan typo gagal diam-diam saat dimuat dan Anda menemukannya selama insiden:
promtool check config /etc/prometheus/prometheus.yml
promtool check rules /etc/prometheus/rules/fleet.ymlKemudian pastikan setiap target sedang di-scrape:
curl -s http://127.0.0.1:9090/api/v1/targets | grep -o "\"health\":\"[a-z]*\"" | sort | uniq -cSetiap target harus melaporkan up. Yang melaporkan down adalah aturan firewall atau exporter yang terikat pada alamat yang salah.
Sekarang satu-satunya tes yang membuktikan seluruh rantai berfungsi, yaitu dengan sengaja merusak sesuatu. Pada node yang dipantau mana pun:
systemctl stop prometheus-node-exporterTiga menit kemudian alert harus berstatus pending, lalu firing. Pantau pergerakannya:
curl -s http://127.0.0.1:9090/api/v1/alerts | head -c 400
amtool --alertmanager.url=http://127.0.0.1:9093 alert queryDalam waktu sekitar satu menit setelah firing, email datang. Jika alert menyala tetapi tidak ada email yang muncul, masalahnya adalah kredensial smarthost, dan journalctl -u prometheus-alertmanager akan mengatakannya dengan jelas. Nyalakan exporter lagi dan pastikan Anda juga menerima notifikasi resolved, karena sistem alerting yang tidak pernah memberi tahu Anda bahwa semuanya baik-baik saja akan melatih Anda untuk mengabaikannya.
systemctl start prometheus-node-exporterSetelahnya
Tambahkan probe blackbox antar situs, dari setiap situs ke setiap situs lainnya, dan Anda mendapatkan matriks latensi dari estate Anda sendiri yang jauh lebih berguna selama insiden daripada halaman status mana pun. Punya kami di status, dan looking glass menjawab separuh pertanyaan lainnya ketika rute terlihat salah.