Перейти к основному содержимому

Настройка Prometheus и Grafana

·726 слов·4 минут
DevOps • Networks • Security • Infrastructure
Автор
DevOps • Networks • Security • Infrastructure
DevOps/Network/Infra Engineer, CyberSecurity Expert

В современных распределённых системах мониторинг инфраструктуры становится не просто полезным инструментом, а обязательным компонентом. Он позволяет своевременно обнаруживать сбои, отслеживать нагрузку на серверы и прогнозировать рост потребления ресурсов. В этой статье мы рассмотрим один из самых популярных стеков для мониторинга — связку Prometheus и Grafana. Мы настроим сбор метрик с серверов с помощью Node Exporter, организуем алертинг через Alertmanager и визуализируем все данные в удобных дашбордах Grafana. Это решение подходит как для небольших проектов, так и для корпоративных сред, благодаря своей гибкости, производительности и открытому исходному коду.

Настройка системы
#

sudo -i
apt update && apt upgrade -y
reboot
 
apt install mc htop tcpdump curl wget traceroute net-tools iperf3 iptraf tree -y
 
nano ~/.bashrc
# Tuning Command Line History (only current user)
export HISTSIZE=10000
export HISTTIMEFORMAT="%h %d %H:%M:%S "
PROMPT_COMMAND='history -a'
export HISTIGNORE="ls:ll:history:w:htop:pwd:mc:docker ps"

source ~/.bashrc

ufw allow 9090,9093,9094,9100/tcp
ufw allow 9094/udp
ufw allow ssh
ufw enable

Настройка Prometheus
#

# https://prometheus.io/download/ -> linux -> amd64
wget https://github.com/prometheus/prometheus/releases/download/v3.8.0/prometheus-3.8.0.linux-amd64.tar.gz

mkdir /etc/prometheus /var/lib/prometheus
tar -zxf prometheus-*.linux-amd64.tar.gz
cd prometheus-3.8.0.linux-amd64/
cp prometheus promtool /usr/local/bin/
cp prometheus.yml /etc/prometheus
cd .. && rm -rf prometheus-*.linux-amd64/ && rm -f prometheus-*.linux-amd64.tar.gz

# создаем пользователя prometheus без домашней директории и без возможности входа в консоль сервера
useradd --no-create-home --shell /bin/false prometheus
chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}

sudo -u prometheus /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/

# time=2025-12-10T17:40:57.068+03:00 level=INFO source=main.go:1286 msg="Server is ready to receive web requests."

nano /etc/systemd/system/prometheus.service

[Unit]
Description=Prometheus Service
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
 --config.file /etc/prometheus/prometheus.yml \
 --storage.tsdb.path /var/lib/prometheus/
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Запускаем:

systemctl enable prometheus
systemctl start prometheus
systemctl status prometheus

Проверка:
http://192.168.100.97:9090

Настройка Alertmanager
#

# https://prometheus.io/download/
wget https://github.com/prometheus/alertmanager/releases/download/v0.29.0/alertmanager-0.29.0.linux-amd64.tar.gz

mkdir -p /etc/alertmanager /var/lib/prometheus/alertmanager
tar -zxf alertmanager-*.linux-amd64.tar.gz
cd alertmanager-0.29.0.linux-amd64/
cp alertmanager amtool /usr/local/bin/
cp alertmanager.yml /etc/alertmanager
cd .. && rm -rf alertmanager-*.linux-amd64/ && rm -f alertmanager-*.linux-amd64.tar.gz

# создаем пользователя alertmanager без домашней директории и без возможности входа в консоль сервера
useradd --no-create-home --shell /bin/false alertmanager
chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/prometheus/alertmanager
chown alertmanager:alertmanager /usr/local/bin/{alertmanager,amtool}

nano /etc/systemd/system/alertmanager.service

[Unit]
Description=Alertmanager Service
After=network.target

[Service]
EnvironmentFile=-/etc/default/alertmanager
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/usr/local/bin/alertmanager \
          --config.file=/etc/alertmanager/alertmanager.yml \
          --storage.path=/var/lib/prometheus/alertmanager \
          --cluster.advertise-address=0.0.0.0:9093 \
          $ALERTMANAGER_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Запускаем:

