Как добавить свой счетчик в PRTG. И кратенько о форматах датчиков с примерами на powershell

Почему бы не добавлять в систему мониторинга показатели работы из 1С (да и вообще чего угодно)? По мере изучения оказалось что вывести можно из скриптов, батников, VB скриптов, исполняемых файлов, по SSH, прямым исполнением sql запросов и еще куча способов. Чтобы не получилась огромная простыня в этой статье будет только минимум того что нужно чтобы прикрутить счетчики к PRTG с примерами на powershell.

На самом деле, все очень просто.

Тут немного волшебства чтобы заработали PowerShell счетчики в PRTG

после того как счетчик создан может оказаться что он не выдает цифры, хотя в консоли или при ручном запуске все нормально. А дело в том что PRTG запускает скрипты из под «себя», у нее может:

  • не быть прав на доступ
  • может быть запрещен запуск скриптов в системе
  • может быть запрещен запуск скриптов в x86 версии а в x64 разрешен

Начать нужно с последних двух пунктов. Проверить политику запуска скриптов можно командой

Get-ExecutionPolicy

Если она вернула Restricted то нужно разрешить запуск скриптов в данной системе выполнив из административной консоли команду

Set-ExecutionPolicy Unrestricted

Для тех, кто хочет безопасности — подписывайте скрипты хотя бы даже и локальным сертификатом и установите политику AllSigned.

После установки политики запуска скриптов обязательно проверьте, что все верно, для тех у кого есть 32х битная версия PowerShell установите политику и в ней тоже, т.к. PRTG может пытаться ваш скрипт запустить именно с 32х битного пошика. (Точнее, она так и будет делать если есть PowerShell x86 версия), политики запуска у них разные, и установив в 64х битной можно забыть что в 32 так и осталось. Просто запустите под админом Powershell x86 и проведите те же настройки в нем.

Проблема прав решается проще — выставляем права everyone и если заработало, значит чето не хватает. Если на скрипте есть альтернативный ntfs в ствойствах то его надо убрать

Вначале немного теории о том как устроены сенсоры

В PRTG существуют несколько видов сенсоров добавляемых вручную назовем их «простой сенсор» и «сложный сенсор».

1. Простой сенсор

Простой сенсор возвращает системе всего одно число и сообщение, выбросить текст на выход он должен в таком виде

 12345:Ok  # допускается пробел, например так 12345 :Ok 

Число должно быть 64-битным целым или дробным, сообщение после двоеточия не более 2000 символом длиной.

Сообщение после двоеточия — это та строка, что отобразится в заголовке на цветном поле

Можно чтобы обозначить счетчик делать так

 1000 :To low 2000 :Ok 5000 :To high 

В таком случае у вас будет меняться сообщение в поле Last Message но не будет меняться цвет. Как изменить фоновый цвет чуть ниже в разделе Коды выхода.

Из программы или скрипта, чтобы взаимодействовать нужно всего лишь выдать наружу текст и все. Я обычно подавляю выдачу любых сообщений, и выбрасываю наружу только строку. Ниже пример:

 # Пусть 1С выгружает каждые 30 минут количество продаж за сегодня # в текстовый файлик $FileName = 'C:\PRTG\sales_today.txt'  # глушим все сообщения $ErrorActionPreference = 'SilentlyContinue'  if ((Test-Path $FileName) -eq $false) {  Write-Host "0 :Error" } else {     $Val = Get-Content $FileName | select -First 1      # обратите внимание на строку ниже, производится явное приведение типов     # иначе можно получить пустое значение в мониторинге (здесь грабля)     $Val = [string]$Val + ":Ok"      Write-Host $Val    # можно просто $Val     # возвращаем код выхода    exit 0 } 

коды выхода — красим датчики на панели

Чтобы получить правильный вид dashboard, а не просто цифровые значения нужно возвращать коды выхода из скрипта. Мы сможем тогда передавать не просто цифры но еще и красить датчики по цветам

Все что нужно сделать чтобы PRTG отобразила в нужном цвете это вернуть параметр на выходе, в powershell это делается командой на выходе.

# этот код сделает датчик зеленым exit 0

В PRTG предусмотрены следующие коды

Значение Описание
0 все хорошо. Датчик в dashborde покрашен в зеленый цвет. Последнее сообщение подсвечивается зеленым
1 Внимание. Датчик покрашен в желтый цвет. Последнее сообщение подкрашивается желтеньким
2 System error. Датчик покрашен в красный цвет. Последнее сообщение подсвечено красным. Сообщение регистрируется в Alert
3 Protocol error (например веб сервер возвращает 404). Датчик покрашен в красный цвет. Последнее сообщение красное. Алерт подсвечивается. Добавляется строка Protocol Error
4 Датчик покрашен красным. Последнее сообщение красное. Алерт регистрируется. Перед сообщением выводится надпись Content Error

В принципе это все, что нужно знать о простых датчиках, чтобы начать.

2. Сложный сенсор

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

<prtg> <result> <channel>Первый канал</channel> <value>100</value> </result> <result> <channel>Второй канал</channel> <value>200</value> </result> </prtg> 

На пошике часть отвечающая за вывод будет выглядеть так:

 "<prtg>"        "<result>"        "<channel>Total all accounts</channel>"        "<value>$TotalAllAccountsBeg</value>"        "<CustomUnit>RUB</CustomUnit>"        "</result>"         "<result>"        "<channel>Total all accounts income</channel>"        "<value>$TotalAllAccountsIncome</value>"        "<CustomUnit>RUB</CustomUnit>"        "</result>"         "<result>"        "<channel>Total all account outcome</channel>"        "<value>$TotalAllAccountsOutcome</value>"        "<CustomUnit>RUB</CustomUnit>"        "</result>" "</prtg>" 

Я даже не пытаюсь сделать Out-String, просто прямой вывод и все. Помним про грабли, каждая переменная должна содержать только одно значение и больше ничего, иначе получите неверный вывод, лучше явно привидитесь к типу.

Выглядеть для JSON должно примерно так:

        {          "prtg": {          "result": [          {          "channel": "Первый канал",          "value": "100"          },          {          "channel": "Второй канал",          "value": "20"          }          ]          }         } 

Теперь давайте посмотрим самые важные тэги (все тэги регистрозависимы).

<Channel>
обязательный
Имя канала отображаемое в пользовательском интерфейсе должен быть уникальный для каждого сенсора в одном датчике не должно быть 2 одинаковых имени канала
значение: любая строка

<Value>
обязательный
целое или дробное значение. Если PRTG не сможет его распознать то отобразит 0. Поэтому всего проверяйте формат вывода, правильно ли вы выводите
значение: целое или дробное

<CustomUnit>
нет
если выбрано то под цифрами выводится эта строка
например RUB
значение: любая строка, лучше короткая

<Unit>
не обязательный
Если хотите встроенную единицу измерения то нужно указать одну из встроенных. PRTG может понимать время и масштабировать некоторые величины (байты — мегабайты)
значение:
BytesBandwidth
BytesMemory
BytesDisk
Temperature
Percent
TimeResponse
TimeSeconds
Custom
Count
CPU (*)
BytesFile
SpeedDisk
SpeedNet
TimeHours

Полный список тэгов здесь.

Рабочий пример выдающий XML для PRTG

Теперь пример скрипта делающего вывод данных в формате PRTG. Считаем, что 1С-ка выгружает каждые N минут данные в текстовый файл на диске, содержимое текстового файла data.txt с исходными данными:

Отгрузка: 10 000 000,06 Втб и Сбер Нач ост: 8 000 000,93 Втб и Сбер Приход: 0 Втб и Сбер Расход: 0 Втб и Сбер Кон ост: 8 000 000,93 Гос заказ Нач ост: 2 000 000,4 Гос заказ Приход: 0 Гос заказ Расход: 0 Гос заказ Кон ост: 2 000 000,4 Касса Нач ост: 30 000,04 Касса Приход: 20 000,11 Касса Расход: 0 Касса Кон ост: 50 000,15 

