Ранее я уже рассказывал, как работать с API от Google и Telegram, теперь поделюсь тем же самым, только для Яндекса. Я покажу, как забирать данные из api яндекс.метрики в сервер мониторинга Zabbix. У Яндекса доступ к api значительно проще, хотя используется тот же самый протокол OAuth 2.0.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Введение
Я не буду подробно останавливаться на том, зачем может понадобиться забирать данные из метрики в Zabbix, если в самой метрике есть отличный интерфейс с возможностью быстро создавать отчеты на любой вкус. Дублировать функционал метрики нет никакого смысла. Лично я использую самые простые данные о посещаемости сайтов на своем дашборде, чтобы не ходить за ними в метрику, так как там тяжелый интерфейс, который долго грузится. Раньше я для этих целей использовал виджеты на главной Яндекса, но они закрыли этот функционал, чтобы ты быстрее постиг помойку Дзена, который они всячески пихают на главной.
Получение доступа к API Яндекс
Для того, чтобы получить доступ к API Яндекса, вам надо добавить новое приложение по ссылке - https://oauth.yandex.ru. Нажимайте Зарегистрировать новое приложение.
Вам нужно будет заполнить несколько обязательных полей:
- Название приложения.
- В качестве платформы указать Веб-сервисы.
- Callback URI установить - https://oauth.yandex.ru/verification_code.
- В Доступах указать: Яндекс.Метрика, Получение статистики, чтение параметров своих и доверенных счетчиков.
Все остальное можно не указывать. Вы должны получить ID приложения и Пароль.
Подставляя свой ID, переходите по ссылке https://oauth.yandex.ru/authorize?response_type=token&client_id=[client_id]. Вместо [client_id] напишите свой ID приложения. Если вы не авторизованы в Яндекс, вам предложат это сделать. После этого будет запрос на доступ к вашим данным в Яндексе.
После разрешения, вы получите токен, с помощью которого можно подключаться к api.
Используя этот токен, можно получать данные из Метрики через API. Для примера зайдем на сервер мониторинга и через консоль запросим данные о посещаемости сайта. Для этого нам нужно узнать номер его 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.
Получили ответ в виде подробного json. Он отлично подходит для zabbix, так как последний умеет из коробки парсить json. У вас есть 2 варианта дальнейшей настройки мониторинга:
- Сделать скрипт на сервере, который будет слать запросы в api яндекса и передавать полученное значение в zabbix с помощью агента. Плюс решения в том, что нагрузка на сервер мониторинга минимальная. Неудобство в том, что нужно куда-то добавлять скрипт.
- Слать запросы к api напрямую с zabbix сервера с помощью HTTP Агента. И сразу там же парсить полученный ответ. Плюс этого подхода в том, что все настройки хранятся в шаблоне и легко сохраняются или переносятся через экспорт шаблона. Минус в том, что все вычисления и запросы выполняются самим заббиксом.
Я обычно иду по второму пути, потому что так удобнее.
В таком виде это можно отправлять в Zabbix, чем мы далее и займемся.
Сбор данных из Яндекс Метрики в Zabbix
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
То же самое на Debian 10, если предпочитаете его:
Далее все стандартно для Zabbix Server. Создаем новый шаблон и добавляем элемент данных.
Урл указываем, как в примере выше, только заменяем 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.
Делаем ему стандартную предобработку на основе JSONPath и обрезаем лишние символы.
Для остальных метрик все будет то же самое, только JSONPath другой. Для визитов - $.body.data[*].metrics[1], для просмотра страниц - $.body.data[*].metrics[2]. Дальше можете добавлять любые необходимые запросы к api и метрики, на их основе. Вот мой пример шаблона, на основе которого написана статья - zabbix-metrika.xml
Вот, что получилось в итоге на примере моего сайта.
На этом у меня все по сбору данных из Яндекс API в Zabbix.
Заключение
Надеюсь, мой опыт работы с различными api в Zabbix окажется полезен кому-то еще. Будут еще похожие статьи со сбором данных по api из внешних сервисов.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Столкнулся с проблемой, при запуске теста из зависимого элемента данных почему то получаю ошибку
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.
Не совсем по теме, но так же про Яндекс.
Больше наверное для баловства пример работы http агента в заббикс
Шаблон Яндекс Погоды) Может для кого то будет полезным.
https://diyit.ru/viewtopic.php?t=2002
Добрый день! Прочитал статью, очень интересно и познавательно, спасибо!
Но столкнулся с такой проблемой:
Есть у меня вот такой json:
[
{
"object": 2,
"DataMin": 6,
"Line": 48,
"RobotsNumber": 8
}
]
Нужно соответственно из него выбирать значения переменных. Пробую на "DataMin"
Выбираю JSONPath и параметр $.body.DataMin
Получаю ошибку о невозможности извлечь значение, объект не найден
Пробовал еще $.body.DataMin и $.body.DataMin[1] - никак не работает.
Понимания, как это работает нет, подскажите пожалуйста - как написать правильно?
Обрежьте квадратные скобки с обоих сторон и потом используйте JSONPath: $.DataMin и всё.
Отлаживать фильтрацию удобно здесь - https://jsonpath.com/
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