Работа с API Яндекс метрики в Zabbix

Ранее я уже рассказывал, как работать с API от Google и Telegram, теперь поделюсь тем же самым, только для Яндекса. Я покажу, как забирать данные из api яндекс.метрики в сервер мониторинга Zabbix. У Яндекса доступ к api значительно проще, хотя используется тот же самый протокол OAuth 2.0.

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Работа с API Яндекс метрики в Zabbix

 

Введение

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

Получение доступа к API Яндекс

Для того, чтобы получить доступ к API Яндекса, вам надо добавить новое приложение по ссылке - https://oauth.yandex.ru. Нажимайте Зарегистрировать новое приложение.

Создание приложения для доступа к api

Вам нужно будет заполнить несколько обязательных полей:

  1. Название приложения.
  2. В качестве платформы указать Веб-сервисы.
  3. Callback URI установить - https://oauth.yandex.ru/verification_code.
  4. В Доступах указать: Яндекс.Метрика, Получение статистики, чтение параметров своих и доверенных счетчиков.

Включение доступа к яндекс метрики через api

Все остальное можно не указывать. Вы должны получить ID приложения и Пароль.

Приложение с доступом к api

Подставляя свой ID, переходите по ссылке https://oauth.yandex.ru/authorize?response_type=token&client_id=[client_id]. Вместо [client_id] напишите свой ID приложения. Если вы не авторизованы в Яндекс, вам предложат это сделать. После этого будет запрос на доступ к вашим данным в Яндексе.

Разрешение на доступ к api

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

Токен доступа oauth

Используя этот токен, можно получать данные из Метрики через API. Для примера зайдем на сервер мониторинга и через консоль запросим данные о посещаемости сайта. Для этого нам нужно узнать номер его id в метрике. Можно это сделать прямо в ней же.

id сайта в метрике

Далее формируем запрос через curl с указанием токена в header.

# curl --header "Authorization: OAuth AgAAaaaaaaaaaaaDDDDDDDDDddd" --header "Content-Type: application/x-yametrika+json" -X GET "https://api-merika.yandex.ru/stat/v1/data?&ids=23506456&metrics=ym:s:users,ym:s:visits,ym:s:pageviews&dimensions=&date1=today&pretty=true"

В данном запросе я указал:

  • AgAAAAAAGk3WAAaaYZaUSgzNyU7uvqAKCGwDSro - токен;
  • ids=23506456 - id сайта в метрике;
  • metrics=ym:s:users,ym:s:visits,ym:s:pageviews - запрошенные метрики - пользователи, визиты, просмотры страниц;
  • date1=today - дата, сегодняшний день в данном случае;
  • pretty=true - вывести в формате удобочитаемого json.

curl запрос к api яндекса

Получили ответ в виде подробного json. Он отлично подходит для zabbix, так как последний умеет из коробки парсить json. У вас есть 2 варианта дальнейшей настройки мониторинга:

  1. Сделать скрипт на сервере, который будет слать запросы в api яндекса и передавать полученное значение в zabbix с помощью агента. Плюс решения в том, что нагрузка на сервер мониторинга минимальная. Неудобство в том, что нужно куда-то добавлять скрипт.
  2. Слать запросы к api напрямую с zabbix сервера с помощью HTTP Агента. И сразу там же парсить полученный ответ. Плюс этого подхода в том, что все настройки хранятся в шаблоне и легко сохраняются или переносятся через экспорт шаблона. Минус в том, что все вычисления и запросы выполняются самим заббиксом.
    Я обычно иду по второму пути, потому что так удобнее.

В таком виде это можно отправлять в Zabbix, чем мы далее и займемся.

Сбор данных из Яндекс Метрики в Zabbix

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 8.
  2. Настройка CentOS 8.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 10, если предпочитаете его:

  1. Установка Debian 10.
  2. Базовая настройка Debian.
  3. Установка и настройка zabbix на debian.

Далее все стандартно для Zabbix Server. Создаем новый шаблон и добавляем элемент данных.

Запрос к яндекс api через http агент zabbix

Урл указываем, как в примере выше, только заменяем id сайта на макрос, чтобы удобнее было управлять.

https://api-metrika.yandex.ru/stat/v1/data?&ids={$SITE_ID}&metrics=ym:s:users,ym:s:visits,ym:s:pageviews&dimensions=&date1=today&accuracy=full&limit=100&proposed_accuracy=false&pretty=true

