143 lines
5.9 KiB
Markdown
143 lines
5.9 KiB
Markdown
# Кейс: стек мониторинга (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.
|