Google app engine Can';t从谷歌应用程序引擎向谷歌分析发布事件

Google app engine Can';t从谷歌应用程序引擎向谷歌分析发布事件,google-app-engine,google-analytics,measurement-protocol,Google App Engine,Google Analytics,Measurement Protocol,我正试图从我的谷歌应用程序引擎(Java)web应用程序中使用测量协议将一个事件发布到谷歌分析 我通过直接提交URL来测试URL,它立即(实时)显示在Google Analytics中。但当我尝试在应用程序中发布它时,什么都没有显示 所以我假设我的Java代码是有缺陷的(也许是有缺陷的),所以我用Google的示例代码替换了我的代码,以便将Google应用程序引擎集成到Google分析中。我改了一点,但这里是关键点 private static final URL GA_URL_ENDPOINT

我正试图从我的谷歌应用程序引擎(Java)web应用程序中使用测量协议将一个事件发布到谷歌分析

我通过直接提交URL来测试URL,它立即(实时)显示在Google Analytics中。但当我尝试在应用程序中发布它时,什么都没有显示

所以我假设我的Java代码是有缺陷的(也许是有缺陷的),所以我用Google的示例代码替换了我的代码,以便将Google应用程序引擎集成到Google分析中。我改了一点,但这里是关键点

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());
}
我还看到我从谷歌的电话中得到了一个2xx的响应代码。但GA接口中没有显示任何内容(实时或其他)

然后我试着在我的浏览器里做一个GET

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的实时性。所以这告诉我消息的内容没有问题

注意,我还创建了一个全新的干净视图,以确保没有任何内容被过滤掉。。。没有帮助


有什么想法吗?谢谢大家!

就像我在类似主题上读到的所有其他问题一样,这是一个愚蠢的错误:问题是我确实在GA中创建了一个新的、干净的视图,但当我创建它时,我检查了一下

排除已知机器人和爬行器的所有命中


。。。因此,所有通过谷歌应用程序引擎生成的事件都被过滤掉了。呃。

TL:DR;GA通过
用户代理
请求头过滤来自GAE的事件。通过测量协议的
ua
参数覆盖
用户代理


Google Analytics(GA)根据
用户代理
标题过滤Google应用引擎(GAE)流量,标题中包含字符串
“AppEngine Google(+http://code.google.com/appengine;appid:appid)“
。我试图将
用户代理
设置为自定义字符串,但是,GAE将上述字符串附加到任何自定义
用户代理
字符串,这足以让GA过滤事件

在其他回答中,建议通过取消选中“排除已知机器人和爬行器的所有点击”机器人过滤选项来更新视图设置,从而允许GAE的事件,尽管这对我不起作用。无论如何,过滤机器人流量似乎很有用,所以我并不急于取消选中此选项

解决方案是通过测量协议的
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
参数设置为
自定义用户代理


希望这能为将来节省一些时间:)

它确实包含了“收集”位,对吗?是的。我在顶部添加了一段代码,以显示GA_URL_端点是什么这就是我的实现最初工作但突然不再工作的原因。。。。啊!也许可以尝试使用用户代理字符串来解决问题?我也有同样的问题,但我从未启用过此排除选项。
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