Русский
Русский
English
Статистика
Реклама

Procmeminfo gawk удобный JSON для discovery метрик в zabbix

В работе над одной задачей, понадобилось добавить в мониторинг все счетчики памяти из /proc/meminfo с нескольких linux хостов, для отслеживания состояние памяти в течении времени

root@server:~# cat /proc/meminfo                MemTotal:        8139880 kBMemFree:          146344 kBMemAvailable:    4765352 kBBuffers:          115436 kBCached:          6791672 kBSwapCached:         9356 kBActive:          4743296 kBInactive:        2734088 kBActive(anon):    2410780 kBInactive(anon):   340628 kBActive(file):    2332516 kBInactive(file):  2393460 kBUnevictable:           0 kBMlocked:               0 kBSwapTotal:       3906556 kBSwapFree:        3585788 kBDirty:               804 kBWriteback:             0 kBAnonPages:        567172 kBMapped:          2294276 kBShmem:           2182128 kBKReclaimable:     198800 kBSlab:             340540 kBSReclaimable:     198800 kBSUnreclaim:       141740 kBKernelStack:        7008 kBPageTables:        90520 kBNFS_Unstable:          0 kBBounce:                0 kBWritebackTmp:          0 kBCommitLimit:     7976496 kBCommitted_AS:    5171488 kBVmallocTotal:   34359738367 kBVmallocUsed:       25780 kBVmallocChunk:          0 kBPercpu:            24480 kBHardwareCorrupted:     0 kBAnonHugePages:         0 kBShmemHugePages:        0 kBShmemPmdMapped:        0 kBFileHugePages:         0 kBFilePmdMapped:         0 kBCmaTotal:              0 kBCmaFree:               0 kBHugePages_Total:       0HugePages_Free:        0HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:       2048 kBHugetlb:               0 kBDirectMap4k:      773632 kBDirectMap2M:     7606272 kBDirectMap1G:     2097152 kBroot@server:~#

Набор счетчиков должен приезжать в мониторинг автоматически при помощи discovery прямиком с файла /proc/meminfo

После разведки и создании метрик, все метрики должны приезжать в мониторинг раз в минуту одной операцией, для снижения эффекта наблюдения

Первое что пришло на ум - создать скрипт, запилить в нем всю логику, разложить на сервера и добавить юсер-параметр zabbix агента, но это уже не спортивно, так как эту же штуку можно сделать используя лишь gawk

Создадим шаблон в мониторинге, переходим во вкладку макросы, создаем три макроса:

макрос {$PATH} нужен для того чтобы gawk нашелся при попытке его запустить

Содержание макроса:

PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; LANG=en_US.UTF-8;

макрос {$S} нужен будет в discovery ( простыню про gawk, BEGIN я объясню в конце статьи )

gawk  'BEGIN {FS=":";ORS="";print "{\"data\": [ " }{b=gensub(/ +/,"","g",gensub(/kB/,"","g",$2) );$1=gensub(/\(|\)/,"_","g",$1);printf "%s{\"{#TYPE}\": \"%s\", \"{#VALUE}\": \"%s\"}",separator, $1, b;separator = ",";} END { print " ]}" }' /proc/meminfo

макрос {$VALUE} нужен будет при получении метрик раз в минуту

gawk  'BEGIN { FS=":"; ORS = ""; print "{" } { b=gensub(/ +/,"","g",gensub(/kB/,"","g",$2) ); $1=gensub(/\(|\)/,"_","g",$1); printf "%s\"%s\":\"%s\"",separator,$1,b;separator=",";} END { print "}" }' /proc/meminfo

вот наш шаблон

Создадим обычную метрику meminfo system.run[{$PATH} {$VALUE},wait]

Обратите внимание на конструкцию вызова system.run а внутри два макроса {$PATH} {$VALUE} очень коротко, лаконично и удобно

Метрика meminfo является источником данных для метрик которые будут обнаружены

С метрикой пока все

Создаем правило обнаружения meminfo

