Стек и зачем он нужен

Grafana — это не только для энтерпрайза и команд из 50 человек. Для одного сервера или небольшой инфраструктуры стек InfluxDB + Telegraf + Grafana даёт красивые дашборды и алерты за один вечер настройки.

Роли компонентов:

Установка 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.

Базовый 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:

# Настройка 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")