SNMP функция опроса свободного места на диске сервера

Опубликовано: 05.06.2015
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

Стандартная функция слежения за свободным паространством на сервере, входящая в набор сервера мониторинга The dude, опрашивает только первый жесткий диск сервера и игнорирует остальные, поэтому необходимо дополнить сервер мониторинга своей функцией.

Для мониторинга за свободным местом на дисках серверов в настройках программы необходимо создать функцию обработки SNMP информации, например для диска D: функция выглядит так:

Name:
Disk_D_FreeSpace

Description:

Code:
if
(
 string_find
 (
   oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
   "D:"
 )
 <> 4294967295,
 if
 (
   string_find
   (
     oid
     (
       concatenate
       (
         "iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageType.",
         array_find
         (
           oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
           string_substring
           (
             oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
             string_find
             (
               oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
               "D:"
             ),
             string_find
             (
               oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
               ",",
               string_find
               (
                 oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                 "D:"
               )
             )
             - string_find
               (
                 oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                 "D:"
               )
           )
         )
         + 1
       )
     ),
     "iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTypes.hrStorageFixedDisk"
   )
   <> 4294967295,
   string_substring
   (
     (
       1 - oid
           (
             concatenate
             (
               "iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageUsed.",
               array_find
               (
                 oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                 string_substring
                 (
                   oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                   string_find
                   (
                     oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                     "D:"
                   ),
                   string_find
                   (
                     oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                     ",",
                     string_find
                     (
                       oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                       "D:"
                     )
                   )
                   - string_find
                     (
                       oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                       "D:"
                     )
                 )
               )
               + 1
             )
           )
       / oid
         (
           concatenate
           (
             "iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageSize.",
             array_find
             (
               oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
               string_substring
               (
                 oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                 string_find
                 (
                   oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                   "D:"
                 ),
                 string_find
                 (
                   oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                   ",",
                   string_find
                   (
                     oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                     "D:"
                   )
                 )
                 - string_find
                   (
                     oid_column("1.3.6.1.2.1.25.2.3.1.3",600),
                     "D:"
                   )
               )
             )
             +1
           )
         )
     )
     * 100,
     0,
     4
   ),
   ""
 ),
 ""
)

Эта функция работает по следующему алгоритму:

1. Проверяется, есть ли в массиве дисков опрашиваемого устройства диск, в описании которого содержится "D:".
2. Ищется индекс диска, в описании которого содержится "D:" (эта подфункция будет использоваться несколько раз).
3. Проверяется, если найденный диск является жестким диском (hrStorageFixedDisk).
4. Запрашивается используемое место на диске с указанным индексом.
5. Запрашивается емкость диска с указанным индексом.
6. Вычисляется свободное место в процентах по формуле (1 - (занятое место / емкость диска)) * 100
7. От полученного значения берется подстрока из первых 4 символа, а остальное отсекается.

Для того, чтобы создать функцию опроса для другого диска, например для E:, нужно заменить в тексте функции имя диска D: на E:

Чтобы сервер мониторинга The dude проверял наличие дисков в серверах, согласно созданной функции, необходимо создать пробу SNMP, например для диска D: проба выглядит так:

Name:
Disk D free space

Type:
Function

Agent:
Default

Available:
Disk_D_FreeSpace()>0

Error:
if(Disk_D_FreeSpace() < 10, "Low Disk Space D:", "")

Value:
Disk_D_FreeSpace()

Unit:
%

Чтобы на карте дисков отображать информацию по свободному пространству на серверах, необходимо создать следующую функцию:

Name:
device_FreeSpace

Description:

Code:
concatenate
(
  if
  (
    Disk_C_FreeSpace(),
    concatenate("C: ", Disk_C_FreeSpace(), "% free "),
    ""
  ),
  if
  (
    Disk_D_FreeSpace(),
    concatenate("D: ", Disk_D_FreeSpace(), "% free "),
    ""
  ),
  if
  (
    Disk_E_FreeSpace(),
    concatenate("E: ", Disk_E_FreeSpace(), "% free "),
    ""
  )
)

Созданную функцию device_FreeSpace нужно вставить в значек устройства в настройках сервера на вкладке Map в секцию Device appearance:

Label:
[Device.Name]
[device_performance()]
[device_FreeSpace()]
[Device.ServicesDown]

Стандартную пробу с именем disk, желательно удалить с сервера, а чтобы не потеряеть ее конфигурацию, ее параметры приведены ниже:

Name:
disk

Type:
Function

Agent:
Default

Available:
hdd_size() > 0

Error:
if(hdd_size() > 0, "", "down")

Value:
hdd_usage()

Unit:
%