Monitorix: добавляем объём записанных данных SSD

Я уже писал про использование системы Monitorix и как можно получить в терминале Linux объём записанных данных на SSD накопитель. Теперь нужно объединить всё это в одно целое и добавить в систему мониторинга график изменения данного значения.

Я не умею писать модули для Monitorix, но есть один обходной путь: использование стандартного модуля gensens (generic sensors). Он позволяет читать данные из обычных текстовых файлов. Значит нам остаётся только эти данные туда писать.

Забирать данные будем простым скриптом на Python:

monitor-agent.py:

#!/usr/bin/python3

import os
import subprocess

sdf = subprocess.run(["smartctl", "-a", "/dev/sdf"], capture_output=True)
sdf = sdf.stdout.decode()
sdf = sdf.split("\n")

for item in sdf:
        if "Total_LBAs_Written" in item:
                tbw = item.split()
                tbw = tbw[-1]
                tbw = 512 * int(tbw) # bytes
                tbw = round(tbw / 1024 / 1024 / 1024 / 1024, 3)
                f = open("/run/monitorix-tbw-sdf", "wt")
                f.write(str(tbw))
                f.close()

Что делает этот код:

  1. Выполняет команду smartctl, вывод сохраняет в переменную.
  2. Вывод разбивается на список строк.
  3. В цикле проверяется каждая строка и ищется фраза «Total_LBAs_Written».
  4. Из найденной строки берётся необходимое значение, переводится в терабайты.
  5. Результат записывается в файл.

Для записи я использую каталог /run, который хранится в оперативной памяти, чтобы не создавать дополнительные операции записи на SSD.

Этот скрипт нам нужно периодически запускать. Я это делаю с интервалом в 10 минут. Используем cron:

# crontab -e

Добавляем в конец строку:

*/10 * * * * monitor-agent.py

Теперь осталось научить Monitorix забирать информацию из файла. Правим файл /etc/monitorix/monitorix.conf. В секции graph_enable включаем модуль gensens. Затем переходим к секции gensens и приводим её к такому виду:

# GENSENS graph
# -----------------------------------------------------------------------------
<gensens>
        <list>
                0 = byt0
        </list>
        <title>
                0 = TBW SSD
        </title>
        <desc>
                byt0 = /run/monitorix-tbw-sdf
        </desc>
        <unit>
                byt0 = 1
        </unit>
        <map>
                byt0 = System SSD
        </map>
        <alerts>
        </alerts>
        rigid = 0, 0, 2
        limit = 100, 100, 100
</gensens>

Перезапускаем сервис:

# service monitorix restart

И смотрим график:

Обратите внимание, что данные отображаются в терабайтах. На графике букву «m» следует читать как милли-терабайт, т.е. 1/1000 ТБ. Значит 370m = 0.37 ТБ. После перехода рубежа в 1 ТБ отображение должно вроде стать нормальным.

Точно также можно добавлять в мониторинг любые другие данные.