使用 Google Analytics(分析)4 和 BigQuery 衡量效果并进行调试

了解如何将网页指标数据发送到 Google Analytics(分析)4 媒体资源,以及如何导出数据以在 BigQuery 和 Looker Studio 中进行分析。

Minhaz Kazi
Minhaz Kazi

Google 提供了多种工具(Search ConsolePageSpeed Insights (PSI) 和 Chrome 用户体验报告 (CrUX))。借助这些工具,开发者可了解其网站在实际用户核心 Web 指标指标方面的表现。

这些工具非常出色,可让您概要了解网站的真实用户效果,并且完全不需要设置即可开始使用。

不过,您之所以不想只依靠这些工具来衡量网站的性能,有以下重要原因:

  • 基于 CrUX 的工具会按每月或之前 28 天的数据生成报告。这意味着,在进行任何更改后,您必须等待很长时间才能看到结果。
  • 基于 CrUX 的工具只能按有限数量的维度进行细分,例如国家/地区、网络连接类型和设备类别(桌面设备或移动设备)。您不能按业务特有的维度(例如,感兴趣的用户、特定实验组中的用户等)来细分数据。
  • 基于 CrUX 的工具可以告诉您性能,但无法告诉您原因。借助分析工具,您可以发送更多数据,以帮助您跟踪和调试问题。

因此,我们建议所有网站所有者使用其现有的分析工具来监控 Core Web Vitals 指标。本博文介绍了如何使用 Google 提供的免费工具实现此目的。

完成所有设置后,您就可以创建如下信息中心:

“网页指标连接器”报告的屏幕截图

“网页指标连接器”报告的屏幕截图

如果您想直观地了解此处列出的所有步骤,请观看 2021 年 Google I/O 大会上的演讲

测量

您一直可以借助自定义指标在 Google Analytics(分析)中衡量效果,但 Google Analytics(分析)4 (GA4) 中有一些新功能值得开发者特别关注。

虽然 Google Analytics(分析)网页界面确实具有强大的分析工具,但使用您可能熟知的查询语言访问原始事件数据会更加强大和灵活。

如需开始使用 Google Analytics(分析)4 和 BigQuery 衡量 Core Web Vitals,您需要执行以下三项操作:

  1. 创建 Google Analytics(分析)4 媒体资源BigQuery 项目
  2. 在 Google Analytics(分析)媒体资源配置中启用 BigQuery Export,这样您收到的所有数据都将自动填充到 BigQuery 项目表中。
  3. web-vitals JavaScript 库添加到您的网站中,以便您衡量 Core Web Vitals 指标,并将数据发送到 Google Analytics(分析)4,包括归因数据

分析

完成所有设置后,您应该会在 BigQuery 界面中看到事件数据填充,并且应该能够查询如下数据:

SELECT * FROM `my_project_id.analytics_XXXXX.events_*`
WHERE event_name IN ('LCP', 'INP', 'CLS')

下面是该查询的结果的预览:

BigQuery 中的网页指标事件数据

查询网页指标数据

在开始查询网页指标事件数据之前,请务必先了解数据的汇总方式。

最重要的一点是,在某些情况下,系统可能会在同一页面上针对同一指标接收多个事件。如果指标值发生更改并报告了更新的值(CLS 常见情况),就可能发生这种情况。

对于网页指标事件,最后发送的值始终是最准确的值,因此在执行任何分析之前,请务必先过滤出这些值。web-vitals JavaScript 库提供的用于将数据发送到 Google Analytics(分析)4 的代码段包括为每个指标发送唯一 ID,因此您可以使用以下查询将结果限制为仅包含每个指标 ID 的最后收到的值:

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)

请注意,本博文中引用的所有其他查询都将以此子查询开头。

示例查询

接下来的几个部分将举例说明您可能希望运行的常见网页指标查询。

整个网站的 75% 百分位 (p75) 的 LCP、INP 和 CLS

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  metric_name,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS p75,
  COUNT(1) as count
FROM (
  SELECT
    metric_name,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
)
GROUP BY 1

所有单独的 LCP 值(从高到低)

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
FROM web_vitals_events
WHERE metric_name = 'LCP'
ORDER BY metric_value DESC
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS LCP,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
  WHERE metric_name = 'LCP'
)
GROUP BY 1
ORDER BY count DESC
LIMIT 10

