NetXMS Support Forum

Russian Support => Общие вопросы => Topic started by: Anth0ny on December 17, 2008, 05:29:32 PM

Title: Push-агент
Post by: Anth0ny on December 17, 2008, 05:29:32 PM
Довольно долго пытался вникнуть в суть данного агента и так до конца и не понял как же он работает.

Прошу если можно дать не теорию а практику, и привести хотя бы один (но полный) пример использования данного агента. Если вас не затруднит.

Я привык ориентироваться в документации на примеры и думаю мне вполне будет достаточно одного примера чтобы понять суть и способы применения...

Прошу помочь. =)
Title: Re: Push-агент
Post by: Victor Kirhenshtein on December 17, 2008, 07:22:15 PM
Push-параметры упоминались несколько раз на форуме:

https://www.netxms.org/forum/index.php/topic,48.msg145.html#msg145 (https://www.netxms.org/forum/index.php/topic,48.msg145.html#msg145)
https://www.netxms.org/forum/index.php/topic,22.msg62.html#msg62 (https://www.netxms.org/forum/index.php/topic,22.msg62.html#msg62)

Название "агент" здесь не очень уместно, но я ничего лучше не придумал. Это просто программа, которая может посылать данные для DCI на сервер. Т.е. смысл в том, что не сервер запрашивает данные у агента, а агент предоставляет данные когда считает нужным.

Пример использования:

Есть некий датчкик, с которым работает собственная программа, которая может вызывать внешний скрипт, которому передает текущее значение. Мы хотим это значение собирать на сервер. Для этого:

1. Делаем DCI с именем, например, Test, и источником Push Agent;
2. Делаем скрипт, который принимает текущее значение и отсылает на сервер:


#!/bin/sh
nxpush -u login -P password netxms_server_address Test=$1


все.
Title: Re: Push-агент
Post by: Anth0ny on May 28, 2009, 02:34:43 PM
Test=$1 - это означает, что мы присваиваем для текущего значения DCI "Test" значение $1 (которое получили от любой другой программы\скрипта)?

т.е. вот например такой cmd-скрипт должен сработать?
(если у DCI Test тип данных Integer)

set example=%random%
nxpush -u login -P password netxms_server_address Test=%example%

я в ответ получаю это: No valid pairs found; nothing to send

* * *

начинаю разбираться =)

nxpush -u "admin" -P "password" monitor monitor:Test=3403
Push failed at record #1 (#1 in batch): Invalid object ID.

Invalid object ID - это оно о чём?
Title: Re: Push-агент
Post by: Anth0ny on May 28, 2009, 03:16:01 PM
вот выполнение скрипта в режиме отладки:

nxpush.exe -vv -u admin -P password -H monitor MONITOR:Test=6666
AddValuePair: dciID="0", nodeName="MONITOR", dciName="Test", value="6666"
Connecting to "monitor" as "admin"; encryption is disabled
NXCL: SendMsg("CMD_GET_SERVER_INFO", id:0)
NXCL: RecvMsg("CMD_REQUEST_COMPLETED", id:0)
NXCL: SendMsg("CMD_LOGIN", id:1)
NXCL: RecvMsg("CMD_LOGIN_RESP", id:1)
Sending batch #1 with 1 records
Record #1: "6666" for 0(MONITOR):0(Test)
NXCL: SendMsg("CMD_PUSH_DCI_DATA", id:2)
NXCL: RecvMsg("CMD_REQUEST_COMPLETED", id:2)
Push failed at record #1 (#1 in batch): Invalid object ID.
NXCL: Network receiver thread stopped

Я посмотрел, у DCI "Test" dciID=1193
Title: Re: Push-агент
Post by: Victor Kirhenshtein on May 28, 2009, 09:32:31 PM
Quote from: Anth0ny on May 28, 2009, 02:34:43 PM
nxpush -u "admin" -P "password" monitor monitor:Test=3403
Push failed at record #1 (#1 in batch): Invalid object ID.

Invalid object ID - это оно о чём?

