Files
resume/stack/monitoring/CASE.md

143 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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