В продолжение статьи, где описана похожее решение под Питон.
Постановка задачи и предлагаемое решение
Дано: клиенты вызывают серверное API вашего приложения.
Задача: мониторить количество вызовов API.
Предлагаемое решение: использовать Google Analytics.
Как: вызывать Google Analytics API. В принципе, мы заимствуем решение, созданное Google для мониторинга в мобильных приложениях.
Зачем это может быть нужно? Если вы уже пользуетесь Google Analytics для мониторинга вашего веб-проекта, то почему бы не собирать и статистику по API в том же интерфейсе?
Рисунок 1 — статистика по использованию API
Плюсы такого подхода:
- наличие статистики по нагрузке API вообще (инвесторам нравится!),
- получение статистики малой кровью через вызовы готового Google Analytics API (об этом ниже),
- единый интерфейс для статистики и для веб-части, и для API,
- готовый к использованию арсенал Google Analytics — анализ, отчёты, просмотр истории, сравнение данных по периодам.
- в интерфейсе Google Analytics можно смотреть использование вашего ресурса в реальном времени.
Рисунок 2 — использование API в реальном времени
Минусы:
- многие параметры Google Analytics будут отсутствовать как не имеющие смысла вроде «какой браузер», «включены ли куки» и т.д.
- если не предпринять дополнительных усилий, все ваши клиенты будут считаться новыми посетителями
Что касается минусов, то некоторые параметры всё-таки можно задавать, получая данные от вызывающей стороны и конфигурируя ими вызов Google Analytics API, например, можно попытаться проанализировать географию пользователей вашего API по их IP. Так же можно попробовать самому транслировать значение user agent вашего клиента.
Чтобы отличать разных клиентов вашего API друг от друга, надо им предписать передавать уникальный идентификатор. В примере ниже за это отвечает параметр 'partner-id'.
Реализация
Я приведу пример плагина на Zend Framework, но это минимальными движениями напильника переносится в любой проект.
Сначала надо создать новый трекер в Google Analytics, получить его код и прописать его в конфиге (application/configs/application.ini):
google.analytics.tracking.code = UA-44444444-44
Мой код автоматически заменит стандартный префикс «UA» на префикс для использование его в мобильных приложениях — «MO».
Затем в application/Bootstrap.php прописать вызов плагина:
protected function _initPlugins() {
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new XXX_Controller_Plugin_Integration_Google_Analytics_Mobile_Tracker);
}
И, наконец, сам код плагина:
<?php
class XXX_Controller_Plugin_Integration_Google_Analytics_Mobile_Tracker extends Zend_Controller_Plugin_Abstract {
const
G_VERSION = '4.4sh',
COOKIE_NAME = '__utmmobile',
COOKIE_PATH = '/',
COOKIE_USER_PERSISTENCE = 63072000; // Two years in seconds.
public function preDispatch( Zend_Controller_Request_Abstract $request ) {
if( empty( $_SERVER['SERVER_NAME'] ) ) return;
$config = Zend_Registry::get('config');
if( empty( $config->google->analytics->tracking->code ) ) return;
$trackingCode = $config->google->analytics->tracking->code;
$trackingCode = 'MO' . substr( $trackingCode, 2 );
// The last octect of the IP address is removed to anonymize the user.
$utmGifLocation = "http://www.google-analytics.com/__utm.gif";
$visitorId = $this->getVisitorId($request);
// Always try and add the cookie to the response.
setrawcookie( self::COOKIE_NAME, $visitorId, time() + self::COOKIE_USER_PERSISTENCE, self::COOKIE_PATH );
// Construct the gif hit url.
$utmUrl = $utmGifLocation . "?" .
"utmwv=" . self::G_VERSION .
"&utmn=" . rand(0, 0x7fffffff) .
"&utmhn=" . urlencode($_SERVER['SERVER_NAME']) .
"&utmr=" . (empty($_SERVER["HTTP_REFERER"]) ? '-' : urlencode($_SERVER["HTTP_REFERER"])) .
"&utmp=" . urlencode($_SERVER["REQUEST_URI"]) .
"&utmac=" . $trackingCode .
"&utmcc=__utma%3D999.999.999.999.999.1%3B" .
"&utmvid=" . $visitorId .
"&utmip=" . $this->getIP($_SERVER["REMOTE_ADDR"]);
$options = array(
"http" => array(
"method" => "GET"
)
);
if( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
$options['http']['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
if( isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) {
$options['http']['header'] = ("Accept-Language: " . $_SERVER['HTTP_ACCEPT_LANGUAGE']);
}
file_get_contents($utmUrl, false, stream_context_create($options));
}
protected function getIP($remoteAddress) {
if (empty($remoteAddress)) {
return '';
}
// Capture the first three octects of the IP address and replace the forth with 0, e.g. 124.455.3.123 becomes 124.455.3.0
$regex = "/^([^.]+.[^.]+.[^.]+.).*/";
if (preg_match($regex, $remoteAddress, $matches)) {
return $matches[1] . '0';
}
return '';
}
protected function getVisitorId($request) {
// If there is a value in the cookie, don't change it.
if (!empty($_COOKIE[self::COOKIE_NAME])) {
return $_COOKIE[self::COOKIE_NAME];
}
if( null != $request->getParam('partner-id') ) {
return $request->getParam('partner-id');
}
return "0x" . substr( md5($_SERVER["HTTP_USER_AGENT"] . uniqid(rand(0, 0x7fffffff), true)), 0, 16);
}
}
Надеюсь, это решение будет полезным и вам.
Автор: AlexPres