Zabbix. Мониторинг температуры процессора Windows-машины

Будем использовать активного Zabbix-агента для слежения за температурой процессора.

Уверен, что важность мониторинга температуры процессора объяснять не нужно.

Замечание 1.
Способ установки Python 2.7 описан тут: https://www.mihanik.net/tihaja-ustanovka-python-2-7/

Замечание 2.

Способ становки Zabbix-агента (клиента) описан тут: https://www.mihanik.net/ustanovka-zabbix-klienta/

1. Собираем данные по температуре при помощи скрипта.

Всё, что касается измерения температуры процессора (процессоров) будет располагаться в каталоге C:\Zabbix\scripts\OHMR

Скрипт  написан на Python 2.7, он собирает данные по температуре процессора (процессоров) и формирует 2 файла:

  • C:\zabbix\scripts\OHMR\cpu0.txt — температура первого процессора
  • C:\zabbix\scripts\OHMR\cpu1.txt — температура второго процессора.

Замечание 1.

Если второго процессора в компьютере нет, то в файле cpu1.txt будет всегда нулевая температура.

Замечание 2.

Для получения температуры процессора будет использоваться OpenHardwareMonitor (консольная его версия). Страницу проекта можно найти тут: https://github.com/openhardwaremonitor/openhardwaremonitor . Дело в том, что при помощи WMI действительную температуру процессора не узнать. Чтобы узнать текущую температуру нужно прочитать данные из регистров процессора, чтобы прочитать данные из регистров процессора, нужно работать из нулевого кольца защиты, а чтобы попасть в нулевое кольцо, нужно писать драйвер… Вот OpenHardwareMonitor и делает за нас всю эту черновую работу. Нам остаётся только проанализировать то, что он нам выдаст.

Сам скрипт сохранён под именем C:\zabbix\scripts\OHMR\OHMR.py.

Текст скрипта:
# -*- coding: utf-8 -*-

import os
import sys
import ctypes

#
# Функция проверки наличия прав администратора
# Вход: нет
# Выход: true - есть права администратора,
#        false - нет прав администратора
#
def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

################################################################################
#   Начало программы
################################################################################
def main(argv=None):

   # Проверяем наличие прав админа.
   if not is_admin ():
      sys.exit ('Not enough permissions to run the script !!!')
   
   # Устанавливаем кодировку по умолчанию.
   reload(sys)
   sys.setdefaultencoding('utf8')
   
   # Устанавливаем имена файлов, где будет храниться температура процесcоров
   cpu0 = 'C:/zabbix/scripts/OHMR/cpu0.txt'
   cpu1 = 'C:/zabbix/scripts/OHMR/cpu1.txt'
   
   # Получаем результат работы OHMR
   OHMR = []
   OHMR = os.popen("C:\zabbix\scripts\OHMR\OpenHardwareMonitorReport.exe").read().splitlines()
   
   # Высчитываем температуру 0-го и, возможно, 1-го процесора
   
   n0 = 0
   sum0 = 0
   
   n1 = 0
   sum1 = 0
   
   for i in OHMR:
      if (':' in i) and ('(/intelcpu/0/temperature/' in i):
         t = i.split()
         n0 = n0 + 1
         sum0 = sum0 + int(t[8])
   
      if (':' in i) and ('(/intelcpu/1/temperature/' in i):
         t = i.split()
         n1 = n1 + 1
         sum1 = sum1 + int(t[8])
   
   if n0>0:
      sum0 = sum0 / n0
   
   if n1>0:
      sum1 = sum1 / n1
   
   # Сохраняем температуру 0-го процессора в файл
   f = open(cpu0,'w')
   try:
      f.write(str(sum0))
   except Exception:
      pass
   finally:
      f.close()
   
   # Сохраняем температуру 1-го процессора в файл
   f = open(cpu1,'w')
   try:
      f.write(str(sum1))
   except Exception:
      pass
   finally:
      f.close()

if __name__ == "__main__":
    sys.exit(main())

2. Устанавливаем скрипт в системе.

Скрипт лучше запускать каждые 5-10 минут. Я обычно это делаю каждые 10 минут – не слишком часто, но и не слишком редко.

Запланировать выполнение скрипта можно при помощи планировщика Windows. Задание планировщика можно создать вручную, а можно и при помощи bat-файла.

Я обычно это делаю при помощи “батника”, имя своему батнику я дал INSTALL_OHMR_py.bat .

Текст скрипта:
@echo off

Rem Предполагаем, что на Windows XP скрипт запускается администратором.
Rem Для более старших систем это неверно.

rem Получаем версию ОС
ver | find "5.1."

rem Windows XP ?
If %errorlevel%==0  (
	rem Пропускаем проверку админских прав
	GOTO SKIPADMIN
 )
 