Eto znachit, chto server ne nashel ob'ekt nodi s ukazannim imenem (monitor). Nado ukazivat' libo imja hosta tak, kak ono propisano v NetXMS'e, libo ego ID.
Title: Re: Push-агент
Post by: Anth0ny on May 29, 2009, 11:53:21 AM
Виктор, вы как всегда правы =)
Заменил короткое имя сервера на длинное и всё срослось.

Правильно выглядит так:

nxpush.exe -vv -u admin -P password -H monitor MONITOR.mydomain.ru:Test=6666

процессуальный вопрос: сейчас если я правильно понял push-алгоритм реализован таким образом, что он пассивно принимает значения от внешнего источника. я думаю, что было бы гораздо удобнее, если бы push-агент мог иметь возможность работать по указанному ему заранее расписанию и САМОСТОЯТЕЛЬНО запускать указанные ему скрипты и программы и работать с их выхлопом.

тогда не понадобилось бы городить огород из дополнительных зашедулленых задач. всё бы управлялось из единого центра...
Title: Re: Push-агент
Post by: Anth0ny on May 29, 2009, 03:24:58 PM
вот, хотел попробовать ещё один способ, но...

пример: опрашиваем через SNMP на удалённой windows-машине сервис Task Shceduler.

штатными средствами этого пока ПРАВИЛЬНО сделать нельзя, поскольку как только сервис будет остановлен, его OID пропадёт из общего списка и DCI встаент в позу Not supported. а значит мониторить сервисы на запущено\не запущено не получается.

испытывал такое решение:

@echo off
nxsnmpget -c public -p 161 имя_опрашиваемого_сервера 1.3.6.1.4.1.77.1.2.3.1.1.14.84.97.115.107.32.83.99.104.101.100.117.108.101.114
nxpush -u admin -P password -H сервер_мониторинга "полное_имя_сервера_мониторинга:Task Scheduler Checker"=%errorlevel%

где errorlevel'ы (nxsnmpget'а):

0 - и OK, и если OID не найден
3 - request timed out

Проблема: nxsnmpget отдаёт errorlevel 0 одинаково и на "сервер доступен-OID есть" и на "сервер доступен-OID'а нет"

в принципе можно эту проблему решить при помощи такой конструкции (поможет возвращаемое значение [04] (получено, порядок) и [05] (не получено, проблема)):

@echo off
nxsnmpget -c public -p 161 имя_опрашиваемого_сервера 1.3.6.1.4.1.77.1.2.3.1.1.14.84.97.115.107.32.83.99.104.101.100.117.108.101.114 | find /I "[04]"
nxpush -u admin -P password -H сервер_мониторинга "полное_имя_сервера_мониторинга:Task Scheduler Checker"=%errorlevel%

где %errorlevel%'ы (find'а):

0 - всё ок, получили [04]
1 - всё плохо, получили не [04] (скорее всего [05])
Title: Re: Push-агент
Post by: Victor Kirhenshtein on May 31, 2009, 12:29:58 PM
Quote from: Anth0ny on May 29, 2009, 11:53:21 AM
процессуальный вопрос: сейчас если я правильно понял push-алгоритм реализован таким образом, что он пассивно принимает значения от внешнего источника. я думаю, что было бы гораздо удобнее, если бы push-агент мог иметь возможность работать по указанному ему заранее расписанию и САМОСТОЯТЕЛЬНО запускать указанные ему скрипты и программы и работать с их выхлопом.

A chem eto otlichaetsja ot obichnogo parametra agenta, kotorij vizivaet script cherez ExternalParameter? Rabotaet po raspisaniju, vozvraschaet rezul'tat raboti scripta...
Title: Re: Push-агент
Post by: Anth0ny on June 01, 2009, 09:39:20 AM
ээ.. я не совсем понимаю, о чём речь: "ExternalParameter"...
Title: Re: Push-агент
Post by: Victor Kirhenshtein on June 01, 2009, 10:02:16 AM
NetXMS агент может запускать любой скрипт и результат его работы использовать как значение запрошенного DCI. Например, если у меня есть скрипт