systemctl enable alertmanager
systemctl start alertmanager
systemctl status alertmanager

Проверка
http://192.168.100.97:9093

Настройка Prometheus Node Exporter
#

# https://prometheus.io/download/
wget https://github.com/prometheus/node_exporter/releases/download/v1.10.2/node_exporter-1.10.2.linux-amd64.tar.gz

tar -zxf node_exporter-*.linux-amd64.tar.gz
cd node_exporter-1.10.2.linux-amd64/
cp node_exporter /usr/local/bin/
cd .. && rm -rf node_exporter-*.linux-amd64/ && rm -f node_exporter-*.linux-amd64.tar.gz

# создаем пользователя nodeuser без домашней директории и без возможности входа в консоль сервера
useradd --no-create-home --shell /bin/false nodeuser
chown -R nodeuser:nodeuser /usr/local/bin/node_exporter

nano /etc/systemd/system/node_exporter.service

[Unit]
Description=Node Exporter Service
After=network.target

[Service]
User=nodeuser
Group=nodeuser
Type=simple
ExecStart=/usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Запускаем:

systemctl enable node_exporter
systemctl start node_exporter
systemctl status node_exporter

Проверка:
http://192.168.100.97:9100/metrics

Добавляем сбор метрик с node_exporter в Prometheus
#

nano /etc/prometheus/prometheus.yml

scrape_configs:
  ... 
  - job_name: 'linux_exporter_clients'
    scrape_interval: 5s
    static_configs:
      - targets:
          - localhost:9100
          - 10.10.1.9:9100

systemctl restart prometheus

Проверка:
http://192.168.100.97:9090/targets

Настройка alerts
#

Создадим простое правило, реагирующее на недоступность клиента:

nano /etc/prometheus/alert.rules.yml

groups:
- name: alert.rules
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      description: '{{ $labels.instance }} of job {{ $labels.job }} has been down
        for more than 1 minute.'
      summary: Instance {{ $labels.instance }} down

Теперь подключим наше правило в конфигурационном файле prometheus:

nano /etc/prometheus/prometheus.yml

...
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
  - "alert.rules.yml"
...

systemctl restart prometheus

Проверка:
http://192.168.100.97:9090/alerts

Настройка Grafana
#

apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/grafana-enterprise/release/12.3.0/grafana-enterprise_12.3.0_19497075765_linux_amd64.deb
dpkg -i grafana-enterprise_12.3.0_19497075765_linux_amd64.deb

systemctl start grafana-server
systemctl enable grafana-server
systemctl status grafana-server

ufw allow 3000/tcp

Проверка:
http://192.168.100.97:3000/
admin\admin

Интеграция Grafana с Prometheus
#

Открыть страницу Connections - Перейти во вкладку Data Sources - Нажать на кнопку добавления новых источников — Add Data Source. Оказавшись на странице настройки подключения Grafana к Prometheus, указываем адрес и порт сервера, а все остальное оставляем как есть. В нашем случае это localhost (либо адрес вашего сервера) и стандартный порт 9090. Кликаем на Save and Test.

Импорт дашбордов в Grafana
#

Prometheus:
Открыть страницу Dashboards - Нажать на кнопку New - Из выпадающего списка выбрать New dashboard
Нажать на кнопку Import dashboard - Ввести идентификатор доски, который указан на странице официального сайта. Это 3662 - Нажать на кнопку Load
Даем ей имя и выбираем ранее созданный источник данных — Prometheus. После заполнения информации жмем Import.

Node_exporter:
Ввести идентификатор доски, который указан на странице официального сайта. Это 1860

ASP.NET Core:
Ввести идентификатор доски, который указан на странице официального сайта. Это 19924

Related

Настройка Grafana Loki
·402 слов·2 минут
Мониторинг производительности Linux
·295 слов·2 минут
Как отключить пароль для sudo в Linux
·228 слов·2 минут