5.9 KiB
Кейс: стек мониторинга (Prometheus + Grafana + Mimir)
Связь с легендой: ../../legend/LEGEND.md — раздел «АО ТНИИС». Задача инженера сопровождения — собирать метрики, визуализировать их и держать масштабируемое хранилище для истории метрик.
Что нужно реально сделать (домашний стенд)
Разворачиваем локально Prometheus + Mimir + Grafana + node-exporter через Docker Compose. Цель — своими руками пройти путь «метрика с хоста → Prometheus → remote_write в Mimir → дашборд в Grafana», чтобы честно говорить об этом на собеседовании.
1. Структура стенда
monitoring-lab/
├── docker-compose.yml
├── prometheus/
│ └── prometheus.yml
├── mimir/
│ └── mimir.yml
└── grafana/
└── provisioning/
└── datasources/
└── datasource.yml
2. docker-compose.yml
version: "3.8"
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
command:
- "--config.file=/etc/prometheus/prometheus.yml"
ports:
- "9090:9090"
depends_on:
- node-exporter
mimir:
image: grafana/mimir:latest
container_name: mimir
command: ["-config.file=/etc/mimir/mimir.yml"]
volumes:
- ./mimir/mimir.yml:/etc/mimir/mimir.yml
ports:
- "9009:9009"
grafana:
image: grafana/grafana:latest
container_name: grafana
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning
ports:
- "3000:3000"
depends_on:
- mimir
- prometheus
3. prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: "node"
static_configs:
- targets: ["node-exporter:9100"]
remote_write:
- url: "http://mimir:9009/api/v1/push"
4. mimir/mimir.yml (минимальный single-binary конфиг для лабы)
target: all
blocks_storage:
backend: filesystem
filesystem:
dir: /data/blocks
bucket_store:
sync_dir: /data/tsdb-sync
compactor:
data_dir: /data/compactor
ingester:
ring:
replication_factor: 1
limits:
ingestion_rate: 100000
5. grafana/provisioning/datasources/datasource.yml
apiVersion: 1
datasources:
- name: Mimir
type: prometheus
access: proxy
url: http://mimir:9009/prometheus
isDefault: true
6. Шаги воспроизведения
docker compose up -d— поднять весь стенд.- Открыть Prometheus UI (
localhost:9090/targets) — убедиться, что targetnodeв статусеUP. - Открыть Grafana (
localhost:3000, admin/admin), проверить, что источник данныхMimirотвечает (Explore → запросup). - Создать дашборд вручную: панель CPU (
rate(node_cpu_seconds_total{mode="idle"}[5m])), панель памяти (node_memory_MemAvailable_bytes), панель дисков. - Настроить alert rule в Grafana (например, «CPU idle < 20% в течение 5 минут») и проверить, что алерт срабатывает при нагрузке (
stressвнутри контейнера или на хосте). - Остановить
node-exporterи убедиться, что Prometheus помечает target какDOWN, а в Grafana это видно на дашборде (пропуск данных) — так на практике выглядит инцидент.
7. Что это даёт в разговоре с интервьюером
- Понимание разницы Prometheus vs Mimir: Prometheus — сбор + локальное краткосрочное хранение + alerting-движок; Mimir — горизонтально масштабируемое долгосрочное хранилище метрик, совместимое с PromQL, принимает данные через
remote_write. - Понимание модели pull (Prometheus сам ходит в
/metrics) в отличие от push-систем. - Практическое понимание, что такое target, job, scrape_interval, label.
- Опыт настройки datasource и дашборда в Grafana руками, а не только просмотр готовых.
Нагрузка и цифры
Один node-exporter — не показатель нагрузки; честная оценка масштаба и вопросы про «как мониторить 300 000 серверов» разобраны в ../../legend/CAPACITY.md. На этом стенде можно замерить число активных series (curl localhost:9090/api/v1/status/tsdb) и вписать результат в таблицу лабных замеров там же.
Как это ложится в легенду
В реальной работе (АО ТНИИС) — 50 дашбордов в Grafana и настройка Mimir для масштабирования, унификация метрик из разных источников. Домашний кейс воспроизводит тот же путь данных в миниатюре: один источник (node-exporter) вместо десятков, но тот же принцип — Prometheus scrape → remote_write → Mimir → Grafana dashboard.