Prometheus + Grafana + Node Exporter + Docker в Azure c уведомлениями в Telegram

Для начала подготовим виртуальную машину, для этого напишем небольшой скрипт, который разворачивает и автоматизирует некоторые рутинные операции, скрипт использует Azure Cli:


project.sh
#!/bin/bash
echo "AZURE VM Create"
echo "Azure Account:"
echo "Azure name:"
read AZ_NAME
read -sp "Azure password: " AZ_PASS && echo && az login -u $AZ_NAME -p $AZ_PASS
echo "Name Group  VM"
read GROUP_NAME
az group create --name $GROUP_NAME --location eastus
echo "VM name"
read VM
echo "Admin user name"
read ADMIN
az vm create --resource-group $GROUP_NAME --name $VM --image UbuntuLTS --admin-username $ADMIN --generate-ssh-keys --custom-data cloud-init.txt
az vm open-port --resource-group $GROUP_NAME --name $VM --port 8080 --priority 1001
az vm open-port --resource-group $GROUP_NAME --name $VM --port 8081 --priority 1002
az vm open-port --resource-group $GROUP_NAME --name $VM --port 9090 --priority 1003
az vm open-port --resource-group $GROUP_NAME --name $VM --port 9093 --priority 1004
az vm open-port --resource-group $GROUP_NAME --name $VM --port 9100 --priority 1005
az vm open-port --resource-group $GROUP_NAME --name $VM --port 3000 --priority 1006
RESULT=$(az vm show --resource-group $GROUP_NAME --name $VM -d --query [publicIps] --o tsv)
echo $RESULT
echo "Whait 5 min"
sleep 300
ssh $ADMIN@$RESULT -y << EOF
sudo usermod -aG docker $ADMIN
EOF
sleep 10
echo "Connect to Azure..."

В скрипте мы используем файл cloud-init.txt который автоматически установит Docker и Docker-Compose на виртуальную машину.


cloud-init.txt
#cloud-config
package_upgrade: true
write_files:
  - path: /etc/systemd/system/docker.service.d/docker.conf
    content: |
      [Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd
  - path: /etc/docker/daemon.json
    content: |
      {
        "hosts": ["fd://","tcp://127.0.0.1:2375"]
      }
runcmd:
- apt-get update && apt-get install mc -y
- curl -sSL https://get.docker.com/ | sh
- curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- chmod +x /usr/local/bin/docker-compose

В домашней директории создаем папку для проекта и файл docker-compose.yaml


docker-compose.yaml
version: '3.2'
services:
    alertmanager-bot:
        image: metalmatze/alertmanager-bot:0.3.1
        environment:
            - ALERTMANAGER_URL=http://<alertmngerURL>:9093 #откуда бот получает алерт
            - LISTEN_ADDR=0.0.0.0:8080
            - BOLT_PATH=/data/bot.db
            - STORE=bolt
            - TELEGRAM_ADMIN=<TelegramAdminID> #ваш ID в телеграм
            - TELEGRAM_TOKEN=<TelegramBotToken> # токен бота
            - TEMPLATE_PATHS=/templates/default.tmpl
        volumes:
            - /srv/monitoring/alertmanager-bot:/data
        ports:
            - 8080:8080
    prometheus:
        image: prom/prometheus:latest
        volumes:
            - ./prometheus:/etc/prometheus/
        command:
            - --config.file=/etc/prometheus/prometheus.yml
        ports:
            - 9090:9090
        links:
            - cadvisor:cadvisor
        depends_on:
            - cadvisor
        restart: always
    node-exporter:
        image: prom/node-exporter
        volumes:
            - /proc:/host/proc:ro
            - /sys:/host/sys:ro
            - /:/rootfs:ro
        command:
            - --path.procfs=/host/proc
            - --path.sysfs=/host/sys
            - --collector.filesystem.ignored-mount-points
            - ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)
        ports:
            - 9100:9100
        restart: always
        deploy:
            mode: global
    alertmanager:
        image: prom/alertmanager
        ports:
            - 9093:9093
        volumes:
            - ./alertmanager/:/etc/alertmanager/
        restart: always
        command:
            - --config.file=/etc/alertmanager/config.yml
            - --storage.path=/alertmanager
    cadvisor:
        image: google/cadvisor
        volumes:
            - /:/rootfs:ro
            - /var/run:/var/run:rw
            - /sys:/sys:ro
            - /var/lib/docker/:/var/lib/docker:ro
        ports:
            - 8081:8080
        restart: always
        deploy:
            mode: global
    grafana:
        image: grafana/grafana
        depends_on:
            - prometheus
        ports:
            - 3000:3000
        volumes:
            - ./grafana:/var/lib/grafana
            - ./grafana/provisioning/:/etc/grafana/provisioning/
        restart: always

