Стек и зачем он нужен
Grafana — это не только для энтерпрайза и команд из 50 человек. Для одного сервера или небольшой инфраструктуры стек InfluxDB + Telegraf + Grafana даёт красивые дашборды и алерты за один вечер настройки.
Роли компонентов:
- Telegraf — агент сбора метрик. Устанавливается на каждый сервер, собирает CPU, RAM, диск, сеть и любые другие метрики, пишет в InfluxDB.
- InfluxDB — time-series база данных, оптимизированная для метрик. Хорошо сжимает данные, быстро отвечает на запросы по времени.
- Grafana — визуализация. Подключается к InfluxDB как data source, строит дашборды, отправляет алерты.
Установка InfluxDB 2.x
# Ubuntu/Debian
wget -q https://repos.influxdata.com/influxdata-archive_compat.key
echo "393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c \
influxdata-archive_compat.key" | sha256sum -c && \
cat influxdata-archive_compat.key | gpg --dearmor | \
tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] \
https://repos.influxdata.com/debian stable main' | \
tee /etc/apt/sources.list.d/influxdata.list
apt update && apt install -y influxdb2
systemctl enable influxdb && systemctl start influxdb
Первоначальная настройка через веб-интерфейс на порту 8086:
# Или через CLI
influx setup \
--username admin \
--password yourpassword \
--org myorg \
--bucket metrics \
--retention 30d \
--force
Установка Telegraf
apt install -y telegraf
Минимальный конфиг /etc/telegraf/telegraf.conf:
[agent]
interval = "10s"
flush_interval = "10s"
# Вывод в InfluxDB 2.x
[[outputs.influxdb_v2]]
urls = ["http://localhost:8086"]
token = "ваш_api_token_из_influxdb"
organization = "myorg"
bucket = "metrics"
# Системные метрики — CPU
[[inputs.cpu]]
percpu = false
totalcpu = true
collect_cpu_time = false
# RAM
[[inputs.mem]]
# Диск
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs"]
# Дисковый ввод-вывод
[[inputs.diskio]]
# Сеть
[[inputs.net]]
interfaces = ["eth0", "lo"]
# Системная нагрузка
[[inputs.system]]
# Процессы
[[inputs.processes]]
systemctl enable telegraf && systemctl start telegraf
# Проверить что метрики идут:
journalctl -u telegraf -n 20
Установка Grafana
apt install -y apt-transport-https software-properties-common
wget -q -O - https://packages.grafana.com/gpg.key | gpg --dearmor | \
tee /etc/apt/trusted.gpg.d/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/trusted.gpg.d/grafana.gpg] \
https://packages.grafana.com/oss/deb stable main" | \
tee /etc/apt/sources.list.d/grafana.list
apt update && apt install -y grafana
systemctl enable grafana-server && systemctl start grafana-server
Grafana доступна на порту 3000. Логин по умолчанию: admin/admin (сменить при первом входе).
Подключение InfluxDB как Data Source
В Grafana: Configuration → Data Sources → Add data source → InfluxDB.
- Query Language: Flux (для InfluxDB 2.x)
- URL:
http://localhost:8086 - Organization: ваша org
- Token: API-токен с правами на чтение бакета
- Default Bucket: metrics
Базовый dashboard: системные метрики
Пример Flux-запроса для CPU:
from(bucket: "metrics")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "cpu")
|> filter(fn: (r) => r._field == "usage_idle")
|> filter(fn: (r) => r.cpu == "cpu-total")
|> map(fn: (r) => ({r with _value: 100.0 - r._value}))
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
Вместо написания запросов с нуля — импортируем готовый дашборд. В Grafana:
Dashboards → Import → вставить ID 1860 (Node Exporter Full, один из лучших).
Или для Telegraf: ID 928.
Alerting
Grafana 9+ имеет встроенный alert engine. Алерт создаётся прямо на панели дашборда: Edit panel → Alert → New alert rule.
Пример правила для CPU:
- Условие: среднее CPU за 5 минут > 85%
- Pending period: 5m (чтобы не срабатывал на короткие пики)
- Notification channel: Telegram, Slack, email
# Настройка Telegram notification channel
# Grafana → Alerting → Contact Points → New
# Type: Telegram
# Bot Token: токен бота
# Chat ID: chat_id куда слать
# Тест:
# Send test notification
Отправка кастомных метрик
Помимо системных метрик, можно писать свои данные напрямую в InfluxDB из Python:
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
from datetime import datetime
client = InfluxDBClient(
url="http://localhost:8086",
token="ваш_токен",
org="myorg"
)
write_api = client.write_api(write_options=SYNCHRONOUS)
# Записать метрику
point = (
Point("app_metrics")
.tag("service", "api")
.field("requests_per_minute", 142.5)
.field("error_rate", 0.02)
.time(datetime.utcnow())
)
write_api.write(bucket="metrics", record=point)
Ретенция данных и дисковое пространство
Метрики с интервалом 10 секунд за 30 дней занимают примерно 200–500 МБ для одного сервера — это незначительно. Можно настроить несколько бакетов с разной ретенцией: «горячий» бакет на 7 дней с детализацией 10 секунд, «холодный» на год с downsample до 5 минут.
# Создать задачу downsample в InfluxDB UI
# или через Flux task:
option task = {name: "downsample_hourly", every: 1h}
from(bucket: "metrics")
|> range(start: -task.every)
|> filter(fn: (r) => r._measurement == "cpu")
|> aggregateWindow(every: 5m, fn: mean)
|> to(bucket: "metrics_archive", org: "myorg")