با نام خدا و سلام، تو آموزش قبلی سعی کردم به طور کامل در مورد پرومتئوس و روش نصب آن و تنظیم کردنش با گرافانا رو آموزش داده باشم، در این قسمت از آموزش به AlertManager می پردازیم.
مقدمه
AlertManager به جهت مدیریت اخطار ها در پرومتئوس استفاده می شود به طوری مه اخطار ها را از سمت پرومتئوس می گیرد و کاربر نهایی را از طریق E-mail ، اسلک یا دیگر ابازرها مطلع می سازد. اخطار دهی منجر به این می شود همین که اخطاری رخ داد، کاربر از آن مطلع شود.
معماری AlertManager
در ادامه نمایی از معماری پایه AlertManager و Prometheus را مشاهده می کنید:
قوانین اخطار (Alert rules) در کانفیگ پرومتئوس انجام می شود. پرومتئوس فقط معیار ها را از طریق اپلیکیشن مشتری (مانند Node exporter) بدست می آورد (Scrapeمی کند). بنابراین هر اخطاری که رخ دهد، پرومتئوس فقط آن را به سمت AlertManager می فرستد و کار دیگری ندارد و AlertManager اخطارها را از طریق پایپلاین های silencing, inhibition, grouping و sending out notifications مدیریت می کند. Silencing اخطار را برای زمان داده شده بی صدا می کند. Inhibition برای مهار کردن اخطار به کار می رود اگر سایر هشدارها (اخطار) از قبل ارسال شده باشد.Grouping هشدارهایی که طبیعت یکسانی دارند را در یه گروه، گروه بندی و اطلاع رسانی می کند. کمک به جلوگیری از ارسال چندین اطلاعیه همزمان به گیرنده ای مانند Mailیا Slack می شود.
نصب و راه اندازی AlertManager
تنظیمات پیش رو مبتنی بر معماری ظرح شده در زیر می باشد:
نکته: نصب و راه اندازی پرومتئوس (Prometheus)، Grafana (گرافانا) و Node Exporter قبلا داخل بلاگ با عنوان «نصب و راه اندازی Prometheus و Grafana (همه چیز درباره پرومتئوس و گرافانا – ۱)» آموزش داده شده بود. در نتیجه در این مطلب فقط به نصب AlertManager پرداخته شده است.
در قدم اول نیاز به دانلود آخرین نصب باینری AlertManager از اینجا داریم. الان که من این مطلب رو می نویسم، آخرین نسخه 0.21.0 می باشد.
sudo su cd /opt/ wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz tar -xvzf alertmanager-0.21.0.linux-amd64.tar.gz mv alertmanager-0.21.0.linux-amd64/alertmanager /usr/local/bin/
خب حالا که عملیات نصب رو به راحتی انجام دادید، نوبت به کانفیگ کردن AlertManager رسیده است.
ابتدا قوانین را باید تعریف کنیم:
برای این منظور فایلی با عنوان alert.rules.yml
می سازیم:
sudo nano /etc/prometheus/alert.rules.yml
محتویات فایل ایجاد شده را برابر زیر قرار می دهیم:
groups: - name: Disk-usage rules: - alert: 'Low data disk space' expr: ceil(((node_filesystem_size_bytes{mountpoint!="/boot"} - node_filesystem_free_bytes{mountpoint!="/boot"}) / node_filesystem_size_bytes{mountpoint!="/boot"} * 100)) > 95 labels: severity: 'critical' annotations: title: "Disk Usage" description: 'Partition : {{$labels.mountpoint}}' summary: "Disk usage is `{{humanize $value}}%`" host: "{{$labels.instance}}" - name: Memory-usage rules: - alert: 'High memory usage' expr: ceil((((node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / node_memory_MemTotal_bytes) * 100)) > 80 labels: severity: 'critical' annotations: title: "Memory Usage" description: 'Memory usage threshold set to `80%`.' summary: "Memory usage is `{{humanize $value}}%`" host: "{{$labels.instance}}" - name: AllInstances rules: - alert: InstanceDown # Condition for alerting expr: up == 0 for: 1m # Annotation - additional informational labels to store more information annotations: title: 'Instance {{ $labels.instance }} down' description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute.' # Labels - additional labels to be attached to the alert labels: severity: 'critical'
همانطور که در فایل بالا مشاهده می کنید، Disk-usage، هرگاه به بیش از ۹۵ درصد برسد اخطار اعلام خواهد شد و دو مورد دیگه نیز برای Memory-usage در صورت بیش از ۸۰ درصد و AllInstances برای حالتی است که در کمتر از یک دقیقه سه مرتبه یک instance فراخوانی شود.
پس از ساخت فایل قوانین نوبت به کامپایل آنها می رسد، از دستور زیر برای این منظور استفاده کنید:
promtool check rules alert.rules.yml
فایل کانفیگ با نام alertmanager.yml می باشد، که ما خودمون فایل کانفیگ خودمون رو می سازیم:
mkdir /etc/alertmanager/ sudo nano /etc/alertmanager/alertmanager.yml
حال داخل فایل ساخته شده متن زیر را قرار دهید:
global: # The directory from which notification templates are read. templates: - '/etc/alertmanager/template/*.tmpl' # The root route on which each incoming alert enters. route: # The labels by which incoming alerts are grouped together. For example, # multiple alerts coming in for cluster=A and alertname=LatencyHigh would # be batched into a single group. group_by: ['alertname', 'cluster', 'service'] # When a new group of alerts is created by an incoming alert, wait at # least 'group_wait' to send the initial notification. # This way ensures that you get multiple alerts for the same group that start # firing shortly after another are batched together on the first # notification. group_wait: 3s # When the first notification was sent, wait 'group_interval' to send a batch # of new alerts that started firing for that group. group_interval: 5s # If an alert has successfully been sent, wait 'repeat_interval' to # resend them. repeat_interval: 1m # A default receiver receiver: mail-receiver # All the above attributes are inherited by all child routes and can # overwritten on each. # The child route trees. routes: - match: service: node receiver: mail-receiver routes: - match: severity: critical receiver: critical-mail-receiver # This route handles all alerts coming from a database service. If there's # no team to handle it, it defaults to the DB team. - match: service: database receiver: mail-receiver routes: - match: severity: critical receiver: critical-mail-receiver receivers: - name: 'mail-receiver' slack_configs: - api_url: https://hooks.slack.com/services/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 channel: '#prom-alert' - name: 'critical-mail-receiver' slack_configs: - api_url: https://hooks.slack.com/services/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 channel: '#prom-alert'
تنظیمات اسلک – slack برای AlertManager:
داخل Slack به این آدرس بروید:
Slack -> Administration -> Manage apps.
از قسمت Search عبارت Incoming WebHooks را جستجو کنید.
ابتدا Add to Slack را بزنید و سپس مشخص کنید که میخولهید به چخ channel وصل شوید و notification ها را از alertManager بگیرید.
در انتها یک Webhook URL برای شما می سازد و آن را داخل فایل alertmanager.yml که بالاتر ساختیم برای slack_api_url قرار دهید. و همچنین اسم channelمورد نظر که Webhookرا روی ان فعال کرده اید.
حال نوبت به ساخت سرویس AlertManager در Systemd رسید:
nano /etc/systemd/system/alertmanager.service
محتویات رابرابر زیر قرار دهید:
[Unit] Description=AlertManager Server Service Wants=network-online.target After=network-online.target [Service] User=root Group=root Type=simple ExecStart=/usr/local/bin/alertmanager --config.file /etc/alertmanager/alertmanager.yml --storage.tsdb.path /var/lib/alertmanager [Install] WantedBy=multi-user.target
ساخت template:
داخل فایل alertmanager.yml خط ۵ و ۶ به صورت زیر است که آدرس فایل های تمپلیت را نشان می دهد، برای همین منظور، جهت تعریف فایل template در همین آدرس فایلی با فرمت tpmlمی سازیم، که پایین نمونه فایل تمپلیت وجود دارد:
templates: - '/etc/alertmanager/template/*.tmpl'
alert.tpml
{{ define "email" }} <html> <head> <style type="text/css"> table { font-family: verdana,arial,sans-serif; font-size:11px; color:#333333; border-width: 1px; border-color: #999999; border-collapse: collapse; } table th { background-color:#ff6961; border-width: 1px; padding: 8px; border-style: solid; border-color: #F54C44; } table td { border-width: 1px; padding: 8px; border-style: solid; border-color: #F54C44; text-align: right; } </style> </head> <body> <table border=1> <thead> <tr> <th>Alert name</th> <th>Host</th> <th>Summary</th> <th>Description</th> </tr> </thead> <tbody> {{ range .Alerts }} <tr> <td>{{ .Labels.alertname }}</td> <td>{{ .Annotations.host }}</td> <td>{{ .Annotations.summary }}</td> <td>{{ .Annotations.description }}</td> </tr> {{ end }} </tbody> </table> </body> </html> {{end}}
همه چیز آماده است، دو دستور زیر را اجرا کنید:
sudo systemctl start alertmanager sudo systemctl restart prometheus
ارسال پاسخ