Перейдем в фильтр и добавим {#TYPE} [не равно] VmallocTotal|VmallocChunk это делается для исключения двух ненужных нам параметров

Создаем прототип элемента данных, тип данных зависимый элемент, в качестве источника данных выбираем метрику созданную ранее

В пред-обработке настраиваем JSONPath + добавляем множитель так как цифры приезжают к килобайтах, а нужны в байтах.

Линкуем созданный шаблон с хостом

Пробуем

Должно получится

метрики нашлись, данные по ним распределились в правильном исчислении то есть в байтах

можем посмотреть и графики

Теперь самое интересное, как использовать gawk для создания JSON для discavery и для базовой метрики

Вот полный честный вывод JSON для discavery

root@server:~# gawk  'BEGIN {FS=":";ORS="";print "{\"data\": [ " }{b=gensub(/ +/,"","g",gensub(/kB/,"","g",$2) );$1=gensub(/\(|\)/,"_","g",$1);printf "%s{\"{#TYPE}\": \"%s\", \"{#VALUE}\": \"%s\"}",separator, $1, b;separator = ",";} END { print " ]}" }' /proc/meminfo{"data": [ {"{#TYPE}": "MemTotal", "{#VALUE}": "8139880"},{"{#TYPE}": "MemFree", "{#VALUE}": "147628"},{"{#TYPE}": "MemAvailable", "{#VALUE}": "4764232"},{"{#TYPE}": "Buffers", "{#VALUE}": "115316"},{"{#TYPE}": "Cached", "{#VALUE}": "6789504"},{"{#TYPE}": "SwapCached", "{#VALUE}": "9356"},{"{#TYPE}": "Active", "{#VALUE}": "4742408"},{"{#TYPE}": "Inactive", "{#VALUE}": "2733636"},{"{#TYPE}": "Active_anon_", "{#VALUE}": "2411644"},{"{#TYPE}": "Inactive_anon_", "{#VALUE}": "340828"},{"{#TYPE}": "Active_file_", "{#VALUE}": "2330764"},{"{#TYPE}": "Inactive_file_", "{#VALUE}": "2392808"},{"{#TYPE}": "Unevictable", "{#VALUE}": "0"},{"{#TYPE}": "Mlocked", "{#VALUE}": "0"},{"{#TYPE}": "SwapTotal", "{#VALUE}": "3906556"},{"{#TYPE}": "SwapFree", "{#VALUE}": "3585788"},{"{#TYPE}": "Dirty", "{#VALUE}": "368"},{"{#TYPE}": "Writeback", "{#VALUE}": "0"},{"{#TYPE}": "AnonPages", "{#VALUE}": "568164"},{"{#TYPE}": "Mapped", "{#VALUE}": "2294960"},{"{#TYPE}": "Shmem", "{#VALUE}": "2182128"},{"{#TYPE}": "KReclaimable", "{#VALUE}": "198800"},{"{#TYPE}": "Slab", "{#VALUE}": "340536"},{"{#TYPE}": "SReclaimable", "{#VALUE}": "198800"},{"{#TYPE}": "SUnreclaim", "{#VALUE}": "141736"},{"{#TYPE}": "KernelStack", "{#VALUE}": "7040"},{"{#TYPE}": "PageTables", "{#VALUE}": "90568"},{"{#TYPE}": "NFS_Unstable", "{#VALUE}": "0"},{"{#TYPE}": "Bounce", "{#VALUE}": "0"},{"{#TYPE}": "WritebackTmp", "{#VALUE}": "0"},{"{#TYPE}": "CommitLimit", "{#VALUE}": "7976496"},{"{#TYPE}": "Committed_AS", "{#VALUE}": "5189180"},{"{#TYPE}": "VmallocTotal", "{#VALUE}": "34359738367"},{"{#TYPE}": "VmallocUsed", "{#VALUE}": "25780"},{"{#TYPE}": "VmallocChunk", "{#VALUE}": "0"},{"{#TYPE}": "Percpu", "{#VALUE}": "24480"},{"{#TYPE}": "HardwareCorrupted", "{#VALUE}": "0"},{"{#TYPE}": "AnonHugePages", "{#VALUE}": "0"},{"{#TYPE}": "ShmemHugePages", "{#VALUE}": "0"},{"{#TYPE}": "ShmemPmdMapped", "{#VALUE}": "0"},{"{#TYPE}": "FileHugePages", "{#VALUE}": "0"},{"{#TYPE}": "FilePmdMapped", "{#VALUE}": "0"},{"{#TYPE}": "CmaTotal", "{#VALUE}": "0"},{"{#TYPE}": "CmaFree", "{#VALUE}": "0"},{"{#TYPE}": "HugePages_Total", "{#VALUE}": "0"},{"{#TYPE}": "HugePages_Free", "{#VALUE}": "0"},{"{#TYPE}": "HugePages_Rsvd", "{#VALUE}": "0"},{"{#TYPE}": "HugePages_Surp", "{#VALUE}": "0"},{"{#TYPE}": "Hugepagesize", "{#VALUE}": "2048"},{"{#TYPE}": "Hugetlb", "{#VALUE}": "0"},{"{#TYPE}": "DirectMap4k", "{#VALUE}": "773632"},{"{#TYPE}": "DirectMap2M", "{#VALUE}": "7606272"},{"{#TYPE}": "DirectMap1G", "{#VALUE}": "2097152"} ]}root@server:~#

Вот так выглядит JSON для discavery

{"data": [ {"{#TYPE}": "MemTotal", "{#VALUE}": "8139880"},{"{#TYPE}": "MemFree", "{#VALUE}": "147628"},{"{#TYPE}": "MemAvailable", "{#VALUE}": "4764232"},{"{#TYPE}": "Buffers", "{#VALUE}": "115316"},{"{#TYPE}": "Cached", "{#VALUE}": "6789504"},{"{#TYPE}": "SwapCached", "{#VALUE}": "9356"},.....{"{#TYPE}": "DirectMap4k", "{#VALUE}": "773632"},{"{#TYPE}": "DirectMap2M", "{#VALUE}": "7606272"},{"{#TYPE}": "DirectMap1G", "{#VALUE}": "2097152"} ]}root@server:~# 
root@server:~# gawk 'BEGIN {FS=":";ORS="";print "{\"data\": [ " }{b = gensub(/ +/,"","g",  gensub(/kB/,"","g",$2) );$1=gensub(/\(|\)/,"_","g",$1);printf "%s{\"{#TYPE}\": \"%s\", \"{#VALUE}\": \"%s\"}",separator, $1, b;separator = ",";}END { print " ]}" }' /proc/meminfo

BEGIN {FS=":";ORS="";print "{\"data\": [ " }

FS=":"; - разделяет строку на части и передает разделившеся части в $1, $2 ... $n

print "{\"data\": [ " - выполняется только один раз, в самом начале

Дальше происходит магия gawk организует сам цикл с перечислением всех полученных строк, принимая во внимание то что строки будут разделятся по ":" то мы в $1 получать всегда имя параметра, а в $2 всегда его значение, правда не очень в удобном формате

собственно это выглядит как: есть строка из цикла CommitLimit: 7976496 kB которая разделяется:

$1=CommitLimit

$2= 7976496 kB

Нужно предобработать обе строки

b = gensub(/ +/,"","g", gensub(/kB/,"","g",$2) ); содержится две функции gensub

Вложенная функция gensub(/kB/,"","g",$2) исключает из вывода kB а базовая gensub(/ +/,"","g", ........ ); исключает пробелы, получаем чистую цифиру.

Следом в имени параметров {#TYPE} нужно предусмотреть что недолжно быть символов скобок ( ) так как мониторинг их не перевариват, ни при создании метрик, ни при разнесении данных.

Сказанно - сделано, регуляркой уберем скобки из имени параметра, заменим поджопником нижней чертой _ $1=gensub(/\(|\)/,"_","g",$1);

После подготовленные параметры, собираем JSON и выводим

printf "%s{\"{#TYPE}\": \"%s\", \"{#VALUE}\": \"%s\"}",separator, $1, b;separator = ",";}

После того как все строки обработаны, gawk выполняет END { print " ]}" что закрывает JSON и финализирует.

Вот таким простым способом без скриптов можно сделать обнаружения и формирование JSON с данными, добавив метрики в мониторинг и получая максимальный эффект от простоты применения.

Источник: habr.com
К списку статей
Опубликовано: 04.12.2020 20:21:06
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Системное администрирование

Awk

Zabbix

Json

Zabbix мониторинг

Linux

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru