Graphite — система хранения и визуализации временных рядов метрик, разработанная для мониторинга серверной инфраструктуры и приложений. Принимает числовые метрики в простом текстовом формате через TCP, хранит их в специализированных файлах формата Whisper и предоставляет HTTP API для построения графиков. Graphite заложил основу для последующих TSDB (Time Series Database) и инструментов мониторинга.
Архитектура Graphite
Graphite состоит из трёх компонентов:
- Carbon — демон приёма метрик. Прослушивает порты TCP 2003 (plaintext), TCP 2004 (Pickle-протокол для batch-записи) и UDP 2003. Поддерживает carbon-cache (одиночный), carbon-relay (маршрутизация между несколькими carbon-cache) и carbon-aggregator (агрегация метрик перед записью).
- Whisper — файловая база данных метрик в формате, похожем на RRD (Round-Robin Database). Каждая метрика хранится в отдельном файле
.wsp. Поддерживает несколько уровней хранения с разной гранулярностью: «каждые 10 секунд — 2 недели; каждую минуту — 3 года». - Graphite Web — веб-интерфейс на Django с HTTP API и URL-based построением графиков. URL вида
/render?target=servers.web01.cpu&from=-24h&format=pngвозвращает PNG-изображение графика.
Протокол приёма метрик
Plaintext протокол — простейший способ отправки метрики:
echo "servers.web01.cpu.load 0.65 $(date +%s)" | nc graphite-host 2003
Формат: имя_метрики значение unix_timestamp. Имя метрики — иерархическая строка через точки. Именно эта простота сделала Graphite популярным: любой скрипт, приложение или сетевое устройство отправляет метрики без специальных библиотек.
Whisper: retention и агрегация
Конфигурация Whisper задаётся в storage-schemas.conf:
[servers]
pattern = ^servers\.
retentions = 10s:14d,1m:1y,10m:5y
Три уровня: 10-секундные данные за 14 дней, минутные за год, 10-минутные за 5 лет. При переходе на следующий уровень данные агрегируются (среднее, максимум, сумма — в зависимости от storage-aggregation.conf). Принципиальное ограничение Whisper: размер файла фиксирован при создании — изменить retention без пересоздания файла нельзя.
История
Graphite создан Крисом Дэвисом (Chris Davis) в компании Orbitz (туристический портал) в 2006 году для внутреннего мониторинга. Опубликован как open-source в 2008 году. Получил широкое распространение как первый простой и расширяемый инструмент мониторинга метрик с гибким API. В 2010-х годах Graphite вошёл в состав популярных мониторинговых стеков. С появлением InfluxDB (2013) и Prometheus (2016) Graphite постепенно стал legacy-решением. В 2024 году Graphite обновляется нечасто, поддерживается сообществом.
Graphite vs Prometheus vs InfluxDB
| Параметр | Graphite | Prometheus | InfluxDB |
|---|---|---|---|
| Протокол записи | Plaintext TCP/UDP | Pull (HTTP scrape) | Line Protocol (HTTP POST) |
| Хранение | Whisper-файлы | TSDB (локально) | TSM-формат |
| Запросы | URL-параметры | PromQL | Flux / InfluxQL |
| Кластеризация | Сложная (carbon-relay) | Thanos/Cortex | InfluxDB Clustered (платный) |
| Статус (2024) | Legacy, поддерживается | Активно развивается | Активно развивается |
Применение в хостинге
Graphite актуален для систем, уже работающих на нём: миграция нескольких лет накопленной истории метрик дорога. Совместим со StatsD — агрегатором метрик для приложений: многие языковые SDK по умолчанию умеют отправлять метрики в формате Graphite. Grafana поддерживает Graphite как источник данных наравне с Prometheus и InfluxDB. Для новых серверных проектов на VPS и выделенных серверах в 2024 году рекомендуется Prometheus с node_exporter — проще в настройке, активнее поддерживается и имеет значительно большую экосистему.