@echo 1


и я в конфиг агента добавлю


ExternalParameter = MyParameter:cmd /c c:\myscript.cmd


то у агента появится новый параметр с именем MyParameter, и если я создам на него DCI, то при каждом запросе сервера к агенту на значение этого параметра агент будет запускать указанный скрипт и как значение возвращать первую строку, выведенную скриптом на экран (в нашем примере всегда 1).
Title: Re: Push-агент
Post by: Anth0ny on June 01, 2009, 11:09:44 AM
спасибо, интересное решение =)

это равносильно ExternalParameter = MyParameter:cmd /c @echo 1
т.е. можно однострочные скрипты использовать без создания скриптофайла.

или же пользоваться опять же в простых случаях сцеплением && для многострочных скриптов с простым выводом...

вот интересный пример:

for /f "tokens=2" %i in ('"nslookup www.microsoft.com 2>nul | find /i /n "address" | find /i /v "[2]" & if errorlevel 1 echo Address Not-Found"') do echo %i
Title: Re: Push-агент
Post by: Anth0ny on June 01, 2009, 12:19:24 PM
и вот пример на злобу дня ;) :
ищем записи одного и тот же сервера на 2 DNS.


@echo off
for /f "tokens=2" %%i in ('"nslookup server1.mydomain.ru dnsserver1.mydomain.ru 2>nul | find /i /n "address" | find /i /v "[2]" & if errorlevel 1 echo Error DNS-Query-Error"') do set dns1=%%i
for /f "tokens=2" %%i in ('"nslookup server1.mydomain.ru dnsserver2.mydomain.ru 2>nul | find /i /n "address" | find /i /v "[2]" & if errorlevel 1 echo Error DNS-Query-Error"') do set dns2=%%i
if %dns1% equ 10.200.1.1 (set dns1=0) else set dns1=1
if %dns2% equ 10.200.1.1 (set dns2=0) else set dns2=2
set /a overall=%dns1%+%dns2%
@echo %overall%


таким образом если нет записей или не ответил сервер dnsserver1 мы получаем на выходе 1, если не получили данные от dnsserver2, то 2, а если не в курсе или не ответили оба, то 3. нормальное состояние = 0.
Title: Re: Push-агент
Post by: Ethril on April 20, 2011, 06:49:43 PM
Quote
nxpush.exe -vv -u admin -P password -H monitor MONITOR.mydomain.ru:Test=6666

Nado ukazivat' libo imja hosta tak, kak ono propisano v NetXMS'e, libo ego ID.
А возможно ли немного допилить nxpush, чтобы можно было указывать ему IP-адрес вместо имени ноды?

А то у меня PowerCLI-скрипт, периодически запускаемый на сервере NetXMS, извлекает с ESXi-гипервизора разную статистику. Эта статистика передаётся в нужные DCI через nxpush. И необходимость скрипту, помимо IP-адресов, откуда-то ещё брать внутренние NetXMS-овские идентификаторы нод выглядит неестественным усложнением.
Title: Re: Push-агент
Post by: Victor Kirhenshtein on April 26, 2011, 10:37:43 AM
Допиливать в данном случае надо сервер. Я добавил возможность использования IP адреса или DNS имени вместо имени объекта - их надо будет указывать после символа @, например:

nxpush.exe -u admin -P password -H monitor @10.0.0.2:Test=1

Эти изменения войдут в релиз 1.1.1. Если вы используете 1.0.11 и не планируете переход на ветку 1.1.x, то я могу прислать патч для сервера 1.0.11.
Title: Re: Push-агент
Post by: Victor Kirhenshtein on April 26, 2011, 03:15:49 PM
Кстати, а скриптом можете поделиться? У меня тоже есть ESXi, которые было бы полезно подключить к мониторингу, и другим может пригодится.
Title: Re: Push-агент
Post by: Ethril on April 27, 2011, 08:12:43 AM
Спасибо. Наверно по такому поводу перейду на 1.1 ветку :)

