- Home »

Как мониторить MongoDB с Grafana и Prometheus на Ubuntu 24
Мониторинг MongoDB — это не просто хорошая практика, это жизненная необходимость для любого серьёзного проекта. Когда твоя база данных начинает тормозить, а пользователи жалуются на медленную загрузку, без метрик ты как слепой котёнок — не понимаешь, где проблема. Grafana + Prometheus — это мощная связка, которая даёт полную картину состояния MongoDB в реальном времени.
Сегодня разберём, как настроить полноценный мониторинг MongoDB с красивыми дашбордами и умными алертами. Будем работать на Ubuntu 24 — свежей, стабильной системе, которая отлично подходит для продакшена. Покажу не только базовую настройку, но и реальные кейсы из практики, включая подводные камни, которые могут испортить тебе выходные.
Как работает связка Prometheus + Grafana для MongoDB
Схема простая, но эффективная. MongoDB экспортер собирает метрики из базы данных и отдаёт их в формате, который понимает Prometheus. Prometheus периодически опрашивает экспортер и сохраняет данные в своей time-series базе. Grafana подключается к Prometheus и строит красивые графики.
Основные компоненты:
- MongoDB Exporter — мост между MongoDB и Prometheus
- Prometheus — сбор и хранение метрик
- Grafana — визуализация и алерты
- Node Exporter — системные метрики сервера
Пошаговая настройка на Ubuntu 24
Шаг 1: Подготовка системы
Для начала нужен VPS с Ubuntu 24 или выделенный сервер для более серьёзных нагрузок. Рекомендую минимум 2 CPU и 4GB RAM — Prometheus может быть прожорливым.
sudo apt update && sudo apt upgrade -y
sudo apt install wget curl unzip -y
# Создаём пользователя для сервисов мониторинга
sudo useradd --no-create-home --shell /bin/false prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter
sudo useradd --no-create-home --shell /bin/false mongodb_exporter
Шаг 2: Установка Prometheus
# Качаем последнюю версию Prometheus
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xvf prometheus-2.45.0.linux-amd64.tar.gz
# Переносим в нужные директории
sudo cp prometheus-2.45.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.45.0.linux-amd64/promtool /usr/local/bin/
# Создаём директории для конфигов и данных
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
# Копируем консоли и библиотеки
sudo cp -r prometheus-2.45.0.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.45.0.linux-amd64/console_libraries /etc/prometheus
# Настраиваем права
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
Шаг 3: Конфигурация Prometheus
sudo nano /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "mongodb_rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'mongodb'
static_configs:
- targets: ['localhost:9216']
scrape_interval: 30s
scrape_timeout: 10s
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
Шаг 4: Создание systemd сервиса для Prometheus
sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.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/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=0.0.0.0:9090 \
--web.enable-lifecycle \
--storage.tsdb.retention.time=30d
[Install]
WantedBy=multi-user.target
Шаг 5: Установка MongoDB Exporter
# Качаем MongoDB Exporter
cd /tmp
wget https://github.com/percona/mongodb_exporter/releases/download/v0.40.0/mongodb_exporter-0.40.0.linux-amd64.tar.gz
tar xvf mongodb_exporter-0.40.0.linux-amd64.tar.gz
# Переносим в систему
sudo cp mongodb_exporter-0.40.0.linux-amd64/mongodb_exporter /usr/local/bin/
sudo chown mongodb_exporter:mongodb_exporter /usr/local/bin/mongodb_exporter
Шаг 6: Настройка MongoDB Exporter
sudo nano /etc/systemd/system/mongodb_exporter.service
[Unit]
Description=MongoDB Exporter
After=network.target
[Service]
Type=simple
User=mongodb_exporter
Group=mongodb_exporter
ExecStart=/usr/local/bin/mongodb_exporter \
--mongodb.uri="mongodb://mongouser:mongopass@localhost:27017/admin" \
--web.listen-address=:9216 \
--collect-all \
--compatible-mode
Restart=always
[Install]
WantedBy=multi-user.target
Шаг 7: Установка Node Exporter
# Node Exporter для системных метрик
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz
tar xvf node_exporter-1.6.0.linux-amd64.tar.gz
sudo cp node_exporter-1.6.0.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target
[Service]
Type=simple
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=:9100
Restart=always
[Install]
WantedBy=multi-user.target
Шаг 8: Установка Grafana
# Добавляем репозиторий Grafana
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install grafana -y
Шаг 9: Запуск всех сервисов
# Перезагружаем systemd и запускаем сервисы
sudo systemctl daemon-reload
# Запускаем и включаем автозапуск
sudo systemctl enable --now prometheus
sudo systemctl enable --now mongodb_exporter
sudo systemctl enable --now node_exporter
sudo systemctl enable --now grafana-server
# Проверяем статус
sudo systemctl status prometheus
sudo systemctl status mongodb_exporter
sudo systemctl status node_exporter
sudo systemctl status grafana-server
Настройка Grafana дашбордов
Переходим в веб-интерфейс Grafana по адресу http://your-server-ip:3000
. Логин и пароль по умолчанию: admin/admin.
Добавление источника данных
- Идём в Configuration → Data Sources
- Добавляем Prometheus:
http://localhost:9090
- Тестируем подключение
Импорт готовых дашбордов
Рекомендую использовать проверенные дашборды из Grafana Labs:
- MongoDB Dashboard by Percona — ID: 7353
- Node Exporter Full — ID: 1860
- MongoDB Exporter Dashboard — ID: 2583
Реальные кейсы и подводные камни
Положительные кейсы
Ситуация | Решение | Результат |
---|---|---|
Медленные запросы | Мониторинг operation_latencies | Оптимизированы индексы, производительность выросла на 40% |
Утечки памяти | Отслеживание wiredTiger_cache_usage | Обнаружена проблема с кэшем, исправлено до критичного состояния |
Репликация отстаёт | Алерты на replication_lag | Проблема решена за 5 минут вместо часов поиска |
Типичные проблемы
Проблема 1: MongoDB Exporter не может подключиться к базе
# Проверяем подключение
sudo systemctl status mongodb_exporter
sudo journalctl -u mongodb_exporter -f
# Создаём пользователя для мониторинга
mongo
use admin
db.createUser({
user: "mongouser",
pwd: "mongopass",
roles: [
{ role: "clusterMonitor", db: "admin" },
{ role: "read", db: "local" }
]
})
Проблема 2: Prometheus не видит таргеты
# Проверяем доступность портов
netstat -tulpn | grep :9216
curl http://localhost:9216/metrics
# Проверяем firewall
sudo ufw status
sudo ufw allow 9216/tcp
Настройка алертов
Создаём файл с правилами алертов:
sudo nano /etc/prometheus/mongodb_rules.yml
groups:
- name: mongodb
rules:
- alert: MongodbDown
expr: mongodb_up == 0
for: 0m
labels:
severity: critical
annotations:
summary: MongoDB is down
description: "MongoDB instance is down"
- alert: MongodbReplicationLag
expr: mongodb_mongod_replset_member_replication_lag > 10
for: 0m
labels:
severity: critical
annotations:
summary: MongoDB replication lag
description: "Mongodb replication lag is more than 10s"
- alert: MongodbHighConnections
expr: mongodb_connections{state="current"} > 500
for: 2m
labels:
severity: warning
annotations:
summary: MongoDB high connections
description: "Too many connections to MongoDB"
Сравнение с альтернативами
Решение | Плюсы | Минусы | Цена |
---|---|---|---|
Prometheus + Grafana | Бесплатно, гибкость, open source | Сложная настройка | Бесплатно |
MongoDB Ops Manager | Интеграция с MongoDB | Платно, vendor lock-in | $$$ |
Datadog | Простая настройка | Дорого, SaaS | $$$$ |
New Relic | Богатая аналитика | Дорого, сложность | $$$ |
Продвинутые настройки и автоматизация
Автоматический деплой через Ansible
# Создаём Ansible playbook для автоматизации
---
- name: Deploy MongoDB monitoring
hosts: mongodb_servers
become: yes
tasks:
- name: Install Prometheus
unarchive:
src: "https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz"
dest: /tmp
remote_src: yes
- name: Copy Prometheus binary
copy:
src: /tmp/prometheus-2.45.0.linux-amd64/prometheus
dest: /usr/local/bin/prometheus
mode: '0755'
owner: prometheus
group: prometheus
Интеграция с Docker
# docker-compose.yml для быстрого развёртывания
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=200h'
- '--web.enable-lifecycle'
mongodb_exporter:
image: percona/mongodb_exporter:0.40.0
container_name: mongodb_exporter
ports:
- "9216:9216"
environment:
- MONGODB_URI=mongodb://mongouser:mongopass@mongo:27017/admin
command:
- '--mongodb.uri=mongodb://mongouser:mongopass@mongo:27017/admin'
- '--collect-all'
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
volumes:
prometheus_data:
grafana_data:
Полезные метрики для мониторинга
Ключевые метрики производительности
- mongodb_op_counters_total — количество операций
- mongodb_mongod_wiredtiger_cache_bytes — использование кэша
- mongodb_mongod_connections — количество подключений
- mongodb_mongod_op_latencies_histogram — задержки операций
- mongodb_mongod_replset_member_health — состояние реплики
Системные метрики
- node_memory_MemAvailable_bytes — доступная память
- node_filesystem_avail_bytes — свободное место на диске
- node_load1 — нагрузка на CPU
- node_network_receive_bytes_total — сетевой трафик
Интересные факты и хаки
Факт 1: Prometheus может хранить до 2 миллиардов временных рядов в одном инстансе. Но на практике больше 10 миллионов — уже проблема.
Факт 2: MongoDB Exporter от Percona собирает более 200 различных метрик. Большинство из них тебе не нужны в обычной жизни.
Лайфхак: Используй recording rules для предвычисления сложных запросов:
# В prometheus.yml
rule_files:
- "recording_rules.yml"
# В recording_rules.yml
groups:
- name: mongodb_recording
rules:
- record: mongodb:operation_rate
expr: rate(mongodb_op_counters_total[5m])
- record: mongodb:slow_queries_rate
expr: rate(mongodb_mongod_metrics_query_executor_total{state="slow"}[5m])
Автоматизация и интеграция
Webhook для Slack
# Настройка Alertmanager для отправки в Slack
global:
slack_api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'slack-notifications'
receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#alerts'
title: 'MongoDB Alert'
text: '{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}'
API для собственных метрик
# Python скрипт для кастомных метрик
import requests
import json
def send_custom_metric(metric_name, value, labels={}):
data = {
"metric": metric_name,
"value": value,
"labels": labels,
"timestamp": time.time()
}
# Отправляем через pushgateway
requests.post(
"http://localhost:9091/metrics/job/custom_metrics",
data=json.dumps(data)
)
Заключение и рекомендации
Prometheus + Grafana — это мощная, но требующая времени на настройку система мониторинга. Она идеально подходит для команд, которые хотят полный контроль над своим стеком мониторинга и готовы потратить время на изучение.
Когда использовать:
- У тебя есть время на настройку и поддержку
- Нужна гибкость и кастомизация
- Бюджет ограничен
- Команда понимает DevOps практики
Когда не использовать:
- Нужно быстро и без головной боли
- Нет времени на изучение
- Маленькая команда без DevOps опыта
- Критичные SLA и нужна поддержка 24/7
Практические советы:
- Начни с минимального набора метрик, добавляй постепенно
- Настрой алерты только на критичные проблемы
- Используй готовые дашборды, не изобретай велосипед
- Регулярно очищай старые данные
- Делай бэкапы конфигурации
Помни: мониторинг — это не самоцель, а инструмент для решения проблем. Лучший мониторинг — тот, который помогает предотвратить проблемы до того, как они затронут пользователей.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.