Короткий вступ в rrdtool - dots and brackets блог

У минулому пості я згадав, що collectd за замовчуванням зберігає зібрані дані через rrdtool. На виході виходять кілька .rrd файлів - по одному для кожної метрики - і їх потім можна отрисовать за допомогою тієї ж rrdtool. RRD файли не так часто упливає в розмовах у кавоварки, та й сама rrdtool та ще tool, так що не відразу зрозуміло, чому collectd використовує саме її, а не якийсь там CSV.

Виявляється, причин вистачає.

Що таке rrdtool

RRDtool - це невелика утиліта, яка чудово робить три речі:

  1. Створює циклічні бази даних (Round-Robin Databases, RRDs),
  2. записує в них дані,
  3. і створює графіки на основі того, що туди записала.

Що таке циклічна база даних (RRD)

RRD це така спеціальна база даних, яка, починаючи з якогось моменту, записує нові значення поверх старих. Наприклад, якщо базі покладається зберігати 7 днів даних, то восьмий день запишеться поверх першого, дев'ятий - поверх другого, і так далі.

Для зберігання системних метрик це просто знахідка. Наприклад, мені рідко цікаво, як посекундно змінювалася завантаження процесора рік тому. За сьогодні і вчора - цікаво. Які-небудь усереднені погодинні значення за останні пару тижнів - теж цілком. Навіть усереднену завантаження по днях за останній рік іноді цікаво глянути. Але все, що старше і докладніше - кому це потрібно?

А rrdtool якраз під такі обмежені в часі і точності архіви і заточена. До того ж, через те, що тимчасові рамки і точність вшиті, розмір архівів відомий заздалегідь, так що сюрпризів з переповненням диска не відбудеться.

Створюємо циклічну базу (RRD)

Для створення RRD з rrdtool потрібно трохи чорної магії, але, якщо один раз розібратися, далі все піде як по маслу. Думаю, варто відразу почати з готової команди, а потім розбиратися, чому вона працює:

Перший рядок цілком зрозуміла - створюємо щось по імені cpu.rrd. У нашому випадку це циклічна база даних для зберігання метрик процесора. Наступний параметр - - step 10 - задає, як часто ми будемо записувати нову порцію даних. В даному випадку - раз в десять секунд. Якщо дані прийдуть рано чи пізно, rrdtool интерполирует значення і вирівняє їх по десятисекундним кордонів.

Останні два рядки описують джерело даних і архів, в якому вони будуть зберігатися.

Джерело даних (Data source, DS)

DS параметр описує джерело даних. Те, що він є, ще зовсім не означає, що дані будуть збережені - для цього потрібні архіви. І в одній базі може бути кілька джерел даних.

Наш параметр - DS. cpu. GAUGE. 20. 0. 100 - буквально означає наступне:

  1. Створи джерело даних (DS)
  2. під назвою cpu
  3. і з типом GAUGE.
  4. Якщо протягом 20 секунд (heartbeat interval) нових даних не надходить - зберігаємо UNDEFINED.
  5. Значення варіюються між 0
  6. і 100.

Тип GAUGE говорить rrdtool інтерпретувати входять значення «як є». Є ще типи COUNTER, DERIVE і ABSOLUTE, для яких rrdtool зберігала б не значення, а швидкість, з якою вони змінюються (беремо поточне значення, віднімаємо попереднє, ділимо на - step). З кроком - step. heartbeat-параметром і вбудованою інтерполяцією раз в 10 секунд в базі буде з'являтися нове значення, подобається нам це, чи ні. Це значення називаються первинної точкою даних (Primary Data Point, PDP)

Циклічний архів (Round-robin archive, RRA)

RRA - це агреговане тимчасове вікно з даними. Як і у випадку з DS, в основі їх може бути кілька. Наш єдиний архів RRA. AVERAGE. 0.5. 6. 120 розшифровується так:

  1. Створи циклічний архів (RRA)
  2. довжиною в 120 елементів,
  3. кожен з яких це середнє (AVERAGE)
  4. від 6-ти первинних точок даних.
  5. Якщо більше половини (> 0.5) значень в шістці - UNDEFINED, в архів так само йде UNDEFINED.