Не забывайте, что в yaml не должно быть табуляции, только пробелы, внимательно за этим следите. Давайте рассмотрим файл docker-compose.yaml более подробнее:


image: — здесь, указаны образы контейнеров docker, которые мы будем использовать


Теперь приступим к созданию Telegram бота. Подробно на этом останавливаться не будем, в интернете полно описаний, скажу только что создание происходит посредством бота @BotFather.


Нам потребуется Token бота и ваш TelegramID, что бы управлять ботом, эти данные вам нужно подставить в файл docker-compose.yaml


Cоздадим файлы:
prometheus.yml в директории prometheus в котором описывается сервера для сбора метрик и отправки алертов.


prometheus.yml
scrape_configs:
  - job_name: node
    scrape_interval: 5s
    static_configs:
    - targets: ['ip_node_explorer:9100']
rule_files:
    - './con.yml'
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['ip_alertmanager:9093']

con.yml в той же директории для описания алертов. В этом файле описан один алерт, который проверяет "жив" ли наш Node Exporter.


con.yml
groups:
- name: ExporterDown
  rules:
  - alert: NodeDown
    expr: up{job='Node'} == 0
    for: 1m
    labels:
      severity: Error
    annotations:
      summary: "Node Explorer instance ($instance) down"
      description: "NodeExporterDown"

config.yml в директории alertmanager в котором добавляем связь с Telegram ботом


config.yml
route:
  group_wait: 20s        #  Частота
  group_interval: 20s   #  уведомлений 
  repeat_interval: 60s  #  в телеграм
  group_by: ['alertname', 'cluster', 'service']
  receiver: alertmanager-bot

receivers:
- name: alertmanager-bot
  webhook_configs:
  - send_resolved: true
    url: 'http://ip_telegram_bot:8080'

Запустим наш образ и проверим результат:


docker-compose up -d

docker-compose ps

Должно получиться что-то похожее на это:



Как мы видим State у всех контейнеров Up, если по каким-то причинам один из контейнеров не запустился, мы можем посмотреть лог командой:


docker logs <имя контейнера>

для примера:


docker logs docker logs project_alertmanager_1

выведет нам такой результат:



Теперь создадим скрипт test.sh для проверки уведомлений


test.sh
#!/bin/sh
curl \
--request POST \
--data '{"receiver":"telegram","status":"firing","alerts":[{"status":"firing","labels":{"alertname":"Fire","severity":"critical"},"annotations":{"message":"Something is on fire"},"startsAt":"2018-11-04T22:43:58.283995108+01:00","endsAt":"2018-11-04T22:46:58.283995108+01:00","generatorURL":"http://localhost:9090/graph?g0.expr=vector%28666%29\u0026g0.tab=1"}],"groupLabels":{"alertname":"Fire"},"commonLabels":{"alertname":"Fire","severity":"critical"},"commonAnnotations":{"message":"Something is on fire"},"externalURL":"http://localhost:9093","version":"4","groupKey":"{}:{alertname=\"Fire\"}"}' \
localhost:8080

после запуска которого, бот должен прислать тестовое сообщение.
Так же мы можем проверить работу нашего алерта, описаного в con.yml, для этого остановим Node Exporter командой


docker stop <имя контейнера node exporter>

через две минуты, бот пришлет вам уведомление, что сервер упал, запустим Node Exporter командой


docker start <имя контейнера node exporter>

И через определенное время бот ответит, что сервер запустился.


На этом все, в следующих статье я научу вас подключать дополнительные метрики и создавать уведомления в Prometheus.

Поделиться публикацией

Комментарии 10

    0
    curlbash в cloud-init? Вы уверены, что это best practice?

      0
      Не уверен, если есть замечания или предложения как это лучше организовать, то я только буду рад критике
        0
        apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
        add-apt-repository \
           "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
           $(lsb_release -cs) \
           stable"
        apt-get update
        apt-get install docker-ce docker-ce-cli containerd.io

        или такое же для debian docs.docker.com/install/linux/docker-ce/ubuntu
          0
          Curl на gpg ключ мало отличается от curlbash. Правильно — иметь ключ с собой, с информацией кому доверяешь.
            0
            Так делать что? по факту?
              0
              Минимум: Добавлять gpg ключ как константу.
              Максимум: иметь свой миррор (с помощью aplty, например).
      0

      А чем мотивирован выбор Azure вместо AWS или Google Cloud?

        0
        Абсолютно не чем, все тоже самое можно «провернуть» в любом облачном провайдере или у себя не сервере, с Azure работаю, мне там удобнее
        0

        Попробуйте вот это:
        https://github.com/netdata/netdata

          0
          Попробую обязательно)

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое