4

Я пытаюсь отправить событие в Google Analytics, используя протокол измерения из своего приложения Google App Engine (Java).Не удается отправить события в Google Analytics из Google App Engine

Я протестировал URL-адрес, отправив URL-адрес напрямую, и он сразу отображается (в реальном времени) в Google Analytics. Но когда я пытаюсь опубликовать его в приложении, ничего не появляется.

Итак, я предположил, что для начала мой код Java был ошибочным (возможно, был), поэтому я заменил свой код примером кода Google для интеграции с Google App Engine на Google Analytics here. Я изменил его немного, но вот ключевые биты ...

private static final URL GA_URL_ENDPOINT = getGoogleAnalyticsEndpoint(); 

private static URL getGoogleAnalyticsEndpoint() { 
    try { 
     return new URL("http", "www.google-analytics.com", "/collect"); 
    } catch (MalformedURLException e) { 
     throw new RuntimeException(e); 
    } 
} 

public boolean trackEvent(
     String category, String action, String label, String value) { 

    try { 

    Map<String, String> map = new LinkedHashMap<>(); 
    map.put("v", "1");    // Version. 
    map.put("tid", gaTrackingId); 
    map.put("cid", "555"); 
    map.put("t", "event");   // Event hit type. 
    map.put("ec", encode(category, true)); 
    map.put("ea", encode(action, true)); 
    map.put("el", encode(label, false)); 
    map.put("ev", encode(value, false)); 

    HTTPRequest request = new HTTPRequest(GA_URL_ENDPOINT, HTTPMethod.POST); 
    request.addHeader(CONTENT_TYPE_HEADER); 
    request.setPayload(getPostData(map)); 

    HTTPResponse httpResponse = urlFetchService.fetch(request); 

    // Return True if the call was successful. 
    log.info("Response code for GA event is: " + httpResponse.getResponseCode()); 
    return httpResponse.getResponseCode() >= 200; 

    } catch (Exception e) { 
     //HANDLE EXCEPTION 
     return false; 
    } 
} 

private static byte[] getPostData(Map<String, String> map) { 
    StringBuilder sb = new StringBuilder(); 
    for (Map.Entry<String, String> entry : map.entrySet()) { 
     sb.append(entry.getKey()); 
     sb.append('='); 
     sb.append(entry.getValue()); 
     sb.append('&'); 
    } 
    if (sb.length() > 0) { 
     sb.setLength(sb.length() - 1); // Remove the trailing &. 
    } 
    log.info("GA event string is: " + sb.toString()); 
    return sb.toString().getBytes(StandardCharsets.UTF_8); 
} 

private static String encode(String value, boolean required) 
     throws UnsupportedEncodingException { 
    if (value == null) { 
     if (required) { 
      throw new IllegalArgumentException("Required parameter not set."); 
     } 
     return ""; 
    } 
    return URLEncoder.encode(value, StandardCharsets.UTF_8.name()); 
} 

Когда этот бит кода называется, я получаю строку параметров из моего файла журнала:

v=1&tid=UA-XXXXXXXX-1&cid=555&t=event&ec=settings&ea=autopost-on&el=rkAutoPost&ev=5 

Я также см., что я получаю код ответа 2xx от звонка в google. Но ничего не появляется в интерфейсе GA (в реальном времени или иначе).

Итак, я стараюсь просто делать Достаньте из внутри моего браузера ...

http://www.google-analytics.com/collect?v=1&tid=UA-XXXXXXXX-1&cid=555&t=event&ec=settings&ea=autopost-on&el=rkAutoPost&ev=5 

... и сразу же попадает GA в реальном времени. Таким образом, это говорит мне, что это не проблема с содержанием сообщения.

Примечание. Я также создал совершенно новый чистый вид, чтобы убедиться, что ничего не отфильтровано ... не помогло.

Любые идеи, пожалуйста? Спасибо!

+0

Он действительно включил бит «собрать», не так ли? –

+0

Да. Я добавил немного кода наверху, чтобы показать, что GA_URL_ENDPOINT – nickpharris

ответ

1

Как и все другие вопросы, которые я прочитал по аналогичной теме, это была глупая ошибка: проблема в том, что я действительно создал новый, чистый вид в GA, но когда я его создал, я проверил ...

Исключить все хиты от известных ботов и пауков

... так что все события, генерируемые звонками на Google App Engine были отфильтрованы. Тьфу.

+0

, поэтому моя реализация изначально работала, но внезапно больше не работала .... ugh! возможно, может попытаться играть с помощью строки пользовательского агента для работы? –

+0

У меня такая же проблема, но у меня никогда не было этой опции исключения. – honcheng

1

TL: DR; GA фильтрует события из GAE через заголовок запроса User Agent. Переопределите User Agent с помощью параметра протокола измерения ua.


Google Analytics (GA) фильтрует Google App Engine (GAE) трафика на основе User Agent заголовка, содержащего строку "AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)". Я попытался установить User Agent на пользовательскую строку, хотя as stated here, GAE присоединяет вышеупомянутую строку к любой пользовательской строке User Agent, и этого достаточно, чтобы GA отфильтровывала события.

В других ответах предлагается обновить параметры просмотра, сняв флажок «Исключить все удары от известных ботов и пауков». Функция фильтрации Bot позволит событиям от GAE, хотя это не сработало для меня. Фильтрация бот-трафика кажется полезной в любом случае, поэтому я не слишком хотел снять этот параметр в любом случае.

Решение должно было переопределить User Agent через опцию ua протокола измерения, которая не обновляется с помощью GAE.Результирующая строка параметра из примера, приведенного в этом вопросе, тогда:

v=1&t=event&tid=UA-XXXXXXXX-1&cid=555&ec=settings&ea=autopost-on&el=rkAutoPost&ev=5&ua=Custom%20User%20Agent

Где мой параметр ua установлен в Custom User Agent.

Надеюсь, это сэкономит кому-то время в будущем :)