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

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

-xjejm3bjb7sjb7zwhde9zxblm8.jpeg

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

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

начать нужно с последних двух пунктов. Проверить политику запуска скриптов можно командой
Get-ExecutionPolicy
если она вернула Restricted то нужно разрешить запуск скриптов в данной системе выполнив из административной консоли команду
Set-ExecutionPolicy Unrestricted

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

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

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


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


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

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


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


12345:Ok

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


число должно быть 64 битным целым или дробным, сообщение после двоеточия не более 2000 символом длиной.
Сообщение после двоеточия это та строка что отобразится в заголовке на цветном поле
s4o7nswrcd-ro0okd5bsuzeyyyu.jpeg
можно чтобы обозначить счетчик делать так


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, а не просто цифровые значения нужно возвращать коды выхода из скрипта. Мы сможем тогда передавать не просто цифры, но еще и красить датчики по цветам
s_0vhfs810axqfxvtvnms6rsbio.jpeg
все что нужно сделать чтобы PRTG отобразила в нужном цвете это вернуть параметр на выходе, в powershell это делается командой на выходе

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


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

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


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

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


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



Первый канал
100


Второй канал
200


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


""
       ""
       "Total all accounts"
       "$TotalAllAccountsBeg"
       "RUB"
       ""

       ""
       "Total all accounts income"
       "$TotalAllAccountsIncome"
       "RUB"
       ""

       ""
       "Total all account outcome"
       "$TotalAllAccountsOutcome"
       "RUB"
       ""
""


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

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

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

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


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


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


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


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

полный список тэгов здесь: prtg.paessler.com/api.htm? username=demo&password=demodemo&tabid=7

Рабочий пример выдающий 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


""
       ""
       "Total all accounts"
       "$TotalAllAccountsBeg"
       "RUB"
       ""

       ""
       "Total all accounts income"
       "$TotalAllAccountsIncome"
       "RUB"
       ""

       ""
       "Total all account outcome"
       "$TotalAllAccountsOutcome"
       "RUB"
       ""

       ""
       "Total all account current"
       "$TotalAllAccountsCurr"
       "RUB"
       ""
""


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

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


на сервере с PRTG есть каталог «C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors» в нем нас интересует 2 директории
EXE для простых датчиков
EXEXML для сложных датчиков
забрасываем наш скриптик в каталог EXEXML
далее, как обычно добавляем сенсор
zwfnvubtfelcwydv5gaimg2n534.jpeg

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

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

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

ссылки по теме:
www.paessler.com/manuals/prtg/additional_sensor_types
prtg.paessler.com/api.htm? username=demo&password=demodemo&tabid=7

© Habrahabr.ru