Files
resume/stack/monitoring/CASE.md

5.9 KiB
Raw Blame History

Кейс: стек мониторинга (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. Шаги воспроизведения

  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. На этом стенде можно замерить число активных series (curl localhost:9090/api/v1/status/tsdb) и вписать результат в таблицу лабных замеров там же.

Как это ложится в легенду

В реальной работе (АО ТНИИС) — 50 дашбордов в Grafana и настройка Mimir для масштабирования, унификация метрик из разных источников. Домашний кейс воспроизводит тот же путь данных в миниатюре: один источник (node-exporter) вместо десятков, но тот же принцип — Prometheus scrape → remote_write → Mimir → Grafana dashboard.