Project

General

Profile

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