Home » Как мониторить MongoDB с Grafana и Prometheus на Ubuntu 24
Как мониторить MongoDB с Grafana и Prometheus на Ubuntu 24

Как мониторить 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

Практические советы:

  • Начни с минимального набора метрик, добавляй постепенно
  • Настрой алерты только на критичные проблемы
  • Используй готовые дашборды, не изобретай велосипед
  • Регулярно очищай старые данные
  • Делай бэкапы конфигурации

Помни: мониторинг — это не самоцель, а инструмент для решения проблем. Лучший мониторинг — тот, который помогает предотвратить проблемы до того, как они затронут пользователей.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked