Ad Widget

Collapse

Получение счетчика производительности perf_counter по имени процесса содержащего PID

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • EugeneSemyonov
    Junior Member
    • Apr 2020
    • 27

    #1

    Получение счетчика производительности perf_counter по имени процесса содержащего PID

    Всем, доброго дня!

    Подскажите, пожалуйста, как правильно настроить элемент для получения значения счетчика производительности perf_counter по имени процесса содержащего PID?
    (https://infostart.ru/public/966270/, http://web.archive.org/web/201901211...ocess-ids-pids)

    Имя процесса в мониторинге в данном случае не является постоянным. Можно ли настроить поиск такого процесса с помощью макроса или регулярного выражения?
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    В настройках Zabbix (в элементах данных с ключом perf_counter_en[counter,<interval>] или perf_counter[counter,<interval>]) указывается ссылка на соответствующий счётчик Windows Performance Monitor-а.
    Осталось выяснить, меняется ли эта ссылка при использовании упомянутого Вами приёма. Вот тут пишут, что список всех счётчиков можно получить консольной командой "typeperf -qx". Вот и надо разочек взять да проверить. Если ничего не меняется - то и новой проблемы нет. Если меняется - то лепить какие-то костыли скрипты для низкоуровневого обнаружения (LLD).

    Comment

    • EugeneSemyonov
      Junior Member
      • Apr 2020
      • 27

      #3
      Доброго дня, Kos. Проверил командой "typeperf -qx". Все процессы выводятся с подчёркиванием и PID:
      \Process(rphost_4032)\Working Set
      \Process(rphost_4032)\Private Bytes
      \Process(rphost_4032)\Working Set - Private
      \Thread(rphost_4032/0)\Context Switches/sec
      \Thread(rphost_4032/1)\Context Switches/sec
      \Thread(rphost_4032/2)\Context Switches/sec
      \Thread(rphost_4032/3)\Context Switches/sec
      \Thread(rphost_4032/4)\Context Switches/sec
      \Thread(rphost_4032/5)\Context Switches/sec
      \Thread(rphost_4032/6)\Context Switches/sec
      \Thread(rphost_4032/7)\Context Switches/sec
      и т.д.

      PS C:\Users\Username> tasklist /FI "imagename eq rphost.exe"

      Image Name PID Session Name Session# Mem Usage
      ========================= ======== ================
      rphost.exe 4032 Services 0 260 072 K
      Похоже придётся настраивать обнаружение.

      Comment

      • EugeneSemyonov
        Junior Member
        • Apr 2020
        • 27

        #4
        Пытаюсь настроить обнаружение процессов. Написал скрипт, который возвращает данные об обнаруженных процессах в формате json, в соответствие со структурой указанной в мануале к Zabbix. На основании этих данных должны создаваться элементы для счетчиков с ключами вида: perf_counter["\Process(rphost_4032)\Working Set - Private"]

        При проверке с помощью zabbix_get вижу корректный текст в формате json:
        Code:
        {[INDENT]"data":[[/INDENT][INDENT=2]{"{#PROCESS}":"ragent"},[/INDENT][INDENT=2]{"{#PROCESS}":"rmngr"},
        {"{#PROCESS}":"rphost"},
        {}[/INDENT][INDENT]][/INDENT]
         }
        Почему при работе правила получаю:
        Cannot accurately apply filter: no value received for macro "{#FSTYPE}".
        Cannot accurately apply filter: no value received for macro "{#FSTYPE}".
        Cannot accurately apply filter: no value received for macro "{#FSTYPE}".
        Cannot accurately apply filter: no value received for macro "{#FSTYPE}".
        Причём здесь {#FSTYPE}?
        Last edited by EugeneSemyonov; 13-05-2020, 16:59.

        Comment

        • Kos
          Senior Member
          Zabbix Certified SpecialistZabbix Certified Professional
          • Aug 2015
          • 3404

          #5
          EugeneSemyonov , каким образом запускаете скрипт на агенте?
          Стандартный вариант - через UserParameter; в этом случае имя нового ключа придумываете сами и прописываете его в конфиге агента в этой самой строке UserParameter, после чего перезапускаете агента, чтобы он, перечитав конфигурацию, распознавал этот новый ключ.

          Comment

        • EugeneSemyonov
          Junior Member
          • Apr 2020
          • 27

          #6
          @Kos, прошу прощения, поздно увидел ваш пост и уже несколько раз отредактировал свой.

          С ключом и форматом json разобраться удалось. В первом случае я не очень внимательно прочитал конфиг агента и не правильно указал ключ. Во втором пришлось добавить data, ну и забытые запятые между элементами.
          Состояние правило обнаружения перешло в Активно. Но с восклицательным знаком и комментарием указанным выше.
          Новые элементы по прототипу не создаются, хотя прототип активен.

          Comment

          • Kos
            Senior Member
            Zabbix Certified SpecialistZabbix Certified Professional
            • Aug 2015
            • 3404

            #7
            EugeneSemyonov , не надо комментировать другие сообщения - лучше отвечать отдельной репликой (иначе легко пропустить Ваш комментарий).
            (update: уже отредактировано, спасибо).

            Причём здесь {#FSTYPE}?
            Возможно, он используется в фильтре правила обнаружения. Загляните в свойствах самого правила обнаружения на закладку "Filters" - может, там есть упоминание этого макроса?

            пришлось добавить data, ну и забытые запятые между элементами.
            Ко всему прочему, Ваш (процитированный в предыдущем сообщении) JSON по-прежнему не совсем корректен. У него последняя строка списка содержит пустой элемент ({}). Ну, то есть формально - синтаксис этого JSON-а корректен, но не думаю, что это понравится серверу Zabbix (скорее всего, он ругнётся, что не нашёл в этой строке LLD-макроса, нужного для создания элемента из прототипа).
            Last edited by Kos; 13-05-2020, 17:24.

            Comment

            • EugeneSemyonov
              Junior Member
              • Apr 2020
              • 27

              #8
              Действительно в фильтрах был макрос, т.к. я скопировал правило с другого имеющегося. Про пустой элемент знаю. Это был осознанные шаг пока не придумал как после последнего элемента формируемого в цикле убрать запятую.
              Убрал макрос и заработало! Создались элементы, на 4 пустой элемент Zabbix сервер выругался, что такой элемент уже создан.
              Kos, большое спасибо!
              Last edited by EugeneSemyonov; 13-05-2020, 19:09.

              Comment

              • Kos
                Senior Member
                Zabbix Certified SpecialistZabbix Certified Professional
                • Aug 2015
                • 3404

                #9
                Originally posted by EugeneSemyonov
                пока не придумал как после последнего элемента формируемого в цикле убрать запятую.
                Ну, тут особых проблем быть не должно. Есть, как минимум, три приёма, позволяющих это сделать.

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

                Если же этого нет (или не хочется с этим связываться), то можно использовать остальные два метода.
                Как правило, в скрипте используется цикл, в котором формируется тело JSON-а. И тут возможны два варианта:
                1) по мере обработки сразу пишем результат в stdout;
                2) набираем результат в некую переменную, которую по окончании цикла распечатываем, снабжая корректным заголовком и окончанием.

                Так вот, в первом случае хорошо себя зарекомендовал такой шаблон построения скрипта (на примере bash-а, но легко адаптируется для любого языка программирования):
                Code:
                #!/bin/bash
                #...подготовительные работы...
                printf "{\n\t\"data\":[\n"
                FIRST=1
                for ITEM in #сам цикл для обработки
                do
                  if [ $FIRST != "1" ]
                  then
                    printf ",\n"
                  else
                    FIRST=0
                  fi
                  printf "\t\t{\t\"{#MACRO}\":\"${ITEM}\"\t}"
                done
                printf "\n\t]\n}\n"
                Во втором случае - либо можно поступать аналогично, либо ещё проще: в теле цикла собирать значение результирующей переменной вместе со всеми запятыми, а по выходе из скрипта просто отрезать лишнюю запятую (в конце либо, что проще, в начале значения), прежде чем её распечатывать, добавляя "заголовок" и "хвост". Аналогичный пример шаблона:
                Code:
                #!/bin/bash
                #...подготовительные работы...
                TAB=$'\t'
                LF=$'\n'
                REZ=""
                for ITEM in #сам цикл для обработки
                do
                  REZ="${REZ},${LF}${TAB}${TAB}{${TAB}\"{#MACRO}\":\"${ITEM}\"${TAB}}"
                done
                #если в переменную что-то набрали, то отрежем первые два символа (запятую и перевод строки)
                if [ -n "${REZ}" ]
                then
                  REZ=${REZ:2}
                fi
                #распечатываем результат
                printf "{\n\t\"data\":[\n"
                printf "%s" "${REZ}"
                printf "\n\t]\n}\n"

                Comment

                Working...