将 Performance Monitoring 数据导出到 BigQuery

您可以将 Performance Monitoring 数据从 Apple 和 Android 应用导出到 BigQuery 以供进一步分析。借助 BigQuery,您可以使用 BigQuery SQL 来分析数据,将数据导出至其他云提供商,甚至可以将这些数据用于您的自定义机器学习模型。

启用 BigQuery Export 功能

  1. 前往 Firebase 控制台中的“集成”页面,然后点击 BigQuery 卡片中的关联

  2. 按照屏幕上的说明启用 BigQuery

    Performance Monitoring 启用 BigQuery Export 功能后,会出现以下情况:

    • Firebase 会将您的现有数据的副本导出到 BigQuery。导出数据的初始传播最长可能需要 48 小时才能完成。

      • 您可以手动安排数据回填,该操作会针对过去 30 天内的数据或针对自您最近启用 BigQuery Export 功能后所产生的数据执行(以较近的日期为准)。
    • 创建数据集后,将无法更改其位置,但可以将数据集复制到其他位置,或手动将数据集移动(重新创建)到其他位置。如需了解详情,请参阅更改数据集位置

    • Firebase 会安排定期将您的数据从 Firebase 项目同步到 BigQuery。这些每日导出操作通常会在安排后的 24 小时内完成。

    • 默认情况下,您项目中的所有应用都会关联到 BigQuery,而且您以后向项目中添加的所有应用也都会自动关联到 BigQuery。您可以管理哪些应用可发送数据

如需停用 BigQuery Export 功能,请在 Firebase 控制台中解除与您的项目的关联

哪些数据会导出到 BigQuery

对于项目中的每个应用,导出操作会创建一个表,其中包含所有捕获的性能事件。表中的每一行都是一个性能事件,可以是以下任一值:

  • 时长跟踪记录 - 默认情况下收集“时长”指标的跟踪记录,包括应用启动、应用前台活动、应用后台活动以及开发者插桩的任何自定义代码跟踪记录

    • event_typeDURATION_TRACE
    • event_name 与跟踪记录名称相同
  • 跟踪记录指标 - 与开发者插桩的自定义代码跟踪记录关联的自定义指标

    • event_typeTRACE_METRIC
    • event_name 是指标的名称
    • parent_trace_name 是包含该指标的跟踪记录名称
  • 屏幕跟踪记录 - 涵盖屏幕生命周期的跟踪记录(屏幕呈现跟踪记录)

    • event_typeSCREEN_TRACE
    • event_name 是前缀 _st_ 加上实际的屏幕名称
  • 网络请求 - 涵盖网络请求生命周期的跟踪记录(HTTP 网络请求跟踪记录)

    • event_typeNETWORK_REQUEST
    • event_name 是网络请求网址的分类格式

每个性能事件都包含该事件的特性(例如客户端设备的国家/地区和运营商)以及事件特定信息:

  • 时长跟踪记录、跟踪记录指标和屏幕跟踪记录包含 trace_info
  • 跟踪记录指标包含 trace_info.metric_info
  • 屏幕跟踪记录包含 trace_info.screen_info
  • 网络跟踪记录包含 network_info

详细的数据架构

字段名称 类型 说明
event_timestamp 时间戳 事件在客户端设备上开始后所经过周期的时间戳(跟踪记录启动、网络启动等)
app_display_version 字符串 应用的显示版本(例如“4.1.7”)
  • 对于 Android 设备 - VersionName
  • 对于 iOS 设备 - CFBundleShortVersionString
app_build_version 字符串 应用的版本号(例如“1523456”)
  • 对于 Android 设备 - VersionCode
  • 对于 iOS 设备 - CFBundleVersion
os_version 字符串 客户端设备的操作系统版本
  • 对于 Android 设备 - Android API 级别(例如“26”)
  • 对于 iOS 设备 - iOS 版本(例如“11.4”)
device_name 字符串 客户端设备的名称(例如“Google Pixel”)
国家/地区 字符串 发生事件的国家/地区的双字母国家/地区代码(例如“US”,或使用“ZZ”表示未知国家/地区)
运营商 字符串 客户端设备的运营商
radio_type 字符串 事件发生时的活跃无线网络类型(例如“WIFI”)
custom_attributes ARRAY<RECORD> 附加到此事件的所有自定义特性
custom_attributes.key 字符串 自定义特性的键
custom_attributes.value 字符串 自定义特性的值
event_type 字符串 事件类型;可能的值:
  • DURATION_TRACE - 默认情况下收集“时长”指标的跟踪记录,包括应用启动、应用前台活动、应用后台活动以及开发者插桩的任何自定义代码跟踪记录
  • SCREEN_TRACE - 涵盖屏幕生命周期的跟踪记录(屏幕呈现跟踪记录)
  • TRACE_METRIC - 与开发者插桩的自定义代码跟踪记录相关联的自定义指标
  • NETWORK_REQUEST - 涵盖网络请求生命周期的跟踪记录(HTTP 网络请求跟踪记录)
event_name 字符串 事件名称
  • 对于 DURATION_TRACE - 跟踪记录名称
  • 对于 TRACE_METRIC - 自定义指标名称
  • 对于 SCREEN_TRACE - _st_ 后跟跟踪记录名称
  • 对于 NETWORK_REQUEST - 网络请求网址格式
parent_trace_name 字符串 含有跟踪记录指标的父跟踪记录的名称
仅适用于 TRACE_METRIC
trace_info RECORD 仅适用于 DURATION_TRACESCREEN_TRACETRACE_METRIC
trace_info.duration_us int64
  • 对于 DURATION_TRACESCREEN_TRACE - 从跟踪记录开始到结束的时间长度(“时长”)
  • 对于 TRACE_METRIC - 从父跟踪记录开始到结束的时间长度(“时长”)