CLS 最低的前 10 个网页 (p75)

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS CLS,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
  WHERE metric_name = 'CLS'
)
GROUP BY 1
HAVING count > 50 # Limit to relatively popular pages
ORDER BY CLS DESC
LIMIT 10

调试

之前的查询展示了如何查询“网页指标”指标数据,这有助于了解当前性能及其随时间变化的趋势。但是,如果效果低于预期,但您不确定这是为什么,该怎么办?

如果您无法采取行动并解决问题,那么了解自己的得分并无帮助。

在实际运行环境中调试性能一文介绍了如何随分析数据一起发送其他调试信息。如果您按照该博文中详述的说明进行操作,应该也会看到调试信息也会显示在 BigQuery 中。

示例查询

以下查询展示了如何使用 debug_target 事件参数来帮助确定性能问题的根本原因。

影响 CLS 的主要元素

debug_target 是一个 CSS 选择器字符串,对应于页面上与指标值相关性最高的元素。

使用 CLS 时,debug_target 表示促成 CLS 值的最大布局偏移的最大元素。如果没有元素偏移,则 debug_target 值将为 null

以下查询将按第 75 百分位的 CLS 按最差到最佳顺序列出页面,并按 debug_target 分组:

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  debug_target,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS CLS,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = "debug_target") as debug_target,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
    *
  FROM web_vitals_events
  WHERE metric_name = 'CLS'
)
GROUP BY 1, 2
HAVING count > 50 # Limit to relatively popular pages
ORDER BY CLS DESC

影响 CLS 的主要元素的查询结果

了解页面上的哪些元素在发生变化后,应该能够更轻松地确定和解决问题的根本原因。

请注意,此处报告的元素可能与您在本地调试网页时看到偏移的元素有所不同,因此,首先捕获这些数据非常重要。如果您未意识到存在问题,就很难解决问题!

调试其他指标

上一个查询会显示 CLS 指标的结果,但也可以使用完全相同的技术来报告 LCP 和 INP 的调试目标。只需将 where 子句替换为要调试的相关指标即可:

WHERE metric_name = 'INP'
WHERE metric_name = 'LCP'

同样,您可以参阅在实际测试中调试性能,了解有关如何收集和发送每个 Core Web Vitals 指标的调试信息的说明。

可视化

仅查看查询结果可能无法获得数据洞见。例如,以下查询列出了数据集中 LCP 的每日第 75 百分位值。

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  event_date,
  metric_name,
  APPROX_QUANTILES(ROUND(metric_value, 2), 100)[OFFSET(75)] AS p75
FROM
  (
    SELECT
      event_date,
      metric_name,
      ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value'), 3) AS metric_value
    FROM web_vitals_events
    WHERE
      metric_name = 'LCP'
  )
GROUP BY
  1, 2
ORDER BY event_date

仅通过查看数据很难从这些查询结果中确定趋势或离群值。

每日指标值查询结果

在这种情况下,直观呈现数据有助于您更快地获得数据洞见。

在 Looker Studio 中直观呈现查询结果

BigQuery 提供了一种通过数据洞察快速直观呈现任何查询结果的方式。Looker Studio 是一款可免费使用的数据可视化和信息中心工具。如需直观呈现查询结果,请在 BigQuery 界面中运行查询后,点击“探索数据”按钮,然后选择使用 Looker Studio 进行探索

BigQuery 中的“通过 Looker Studio 进行探索”选项

这将在探索视图中创建从 BigQuery 到 Looker Studio 的直接关联。在此视图中,您可以选择要直观呈现的字段、选择图表类型、设置过滤条件,并创建临时图表以进行快速可视化分析。根据之前的查询结果,您可以创建以下折线图来查看 LCP 值随时间变化的趋势:

Looker Studio 中的每日 LCP 值折线图

通过 BigQuery 与 Looker Studio 之间的直接关联,您可以基于任何查询创建快速图表并执行可视化分析。但是,如果您要进行其他分析,则可能需要在交互式信息中心内查看多个图表,以获取更全面的视图或能够深入了解数据。拥有一个方便的信息中心,意味着您不必在每次要分析指标时编写查询并手动生成图表。

您可以使用原生 BigQuery 连接器在 Looker Studio 中创建信息中心。要执行此操作,请转到 datastudio.google.com,创建新的数据源,选择 BigQuery 连接器,然后选择要使用的数据集:

在 Looker Studio 中使用 BigQuery 原生连接器

将网页指标数据具体化

