Почему бы не добавлять в систему мониторинга показатели работы из 1С (да и вообще чего угодно)? По мере изучения оказалось что вывести можно из скриптов, батников, VB скриптов, исполняемых файлов, по SSH, прямым исполнением sql запросов и еще куча способов. Чтобы не получилась огромная простыня в этой статье будет только минимум того что нужно чтобы прикрутить счетчики к PRTG с примерами на powershell.
На самом деле, все очень просто.
В PRTG существуют несколько видов сенсоров добавляемых вручную назовем их «простой сенсор» и «сложный сенсор».
Простой сенсор возвращает системе всего одно число и сообщение, выбросить текст на выход он должен в таком виде
Число должно быть 64-битным целым или дробным, сообщение после двоеточия не более 2000 символом длиной.
Сообщение после двоеточия — это та строка, что отобразится в заголовке на цветном поле
Можно чтобы обозначить счетчик делать так
В таком случае у вас будет меняться сообщение в поле Last Message но не будет меняться цвет. Как изменить фоновый цвет чуть ниже в разделе Коды выхода.
Из программы или скрипта, чтобы взаимодействовать нужно всего лишь выдать наружу текст и все. Я обычно подавляю выдачу любых сообщений, и выбрасываю наружу только строку. Ниже пример:
Чтобы получить правильный вид dashboard, а не просто цифровые значения нужно возвращать коды выхода из скрипта. Мы сможем тогда передавать не просто цифры но еще и красить датчики по цветам
Все что нужно сделать чтобы PRTG отобразила в нужном цвете это вернуть параметр на выходе, в powershell это делается командой на выходе.
В PRTG предусмотрены следующие коды
В принципе это все, что нужно знать о простых датчиках, чтобы начать.
Сложный сенсор должен выкинуть на выход данные в определенном формате, т.к. на одном графике может быть много каналов, маштабирование значений, подпись к ним и тому подобное то используется формат XML или JSON. Выход для XML должен быть примерно такой.
На пошике часть отвечающая за вывод будет выглядеть так:
Я даже не пытаюсь сделать Out-String, просто прямой вывод и все. Помним про грабли, каждая переменная должна содержать только одно значение и больше ничего, иначе получите неверный вывод, лучше явно привидитесь к типу.
Выглядеть для JSON должно примерно так:
Теперь давайте посмотрим самые важные тэги (все тэги регистрозависимы).
Теперь пример скрипта делающего вывод данных в формате PRTG. Считаем, что 1С-ка выгружает каждые N минут данные в текстовый файл на диске, содержимое текстового файла data.txt с исходными данными:
Тогда скрипт будет выглядеть так:
Скрипт готов, как устроен сенсор нам понятно, теперь давайте все это прикрутим и запустим.
На сервере с PRTG есть каталог «C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors» в нем нас интересует 2 директории:
Забрасываем наш скриптик в каталог EXEXML.
Далее, как обычно добавляем сенсор:
Указываем, что сенсор будет кастомный, вида exe\script advanced:
Меняем имя на понятное, нажимаем стрелку и видим скрипты из каталога EXEXML. Внимание, там ниже стоит значение — Discard EXE result, это значит что PRTG выполнив скрипт сбросит его вывод, для отладки можете переключить его в положение — записывать на диск, результат работы будет в каталоге C:\ProgramData\Paessler\PRTG Network Monitor\Logs\имя сенсора.
По итогу получаем то что нам нужно.
Ссылки по теме:
На самом деле, все очень просто.
Тут немного волшебства чтобы заработали 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 директории:
- EXE для простых датчиков
- EXEXML для сложных датчиков.
Забрасываем наш скриптик в каталог EXEXML.
Далее, как обычно добавляем сенсор:
Указываем, что сенсор будет кастомный, вида exe\script advanced:
Меняем имя на понятное, нажимаем стрелку и видим скрипты из каталога EXEXML. Внимание, там ниже стоит значение — Discard EXE result, это значит что PRTG выполнив скрипт сбросит его вывод, для отладки можете переключить его в положение — записывать на диск, результат работы будет в каталоге C:\ProgramData\Paessler\PRTG Network Monitor\Logs\имя сенсора.
По итогу получаем то что нам нужно.
Ссылки по теме:
Комментарии (2)
alchazar
02.02.2018 09:48В случае со сложными сенсорами можно добавить информацию о том, как показать информацию об ошибке в работе скрипта. То есть если скрипт выкинул ошибку и не сгенерировал правильный XML, PRTG об этом не сообщит насколько я помню (может и ошибаюсь). Я делаю примерно так:
# Function to write back an XML error in the format PRTG expects function Write-Xml-Error($ErrorMessage) { $xmlstring = "<?xml version=""1.0"" encoding=""UTF-8"" ?>`n" $xmlstring += "<prtg>`n" $xmlstring += "<error>1</error>`n" $xmlstring += "<text>" + $ErrorMessage + "</text>`n" $xmlstring += "</prtg>" Write-Output $xmlstring } # Function to return the XML output in the format PRTG expects function Write-Xml-Output($xml) { $xmlstring = "<?xml version=""1.0"" encoding=""UTF-8"" ?>`n" $xmlstring += "<prtg>`n" $smlString += $xml $xmlstring += "</prtg>" Write-Output $xmlstring } try { … Write-Xml-Output ($xml) } catch { Write-Xml-Error ("Exception occured (line #" + $_.InvocationInfo.ScriptLineNumber + ", Char#" + $_.InvocationInfo.OffsetInLine + "): " + $_.Exception.Message) }
kol_dm_ukk
Интересная идея! Сам 3 года использовал эту систему для компании-холдинга и многое что удавалось успешно мониторить через PRTG и реагировать вовремя. Однако, мысль не приходила чтобы мониторить показатели из 1С — надо попробовать )))