Dua belas build

Tumpukan pemantauan yang mengawasi armada Anda sendiri

Prometheus, exporter, dan Alertmanager di beberapa situs, dikeruk melalui tunnel pribadi, dengan alert yang menyala sebelum disk penuh daripada setelahnya.

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 9100

Ganti 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-exporter

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

Discovery 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-exporter

Retensi 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 prometheus

Verifikasi

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.yml

Kemudian pastikan setiap target sedang di-scrape:

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

Setiap 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-exporter

Tiga 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 query

Dalam 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-exporter

Setelahnya

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.

Siap saat Anda siap

Pilih kota. Pilih ukuran. Bayar dengan koin.

Tanpa formulir tentang siapa Anda, tanpa menunggu manusia untuk menyetujui, tanpa panggilan telepon untuk memverifikasi apa pun. Invoice dibersihkan dan kredensial masuk ke kotak masuk Anda.