Увидел на просторах Инфостарта статью и решил сделать себе нечто подобное. Никакой цели, кроме исследовательской, не преследовал. Было интересно просто посмотреть на графики, какое количество памяти выделяется на процесс, сколько живут процессы и каково их количество на каждом сервере.
Для получения объема потребляемой памяти процессами:
1. Был написан скрипт на python
import sys
sys.path.append('C:\\Program Files\\Python38\\lib\\site-packages\\win32')
sys.path.append('C:\\Program Files\\Python38\\lib\\site-packages\\win32\\lib')
import wmi
import json
servers = ['server1', 'server2', 'server3'] # указываем серверы кластера
response = [] #список словарей с результатом
for server in servers:
try:
c = wmi.WMI(server)
for proc in c.Win32_Process():
if proc.Description == 'rphost.exe':
dict_res = {'server_name': server, 'values': {'name_rphost': f'rphost_{proc.ProcessID}', 'working_set_size': round(int(proc.WorkingSetSize) / 1048576, 2)}}
response.append(dict_res)
except wmi.x_wmi as err:
error = err
continue
print(json.dumps(response)) #создаем json из списка словарей с результатом
Формат полученных данных будет приблизительно такой
[{"server_name": "server1", "values": {"name_rphost": "rphost_58564", "working_set_size": 48145.27}}, {"server_name": "server1", "values": {"name_rphost": "rphost_32956", "working_set_size": 54529.21}}, {"server_name": "server1", "values": {"name_rphost": "rphost_28856", "working_set_size": 27538.9}}, {"server_name": "server2", "values": {"name_rphost": "rphost_15800", "working_set_size": 49021.79}}, {"server_name": "server2", "values": {"name_rphost": "rphost_24416", "working_set_size": 56346.69}}, {"server_name": "server2", "values": {"name_rphost": "rphost_14772", "working_set_size": 63873.95}}, {"server_name": "server3", "values": {"name_rphost": "rphost_16416", "working_set_size": 53725.92}}, {"server_name": "server3", "values": {"name_rphost": "rphost_2424", "working_set_size": 45330.21}}, {"server_name": "server3", "values": {"name_rphost": "rphost_20116", "working_set_size": 48531.26}}, {"server_name": "server3", "values": {"name_rphost": "rphost_52112", "working_set_size": 33326.7}}]
2. Положил этот скрипт в папку для внешних скриптов Zabbix, настроил user_parameters и добавил элемент данных на сервер, на котором будет выполняться этот скрипт.
3. Создал правило обнаружения для этого элемента данных
и в макросах указал переменные, которые мы будем забирать из полученного в основном элементе данных json'a
4. В созданном правиле обнаружения создал прототип элементов данных
И добавил шаг предобработки JSONPath c параметром
$[?(@.server_name=='{#SERVER_NAME}')].[?(@.name_rphost=='{#NAME_RPHOST}')].working_set_size.first()
5. Добавил прототип триггера, который будет срабатывать, если объем памяти рабочего процесса будет превышать 50 Гб
6. Добавил график в Grafana и наслаждался красотой
И вот такая картина за 7 дней, видно, как в один из дней все процессы резко умерли, это связано с рестартом кластера 1С