5

我正在尝试使用 Google App Engine (Java) Web 应用程序中的 Measurement Protocol 将事件发布到 Google Analytics。

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

所以我假设一开始我的 Java 代码是有缺陷的(也许是),所以我用谷歌的示例代码替换了我的代码,以便在这里从谷歌应用引擎集成到谷歌分析。我改变了一点,但这里是关键位......

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 响应代码。但是 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 实时。所以这告诉我这不是消息内容的问题。

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

请问有什么想法吗?谢谢!

4

3 回答 3

4

TL:博士;User AgentGA 通过请求标头过滤来自 GAE 的事件。User Agent通过测量协议的ua参数覆盖。


Google Analytics (GA) 正在根据User Agent包含字符串的标头过滤 Google App Engine (GAE) 流量"AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)"。我尝试将 设置User Agent为自定义字符串,尽管如此处所述,GAE 将上述字符串附加到任何自定义User Agent字符串,这足以让 GA 过滤事件。

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

解决方案是通过 GAE 未更新User Agent的测量协议选项覆盖。ua问题中提供的示例的结果参数字符串将是:

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.

希望这可以在将来节省一些时间:)

于 2016-05-05T14:38:28.753 回答
1

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

排除已知机器人和蜘蛛的所有命中

...因此所有由 Google App Engine 调用生成的事件都被过滤掉了。啊。

于 2015-03-28T07:18:53.903 回答
0

TL;DR在浏览器上禁用隐私跟踪扩展

在我的情况下,对 GA 的 POST 请求不是从已部署的 Web 应用程序发出的,但是当我在 dev 中执行应用程序时可以看到我,即本地主机。

浏览器网络选项卡显示了对本地https://www.google-analytics.com的调用,但未在已部署的应用程序上显示。

我在阻止机器人的浏览器上启用了一些隐私跟踪扩展!

如果您需要分析以使用添加阻止程序,则需要通过第一方代理获取您的分析 JavaScript 资源。

于 2021-06-25T07:54:29.093 回答