单位:微秒
trace_info.screen_info RECORD 仅适用于 SCREEN_TRACE
trace_info.screen_info.slow_frame_ratio float64 此屏幕跟踪记录的慢帧比率,介于 0 和 1 之间(例如,值为 0.05 表示此屏幕实例的 5% 的帧需要超过 16 毫秒才能呈现)
trace_info.screen_info.frozen_frame_ratio float64 此屏幕跟踪记录的冻结帧的比率,介于 0 和 1 之间(例如,值为 0.05 表示此屏幕实例的 5% 的帧需要超过 700 毫秒才能呈现)
trace_info.metric_info RECORD 仅适用于 TRACE_METRIC
trace_info.metric_info.metric_value int64 跟踪记录指标的值
network_info RECORD 仅适用于 NETWORK_REQUEST
network_info.response_code int64 网络响应的 HTTP 响应代码(例如 200、404)
network_info.response_mime_type 字符串 网络响应的 MIME 类型(例如“text / html”)
network_info.request_http_method 字符串 网络请求的 HTTP 方法(例如“GET”或“POST”)
network_info.request_payload_bytes int64 网络请求载荷的大小
单位:字节
network_info.response_payload_bytes int64 网络响应载荷的大小
单位:字节
network_info.request_completed_time_us int64 event_timestamp(网络请求发送完成时)之后所经历的微秒数
单位:微秒
network_info.response_initiated_time_us int64 event_timestamp(网络响应启动时)之后所经历的微秒数
单位:微秒
network_info.response_completed_time_us int64 event_timestamp(网络响应完成时)之后所经历的微秒数
单位:微秒

您可以对导出的数据执行哪些操作?

以下部分提供了您可以针对导出的 Performance Monitoring 数据在 BigQuery 中运行的查询示例。

匹配控制台中显示的数据

Firebase 信息中心会汇总 America/Los_Angeles 时区内的每日数据。为了与控制台中显示的内容一致,日期函数应明确将 America/Los_Angeles 设置为时区,否则日期函数将默认使用世界协调时间 (UTC)

SELECT
  DATE(event_timestamp, 'America/Los_Angeles') AS daily_date,
  APPROX_QUANTILES(trace_info.duration_us, 100)[OFFSET(90)] / 1000000 AS p90_seconds,
FROM `TABLE_NAME`
WHERE
  DATE(event_timestamp, 'America/Los_Angeles')
    >= DATE_SUB( PARSE_DATE('%Y%m%d', 'YYYY-MM-DD'), INTERVAL 7 DAY)
  AND DATE(event_timestamp, 'America/Los_Angeles')
    <= PARSE_DATE('%Y%m%d', 'YYYY-MM-DD')
  AND event_name = '_app_start'
GROUP BY 1
ORDER BY 1 DESC;

按国家/地区查看应用平均启动延迟时间的详细信息

SELECT AVG(trace_info.duration_us), country
FROM `TABLE_NAME`
WHERE _PARTITIONTIME > TIMESTAMP("YYYY-MM-DD")
AND event_type = "DURATION_TRACE"
AND event_name = "_app_start"
GROUP BY 2;

按各种条件检查冻结帧的比率

例如,您可以检查不同的无线网络类型(WiFi、4G 等)上的冻结帧的比率以及用户在应用的每个屏幕上花费的时间。

SELECT
  AVG(trace_info.duration_us / 1000000) AS seconds_on_screen,
  AVG(trace_info.screen_info.frozen_frame_ratio) AS frozen_frame_ratio,
  event_name,
  radio_type
FROM `TABLE_NAME`
WHERE _PARTITIONTIME > TIMESTAMP("YYYY-MM-DD")
AND event_type = "SCREEN_TRACE"
GROUP BY event_name, radio_type
ORDER BY event_name, radio_type;

计算从磁盘加载某些类型的文件的缓存命中率

此分析假设您已对从磁盘加载文件的自定义代码跟踪记录进行插桩,该跟踪记录具有名为 file-extension 的自定义特性和名为 cache-hit 的自定义指标 (TRACE_METRIC)(如果缓存命中,则设置为 1,如果缓存未命中,则设置为 0)。

例如,您可以计算从磁盘加载 PNG 文件的缓存命中率:

SELECT AVG(trace_info.metric_info.metric_value) AS cache_hit_rate
FROM `TABLE_NAME`
WHERE _PARTITIONTIME > TIMESTAMP("YYYY-MM-DD")
AND event_type = "TRACE_METRIC"
AND event_name = "cache-hit"
AND parent_trace_name = "loadFromDisk"
AND STRUCT("file-extension", "png") IN UNNEST(custom_attributes);

检查用户发出网络请求的时段

例如,您可以查看在当天的哪个时段,来自美国的用户从您的应用发出网络请求:

SELECT
  count(1) AS hourly_count,
  EXTRACT(HOUR FROM event_timestamp) AS hour_of_day
FROM `TABLE_NAME`
WHERE _PARTITIONTIME > TIMESTAMP("YYYY-MM-DD")
AND event_type = "NETWORK_REQUEST"
AND country = "US"
GROUP BY 2 ORDER BY 2;

随时随地获取 Performance Monitoring 数据

有时,您想要访问 Performance Monitoring 数据服务器端或将其推送到另一个第三方解决方案。目前,您可免费导出数据。

您可以通过以下方式导出数据:

价格

Performance Monitoring 导出数据是免费的,并且 BigQuery 提供宽裕的免费使用限额。如需了解详情,请参阅 BigQuery 价格BigQuery 沙盒