اثنا عشر بناءً

حزمة مراقبة تراقب أسطولك الخاص

بروميثيوس، ومصدِّرات، وتنبيهات عبر عدة مواقع، يتم جمعها عبر نفق خاص، مع تنبيهات تعمل قبل امتلاء القرص وليس بعده.

ما يُبنى هنا

مثيل صغير واحد يجمع البيانات من كل جهاز تملكه، عبر نفق خاص، ويرسل لك بريدًا إلكترونيًا عندما يكون هناك شيء على وشك الانهيار. مقاييس العقد، وفحوصات البلَكبوكس بين المواقع، وقواعد تنبيه بعتبات منطقية، وإعداد Alertmanager يجمع الإشعارات بدلاً من أن يرسل لك أربعمئة منها في الثالثة فجرًا.

لا توجد لوحة معلومات في هذا الإعداد. لوحات المعلومات ممتعة، لكنها ليست مراقبة؛ الرسم البياني الذي لا ينظر إليه أحد لم يُوقظ أحدًا أبدًا. أضف واحدة لاحقًا إذا أردتها، فوق نفس البيانات.

قبل أن تبدأ

  • R-4 للمراقب. مئة عقد بفواصل زمنية مدتها خمس عشرة ثانية تعني بضع مئات الآلاف من العينات في الدقيقة، وهذا الجهاز يتعامل معها دون أن يلاحظ.
  • ضعه في مكان ليس فيه أسطولك. أي مراقب يتشارك المبنى مع كل ما يراقبه يظل صامتًا بشكل ملحوظ في اليوم الذي تحتاج فيه إليه أن يصرخ. إذا كانت بنيتك في أوروبا، فتورونتو أو سنغافورة مكان مناسب له.
  • نفق إلى كل عقدة مراقَبة، من دليل WireGuard. المُصدِّرات (Exporters) تكشف الكثير عن الجهاز، ولا مكان لها قرب واجهة عامة.

1. على كل عقدة مراقَبة

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

استبدل بعنوان النفق الخاص بكل عقدة. الربط على النفق بدلاً من الربط على كل شيء يعني أن جدار الحماية هو خط دفاع ثانٍ وليس الوحيد.

2. على المراقب

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

اكتب /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

الاكتشاف المبني على الملفات بدلاً من قائمة ثابتة يستحق الدليل الإضافي. إضافة عقدة تصبح ملفًا واحدًا، ويمكن كتابة الملف بواسطة أي أداة توفّر أجهزتك. /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 }

هذه التصنيفات هي ما يجعل التنبيهات قابلة للقراءة لاحقًا. تنبيه يقول db in AMS-01 قابل للتنفيذ؛ واحد يقول 10.7.0.12 يرسلك إلى جدول بيانات.

3. قواعد تستحق الوجود

/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 هي القاعدة التي تجعل هذا الإعداد يستحق عناءه. عتبة على المساحة الحرة تخبرك أن القرص ممتلئ؛ اتجاه ست ساعات مستقرأ إلى الأمام يخبرك أنه سيكون ممتلئًا حوالي الساعة الرابعة بعد الظهر، وهي مشكلة لا يزال بإمكانك حلها بهدوء. تنبيهات القرص المبنية على نسبة مئوية ثابتة إما مزعجة على وحدات التخزين الصغيرة أو غير مفيدة على الكبيرة.

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

قاعدة الكبح هي الفرق بين رسالة واحدة وأربعين. عندما تتعطل عقدة، يتم كبح كل تحذير حول تلك العقدة، لأنك تعرف بالفعل: العقدة معطلة.

التجميع حسب alertname و site يعني أن انقطاع التيار الكهربائي في موقع بأكمله ينتج بريدًا واحدًا يسرد كل جهاز، بدلاً من بريد واحد لكل جهاز. خادم البريد هذا هو نفسه الموجود في دليل البريد، وكون مسار التنبيه يعتمد على بنية تحتية تراقبها أيضًا مقايضة معروفة؛ مستقبل ثانٍ يشير إلى خطاف ويب في مكان آخر تأمين رخيص.

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

الاحتفاظ بالبيانات يستحق أن يُحدد عمدًا. تسعون يومًا لمئة عقدة تعني بضع عشرات من الغيغابايتات:

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

تحقق من ذلك

القواعد أولاً، لأن ملف قواعد به خطأ إملائي يفشل بصمت عند التحميل وتكتشف ذلك أثناء الحادث:

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

ثم تأكد من أن كل هدف يتم جمعه:

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

يجب أن يبلغ كل هدف عن up. من يبلغ عن down إما قاعدة جدار حماية أو مُصدِّر مرتبط بعنوان خاطئ.

الآن الاختبار الوحيد الذي يثبت أن السلسلة كلها تعمل، وهو كسر شيء ما عن قصد. على أي عقدة مراقَبة:

systemctl stop prometheus-node-exporter

بعد ثلاث دقائق يجب أن يكون التنبيه في حالة انتظار، ثم في حالة إطلاق. شاهد تحركه:

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

خلال حوالي دقيقة من الإطلاق، يصل البريد. إذا أُطلق التنبيه لكن لم يظهر بريد، فالمشكلة في بيانات اعتماد الخادم الوسيط، وjournalctl -u prometheus-alertmanager سيقول ذلك بوضوح. أعد تشغيل المُصدِّر وتأكد من استلامك إشعار الحل أيضًا، لأن نظام تنبيه لا يخبرك أبدًا أن الأمور تحسنت يدربك على تجاهله.

systemctl start prometheus-node-exporter

بعد ذلك

أضف فحوصات بلَكبوكس بين المواقع، من كل موقع إلى كل موقع آخر، وستحصل على مصفوفة زمن انتقال لممتلكاتك الخاصة أكثر فائدة أثناء الحادث من أي صفحة حالة. صفحتنا على الحالة، والمنظار يجيب على النصف الآخر من السؤال عندما يبدو مسار ما خاطئًا.

جاهز عندما تكون

اختر مدينة. اختر الحجم. ادفع بالعملة الرقمية.

لا نماذج عن هويتك، ولا انتظار لموافقة بشرية، ولا مكالمة للتحقق من أي شيء. بمجرد تصفية الفاتورة، تصل بيانات الدخول إلى بريدك الإلكتروني.