如前所述,在创建网页指标事件数据的信息中心时,直接使用 Google Analytics(分析)4 导出数据集效率低下。由于 GA4 数据的结构以及网页指标所需的预处理,查询的部分内容最终将运行多次。这会带来两个问题:信息中心性能和 BigQuery 费用。

您可以免费使用 BigQuery 沙盒模式。借助 BigQuery 的免费使用量层级,每月处理的前 1 TB 查询数据是免费的。对于本博文中讨论的分析方法,除非您使用非常大的数据集或定期大量查询该数据集,否则您每月应该都能保持在此免费限额以内。但是,如果您的网站流量较高,并且希望使用快速的交互式信息中心定期监控不同的指标,我们建议您对 Web Vitals 数据进行预处理并具体化,同时利用分区、聚类和缓存等 BigQuery 效率功能。

以下脚本将预处理您的 BigQuery 数据(源表)并创建一个具体化表(目标表)。对您自己的数据集使用此查询时,您可能还需要定义源表的日期范围,以减少处理的数据量。

# Materialize Web Vitals metrics from GA4 event export data

# Replace target table name
CREATE OR REPLACE TABLE bigquery_project_id.ga4_demo_dev.web_vitals_summary
  PARTITION BY DATE(event_timestamp)
  CLUSTER BY metric_name
AS
SELECT
  ga_session_id,
  IF(
    EXISTS(SELECT 1 FROM UNNEST(events) AS e WHERE e.event_name = 'first_visit'),
    'New user',
    'Returning user') AS user_type,
  IF(
    (SELECT MAX(session_engaged) FROM UNNEST(events)) > 0, 'Engaged', 'Not engaged')
    AS session_engagement,
  evt.* EXCEPT (session_engaged, event_name),
  event_name AS metric_name,
  FORMAT_TIMESTAMP('%Y%m%d', event_timestamp) AS event_date
