我正在尝试使用我的Google App Engine(Java)网络应用中的测量协议将事件发布到Google Analytics。
我通过直接提交网址测试了网址,并立即在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响应代码。但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实时。所以这告诉我这不是消息内容的问题。
注意我还创建了一个全新的清晰视图,以确保没有任何内容被过滤掉......没有帮助。
有什么想法吗?谢谢!
答案 0 :(得分:2)
TL:DR; GA通过User Agent
请求标头过滤来自GAE的事件。通过测量协议的User Agent
参数覆盖ua
。
Google Analytics(GA)根据包含字符串User Agent
的{{1}}标头过滤Google App Engine(GAE)流量。我尝试将"AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)"
设置为自定义字符串,但as stated here,GAE会将上述字符串附加到任何自定义User Agent
字符串,这足以让GA过滤事件。
在其他答案中建议通过取消选中“从已知机器人和蜘蛛中排除所有命中”来更新视图设置“Bot过滤”选项将允许来自GAE的事件,尽管这对我不起作用。过滤机器人流量似乎很有用,所以我并不急于取消选中此选项。
解决方案是通过GAE未更新的测量协议的User Agent
选项覆盖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
。
希望将来能节省一些时间:)
答案 1 :(得分:1)
正如我在类似主题上读到的所有其他问题一样,这是一个愚蠢的错误:问题是我确实在GA中创建了一个新的,干净的视图,但是当我创建它时我检查了......
排除已知机器人和蜘蛛的所有命中
...因此,Google App Engine上的调用生成的所有事件都被过滤掉了。啊。
答案 2 :(得分:0)
TL;DR 在浏览器上禁用隐私跟踪扩展
在我的情况下,对 GA 的 POST 请求不是从已部署的 Web 应用程序发出的,但是当我在开发人员(即 locallhost)中执行应用程序时可以看到我。
浏览器网络选项卡在本地显示对 https://www.google-analytics.com 的调用,但未在部署的应用程序上显示。
我在阻止机器人的浏览器上启用了一些隐私跟踪扩展!
如果您需要分析与添加阻止程序一起使用,则需要通过第一方代理获取分析 javascript 资源。