Тогда скрипт будет выглядеть так:

 $FileName = 'C:\PRTG\data.txt'  # глушим все сообщения $ErrorActionPreference = 'SilentlyContinue'  # т.к. 1С-ка выгружает с запятыми и вставляет пробел как разделитель разрядов # то очищаем данные, убираем дробное и пробелы между цифрами function Get-Data{     Param(     [parameter(Mandatory=$true)]     [String]     $SourceString     )       $str = ''     $str = $SourceString.Split(':')     $str = $str[1]     $str = $str.split(',')     $str = $str[0]     $str = $str -replace '\s',''      return $str }  if ((Test-Path $FileName) -eq $false) {      exit 3 }  $File = Get-Content $FileName | Select-String "Отгрузка:" $SalesToday = Get-Data $File  $File = Get-Content $FileName | Select-String "Втб и Сбер Нач ост:" $AccVTBBeg = Get-Data $File  $File = Get-Content $FileName | Select-String "Втб и Сбер Приход:" $AccVTBincome = Get-Data $File  $File = Get-Content $FileName | Select-String "Втб и Сбер Расход:" $AccVTBoutcome = Get-Data $File  $File = Get-Content $FileName | Select-String "Втб и Сбер Кон ост:" $AccVTBCurr = Get-Data $File  $File = Get-Content $FileName | Select-String "Гос заказ Нач ост:" $AccGosBeg = Get-Data $File  $File = Get-Content $FileName | Select-String "Гос заказ Приход:" $AccGosincome = Get-Data $File  $File = Get-Content $FileName | Select-String "Гос заказ Расход:" $AccGosoutcome = Get-Data $File  $File = Get-Content $FileName | Select-String "Гос заказ Кон ост:" $AccGosCurr = Get-Data $File  $File = Get-Content $FileName | Select-String "Касса Нач ост:" $AccKassaBeg = Get-Data $File  $File = Get-Content $FileName | Select-String "Касса Приход:" $AccKassaincome = Get-Data $File  $File = Get-Content $FileName | Select-String "Касса Расход:" $AccKassaoutcome = Get-Data $File  $File = Get-Content $FileName | Select-String "Касса Кон ост:" $AccKassaCurr = Get-Data $File   $TotalAllAccountsBeg     = [int]$AccVTBBeg + [int]$AccGosBeg + [int]$AccKassaBeg $TotalAllAccountsIncome  = [int]$AccVTBincome + [int]$AccGosincome + [int]$AccKassaincome $TotalAllAccountsOutcome = [int]$AccVTBoutcome + [int]$AccGosoutcome + [int]$AccKassaoutcome $TotalAllAccountsCurr    = [int]$AccVTBCurr + [int]$AccGosCurr + [int]$AccKassaCurr   "<prtg>"        "<result>"        "<channel>Total all accounts</channel>"        "<value>$TotalAllAccountsBeg</value>"        "<CustomUnit>RUB</CustomUnit>"        "</result>"         "<result>"        "<channel>Total all accounts income</channel>"        "<value>$TotalAllAccountsIncome</value>"        "<CustomUnit>RUB</CustomUnit>"        "</result>"         "<result>"        "<channel>Total all account outcome</channel>"        "<value>$TotalAllAccountsOutcome</value>"        "<CustomUnit>RUB</CustomUnit>"        "</result>"         "<result>"        "<channel>Total all account current</channel>"        "<value>$TotalAllAccountsCurr</value>"        "<CustomUnit>RUB</CustomUnit>"        "</result>" "</prtg>" 

Скрипт готов, как устроен сенсор нам понятно, теперь давайте все это прикрутим и запустим.

А теперь прикручиваем кастомные сенсоры к PRTG

На сервере с PRTG есть каталог «C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors» в нем нас интересует 2 директории:

  1. EXE для простых датчиков
  2. EXEXML для сложных датчиков.

Забрасываем наш скриптик в каталог EXEXML.
Далее, как обычно добавляем сенсор:

Указываем, что сенсор будет кастомный, вида exe\script advanced:

Меняем имя на понятное, нажимаем стрелку и видим скрипты из каталога EXEXML. Внимание, там ниже стоит значение — Discard EXE result, это значит что PRTG выполнив скрипт сбросит его вывод, для отладки можете переключить его в положение — записывать на диск, результат работы будет в каталоге C:\ProgramData\Paessler\PRTG Network Monitor\Logs\имя сенсора.

По итогу получаем то что нам нужно.

Ссылки по теме:

FavoriteLoadingДобавить в избранное

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *