نصب و راه اندازی AlertManager برای Prometheus (همه چیز درباره پرومتئوس و گرافانا – ۲)

نصب و راه اندازی alertmanagerروی prometheus

با نام خدا و سلام، تو آموزش قبلی سعی کردم به طور کامل در مورد پرومتئوس و روش نصب آن و تنظیم کردنش با گرافانا رو آموزش داده باشم، در این قسمت از آموزش به 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

تست :

منابع :