SET HasAdminRights=0

FOR /F %%i IN ('WHOAMI /PRIV /NH') DO (
	IF "%%i"=="SeTakeOwnershipPrivilege" SET HasAdminRights=1
)

IF NOT %HasAdminRights%==1 (
	ECHO .
	ECHO Not enough permissions to run the script !!!
	ECHO .
	GOTO END
)

:SKIPADMIN

rem Получаем версию ОС
rem Windows XP ?

ver | find "5.1."

If %errorlevel%==0  (
rem Windows XP
	SCHTASKS /Create /RU "NT AUTHORITY\SYSTEM" /SC HOURLY /ST 00:00:00 /TN "OHMR0" /TR "python \"C:\zabbix\scripts\OHMR\OHMR.py\""
	SCHTASKS /Create /RU "NT AUTHORITY\SYSTEM" /SC HOURLY /ST 00:10:00 /TN "OHMR1" /TR "python \"C:\zabbix\scripts\OHMR\OHMR.py\""
	SCHTASKS /Create /RU "NT AUTHORITY\SYSTEM" /SC HOURLY /ST 00:20:00 /TN "OHMR2" /TR "python \"C:\zabbix\scripts\OHMR\OHMR.py\""
	SCHTASKS /Create /RU "NT AUTHORITY\SYSTEM" /SC HOURLY /ST 00:30:00 /TN "OHMR3" /TR "python \"C:\zabbix\scripts\OHMR\OHMR.py\""
	SCHTASKS /Create /RU "NT AUTHORITY\SYSTEM" /SC HOURLY /ST 00:40:00 /TN "OHMR4" /TR "python \"C:\zabbix\scripts\OHMR\OHMR.py\""
	SCHTASKS /Create /RU "NT AUTHORITY\SYSTEM" /SC HOURLY /ST 00:50:00 /TN "OHMR5" /TR "python \"C:\zabbix\scripts\OHMR\OHMR.py\""
 ) else (
rem НЕ Windows XP
	SCHTASKS /Create /RU "NT AUTHORITY\SYSTEM" /SC DAILY /ST 00:00 /RI 10 /DU 24:00 /TN "OHMR" /TR "python \"C:\zabbix\scripts\OHMR\OHMR.py\"" /RL HIGHEST /F
 )

del /f /q C:\zabbix\scripts\OHMR\cpu0.txt
del /f /q C:\zabbix\scripts\OHMR\cpu1.txt

python C:\zabbix\scripts\OHMR\OHMR.py

:END

EXIT /B

3. Формируем шаблон в Zabbix.

В Zabbix при этом добавляем несложный шаблон.

Сначала приведу описание шаблона в картинках.

Создаём шаблон с именем : Active Computer — Python — CPU Temperature


Группа элементов данных: CPU


Элементы данных:

  • CPU0 Temperature — vfs.file.contents[C:\zabbix\scripts\OHMR\cpu0.txt]
  • CPU1 Temperature — vfs.file.contents[C:\zabbix\scripts\OHMR\cpu1.txt]




Триггеры:

  • Информация {HOST.NAME}. Температура процессора выше 50 градусов {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu1.txt].last()}>=50 and {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu1.txt].last()}<60
  • Информация {HOST.NAME}. Температура процессора выше 50 градусов {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu0.txt].last()}>=50 and {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu0.txt].last()}<60
  • Предупреждение {HOST.NAME}. Температура процессора выше 60 градусов {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu1.txt].last()}>=60 and {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu1.txt].last()}<70
  • Предупреждение {HOST.NAME}. Температура процессора выше 60 градусов {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu0.txt].last()}>=60 and {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu0.txt].last()}<70
  • Средняя {HOST.NAME}. Температура процессора выше 70 градусов {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu1.txt].last()}>=70 and {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu1.txt].last()}<80
  • Средняя {HOST.NAME}. Температура процессора выше 70 градусов {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu0.txt].last()}>=70 and {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu0.txt].last()}<80
  • Высокая {HOST.NAME}. Температура процессора выше 80 градусов {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu1.txt].last()}>=80
  • Высокая {HOST.NAME}. Температура процессора выше 80 градусов {Active Computer — Python — CPU Temperature:vfs.file.contents[C:\zabbix\scripts\OHMR\cpu0.txt].last()}>=80




И для большей наглядности добавим графики…


А вот и готовый для импорта заархивированный файл с описанным выше шаблоном:  Active Computer — Python — CPU Temperature.xml

Описанные ранее скрипты можно найти в моём репозитории: https://github.com/mihanik2000/ZabbixActiveAgent/tree/master/zabbix/scripts/OHMR

4. Сбор данных.

Осталось назначить созданный шаблон соответствующему узлу сети и ждать начала поступления данных.




 

Всё!