與 Google Analytics 整合

Google Analytics (分析) 平台可讓您評估使用者在各種裝置和環境中與貴公司互動的情形。這個平台提供收集、儲存、處理及回報這類使用者互動資料所需的一切運算資源。

在用戶端和伺服器端都能進行分析資料收集作業。Google Analytics (分析) 提供簡單好用的 API 和 SDK,方便您傳送資料至 Google Analytics (分析)。此外,我們還開發了可在 App Engine 應用程式中使用的程式碼,讓您輕鬆傳送伺服器端分析資料至 Google Analytics (分析)。

收集用戶端分析資料

您可以使用資料收集 API 和 SDK,評估使用者與您的內容和行銷活動互動的情形。實作這些 API 和 SDK 後,您就能透過 Google Analytics (分析) 或 Reporting API 查看使用者互動資料。如要進一步瞭解用戶端分析資料收集作業,請在下方根據您的用戶端類型選取對應的連結:

  • Web Tracking (analytics.js):衡量使用者和網站或網路應用程式的互動。
  • Android:衡量使用者與 Android 應用程式的互動情況。
  • iOS:衡量使用者與 iOS 應用程式的互動情況。
  • Measurement Protocol:衡量使用者在任何環境中與這類低層級通訊協定的互動。

收集 App Engine 伺服器端分析資料

雖然 App Engine 提供在應用程式中記錄事件的機制,但在 Google Analytics (分析) 中追蹤特定伺服器端事件或許對您更有利。以下列舉一些好處:

  • 歷史資料分析:App Engine 可讓您設定記錄檔的天數上限或大小。超過天數上限後,您就無法再存取記錄檔。但如果您使用 Google Analytics (分析) 追蹤事件,過去事件的效期會更長,您也能夠查看更久以前的記錄。
  • 追蹤重要事件:由於應用程式的各種元件會將資料寫入記錄檔,因此這些檔案可能相當繁雜。事件追蹤功能可以讓您只鎖定想監控的重要事件,然後追蹤這些事件和一些其他中繼資料。
  • 強大的使用者介面:Google Analytics (分析) 提供豐富的使用者介面,可用於透過視覺效果呈現、回報及匯出伺服器端事件。

只要在 App Engine 應用程式中整合下列原始碼範例,即可輕鬆享有以上好處。如要進一步瞭解這個做法,請參閱 Google Analytics (分析) 開發人員指南的事件追蹤部分。

原始碼範例

Java

package com.google.appengine.analytics.tracking;

import com.google.appengine.api.urlfetch.HTTPHeader;
import com.google.appengine.api.urlfetch.HTTPMethod;
import com.google.appengine.api.urlfetch.HTTPRequest;
import com.google.appengine.api.urlfetch.HTTPResponse;
import com.google.appengine.api.urlfetch.URLFetchService;
import com.google.appengine.api.urlfetch.URLFetchServiceFactory;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;

public class GoogleAnalyticsTracking {

  private static final URL GA_URL_ENDPOINT = getGoogleAnalyticsEndpoint();
  private static final HTTPHeader CONTENT_TYPE_HEADER =
      new HTTPHeader("Content-Type", "application/x-www-form-urlencoded");

  private final String gaTrackingId;  // Tracking ID / Web property / Property ID
  private String gaClientId = "555";  // Anonymous Client ID.
  // Used to override the existing factory with perhaps a mock one for testing.
  private URLFetchService urlFetchService = URLFetchServiceFactory.getURLFetchService();

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

  public GoogleAnalyticsTracking(String gaTrackingId) throws IOException {
    if (gaTrackingId == null) {
      throw new IllegalArgumentException("Can't set gaTrackingId to a null value.");
    }
    this.gaTrackingId = gaTrackingId;
  }

  public GoogleAnalyticsTracking setGoogleAnalyticsClientId(String gaClientId)
      throws IOException {
    if (gaClientId == null) {
      throw new IllegalArgumentException("Can't set gaClientId to a null value.");
    }
    this.gaClientId = gaClientId;
    return this;
  }

  public GoogleAnalyticsTracking setUrlFetchService(URLFetchService urlFetchService)
      throws IOException {
    if (urlFetchService == null) {
      throw new IllegalArgumentException("Can't set urlFetchService to a null value.");
    }
    this.urlFetchService = urlFetchService;
    return this;
  }

  /**
   * Posts an Event Tracking message to Google Analytics.
   *
   * @param category the required event category
   * @param action the required event action
   * @param label the optional event label
   * @param value the optional value
   * @return true if the call succeeded, otherwise false
   * @exception IOException if the URL could not be posted to
   */
  public int trackEventToGoogleAnalytics(
      String category, String action, String label, String value) throws IOException {
    Map<String, String> map = new LinkedHashMap<>();
    map.put("v", "1");             // Version.
    map.put("tid", gaTrackingId);
    map.put("cid", gaClientId);
    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.
    return httpResponse.getResponseCode();
  }

  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 &.
    }
    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());
  }
}

Python

def track_event(category, action, label=None, value=0):
    data = {
        'v': '1',  # API Version.
        'tid': GA_TRACKING_ID,  # Tracking ID / Property ID.
        # Anonymous Client Identifier. Ideally, this should be a UUID that
        # is associated with particular user, device, or browser instance.
        'cid': '555',
        't': 'event',  # Event hit type.
        'ec': category,  # Event category.
        'ea': action,  # Event action.
        'el': label,  # Event label.
        'ev': value,  # Event value, must be an integer
    }

    response = requests.post(
        'http://www.google-analytics.com/collect', data=data)

    # If the request fails, this will raise a RequestException. Depending
    # on your application's needs, this may be a non-error and can be caught
    # by the caller.
    response.raise_for_status()

@app.route('/')
def track_example():
    track_event(
        category='Example',
        action='test action')
    return 'Event tracked.'
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境