У підсумку вийде архів, який буде зберігати похвилинні (10 секунд * 6) середні значення завантаження CPU за останні дві години (10 секунд * 6 * 120). Один елемент архіву називається консолідованою точкою даних (Consolidated Data Point, CDP), а AVERAGE - консолідуючою функцією (Consolidation Function, CF). Первинні і консолідовані точки пов'язані між собою ось так:

Крім AVERAGE є й інші консолідуючі функції: MIN, MAX, і LAST.

Додаємо дані в RRD

Додавання нових даних в циклічну базу теж йде через rrdtool. Так як час впливає на те, як і куди будуть зберігатися значення, його потрібно передавати разом з ними. Наприклад, можна додати значення з міткою «зараз»:

Крім цифрових значень в базу можна зберегти 'U' - UNDEFINED.

Хоча дані і можна додавати руками через командний рядок, буде розумніше, якщо це буде робити скрипт або інша програма.

Створення графіків з RRD

rrdtool вміє не тільки зберігати дані, але і малювати. Команда для створення графіків може приймати на вхід мільйон параметрів. але для демки вистачить всього декількох основних.

На моїй віртуальній Убунту вже кілька днів працює collectd, який встиг зробити зграйку RRD файлів: cpu-system.rrd, cpu-user.rrd і тому подібних. Щоб зробити нормальний графік по першим двом файлам, досить такої команди:

Create CPU graph

Вітання.
Допоможи, будь ласка, розібратися: отримую помилку при використанні $ res = rrd_graph ($ file, $ options) -> «Call to undefined function rrd_graph ()»? На rrd_error помилки немає, rrd_fetch прекрасно відпрацьовує, а ось саме rrd_graph не хоче працювати. Може бути що для rrd_graph недоустановілся якийсь пакет? Або права на папку з файлами rrd не ті? Дякуємо

Вітання!
PHP не мій профіль, тому тут навряд чи допоможу. Але я б ставив на проблему переданими в rrd_graph аргументами, а не на пропущений пакет. У доках ніяких додаткових залежностей немає, а на Stack Overflow у кого-то вже була точно така ж помилка з rrd_xport, тому що $ options були неправильного формату, так що «Call to undefined function» може кидатися з різних причин. За ідеєю, у fetch і graph повинні бути однакові параметри, так що якщо fetch спрацював, твої $ options правильні і проблема повинна бути десь в $ file. Може, не вистачає прав на запис, або в дорозі якась проміжна папка не створена. Можна ще поексперементувати з форматом вихідний картинки: якщо PNG валиться, може, SVG прокотить, і тоді ми повертаємося до пропущених неявним залежностям.
Якось так.

Вітання. Может кому пригодится: у мене показувало помилку Call to undefined function rrd_graph в рядку, де я викликав цю функцію. В php є функція get_defined_functions, так від якщо викликати print_r (get_defined_functions); exit () ;. наприклад, в індексному файлі, то здадуться всі доступні php-фунтціі і якщо в їхньому списку немає rrd_graph, то біда в налаштуваннях на сервері. У мене були всі, крім rrd_graph 🙂 правда я не знаю що саме начальство робило на сервері - ніби як переустановили всю ту біду з rrdtool, ребутнулі сервак і все запрацювало. Ну а якщо функція є - то тоді дійсно проблема в опціях.

Мда, загадково. Але спасибі, що поділився. Я вже було задумався про скриптових мовах і недосконалість цього світу, як згадав, що недавно отлавливал вислизає NuGet пакет Compression для .NET додатки: все добре компілювати, але можна запустити програму тут же випадало з RuntimeExeption, Compresison.ZipFile не найден. Ніде порядку немає.