Настройка связки grafana+prometheus с уведомлениями в telegram

Prometheus-operator (на текущий момент проект называется kube-prometheus-stack) позволяет из коробки получить базово настроенный мониторинг кластера kubernetes на основе популярной связки prometheus+grafana.

К сожалению, для решения реальных задач настроек по умолчанию недостаточно, ведь может понадобиться подключать к мониторингу дополнительные объекты, создавать кастомные уведомления, настраивать отправку уведомлений в мессенджер. Рассмотрим пример базовой конфигурации prometheus-operator, позволяющей решать эти задачи.

Создаем папку prometheus-operator, которая будет содержать наши кастомные values-prod.yaml для helm-чарта и папку с манифестами telegram-alertmanager, решения, используемого в качестве “посредника” для отправки алертов в telegram.

Нужна помощь? Настройки grafana, prometheus мы осуществляем в рамках услуги DevOps-аутсорсинг. Также возможны разовые проектные работы.

Содержимое папки telegram-alertmanager. Манифест Telegram-alertmanager.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
   name: telegram-alertmanager
   namespace: prometheus-operator
   labels:
     app: telegram
spec:
   template:
     metadata:
       name: telegram-alertmanager
       labels:
         app: telegram
     spec:
       containers:
         - name: telegram-alertmanager
           image: janwh/alertmanager-telegram
           ports:
             - containerPort: 8080
           env:
             - name: TELEGRAM_CHAT_ID
               value: "-5842051ХХ"
             - name: TELEGRAM_TOKEN
               value: "1457321396:AAGB8bUYwY8yGZchAiitrHOpUYb_7YuХХХХ"
   replicas: 1
   selector:
     matchLabels:
       app: telegram

В указанном выше манифесте необходимо поменять параметры namespace, telegram_chat_id и telegram_token, указав свои значения.

Манифест service-telegram.yaml:

apiVersion: v1
kind: Service
metadata:
 labels:
   app: telegram
 name: telegram-alertmanager
 namespace: prometheus-operator
spec:
 type: ClusterIP
 selector:
   app: telegram
 ports:
   - protocol: TCP
     port: 8080

Создадим yaml-файл со значениями параметров нашего prometheus-operatora:

additionalPrometheusRules:
 - name: my-rule-file
   groups:
     - name: test
       rules:
         - alert: HaproxyServerDown
           expr: haproxy_server_up != 0
           for: 0m
           labels:
             severity: critical
           annotations:
             summary: HAProxy server down (instance {{ $labels.instance }})
         #              description: HAProxy server is down\n  VALUE = {{ $value }}\n  LABELS: { { $labels } }

         - alert: NodeNetworkInterfaceFlapping
           expr: changes(node_network_up{device!~"veth.+",job="node-exporter"}[2m])> 2
           for: 2m
           labels:
             severity: warning
           annotations:
             message: Network interface "{{ $labels.device }}" changing it's up status often on node-exporter {{ $labels.namespace }}/{{ $labels.pod }}"

alertmanager:
 config:
   global:
     resolve_timeout: 5m
   route:
     group_by: ['alertname', 'instance', 'job']
     group_wait: 30s
     group_interval: 5m
     repeat_interval: 12h
     receiver: 'null'
     routes:
       - match:
           alertname: Watchdog
         receiver: 'telegram'
         continue: true
       - match_re:
           severity: ^(none|warning|critical)$
         receiver: 'telegram'
   receivers:
     - name: 'telegram'
       webhook_configs:
         - url: 'http://telegram-alertmanager:8080/alerts'
           send_resolved: true
     - name: 'null'

 ingress:
   enabled: true
   annotations:
     kubernetes.io/ingress.class: nginx
     external-dns.alpha.kubernetes.io/target: "monitoring.dom"
   hosts:
     - alertmanager.dom
   paths:
     - /

grafana:
 enabled: true
 namespaceOverride: ""
 defaultDashboardsEnabled: true
 adminPassword: prom-operator
 ingress:
   enabled: true
   annotations:
     kubernetes.io/ingress.class: "nginx"
     external-dns.alpha.kubernetes.io/target: "monitoring.dom"
   hosts:
     - grafana.dom

prometheus:
 ingress:
   enabled: true
   annotations:
     kubernetes.io/ingress.class: "nginx"
     external-dns.alpha.kubernetes.io/target: "monitoring.dom"
   hosts:
     - prometheus.dom

 prometheusSpec:
   additionalScrapeConfigs:
     - job_name: 'linux vm'
       static_configs:
       - targets: [ '172.28.7.139:9100' ]
     - job_name: 'win-exporter'
       static_configs:
       - targets: [ '172.28.7.128:9182' ]
     - job_name: 'rabbit'
       static_configs:
       - targets: [ '172.28.7.139:9419' ]

В разделе additionalPrometheusRules описанного выше файла указываем необходимые кастомные алерты, в разделе alertmanager описываем получателя наших алертов, в grafana. Указываем пароль админа и адрес нашего экземпляра grafana, в PrometheusSpec указываем объекты, которые необходимо мониторить нашей связкой prometheus+grafana.

Данный пример лишь один из возможных вариантов базовой настройки, позволяет получить базовое понимание параметризации helm-чарта prometheus-operatora; на его основе возможно быстро оптимизировать параметры под нужды своей инфраструктуры.

Запустим установку в кластер telegram-alertmanager:

kubectl apply -f telegram-alertmanager/.

Запустим установку prometheus-operator:

helm repo add stable https://charts.helm.sh/stable
helm repo update
helm upgrade -i prometheus-operator stable/prometheus-operator  --atomic --namespace prometheus-operator --values values-prod.yaml

После запуска всех сущностей в кластере kubernetes, получили решение, позволяющие гибко оптимизировать параметры стека prometheus+grafana и получать в мессенджер информацию об уведомлениях (алертах).

Не нашли ответа на свой вопрос?
Содержание

Есть вопросы?

Закажите звонок специалиста!

Есть вопросы?

Закажите звонок специалиста!
*нажимая на кнопку, Вы даете согласие на обработку персональных данных