On iki kurulum

Kendi filonuzu izleyen bir izleme yığını

Prometheus, exporter'lar ve Alertmanager birden çok sitede, özel bir tünel üzerinden çekilir ve disk dolmadan önce tetiklenen uyarılar.

Bu kurulum ne yapar

Kendi özel tüneliniz üzerinden sahip olduğunuz diğer her makineyi tarayan ve bir şey bozulmak üzereyken size e-posta gönderen tek bir küçük örnek. Node metrikleri, siteler arası blackbox sondaları, makul eşiklerle kural uyarıları ve sizi gece üçte dört yüz bildirim göndermek yerine gruplandıran bir Alertmanager yapılandırması.

Bu kurulumda pano yoktur. Panolar hoştur ve izleme değildir; kimsenin bakmadığı bir grafik kimseyi uyandırmamıştır. İsterseniz daha sonra aynı verinin üzerine bir tane ekleyin.

Başlamadan önce

  • Monitör için bir R-4. On beş saniyelik aralıklarla yüz düğüm, dakikada birkaç yüz bin örnek demektir; bunu fark etmeden halleder.
  • Onu filonuzun olmadığı bir yere koyun. İzlediği her şeyle aynı binayı paylaşan herhangi bir monitör, tam da bağırmanız gereken günde takdire şayan bir şekilde sessiz kalır. Avrupa'daysanız, Toronto veya Singapur onun için mantıklı yerlerdir.
  • İzlenen her düğüme, WireGuard rehberinden bir tünel. Dışa aktarıcılar bir makine hakkında çok şey ifşa eder ve genel bir arayüzün yakınında olmamalıdır.

1. İzlenen her düğümde

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 9100

Her düğümün kendi tünel adresini kullanın. Tünele bağlanmak, her şeye bağlanmak yerine, güvenlik duvarını tek savunma değil ikinci savunma hattı yapar.

2. Monitörde

apt install -y prometheus prometheus-alertmanager prometheus-blackbox-exporter

/etc/prometheus/prometheus.yml dosyasını yazın:

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:9115

Statik bir liste yerine dosya tabanlı keşif, ekstra dizine değer. Bir düğüm eklemek tek bir dosya haline gelir ve dosya, makinelerinizi sağlayan herhangi bir araç tarafından yazılabilir. /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 }

Bu etiketler uyarıları daha sonra okunabilir yapan şeydir. db in AMS-01 diyen bir uyarı eyleme geçirilebilir; 10.7.0.12 diyen bir uyarı sizi bir elektronik tabloya gönderir.

3. Sahip olmaya değer kurallar

/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 bu kurulumun işe yaramasını sağlayan kuraldır. Boş alan için bir eşik size diskin dolu olduğunu söyler; altı saatlik bir eğilim ileriye doğru tahmin edildiğinde, bu öğleden sonra saat dört civarında dolu olacağını söyler; bu sakin bir şekilde çözebileceğiniz bir sorundur. Sabit bir yüzdeye dayalı disk uyarıları küçük birimlerde gürültülü veya büyük birimlerde işe yaramaz.

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>"

Engelleme kuralı bir mesaj ile kırk mesaj arasındaki farktır. Bir düğüm kapandığında, o düğümle ilgili her uyarı bastırılır, çünkü zaten biliyorsunuz: düğüm kapalı.

alertname ve site'ye göre gruplama, tüm bir sitenin güç kaybetmesi durumunda her makine için bir e-posta yerine her makineyi listeleyen tek bir e-posta üretir. Bu posta sunucusu, e-posta rehberindeki sunucudur ve uyarı yolunuzun size de izlediğiniz altyapıya bağlı olması bilinen bir takastır; başka bir yerde bir webhook'a işaret eden ikinci bir alıcı ucuz bir sigortadır.

systemctl enable --now prometheus prometheus-alertmanager prometheus-blackbox-exporter

Saklama süresi bilerek ayarlanmaya değer. Yüz düğümün doksan günü, birkaç on gigabayttır:

echo 'ARGS="--storage.tsdb.retention.time=90d --storage.tsdb.retention.size=40GB"' > /etc/default/prometheus
systemctl restart prometheus

Doğrulayın

Önce sözdizimi, çünkü yazım hatası olan bir kurallar dosyası yüklemede sessizce başarısız olur ve olay sırasında fark edersiniz:

promtool check config /etc/prometheus/prometheus.yml
promtool check rules /etc/prometheus/rules/fleet.yml

Ardından her hedefin tarandığını doğrulayın:

curl -s http://127.0.0.1:9090/api/v1/targets | grep -o "\"health\":\"[a-z]*\"" | sort | uniq -c

Her hedef up rapor etmelidir. down rapor eden bir hedef ya bir güvenlik duvarı kuralıdır ya da yanlış adrese bağlanmış bir dışa aktarıcıdır.

Şimdi tüm zincirin çalıştığını kanıtlayan tek test: kasten bir şeyi kırmak. İzlenen herhangi bir düğümde:

systemctl stop prometheus-node-exporter

Üç dakika sonra uyarı beklemede, ardından tetikleniyor olmalıdır. Hareketini izleyin:

curl -s http://127.0.0.1:9090/api/v1/alerts | head -c 400
amtool --alertmanager.url=http://127.0.0.1:9093 alert query

Tetiklenmeden yaklaşık bir dakika sonra e-posta gelir. Uyarı tetiklenir ancak e-posta gelmezse, sorun akıllı ana bilgisayar kimlik bilgileridir ve journalctl -u prometheus-alertmanager bunu açıkça söyleyecektir. Dışa aktarıcıyı yeniden başlatın ve çözülen bildirimi de aldığınızı doğrulayın, çünkü size daha iyi olduğunu söylemeyen bir uyarı sistemi onu görmezden gelmenizi öğretir.

systemctl start prometheus-node-exporter

Sonrasında

Siteler arası blackbox sondaları ekleyin, her siteden diğer her siteye; kendi varlığınızın olay sırasında herhangi bir durum sayfasından çok daha kullanışlı olan bir gecikme matrisini elde edersiniz. Bizimki status adresinde ve looking glass bir rota yanlış göründüğünde sorunun diğer yarısını yanıtlar.

Hazır olduğunda

Bir şehir seç. Bir boyut seç. Kripto ile öde.

Kim olduğunuzla ilgili formlar yok, onay için insan bekleme yok, doğrulama için telefon görüşmesi yok. Ödeme onaylanır ve kimlik bilgileri gelen kutunuza düşer.