Цель создания шаблона — автоматизация мониторинга серверов системы видеонаблюдения на основе регистраторов Trassir под управлением одноименного программного обеспечения на основе linux через web-сервер SDK.

Trassir SDK включается в настройках веб-сервера, там же необходимо указать пароль. Согласно документации производителя для снятия показаний о работе сервера не нужно создавать отдельную учетную запись.

Trassir SDK предлагает доступ к состоянию сервера через запрос

https://{ip адрес сервера }:{порт подключения}/health?password={пароль SDK}

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

На конкретном примере в теле ответа получим следующее:

{
    "disks": "1",
    "database": "1",
    "channels_total": "13",
    "channels_online": "13",
    "uptime": "882232",
    "cpu_load": "33.96",
    "network": "1",
    "automation": "1",
    "disks_stat_main_days": "16.41",
    "disks_stat_priv_days": "0.00",
    "disks_stat_subs_days": "16.41"
}
/*

Meanings of values:

-1 - undefined value
 0 - bad health (error)
 1 - good health (ok)

Values for channels are channel counters.

Value of cpu_load is given in percents.

Первая часть вывода от символа { до символа } соответствует документации и является стандартизированным выводом формата JSON, что соответствует документации, а далее идет описание вывода, которое под стандарт не подходит.

Ранее для того чтобы использовать такой вывод в системе мониторинга Zabbix необходимо было писать свой скрипт, который бы использовался на агенте и получал нужные данные. При этом подходе либо нужно хранить файл ответа и следить за его актуальностью, либо запрашивать каждый элемент отдельно, т.е. использовать 11 запросов вместо 1.

В версии Zabbix 4.0 появился тип элемента данных HTTP агент, который позволяет получать данные по протоколам http и https и обрабатывать их, а также зависимые элементы, которые вычисляются из основных.

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

Первоначально определим макросы номера порта и пароля для универсальности и безопасности нашего шаблона.

Создаем шаблон и добавляем элемент данных с типом “HTTP агент”, ключом по желанию, URL https://{HOST.IP}:{$TRASSIR_SDK_PORT}/health и полем запроса password {$TRASSIR_SDK_PASS}. Здесь {HOST.IP} является макросом который при добавлении шаблона на узел будет преобразован в IP адрес хоста.

Как мы уже выяснили экспериментальным путём ранее этот запрос не соответствует в полной мере JSON формату и выделить из него данные просто так не получится.

Воспользуемся новым функционалом Zabbix и во вкладке “предобработка” шаблона элемента данных добавим регулярное выражение \{(\n|.)*\} с выводом \0 которое вернет только данные формата JSON.

Кому интересно, почему именно так
Разрабатывать подобные выражения для новичков гораздо проще в визуальном редакторе. В данном выражении мы ищем конкретный символ открывающейся фигурной скобки и так как в регулярных выражениях данные скобки используются необходимо перед символом указать обратный слэш. В данных JSON могут быть любые (на самом деле нет, но опустим этот момент) символы, а также перевод строки. Эти варианты символов, которые обозначают точкой или управляющего символа перевода строки \n указываются в круглых скобках через вертикальную черту. За скобками стоит звёздочка, которая говорит о том, что найденный символ или перевод строки могут повторяться бесконечное число раз. Далее идет закрывающаяся фигурная скобка. Вывод \0 означает что будут выведены все найденные последовательности.

Далее создается зависимый элемент данных для которого основной элемент данных указывается полученный ранее ответ в формате JSON и указывается предобработка с шагом “Путь JSON” который позволяет обратиться к любому элементу данных через указание пути JSON. В нашем примере все данные лежат на верхнем уровне, поэтому указываем $.disks и так далее для всех элементов.

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

Получается, что мы очень легко и быстро штатными методами Zabbix получили данные с внешней системы, вывод которой не в полной мере соответствует стандарту. Отсутствие внешних скриптов упрощает понимание системы мониторинга и повышает простоту её обслуживания.

Указанный шаблон доступен на портале обмена share.zabbix.com.

Комментарии (12)


  1. vesper-bot
    20.11.2018 17:12

    Если отбросить предобработку, можно ли распарсить JSON, возвращенный в ответ на HTTPS-запрос, средствами Zabbix 3.4?


    1. vanomel Автор
      20.11.2018 17:16

      В Zabbix 3.4 из указанного нет только http агента, так что ответ — да, можно.


      1. vesper-bot
        20.11.2018 17:53

        Интересно, как мне эмулировать http-agent для 3.4 — скриптом, что ли? Вроде как в 3.4 тупо нет возможности вызвать curl и получить его вывод в элемент данных заббикса.


        1. vanomel Автор
          20.11.2018 18:05

          можно скриптом, который просто будет возвращать ответ curl --insecure, но лучше бы задуматься об обновлении.


          1. vesper-bot
            20.11.2018 18:16

            Кстати, можно ли в 4м заббиксе на http-агенте писать discovery? Больно костыльное оно в заббиксе, по результатам попытки адаптировать возврат REST API в понятный заббиксу формат. А раз появился фактически нативный для заббикса формат получить результат вызова апи в виде json, дискавери можно было бы реализовать вычисляемыми элементами из одного запроса http-agent.


            1. vanomel Автор
              20.11.2018 18:32

              Предлагаю попробовать и опубликовать статью.


            1. xface
              20.11.2018 19:33

              Мы обновили свой zabbix до 4.0.1, думаю дискавери можно реализовать с его помощью(доступен для выбора в «типе»). Но у нас нет сервиса, на котором можно было бы обкатать это дело.
              А вот, что бы хотелось в http agent-е, то это получение времени выполнения запроса, как в web сценариях


        1. xface
          20.11.2018 19:35

          До перехода на 4-ю версию мы использовали внешний скрипт для таких вещей и пихали данные в траппер или создавали внешнюю проверку, но первый вариант субъективно удобней


        1. hanzakkerman
          21.11.2018 05:13

          Есть web.page.get, работает с zabbix-агента, ну и как и следовало бы ожидать, пишет содержимое полученной страницы: www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/zabbix_agent


          1. vesper-bot
            21.11.2018 09:14

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

            А ещё, из доков следует, что этот тип не умеет авторизации, а искомый апи её требует. Досадно, но не взлетит. Я думал, что есть вариант вытянуть содержимое полученной страницы из веб-сценария, где авторизация вполне себе настраивается, мало того, в web.test.in[] есть третий параметр, куда по идее можно что-то запихнуть, чтобы получить текст результата запроса, но в мануале там только глупый bps, не имеющий ИМХО большого смысла — все равно он определяется временем ответа в первую очередь.


  1. ol_x
    20.11.2018 20:43

    а curl внедрили в агента уже, или все еще в процессе щамены стандартного ключа web.get?


    1. blind_oracle
      22.11.2018 18:12

      HTTP запрос идет с сервера или с прокси, а не с агента.