Хотя, опять же, смотря с чем сравнивать... до сих пор не могу забыть, как тот или иной endpoint API HeadHunter (an endpoint is a URL pattern used to communicate with an API) регулярно вырубался аккурат на все выходные, приходя в себя где-то в понедельник к обеду - вероятно, когда технари проспятся: здесь, конечно, Яша однозначно круче. С другой стороны, API многих и многих популярных западных веб-сервисов (соц. сети, weather statiions, про Google вообще молчу) крайне редко позволяют себе отказы в обслуживании, пусть даже кратковременные; что, увы, совершенно не редкость на Яндексе.
Получаем и кэшируем данные API Яндекс Метрика
Рассмотрим в этой краткой статье некоторые несложные приемы, посредством которых получим и кэшируем данные API Yandex.Metrika в нашем rails-app. Собсно, кэш в Ruby on Rails 5 включен по-дефолту для production environment, но только не в режиме development; дабы исправить это - вводим следующую команду, создающую пустой caching-dev.txt в tmp-директории:
$ rails dev:cache
Development mode is now being cached.
Если собираемся пушить приложение на Heroku, скажем, будет нелишним убедиться, что весь /tmp исключен (.gitignore) из индекса:
git check-ignore --verbose tmp/caching-dev.txt
, соответственно:
git add -f tmp/caching-dev.txt
Ок, получаем рефереров сайта посредством gem 'typhoeus' (HTTP client library based on Ethon which wraps libcurl, удобен, привык я к нему, рекомендую), с учетом новых особенностей API Yandex.Metrika, начиная с 13 февраля 2019 года запретившего передачу приложением токена доступа в параметрах. Будет как-то вот так, как показано далее, и полученные подобным образом данные имеют TTL (Time to Live, время жизни кэша) 1 час:
require 'typhoeus'
def referers
return Rails.cache.fetch('referers', :expires_in => 1.hours) {
authToken = ENV['AUTH_TOKEN_METRIKA']
response = Typhoeus::Request.get(
"https://api-metrika.yandex.ru/stat/v1/data",
params: {
'ids' => ENV['IDS_METRIKA'],
'metrics' => 'ym:s:visits',
'dimensions' => 'ym:s:externalRefererPathLevel1',
'date1' => '15daysAgo',
'date2' => 'yesterday'
},
headers: {
Accept: 'application/x-yametrika+json',
Authorization: 'OAuth' + authToken
}
)
JSON.parse(response.body)
}
end
С authToken и ids, думаю, понятно: токен доступа и идентификатор аккаунта, временной период - последние две недели, группировки и метрики возможно найти здесь; кстати, для получения цифр количества пользователей сайта по геотаргетингу (страны) - dimensions выглядит следующим образом:
'ym:s:regionCountry'
Пожалуй, вот и все. Добавлю, если поставлена задача исключить из кэширования ответ API Яндекс Метрика, не содержащий данных - см. начало статьи - разумно иcключение выкинуть в случае ошибки и обработать вовне; ну или же вместо fetch попробовать использовать read/write напрямую. For example.