Ad Widget

Collapse

Использование макро для snmp oid

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Zuzuka
    Member
    • Aug 2011
    • 39

    #1

    Использование макро для snmp oid

    Друзья!

    Пожалуйста, укажите путь истинный, как мне справиться с такой ситуацией. Возможно уже есть подобное решение или недокументированная возможность? Я пререлистал кучу станиц этого форума, но ничего похожего не нашел.

    Суть: Имеется сервер виртуальных машин VMware ESX Server 3.5.0. Настраиваю мониторинг некоторых его параметров через SNMP. Внутри него есть куча VM, id которых доступны по таким OID-ам (VMWARE-VMINFO-MIB):
    vmVMID.0 (1.3.6.1.4.1.6876.2.1.1.7.0) значение равно 1088
    vmVMID.
    1 (1.3.6.1.4.1.6876.2.1.1.7.1) значение равно 1154
    vmVMID.
    2 (1.3.6.1.4.1.6876.2.1.1.7.2) значение равно 1227
    vmVMID.
    3 (1.3.6.1.4.1.6876.2.1.1.7.3) значение равно 1291
    vmVMID.
    4 (1.3.6.1.4.1.6876.2.1.1.7.4) значение равно 1404
    ...
    vmVMID.21 (1.3.6.1.4.1.6876.2.1.1.7.21)
    значение равно 1732

    Далее эти id (только для запущенных VM, например для 1088, 1227 и 1732) используются в следующих IOD-ах как индексы для параметров загрузки проца и памяти:
    cpuUtil.1088 (1.3.6.1.4.1.6876.3.1.2.1.3.1088),
    cpuUtil.1227 (1.3.6.1.4.1.6876.3.1.2.1.3.1227),
    cpuUtil.1732 (1.3.6.1.4.1.6876.3.1.2.1.3.1732);
    memUtil.1088 (1.3.6.1.4.1.6876.3.2.4.1.4.1088),
    memUtil.1227 (1.3.6.1.4.1.6876.3.2.4.1.4.1227),
    memUtil.1732 (1.3.6.1.4.1.6876.3.2.4.1.4.1732).


    Проблема: Если максимальное число виртуальных машин на сервере я еще могу спрогнозировать, например не более 50, то вот значения id, которые сервер присваивает этим VM спрогнозировать (точнее описать в OID-ах) крайне проблематично. Поэтому, я добавил в темплейт элементы vmVMID.0, vmVMID.1, ..., vmVMID.49 (тип данных Character) и макросы такого содержания (чтобы ими "выловить" значения id машин):
    MACRO VALUE
    ----------------
    {$VM00_ID} {{HOSTNAME}:vmVMID.0.last(0)}
    {$VM01_ID} {{HOSTNAME}:vmVMID.1.last(0)}
    {$VM02_ID} {{HOSTNAME}:vmVMID.2.last(0)}
    ...
    {$VM49_ID} {{HOSTNAME}:vmVMID.49.last(0)}

    Так вот когда я начинаю по SNMP получать значения параметра например, memUtil.0, OID которого я прописал как "1.3.6.1.4.1.6876.3.2.4.1.4.{$VM00_ID}", то вместо ожидаемого "1.3.6.1.4.1.6876.3.2.4.1.4.1088" получаю "1.3.6.1.4.1.6876.3.2.4.1.4.{{HOSTNAME}:vmVMID.0.l ast(0)}", который тут же становится Unsupported и на этом дальнейший рассчет прекращается.

    Ниже прилагается соответствующий лог:
    Code:
     22307:20110803:123228.345 In substitute_simple_macros() data:'memUtil.0'
     22307:20110803:123228.346 In substitute_simple_macros() data:'public'
     22307:20110803:123228.346 In substitute_simple_macros() data:'1.3.6.1.4.1.6876.3.2.4.1.4.{$VM00_ID}'
     22307:20110803:123228.346 In zbxmacros_get_value() macro:'{$VM00_ID}'
     22307:20110803:123228.346 In zbxmacros_get_value_hosts() macro:'{$VM00_ID}'
     22307:20110803:123228.346 zbxmacros_get_value_hosts() hostid:10244
     22307:20110803:123228.346 Query [txnlev:0] [select macro,value from hostmacro where hostid=10244]
     22307:20110803:123228.347 Query [txnlev:0] [select templateid from hosts_templates where hostid=10244]
     22307:20110803:123228.348 In zbxmacros_get_value_hosts() macro:'{$VM00_ID}'
     22307:20110803:123228.348 zbxmacros_get_value_hosts() hostid:10243
     22307:20110803:123228.348 Query [txnlev:0] [select macro,value from hostmacro where hostid=10243]
     22307:20110803:123228.350 Query [txnlev:0] [select templateid from hosts_templates where hostid=10243]
     22307:20110803:123228.351 zbxmacros_get_value_hosts() replace_to:'{{HOSTNAME}:vmVMID.0.last(0)}'
     22307:20110803:123228.351 End of zbxmacros_get_value_hosts():SUCCEED
     22309:20110803:123228.351 In get_values()
     22309:20110803:123228.351 In DCinit_nextchecks()
     22309:20110803:123228.351 In DCconfig_get_poller_items() poller_type:0
     22309:20110803:123228.351 End of DCconfig_get_poller_items():0
     22309:20110803:123228.351 In DCflush_nextchecks()
     22309:20110803:123228.351 End of get_values()
     22309:20110803:123228.352 poller #15 spent 0.000676 seconds while updating 0 values
     22309:20110803:123228.352 In DCconfig_get_poller_nextcheck() poller_type:0
     22309:20110803:123228.352 End of DCconfig_get_poller_nextcheck():1312363949
     22309:20110803:123228.352 sleeping for 1 seconds
     22307:20110803:123228.352 End of zbxmacros_get_value_hosts():SUCCEED
     22307:20110803:123228.352 End of zbxmacros_get_value()
     22307:20110803:123228.352 End substitute_simple_macros() data:'1.3.6.1.4.1.6876.3.2.4.1.4.{{HOSTNAME}:vmVMID.0.last(0)}'
     22307:20110803:123228.352 In get_value() key:'memUtil.0'
     22307:20110803:123228.353 In get_value_snmp() key:'memUtil.0' oid:'1.3.6.1.4.1.6876.3.2.4.1.4.{{HOSTNAME}:vmVMID.0.last(0)}'
     22307:20110803:123228.353 In snmp_open_session()
     22307:20110803:123228.353 SNMP [[email protected]:161]
     22307:20110803:123228.353 End of snmp_open_session()
     22307:20110803:123228.353 Standard processing
     22307:20110803:123228.353 In snmp_normalize(oid:1.3.6.1.4.1.6876.3.2.4.1.4.{{HOSTNAME}:vmVMID.0.last(0)})
     22307:20110803:123228.353 End of snmp_normalize():1.3.6.1.4.1.6876.3.2.4.1.4.{{HOSTNAME}:vmVMID.0.last(0)}
     22307:20110803:123228.354 In get_snmp(oid:1.3.6.1.4.1.6876.3.2.4.1.4.{{HOSTNAME}:vmVMID.0.last(0)})
    No log handling enabled - turning on stderr logging
    snmp_build: unknown failure 22307:20110803:123228.354 Status send [1]
     22307:20110803:123228.354 End of get_snmp():NOTSUPPORTED
     22307:20110803:123228.354 In snmp_close_session()
     22307:20110803:123228.354 End of snmp_close_session()
     22307:20110803:123228.354 End of get_value_snmp():NOTSUPPORTED
    Как мне правильно применять макросы в snmp oid-ах для такого случая? Значение "vmVMID.0" возвращается нормально. Пробовал значения макроса {$VM00_ID} писать как:
    vmVMID.0.last(0)
    {vmVMID.0.last(0)}
    {{HOSTNAME}:vmVMID.0.last(0)}
    результат аналогичный.
    Прошу помощи зала, так сказать
  • zalex_ua
    Senior Member
    Zabbix Certified Trainer
    Zabbix Certified SpecialistZabbix Certified Professional
    • Oct 2009
    • 1286

    #2
    Привет землякам.

    Во первых нужно указывать какая у вас версия Zabbix !
    Судя из обстоятельств я предполагаю что у вас 1.8.4 или выше.

    Originally posted by Zuzuka
    Поэтому, я добавил в темплейт элементы vmVMID.0, vmVMID.1, ..., vmVMID.49 (тип данных Character) и макросы такого содержания (чтобы ими "выловить" значения id машин):
    MACRO VALUE
    ----------------
    {$VM00_ID} {{HOSTNAME}:vmVMID.0.last(0)}
    {$VM01_ID} {{HOSTNAME}:vmVMID.1.last(0)}
    {$VM02_ID} {{HOSTNAME}:vmVMID.2.last(0)}
    ...
    {$VM49_ID} {{HOSTNAME}:vmVMID.49.last(0)}
    А где в документации сказано что заббикс умеет так "прогибаться"? Если по сути - раскрытие системных макросов внутри пользовательских макросов - такое не поддерживается.


    Originally posted by Zuzuka
    Так вот когда я начинаю по SNMP получать значения параметра например, memUtil.0, OID которого я прописал как "1.3.6.1.4.1.6876.3.2.4.1.4.{$VM00_ID}", то вместо ожидаемого "1.3.6.1.4.1.6876.3.2.4.1.4.1088" получаю "1.3.6.1.4.1.6876.3.2.4.1.4.{{HOSTNAME}:vmVMID.0.l ast(0)}", который тут же становится Unsupported и на этом дальнейший рассчет прекращается.
    Совершенно верно, согласно документации только пользовательские макросы поддерживаются в OID и только с версии 1.8.4
    А вы пытаетесь раскрыть "системный" макрос, да еще и внутри пользовательского. Такая "матрешка" невозможна.

    Originally posted by Zuzuka
    Как мне правильно применять макросы в snmp oid-ах для такого случая? Значение "vmVMID.0" возвращается нормально. Пробовал значения макроса {$VM00_ID} писать как:
    vmVMID.0.last(0)
    {vmVMID.0.last(0)}
    {{HOSTNAME}:vmVMID.0.last(0)}
    результат аналогичный.
    Аналогичный это какой? -> отрицательный или положительный?
    Я понял что отрицательный, но не напрягайте чужой мозг, пишите всегда определенно.
    Отрицательный потому что это не пользовательские макросы, см. мой предыдущий комментарий.

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

    И посмотрите в сторону динамических индексов. Я не использовал - ничего сказать не могу

    Comment

    • Zuzuka
      Member
      • Aug 2011
      • 39

      #3
      Originally posted by zalex_ua
      Во первых нужно указывать какая у вас версия Zabbix !
      Судя из обстоятельств я предполагаю что у вас 1.8.4 или выше.
      Пардон! Действительно, у меня версия Zabbix 1.8.5.

      Originally posted by zalex_ua
      А где в документации сказано что заббикс умеет так "прогибаться"? Если по сути - раскрытие системных макросов внутри пользовательских макросов - такое не поддерживается.
      Честно, говоря, прочитав ту документацию, вообще не понятно, чем отличается пользовательский макрос от какого-либо другого, и как описывать (или какими могут быть) значения макросов.
      Поэтому все "пробовалось" исключительно методом "тыка". Более того, там же в доке приводится пример (ни слова о том, какой это макрос - пользовательский или какой-другой):
      Пример 2
      Использование макроса уровня узла сети в триггере “CPU load is too high”:
      {ca_001:system.cpu.load[,avg1].last(0)}>{$MAX_CPULOAD}
      который, собственно, меня и побудил на поиск решения в моем случае через использование макроса в OID.

      Originally posted by zalex_ua
      А вы пытаетесь раскрыть "системный" макрос, да еще и внутри пользовательского. Такая "матрешка" невозможна.
      Я после нескольких дней экспериментов тоже почти дошел до такого же вывода. Но, надежда умирает последней, решил уточнить у знатоков, может и можно как-то это сделать.

      Originally posted by zalex_ua
      И посмотрите в сторону динамических индексов. Я не использовал - ничего сказать не могу
      К сожалению, в моем случае мне нужно не значение индекса, а собственно само значение переменной.
      Другими словами, мне нужно вначале вычислить значение SNMP переменной, а затем использовать ее значение в качестве индекса в искомом SNMP запросе. Вот такая "петрушка".

      Comment

      • dima_dm
        Senior Member
        • Dec 2009
        • 2697

        #4
        Originally posted by Zuzuka
        К сожалению, в моем случае мне нужно не значение индекса, а собственно само значение переменной.
        Другими словами, мне нужно вначале вычислить значение SNMP переменной, а затем использовать ее значение в качестве индекса в искомом SNMP запросе. Вот такая "петрушка".
        Пишите скрипт, который делает необходимый опрос по SNMP и используйте Внешние проверки

        Comment

        • dotneft
          Senior Member
          • Nov 2008
          • 699

          #5
          Вообще SNMP ненадежная штука=\

          Полюбому у dom0 хоста, т.е. у Vmware ESX есть CLI которым можно проверять работу хостов, вот с помощью этого дела и делайте. Если не хотите часто запрашивать данные в tmp файлик записывайте кронтабом раз в минуту и из файлика читайте заббикс_агентом.

          ЗЫ: если есть возможность не использовать SNMP не используйте его Агент все таки tcp + многопоточный.

          Comment

          • dima_dm
            Senior Member
            • Dec 2009
            • 2697

            #6
            Вот как я это делал через API (VMware Infrastructure (VI) Perl Toolkit), только у меня ESX/ESXi 4.0 и 4.1, т.е. посвежее.
            Last edited by dima_dm; 09-08-2011, 17:03.

            Comment

            Working...