Wiki » History » Version 1
Дмитрий Курнаев, 06/19/2026 11:57 AM
| 1 | 1 | Дмитрий Курнаев | h1. Prometheus + Alertmanager +Grafana |
|---|---|---|---|
| 2 | |||
| 3 | h2. _*Пролог*_ |
||
| 4 | |||
| 5 | p. Описываем процесс развертывания системы мониторинга (сбора метрик) на базе компонентов: |
||
| 6 | * _Prometheus_ - сборщик (база данных) метрик от клиентов |
||
| 7 | * _Alertmanager_ - служба оповещений |
||
| 8 | * _Grafana_ - визуализатор метрик |
||
| 9 | * _XMPP-WebHook_ - коннектор для отправки уведомлений в Snikket |
||
| 10 | * _Node exporter_ - клиент Linux для Prometheus |
||
| 11 | * _Windows exporter_ -клиент Windows для Prometheus |
||
| 12 | |||
| 13 | h2. _*1. Подготовка ОС*_ |
||
| 14 | |||
| 15 | # Ставим Ubuntu 22.04 |
||
| 16 | # Обновляем пакеты: |
||
| 17 | _sudo apt update_ |
||
| 18 | # Устанавливаем недостающие пакеты: |
||
| 19 | _sudo apt install openresolv wget ca-certificates curl_ |
||
| 20 | # Устанавливаем часовой пояс: |
||
| 21 | _sudo timedatectl set-timezone 'Asia/Yekaterinburg'_ |
||
| 22 | # Ставим Docker |
||
| 23 | ## Даем права на директорию: |
||
| 24 | _sudo install -m 0755 -d /etc/apt/keyrings_ |
||
| 25 | ## Скачиваем ключ: |
||
| 26 | sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc |
||
| 27 | ## Даем всем пользователям права на чтение: |
||
| 28 | sudo chmod a+r /etc/apt/keyrings/docker.asc |
||
| 29 | ## Добавляем репозиторий: |
||
| 30 | _sudo tee /etc/apt/sources.list.d/docker.sources <<EOF |
||
| 31 | Types: deb |
||
| 32 | URIs: https://download.docker.com/linux/ubuntu |
||
| 33 | Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") |
||
| 34 | Components: stable |
||
| 35 | Architectures: $(dpkg --print-architecture) |
||
| 36 | Signed-By: /etc/apt/keyrings/docker.asc |
||
| 37 | EOF_ |
||
| 38 | ## Снова обновляем список пакетов: |
||
| 39 | _sudo apt update_ |
||
| 40 | ## Ставим докер: |
||
| 41 | _sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin_ |
||
| 42 | |||
| 43 | h2. _*2. Устанавливаем, непосредственно, системы*_ |
||
| 44 | |||
| 45 | # Создаем рабочие директории: |
||
| 46 | _sudo mkdir -p /opt/prometheus_stack/{prometheus,grafana,alertmanager,blackbox,jelmer-xmpp}_ |
||
| 47 | # Создаем файл docker-compose.yml: |
||
| 48 | _sudo touch /opt/prometheus_stack/docker-compose.yml_ |
||
| 49 | # Идем в рабочую директорию: |
||
| 50 | _cd /opt/prometheus_stack/_ |
||
| 51 | # Открываем файл на редактирование: |
||
| 52 | _sudo nano docker-compose.yml_ |
||
| 53 | и приводим к следующему виду: |
||
| 54 | @services:@ |
||
| 55 | |||
| 56 | @prometheus: |
||
| 57 | image: prom/prometheus:latest |
||
| 58 | volumes: |
||
| 59 | - ./prometheus/etc:/etc/prometheus/ |
||
| 60 | - ./prometheus/data:/prometheus |
||
| 61 | container_name: prometheus |
||
| 62 | hostname: prometheus |
||
| 63 | command: |
||
| 64 | - --config.file=/etc/prometheus/prometheus.yml |
||
| 65 | ports: |
||
| 66 | - "9090:9090" |
||
| 67 | restart: unless-stopped |
||
| 68 | environment: |
||
| 69 | TZ: "Asia/Yekaterinburg"@ |
||
| 70 | |||
| 71 | @node-exporter: |
||
| 72 | image: prom/node-exporter |
||
| 73 | volumes: |
||
| 74 | - /proc:/host/proc:ro |
||
| 75 | - /sys:/host/sys:ro |
||
| 76 | - /:/rootfs:ro |
||
| 77 | container_name: node-exporter |
||
| 78 | hostname: exporter |
||
| 79 | command: |
||
| 80 | - --path.procfs=/host/proc |
||
| 81 | - --path.sysfs=/host/sys |
||
| 82 | - --collector.filesystem.ignored-mount-points |
||
| 83 | - ^(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/) |
||
| 84 | ports: |
||
| 85 | - "9100:9100" |
||
| 86 | restart: unless-stopped |
||
| 87 | environment: |
||
| 88 | TZ: "Asia/Yekaterinburg"@ |
||
| 89 | |||
| 90 | @grafana: |
||
| 91 | image: grafana/grafana |
||
| 92 | user: root |
||
| 93 | depends_on: |
||
| 94 | - prometheus |
||
| 95 | ports: |
||
| 96 | - "3000:3000" |
||
| 97 | volumes: |
||
| 98 | - ./grafana:/var/lib/grafana |
||
| 99 | - ./grafana/provisioning/:/etc/grafana/provisioning/ |
||
| 100 | container_name: grafana |
||
| 101 | hostname: grafana |
||
| 102 | restart: unless-stopped |
||
| 103 | environment: |
||
| 104 | TZ: "Asia/Yekaterinburg"@ |
||
| 105 | |||
| 106 | @alertmanager: |
||
| 107 | image: prom/alertmanager:v0.31.1 |
||
| 108 | user: root |
||
| 109 | ports: |
||
| 110 | - "9093:9093" |
||
| 111 | volumes: |
||
| 112 | - ./alertmanager/:/etc/alertmanager/ |
||
| 113 | container_name: alertmanager |
||
| 114 | hostname: alertmanager |
||
| 115 | environment: |
||
| 116 | TZ: "Asia/Yekaterinburg" |
||
| 117 | restart: unless-stopped |
||
| 118 | command: |
||
| 119 | - '--config.file=/etc/alertmanager/config.yml' |
||
| 120 | - '--storage.path=/etc/alertmanager/data'@ |
||
| 121 | |||
| 122 | @xmpp-bot: |
||
| 123 | image: ghcr.io/jelmer/prometheus-xmpp-alerts |
||
| 124 | container_name: xmpp-bot |
||
| 125 | user: 1000:1000 |
||
| 126 | ports: |
||
| 127 | - "9199:9199" |
||
| 128 | volumes: |
||
| 129 | - ./jelmer-xmpp/prometheus/config.yaml:/config.yaml:ro@ |
||
| 130 | # Создаем конфигурационный файл: |
||
| 131 | _sudo mkdir -p ./prometheus/etc_ |
||
| 132 | _sudo nano ./prometheus/etc/prometheus.yml_ |
||
| 133 | со следующим содержанием: |
||
| 134 | @scrape_configs: |
||
| 135 | - job_name: node |
||
| 136 | scrape_interval: 5s |
||
| 137 | static_configs: |
||
| 138 | - targets: ['node-exporter:9100'] |
||
| 139 | - job_name: windows_servers |
||
| 140 | scrape_interval: 5s |
||
| 141 | static_configs: |
||
| 142 | - targets: ['192.168.100.20:9182', '192.168.10.13:9182', '192.168.100.23:9182'] |
||
| 143 | rule_files: |
||
| 144 | - 'alert.rules' |
||
| 145 | alerting: |
||
| 146 | alertmanagers: |
||
| 147 | - scheme: http |
||
| 148 | static_configs: |
||
| 149 | - targets: |
||
| 150 | - "alertmanager:9093"@ |
||
| 151 | # Создаем директорию для данных Prometheus: |
||
| 152 | _sudo mkdir -p ./prometheus/data_ |
||
| 153 | # Устанавливаем разрешения: |
||
| 154 | _sudo chown 65534:65534 ./prometheus/data_ |
||
| 155 | # Создаем файл с правилами для Promtheus: |
||
| 156 | _sudo mkdir - p ./prometheus/etc/alert.rules_ |
||
| 157 | следующего содержания: |
||
| 158 | @groups: |
||
| 159 | - name: InstanceState |
||
| 160 | rules: |
||
| 161 | - alert: PrometheusTargetMissing |
||
| 162 | expr: up == 0 |
||
| 163 | for: 0m |
||
| 164 | labels: |
||
| 165 | severity: critical |
||
| 166 | annotations: |
||
| 167 | summary: "Prometheus target missing (instance {{ $labels.instance }})" |
||
| 168 | description: "A Prometheus target has disappeared. An exporter might be crashed. VALUE = {{ $value }} LABELS: {{ $labels }}"@ |
||
| 169 | # Создаем конфигурационный файл для Alertmanager: |
||
| 170 | _sudo nano alertmanager/config.yml_ |
||
| 171 | следующего содержания: |
||
| 172 | @global: |
||
| 173 | route: |
||
| 174 | group_by: ['alertname'] |
||
| 175 | group_wait: 30s |
||
| 176 | group_interval: 1m |
||
| 177 | repeat_interval: 2m |
||
| 178 | receiver: 'team-alerts' |
||
| 179 | receivers: |
||
| 180 | - name: 'team-alerts' |
||
| 181 | email_configs: |
||
| 182 | - to: 'dkurnaev@krovelson.ru' |
||
| 183 | from: 'informer@krovelson.ru' |
||
| 184 | smarthost: 'mx01.krovelson.ru:465' |
||
| 185 | auth_username: 'informer@krovelson.ru' |
||
| 186 | auth_identity: 'informer@krovelson.ru' |
||
| 187 | auth_password: 'Rjkj,jr-1' |
||
| 188 | webhook_configs: |
||
| 189 | - url: 'http://xmpp-bot:9199/alert'@ |
||
| 190 | # Создаем конфигурационный файл для XMPP-Hook: |
||
| 191 | _sudo nano ./jelmer-xmpp/prometheus/config.yaml_ |
||
| 192 | следующего содержания: |
||
| 193 | @jid: 'alert-bot@f-drive.krovelson.ru' |
||
| 194 | password: 'Vbrhj<bjkjubz' |
||
| 195 | to_jid: 'dkurnaev@f-drive.krovelson.ru' |
||
| 196 | listen_address: '0.0.0.0' |
||
| 197 | listen_port: 9199 |
||
| 198 | text_template: | |
||
| 199 | {{ status.upper() }}: *{{ labels.alertname }}* at {{ labels.host or labels.instance }}:\ |
||
| 200 | {{ annotations.message }}. {{ generatorURL }}@ |
||
| 201 | |||
| 202 | # Запускаем сборку контейнеров: |
||
| 203 | _sudo docker compose up -d_ |
||
| 204 | # Если все прошло удачно, то по адресам: |
||
| 205 | * http://<your_ip>:9090/metrics - будут метрики Prometheus |
||
| 206 | * http://<your_ip>:9093 - будет Alertmanager |
||
| 207 | * http://<your_ip>:3000 - будет Grafana |
||
| 208 | * http://<your_ip>:9100 - будет Node-exporter |
||
| 209 | |||
| 210 | h3. PS |
||
| 211 | |||
| 212 | Для Windows машин скачиваем программу Windows exporter и устанавливаем её в качестве службы, открыв соответствующий порт в брандмауэре. |
||
| 213 | |||
| 214 | h3. PPS |
||
| 215 | |||
| 216 | Уведомления будут приходить в Snikket от имени alert-bot пользователю dkurnaev |
||
| 217 | |||
| 218 | |||
| 219 |