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