Скрипт:

Add-PSSnapin VMware.VimAutomation.Core
$UserName = "root"
$UserPWD = "password"
$InFilePath = "C:\ESXi-stats\ESXi-list.txt"
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -Confirm:$False
Get-Content $InFilePath | Foreach {
    Connect-VIServer $_ -User $UserName -Password $UserPWD
    $VMHost = Get-VMHost -Server $_
    $VMHostNetwork = 0
    $VMHostNetwork = Get-VMHostNetwork $_
    $VMDatastoreList = ''
    Get-Datastore -Server $_ | Foreach {
        $VMDatastoreList += $_.Name + ' '
        $ExecParameters = $VMHostNetwork.HostName + "." + $VMHostNetwork.DomainName + ":" + $_.Name + "=" + (1 - $_.FreeSpaceMB / $_.CapacityMB)
        & "$env:ProgramFiles\NetXMS\bin\nxpush.exe" -u pushagent -H SERVICE $ExecParameters
    }
    Disconnect-VIServer -Server $_ -Force -Confirm:$False
   
    $ExecParameters = $VMHostNetwork.HostName + "." + $VMHostNetwork.DomainName + ":MemUse=" + ($VMHost.MemoryUsageMB / $VMHost.MemoryTotalMB)
    & "$env:ProgramFiles\NetXMS\bin\nxpush.exe" -u pushagent -H SERVICE $ExecParameters
   
    $ExecParameters = $VMHostNetwork.HostName + "." + $VMHostNetwork.DomainName + ":CpuUse=" + ($VMHost.CpuUsageMhz / $VMHost.CpuTotalMhz)
    & "$env:ProgramFiles\NetXMS\bin\nxpush.exe" -u pushagent -H SERVICE $ExecParameters
   
    $ExecParameters = $VMHostNetwork.HostName + "." + $VMHostNetwork.DomainName + ":DatastoreList=" + $VMDatastoreList
    & "$env:ProgramFiles\NetXMS\bin\nxpush.exe" -u pushagent -H SERVICE $ExecParameters
}

(имя сервера NetXMS - SERVICE - не вынесено в переменную, во входном файле ESXi-list.txt находятся IP-адреса ESXi-гипервизоров в столбик, имена ESXi-гипервизоров в NetXMS соответствуют их DNS-именам, после вашего патча скрипт можно будет упростить)

Запускается из стандартного виндового шедулера батником:

%PSMODULEPATH%\..\powershell.exe -PSConsoleFile "%ProgramFiles%\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -WindowStyle Minimized -Command ".\Get-AllVMHostStats.ps1"

Из-за общей неторопливости PowerCLI отрабатывает довольно долго - у меня на 6 ESXi прокручивается ~3-4 минут. Поэтому часто делать отсчёты не получится.
Результат работы - http://img847.imageshack.us/i/89160342.jpg/
Title: Re: Push-агент
Post by: Ethril on April 27, 2011, 10:33:29 AM
Кстати, раз уж речь зашла про интеграцию NetXMS с ESXi, то есть ещё полезные фишки:

Можно включить на ESXi поддержку SNMP (только на бесплатной версии нужно её включать ДО лицензирования, пока ещё ESXi крутится на 30-дневной триалке). После этого появится возможность мониторить кое-какие параметры гипервизора (например, у меня TotalMemSize мониторится запросом на OID .1.3.6.1.4.1.6876.3.2.1.0), но в целом список этих параметров невелик и не очень интересен.
Значительно ценнее возможность получать кликом в консоли по ноде гипервизора список его виртуалок, для этого заходим в NetXMS->Control Panel->Object Tools->New->SNMP Table и там сооружаем табличку примерно такого вида: http://img828.imageshack.us/i/81835416.jpg/
Заодно можно добавить в Object Tools возможность запуска VIClient.

Также можно форвардить на NetXMS syslog-и гипервизоров, и фильтровать их на предмет ошибок.