FROM
  (
    SELECT
      ga_session_id,
      ARRAY_AGG(custom_event) AS events
    FROM
      (
        SELECT
          ga_session_id,
          STRUCT(
            country,
            device_category,
            device_os,
            traffic_medium,
            traffic_name,
            traffic_source,
            page_path,
            debug_target,
            event_timestamp,
            event_name,
            metric_id,
            IF(event_name = 'LCP', metric_value / 1000, metric_value) AS metric_value,
            user_pseudo_id,
            session_engaged,
            session_revenue) AS custom_event
        FROM
          (
            SELECT
              (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id')
                AS ga_session_id,
              (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
                AS metric_id,
              ANY_VALUE(device.category) AS device_category,
              ANY_VALUE(device.operating_system) AS device_os,
              ANY_VALUE(traffic_source.medium) AS traffic_medium,
              ANY_VALUE(traffic_source.name) AS traffic_name,
              ANY_VALUE(traffic_source.source) AS traffic_source,
              ANY_VALUE(
                REGEXP_SUBSTR(
                  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
                  r'^[^?]+')) AS page_path,
              ANY_VALUE(
                (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'debug_target'))
                AS debug_target,
              ANY_VALUE(user_pseudo_id) AS user_pseudo_id,
              ANY_VALUE(geo.country) AS country,
              ANY_VALUE(event_name) AS event_name,
              SUM(ecommerce.purchase_revenue) AS session_revenue,
              MAX(
                (
                  SELECT
                    COALESCE(
                      value.double_value, value.int_value, CAST(value.string_value AS NUMERIC))
                  FROM UNNEST(event_params)
                  WHERE key = 'session_engaged'
                )) AS session_engaged,
              TIMESTAMP_MICROS(MAX(event_timestamp)) AS event_timestamp,
              MAX(
                (
                  SELECT COALESCE(value.double_value, value.int_value)
                  FROM UNNEST(event_params)
                  WHERE key = 'metric_value'
                )) AS metric_value,
            FROM
              # Replace source table name
              `bigquery_project_id.analytics_XXXXX.events_*`
            WHERE
              event_name IN ('LCP', 'INP', 'CLS', 'first_visit', 'purchase')
            GROUP BY
              1, 2
          )
      )
    WHERE
      ga_session_id IS NOT NULL
    GROUP BY ga_session_id
  )
CROSS JOIN UNNEST(events) AS evt
WHERE evt.event_name NOT IN ('first_visit', 'purchase');

此具体化数据集具有多项优势:

  • 数据结构已扁平化,更易于查询。
  • 它仅保留原始 GA4 数据集中的网页指标事件。
  • 会话 ID、用户类型(新用户与回访用户)和会话互动信息会直接显示在列中。
  • 该表按日期partitioned,并按指标名称聚簇。这通常会减少每个查询处理的数据量。
  • 由于您不需要使用通配符查询此表,因此查询结果最多可缓存 24 小时。这可以降低重复执行相同查询的费用。
  • 如果您使用 BigQuery BI 引擎,则可以对此表运行优化的 SQL 函数和运算符

您可以直接在 BigQuery 界面中查询此具体化表,也可以通过 BigQuery 连接器在 Looker Studio 中使用该表。

使用 Web Vitals 连接器

由于从头开始创建信息中心非常耗时,因此我们开发了一个打包解决方案来为您创建模板信息中心。首先,确保您已使用上一查询将网页指标表具体化。然后,通过以下链接访问 Looker Studio 的 Web Vitals 连接器:goo.gle/web-vitals-connector

提供一次性授权后,您应该会看到以下配置屏幕:

Web Vitals 连接器授权屏幕

提供具体化的 BigQuery 表 ID(即目标表)和您的 BigQuery 结算项目 ID。点击“连接”后,Looker Studio 将创建一个新的模板化信息中心,并将您的数据与该信息中心相关联。您可以根据需要修改、修改和共享信息中心如果创建一次信息中心,则无需再次访问连接器链接,除非您想要通过不同的数据集创建多个信息中心。

在浏览信息中心时,您可以在摘要标签页中查看网页指标的每日趋势,以及您网站的一些使用情况信息(例如用户和会话)。

用户分析标签页中,您可以选择指标,然后按不同的用量和业务指标查看指标百分位数以及用户数。

网页路径分析标签页可帮助您确定网站上的问题区域。在这里,您可以选择一个指标以查看概览。不过,您还会看到所有网页路径的散点图,其中 y 轴表示百分位值,x 轴记录计数。散点图有助于识别指标值低于预期的网页。使用“网页路径”表的散点图选择页面后,您可以通过查看“调试目标”表来进一步细分问题区域。

通过收入分析标签页,您可以了解如何在同一位置监控业务和效果指标。此部分绘制的是用户进行了购买的所有会话。您可以比较特定会话期间获得的收入与用户体验。

高级用法

随着您对数据集越来越熟悉,您可以修改信息中心并添加自己的图表,以获得更丰富、更有针对性的分析。为了使信息中心更有用,您可以执行以下步骤:

  • 在 BigQuery 中设置计划查询以获取更新的数据。我们之前运行的具体化查询只会截取当前数据的快照。如果要使用新数据及时更新信息中心,您可以运行每天运行的计划查询,并向具体化表附加新数据。
  • 联接第一方数据(例如客户关系管理)以获取业务数据洞见。在具体化表中,您可以将 user_id 添加为单独的列。这样您就可以联接第一方数据。如果 BigQuery 中没有第一方数据,您可以加载数据或使用联合数据源
  • 在您发送给 Google Analytics(分析)的数据中,以参数的形式报告您的网站或应用版本,并将其添加为具体化表中的列。然后,您可以将该版本数据作为维度添加到图表中,以便更轻松地查看版本更改对性能的影响。
  • 如果您预计通过直接查询或信息中心会大量使用数据集,可以尝试使用付费版本的 BigQuery BI Engine

摘要

这篇博文涵盖了有关如何使用 Google Analytics(分析)4 和 BigQuery 通过在现场收集的真实用户数据来衡量和调试性能的基础知识。此外,还介绍了如何使用 Looker Studio 和 Web Vitals 连接器构建自动化报告和信息中心,从而尽可能轻松地直观呈现数据。

这篇博文的一些要点总结如下:

  • 使用真实的用户数据衡量性能对于了解、调试和优化您的网站至关重要。
  • 当您的效果指标和业务指标在同一个系统中时,您可以获得更深入的数据洞见。Google Analytics(分析)和 BigQuery 可以帮您实现这一目的。
  • 通过 BigQuery 导出 Google Analytics(分析)原始数据,您可以使用您可能已经掌握的查询语言进行深入的自定义分析,这让您能够不受限制地进行深入自定义分析。
  • Google 提供许多 API 和 Looker Studio 等可视化工具,可让您自由地按照自己希望的方式构建报告。