# Кейс: стек мониторинга (Prometheus + Grafana + Mimir) Связь с легендой: [../../legend/LEGEND.md](../../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 ```yaml 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 ```yaml 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 конфиг для лабы) ```yaml 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 ```yaml apiVersion: 1 datasources: - name: Mimir type: prometheus access: proxy url: http://mimir:9009/prometheus isDefault: true ``` ### 6. Шаги воспроизведения 1. `docker compose up -d` — поднять весь стенд. 2. Открыть Prometheus UI (`localhost:9090/targets`) — убедиться, что target `node` в статусе `UP`. 3. Открыть Grafana (`localhost:3000`, admin/admin), проверить, что источник данных `Mimir` отвечает (Explore → запрос `up`). 4. Создать дашборд вручную: панель CPU (`rate(node_cpu_seconds_total{mode="idle"}[5m])`), панель памяти (`node_memory_MemAvailable_bytes`), панель дисков. 5. Настроить alert rule в Grafana (например, «CPU idle < 20% в течение 5 минут») и проверить, что алерт срабатывает при нагрузке (`stress` внутри контейнера или на хосте). 6. Остановить `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](../../legend/CAPACITY.md). На этом стенде можно замерить число активных series (`curl localhost:9090/api/v1/status/tsdb`) и вписать результат в таблицу лабных замеров там же. ## Как это ложится в легенду В реальной работе (АО ТНИИС) — 50 дашбордов в Grafana и настройка Mimir для масштабирования, унификация метрик из разных источников. Домашний кейс воспроизводит тот же путь данных в миниатюре: один источник (node-exporter) вместо десятков, но тот же принцип — Prometheus scrape → remote_write → Mimir → Grafana dashboard.