برای مدیریت اخطار ها در Prometheus از AlertManager استفاده می شود به طوری که اخطار ها را از سمت پرومتئوس می گیرد و کاربر نهایی را از طریق E-mail ، اسلک یا دیگر ابزارها مطلع می سازد. اخطار دهی منجر به این می شود همین که خطایی رخ داد، کاربر از آن مطلع شود.

برای راه اندازی alertmanager به prometheus rule و کانفیگ خود alertmanager نیاز داریم. ابتدا با prometheus rule شرایط ایجاد خطا را مشخص می کنیم که نمونه کانفیگ آن در زیر آورده شده است:
apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: mpaas labels: role: alert-rules spec: groups: - name: mpaas rules: - alert: example annotations: annotation1: example1 annotation2: example2 expr: sum(container_cpu_usage_seconds_total{namespace="cdn-prod"})>0 for: 5m labels: label1: example1 label2: example2
در تنظیمات بالا قسمت های مهم به صورت زیر پیکربندی می شوند:
برای این که هنگام ارسال هشدار توضیحاتی برای مشخص شدن مشکل وجود داشته باشد از این قسمت استفاده می شود و بهتر است محل وقوع خطا و شدت خطا و ... آورده شود.
کویری پرومتئوسی که برای تشخیص خطا به کار می رود.
مدت زمانی که خطا وجود داشته باشد تا هشدار به وجود بیاید.
برای جدا کردن الرت ها از همدیگر زمان ارسال هشدار استفاده می شود برای مثال هشدار با label1: example1 به کاربر ۱ ارسال گردد.
بعد از تمام شدن کانفیگ prometheus rule با استفاده از
kubectl apply -n namespace prometheus-rule.yaml
ریسورس آن ایجاد می شود.
حالا باید برای ارسال هشدار به کاربر alertmanager را پیکریندی کنیم:
config: global: resolve_timeout: 1m route: receiver: 'default-team' group_wait: 30s group_interval: 30s repeat_interval: 1d group_by: [alertname] routes: - receiver: 'team1' group_wait: 10s group_interval: 5m repeat_interval: 4h group_by: [alertname] matchers: - label1=~"example1|example2" active_time_intervals: - offhours - holidays mute_time_intervals: - offhours - holidays continue: true receivers: - name: 'team1' webhook_configs: - url: http://example.com send_resolved: true - name: 'email' email_configs: - to: '[email protected]' from: '[email protected]' smarthost: smtp.gmail.com:587 auth_username: '[email protected]' auth_identity: '[email protected]' auth_password: 'pass'
در کانفیگ بالا route مشخص می کند که هشدار ها با label های مختلف به کدام کاربر ارسال شوند هر کانفیگی که زیر مجموعه route و بالای routes باشد به عنوان تنظیمات پیش فرض انتخاب می شود و در قسمت routes می توان آن ها را overwrite کرد.
مدت زمانی که الرت منیجر بعد از ایجاد هشدار صبر می کند و سپس هشدار را وارد گروه مشخص شده می کند.
اگر هشدار قبلا در گروه وجود داشته مدت زمانی که الرت منیجر بعد از ایجاد هشدار صبر می کند و سپس هشدار را وارد گروه مشخض شده می کند.
اگر هشدار برطرف نشده باشد بعد از این مدت زمان دوباره پیام را ارسال می شود.
در زمان تعریف prometheus rule لیبل هایی برای alert ها می شخص می شوند با استفاده از این لیبل ها می توان تعیین کرد به receiver مورد نظر کدام هشدار ارسال شود.
زمان هایی که ارسال هشدار فعال است را مشخص می کند.
زمان هایی که ارسال هشدار غیر فعال است را مشخص می کند.
تعیین می کند اگر هشدار با receiver اول مطابق شده و هشدار ارسال شد ایا receiver بعدی نیز چک شود.
حال باید receivers تنظیم شوند برای این ها انواع مختلفی وجود دارد که در اینجا دو حالت email و webhook مورد بررسی قرار گرفته است. به عنوان مثال برای کانفیگ Gmail باید اکانت مورد نظر به صورت لاگین دو مرحله ای باشد و از قسمت security > signing whit google مقدار password را کپی کرده و در auth_password قرار دهید. برای راه اندازی سرویس ارسال پیامک با استفاده از webhook باید یک fast api راه اندازی شده و درخواست را از alertmanager گرفته و به سمت سرویس ارسال پیامک ارسال کند و در درخواستی که به سمت fast api ارسال می گردد شماره تلفن به صورت query parameter به صورت زیر داده شود:
url: http://example.com/?phone=09*********
همچین فایل python مورد نیاز برای ارسال درخواست به صورت زیر نوشته می شود:
from ctypes import Union from lib2to3.pgen2 import grammar from lib2to3.pgen2.token import NEWLINE from typing import Optional, Type from fastapi import FastAPI, Query from pydantic import BaseModel import requests from urllib.parse import unquote import urllib.parse import json class Book(BaseModel): version: str #... app = FastAPI() @app.post("/") def req(phone: str,annotations: Annotations): return_list=[] return_list.append(f"alertname : {annotations.alerts[0].get('labels').get('alertname')}") #... temp = "" nl= '\n' temp = f"{nl.join(return_list)}" uri = urllib.parse.quote(temp) url = "https://example?username=user&password=pass&from=from&to=" + phone + "&text=" + uri payload={} headers = { 'example': 'example' } response = requests.request("GET", url, headers=headers, data=payload)
در کد بالا درخواست از سمت alertmanager ارسال می گردد و مقادیر مورد نیاز response body از آن با استفاده از Base model استخراج می شود به عنوان نمونه:
version: str ...
نمونه response body:
{ "version": "4", "groupKey": <string>, // key identifying the group of alerts (e.g. to deduplicate) "truncatedAlerts": <int>, // how many alerts have been truncated due to "max_alerts" "status": "<resolved|firing>", "receiver": <string>, "groupLabels": <object>, "commonLabels": <object>, "commonAnnotations": <object>, "externalURL": <string>, // backlink to the Alertmanager. "alerts": [ { "status": "<resolved|firing>", "labels": <object>, "annotations": <object>, "startsAt": "<rfc3339>", "endsAt": "<rfc3339>", "generatorURL": <string>, // identifies the entity that caused the alert "fingerprint": <string> // fingerprint to identify the alert }, ... ] }
باید در هنگام راه اندازی fast apj مقدار response body الرت منیجر مشاهده شده و بر اساس آن Base mode تعریف شود.
در قسمت return_list مقادیر مورد استخراج شده و به لیست خروجی که به صورت query parameter هست اضافه می شوند
و در اخر براساس سرویس پیامک موجود url ساخته شده و مقادیر user و pass و ... در آن قرار می گیرد و با استفاده از آن یک درخواست get به سمت سرویس پیامکی ارسال می شود