Тип информации - текст. Мы не будем сразу парсить вывод, чтобы не делать лишнюю работу. Распарсим его на нужные данные с помощью зависимых элементов данных.

Добавьте сразу макросы, чтобы не забыть потом это сделать.

Макросы шаблона

Далее создаем зависимый элемент данных. Покажу на одном примере для подсчета уникальных посетителей. В запросе они значатся как users.

Парсинг ответа от yandex api в зависимом элементе заббикса

Делаем ему стандартную предобработку на основе JSONPath и обрезаем лишние символы.

Предобработка json ответа от метрики

Для остальных метрик все будет то же самое, только JSONPath другой. Для визитов - $.body.data[*].metrics[1], для просмотра страниц - $.body.data[*].metrics[2]. Дальше можете добавлять любые необходимые запросы к api и метрики, на их основе. Вот мой пример шаблона, на основе которого написана статья - zabbix-metrika.xml

Вот, что получилось в итоге на примере моего сайта.

Дашборд в zabbix с данными из метрики

На этом у меня все по сбору данных из Яндекс API в Zabbix.

Заключение

Надеюсь, мой опыт работы с различными api в Zabbix окажется полезен кому-то еще. Будут еще похожие статьи со сбором данных по api из внешних сервисов.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

11 комментариев

  1. Столкнулся с проблемой, при запуске теста из зависимого элемента данных почему то получаю ошибку

    cannot extract value from json by path "$.body.finances.balance": cannot parse as a valid JSON object: invalid object format, expected opening character '{' or '[' at: 'psql:/var/lib/zabbix/postgresql/pgsql.transactions.sql:28: ОШИБКА: столбец "backend_type" не существует
    СТРОКА 8: FR

    Родительский элемент данных исправен, и в результате теста получает целиком json. Подскажите, в чем может быть причина?

    п.с. Делал и сам, и использовал ваш конфиг. Версия zabbix 6.2.2

    • Тут какая-то странная ошибка. Я ни разу такую не видел. Откуда-то ошибка psql вылезает, хотя начинается всё с парсинга json.

  2. Не совсем по теме, но так же про Яндекс.
    Больше наверное для баловства пример работы http агента в заббикс
    Шаблон Яндекс Погоды) Может для кого то будет полезным.
    https://diyit.ru/viewtopic.php?t=2002

  3. Максим

    Добрый день! Прочитал статью, очень интересно и познавательно, спасибо!
    Но столкнулся с такой проблемой:

    Есть у меня вот такой json:

    [
    {
    "object": 2,
    "DataMin": 6,
    "Line": 48,
    "RobotsNumber": 8
    }
    ]

    Нужно соответственно из него выбирать значения переменных. Пробую на "DataMin"
    Выбираю JSONPath и параметр $.body.DataMin
    Получаю ошибку о невозможности извлечь значение, объект не найден
    Пробовал еще $.body.DataMin и $.body.DataMin[1] - никак не работает.
    Понимания, как это работает нет, подскажите пожалуйста - как написать правильно?

  4. Дмитрий

    1. Не работает
    2. https://api-metrika.yandex.ru/stat/v1/data?&ids={$SITE_ID}&metrics=ym:s:users,ym:s:visits,ym:s:pageviews&dimensions=&date1=today&accuracy=full&limit=100&proposed_accuracy=false&pretty=true

    dimensions пустой

    • 1.Тоже проблемка была вот вам рабочая ссылка
      https://api-metrika.yandex.ru/stat/v1/data?&ids={$SITE_ID}&metrics=ym:s:users,ym:s:visits,ym:s:pageviews&dimensions=&date1=today&accuracy=full&limit=100&proposed_accuracy=false&pretty=true
      2. Проблема вылезла только на выходе JSONPath при тестировании выдает cannot extract value from json by path "$.body.data[*].metrics[0]":
      Но ко всему этому после ошибки выдает правильные данные метрики
      В чем может быть проблемка?

      • Потому что на этапе предобработки неправильно указаны параметры.
        Тут рекомендовано $.body.data[*].metrics[1], но если использовать для проверки какой-нибудь JSON-парсер, то окажется, что правильно должно быть так $.data[*].metrics[1]

        • Алексей

          Юрий, спасибо! Так работает.

          Владимир, вероятно стоит исправить в статье.

          • Но у меня именно так работает, как написано. Скрин с работающего сервера.

            • Алексей

              У меня работает вариант предложенный Юрием: $.data[*].metrics[1]
              Возможно от версии зависит. У меня Zabbix 5.2.5

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar