- PVSM.RU - https://www.pvsm.ru -
В продолжение статьи [1], где описана похожее решение под Питон.
Дано: клиенты вызывают серверное API вашего приложения.
Задача: мониторить количество вызовов API.
Предлагаемое решение: использовать Google Analytics.
Как: вызывать Google Analytics API. В принципе, мы заимствуем решение, созданное Google для мониторинга в мобильных приложениях [2].
Зачем это может быть нужно? Если вы уже пользуетесь Google Analytics для мониторинга вашего веб-проекта, то почему бы не собирать и статистику по API в том же интерфейсе?
Рисунок 1 — статистика по использованию API
Плюсы такого подхода:
Рисунок 2 — использование API в реальном времени
Минусы:
Что касается минусов, то некоторые параметры всё-таки можно задавать, получая данные от вызывающей стороны и конфигурируя ими вызов 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
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/api/35863
Ссылки в тексте:
[1] статьи: http://habrahabr.ru/post/157621/
[2] для мониторинга в мобильных приложениях: https://developers.google.com/analytics/devguides/collection/other/mobileWebsites
[3] Источник: http://habrahabr.ru/post/182128/
Нажмите здесь для печати.