针对 Web 自定义崩溃报告

选择平台: iOS+ Android Web Flutter Unity


在 Firebase 控制台(DevOps 和互动 > Crashlytics 信息中心)中,您可以点击进入某个问题并获取详细的事件报告。您可以自定义这些报告并管理遥测数据收集,以便更好地了解 Web 应用中发生的情况:

以编程方式报告已处理的异常

您可以使用 recordError 手动记录已处理的异常。路由错误和未捕获的异常会自动被框架错误边界捕获。

以下是跟踪用户故障发生率和诊断属性的方法:

import { recordError, getCrashlytics } from '@firebase/crashlytics';
import { app } from './lib/firebase';

const crashlytics = getCrashlytics(app);

async function submitPaymentForm() {
  try {
    await api.processTransaction();
  } catch (error) {
    // Manually record handled exceptions with diagnostic context
    recordError(crashlytics, error, {
      userTier: 'Premium Gold',
      checkoutStage: 'BillingAddressVerification',
      transactionCode: 'tx_8412_err',
      retryAttempts: 2
    });
    showFallbackBanner(error);
  }
}

添加自定义键

自定义元数据键可帮助您了解导致崩溃的具体应用状态或用户工作流。

您可以在调用 recordError 时使用可选的元数据参数,直接将用户活动、会话状态和诊断详细信息记录为键值对自定义属性:

import { recordError, getCrashlytics } from '@firebase/crashlytics';
import { app } from './lib/firebase'; // Shared initialization script

const crashlytics = getCrashlytics(app);

// Pass custom key-value diagnostic metadata within recordError
recordError(crashlytics, error, {
  userTier: 'Premium Gold',
  checkoutStage: 'BillingAddressVerification',
  transactionCode: 'tx_8412_err',
  retryAttempts: 2,
  breadcrumb: 'User opened shopping cart',
  lastAction: 'Click Checkout Button'
});

这些自定义属性会保留在异常报告中,并显示在 Crashlytics 信息中心问题视图的键标签页下。

强制刷新遥测记录

默认情况下,Web 遥测引擎会将日志批量存入内存段,以节省电池电量、CPU 性能和网络带宽。不过,对于短期执行环境,必须在执行上下文销毁之前立即上传日志。

您可以使用异步 flush 命令立即将所有已加入队列的错误发送到后端:

import { recordError, flush, getCrashlytics } from '@firebase/crashlytics';
import { app } from './lib/firebase';

const crashlytics = getCrashlytics(app);

async function handleApplicationCrash(error: Error) {
  // Capture the error with immediate priority
  recordError(crashlytics, error, { priority: 'IMMEDIATE' });

  // Force an immediate upload before the process terminates or reloads
  await flush(crashlytics);

  // Safe to terminate or refresh the current execution context
  window.location.reload();
}

配置采样率

如果您对部分用户会话进行采样以控制遥测数据量和费用,则可以使用以下任一选项配置采样:

方法 1(推荐):在 Firebase 控制台中配置采样率

  1. 在 Firebase 控制台中,前往 DevOps 和互动 > Crashlytics 信息中心。

  2. 从页面顶部的下拉选择器中选择您的 Web 应用。

  3. 点击信息中心右上角的配置抽样。

  4. 设置采样率百分比(介于 0% 和 100% 之间),以控制从客户端收集的事件和会话所占的百分比。

方法 2:使用 Firebase Telemetry Admin API 设置采样率

您可以使用 Firebase Telemetry Admin API (firebasetelemetryadmin.googleapis.com/v1alpha) 管理 Firebase 应用的遥测数据收集设置。

  1. 在终端中配置以下必需变量:

    PROJECT_ID="PROJECT_ID"
    LOCATION="LOCATION"  # for example, global
    APP_ID="FIREBASE_APP_ID"  # for example, 1:1234567890:web:abcdef123456
    TOKEN=$(gcloud auth application-default print-access-token)
    
  2. 找到您的 CONFIG_NAME,然后在终端中将其配置为变量:

    遥测设置是使用 Config 资源管理的,因此您需要找到 Web 应用的特定 CONFIG_NAME。

    1. 列出项目中的配置,并按 FIREBASE_APP_ID 进行过滤。curl -G 和 --data-urlencode 标志可确保 AIP-160 过滤条件字符串经过正确的网址编码:

      curl -G \
        -H "Authorization: Bearer $TOKEN" \
        --data-urlencode "filter=app_id=\"${APP_ID}\"" \
        "https://firebasetelemetryadmin.googleapis.com/v1alpha/projects/${PROJECT_ID}/locations/${LOCATION}/configs"
      
    2. 在 JSON 响应中,找到应用的 name 字段 (projects/PROJECT_ID/locations/LOCATION/configs/<CONFIG_ID>),然后将其设置为 CONFIG_NAME 变量:

      CONFIG_NAME="CONFIG_NAME"
      
  3. 设置采样率:

    如需调整采样率,请使用 PATCH 方法更新 sampling_rate 字段。您必须在查询参数中指定 updateMask=sampling_rate。采样率是一个双精度值,表示要收集的会话百分比(例如,0.25 表示 25%):

    # Example: Set sampling rate to 25%
    curl -X PATCH \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d "{
        \"sampling_rate\": 0.25,
        \"app_id\": \"${APP_ID}\"
      }" \
      "https://firebasetelemetryadmin.googleapis.com/v1alpha/${CONFIG_NAME}?updateMask=sampling_rate"
    

停用或启用遥测数据收集

默认情况下,当您为 Web 应用设置 Crashlytics 时,系统会启用遥测收集功能。如果您需要在安装 Crashlytics SDK 后动态停用或重新启用遥测收集功能,可以使用 Firebase Telemetry Admin API (firebasetelemetryadmin.googleapis.com/v1alpha) 管理收集端点。

在停用或启用遥测之前,您需要设置以下变量:

  1. 在终端中配置以下必需变量:

    PROJECT_ID="PROJECT_ID"
    LOCATION="LOCATION"  # for example, global
    APP_ID="FIREBASE_APP_ID"  # for example, 1:1234567890:web:abcdef123456
    TOKEN=$(gcloud auth application-default print-access-token)
    
  2. 找到您的 CONFIG_NAME,然后在终端中将其配置为变量:

    遥测设置是使用 Config 资源管理的,因此您需要找到 Web 应用的特定 CONFIG_NAME。

    1. 列出项目中的配置,并按 FIREBASE_APP_ID 进行过滤。curl -G 和 --data-urlencode 标志可确保 AIP-160 过滤条件字符串经过正确的网址编码:

      curl -G \
        -H "Authorization: Bearer $TOKEN" \
        --data-urlencode "filter=app_id=\"${APP_ID}\"" \
        "https://firebasetelemetryadmin.googleapis.com/v1alpha/projects/${PROJECT_ID}/locations/${LOCATION}/configs"
      
    2. 在 JSON 响应中,找到应用的 name 字段 (projects/PROJECT_ID/locations/LOCATION/configs/<CONFIG_ID>),然后将其设置为 CONFIG_NAME 变量:

      CONFIG_NAME="CONFIG_NAME"
      

停用遥测数据收集

使用 :disable 自定义方法停用遥测收集:

curl -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}' \
  "https://firebasetelemetryadmin.googleapis.com/v1alpha/${CONFIG_NAME}:disable"

重新启用遥测收集

如需重新启用遥测数据收集,请调用 :enable 方法:

curl -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}' \
  "https://firebasetelemetryadmin.googleapis.com/v1alpha/${CONFIG_NAME}:enable"