在这里插入图片描述
在这里插入图片描述

一、前置思考

1.1 线上问题为什么可怕?

线下测试永远测不出全部问题:
  → 真实机型千差万别 (内存/性能/网络)
  → 真实用户行为无法预演 (极端操作/长尾路径)
  → 灰度到全量之间有巨大风险窗口

线上问题闭环: 让每一个线上问题都走完
  "发现 → 定位 → 修复 → 验证 → 归档" 的全流程
  → 不放过任何一个,不让同一个问题第二次发生

1.2 闭环体系的七环

监控埋点 → 告警触发 → 日志采集
  → 问题定位 → 代码修复 → 灰度验证 → 复盘归档

每一环都要"自动化 + 可追踪"
  → 自动发现、自动采集、自动上报
  → 每个问题有 ID,全链路可查

二、核心原理

2.1 监控埋点设计

埋点四类:
  性能埋点: 启动耗时/帧率/内存 (数值型)
  稳定性埋点: 崩溃/ANR/异常 (事件型)
  业务埋点: 转化率/功能使用 (业务指标)
  质量埋点: 接口成功率/延迟 (服务指标)

埋点规范:
  → 统一 SDK: 一套埋点 API
  → 全链路 ID: 一次操作一个 traceId
  → 采样控制: 高频事件采样上报
  → 隐私合规: 不采集敏感数据

2.2 告警触发策略

告警三要素: 指标 + 阈值 + 窗口

示例:
  崩溃率 > 0.5% (5分钟窗口) → P0 告警
  接口成功率 < 99% (10分钟) → P1 告警
  启动耗时 p95 > 3s (30分钟) → P1 告警
  内存泄漏增长持续 1 小时 → P2 告警

告警分级:
  P0: 立即处理 (核心功能不可用)
  P1: 当日处理 (严重体验问题)
  P2: 本周处理 (一般问题)
  P3: 观察 (轻微问题)

防打扰:
  → 抑制重复告警 (同一问题只报一次)
  → 收敛关联告警 (一个根因合并多条)
  → 值班轮转 (7x24 有人响应)

2.3 日志采集体系

采集内容:
  崩溃: faultlog (栈/寄存器/环境)
  ANR: trace 文件 (主线程堆栈)
  业务: 结构化日志 (含 traceId)
  现场: 设备信息/网络/内存快照

采集架构:
  端侧生成 → 本地缓存 → 批量上报 → 服务端归档
  → 脱敏 → 索引 → 可检索

关键: 离线兜底
  → 弱网时本地暂存,恢复后补报
  → 不丢现场,是定位的前提

2.4 灰度验证策略

修复后不能直接全量:
  → 灰度发布: 小比例 → 扩大 → 全量

灰度阶梯:
  1% → 5% → 20% → 50% → 100%
  → 每级观察指标: 崩溃率/告警/用户反馈

回滚预案:
  → 一键回滚到上一版本
  → 开关控制: 功能开关可远程关闭
  → 数据保留: 灰度数据可迁移

三、源码/API 深度解析

3.1 埋点 SDK 设计

// 统一埋点 API
export class Tracker {
  static traceId: string = '';

  // 性能埋点
  static perf(name: string, duration: number, attrs?: Record<string, Object>): void {
    this.report({
      type: 'perf',
      name,
      duration,
      traceId: this.traceId,
      time: Date.now(),
      ...attrs
    });
  }

  // 异常埋点
  static error(code: string, message: string, stack?: string): void {
    this.report({
      type: 'error',
      code,
      message,
      stack: stack ? stack.substring(0, 2000) : '',  // 限制长度
      traceId: this.traceId,
      time: Date.now()
    });
  }

  // 批量上报 (本地缓存 + 离线兜底)
  private static report(data: Object): void {
    const cache = this.getLocalCache();
    cache.push(data);
    if (cache.length >= 10 || Date.now() - this.lastFlush > 30000) {
      this.flush(cache);   // 异步上报
      this.lastFlush = Date.now();
    }
  }
}

3.2 崩溃捕获与上报

// 全局异常捕获
import { errorManager } from '@kit.AbilityKit';

export function initCrashMonitor(): void {
  errorManager.on('error', (err) => {
    // 1. 组装崩溃信息
    const crash = {
      name: err.name,
      message: err.message,
      stack: err.stack,
      traceId: Tracker.traceId,
      device: getDeviceInfo(),      // 型号/系统版本
      time: Date.now()
    };
    // 2. 本地持久化 (防止上报前进程被杀)
    saveCrashLocally(crash);
    // 3. 下次启动时批量上报
  });

  // 下次启动补报
  onAppStart(async () => {
    const pending = readLocalCrashes();
    for (const c of pending) {
      await uploadCrash(c);
    }
    clearLocalCrashes();
  });
}

3.3 全链路 traceId

// 一次用户操作生成唯一 traceId,贯穿所有日志
export function beginTrace(): string {
  Tracker.traceId = genId();   // e.g. '20250401-8f3a2b'
  return Tracker.traceId;
}

// 使用示例
function onUserClickLogin(): void {
  const traceId = beginTrace();
  LoggerUtil.info('Biz', traceId + ' 点击登录');
  try {
    const result = await loginService.login();
    LoggerUtil.info('Biz', traceId + ' 登录成功');
  } catch (e) {
    Tracker.error('LOGIN_FAIL', (e as Error).message);
    LoggerUtil.error('Biz', traceId + ' 登录失败: ' + (e as Error).message);
  }
}

// 排查时: 搜 traceId → 拿到这次操作的全部日志时间线

四、企业级实战落地

4.1 闭环流程速查

环节 动作 工具/机制
监控 指标采集 + 埋点 埋点 SDK
告警 阈值触发 + 分级 告警平台
采集 日志/崩溃/现场 faultlog + 日志上报
定位 栈分析 + 日志检索 traceId + 符号化
修复 根因修复 + 单测 常规开发流程
灰度 阶梯发布 + 开关 发布平台
复盘 归档 + 防回归 复盘模板 + 用例

4.2 完整示例:闭环流程演示

@Entry
@ComponentV2
struct OnlineClosedLoopDemo {
  @Local stage: string = '待开始';
  @Local traceId: string = '';
  @Local logs: string[] = [];

  private runLoopFlow(): void {
    this.logs = [];
    this.traceId = '20250401-8f3a2b';
    this.stage = '监控埋点';
    this.log('📡 ① 埋点: 启动耗时/崩溃率/接口成功率上报');
    this.log('   全链路 traceId: ' + this.traceId);

    this.stage = '告警触发';
    this.log('🚨 ② 告警: 崩溃率 0.8% > 阈值 0.5%');
    this.log('   分级 P0 · 5 分钟窗口 · 值班响应');

    this.stage = '日志采集';
    this.log('📥 ③ 采集: faultlog + 业务日志');
    this.log('   按 traceId 聚合: 2 条崩溃日志');

    this.stage = '问题定位';
    this.log('🔍 ④ 定位: 崩溃在 Image 组件内存回收');
    this.log('   根因: 长列表滑动中图片复用竞态');

    this.stage = '代码修复';
    this.log('🔧 ⑤ 修复: 复用池加 inUse 校验');
    this.log('   新增单测: 覆盖滑动+回收竞态场景');

    this.stage = '灰度验证';
    this.log('🚦 ⑥ 灰度: 1% → 5% → 20% → 50% → 100%');
    this.log('   每级观察崩溃率, 均 < 0.2% ✅');

    this.stage = '复盘归档';
    this.log('📋 ⑦ 复盘: 根因分析 + 防回归用例入库');
    this.log('   知识库新增: "图片复用竞态" 模式');
  }

  build() {
    Column({ space: 12 }) {
      Text('🔄 线上问题闭环演示').fontSize(20).fontWeight(FontWeight.Bold)
      Text('阶段: ' + this.stage).fontSize(13).fontColor('#CF222E')

      Row({ space: 8 }) {
        Button('▶ 模拟闭环流程').layoutWeight(1).height(40).fontSize(12)
          .onClick(() => this.runLoopFlow())
        Button('清空').height(40).fontSize(12)
          .onClick(() => this.logs = [])
      }
      .width('100%')

      Scroll() {
        Column() {
          ForEach(this.logs, (l: string) => {
            Text(l).fontSize(11).lineHeight(18).fontColor('#24292F').width('100%')
          }, (l: string, i: number) => l + i)
        }.width('100%')
      }
      .layoutWeight(1).width('100%').scrollBar(BarState.Off)
    }
    .width('100%').height('100%').padding(16)
    .backgroundColor('#F6F8FA')
  }
}

4.3 闭环体系搭建清单

1. 埋点统一: 一套 SDK,性能/稳定/业务全覆盖
2. 告警分级: P0-P3 明确响应时限,值班轮转
3. traceId 贯穿: 一次操作全链路可查
4. 灰度+回滚: 修复后阶梯发布,一键回滚兜底
5. 复盘归档: 每个问题沉淀为知识 + 防回归用例

五、问题排查与性能优化

问题 原因 解决
告警轰炸 阈值过低/重复 抑制 + 收敛 + 分级
现场丢失 弱网上报失败 本地缓存 + 补报
定位困难 无 traceId 全链路 ID 贯穿
灰度出问题 比例过大 小步灰度 + 快速回滚
复现不了 环境差异 采集设备/网络/内存快照
问题复发 未归档 复盘 + 防回归用例

5.1 闭环效率优化

1. 告警自动归因: 崩溃聚类, 同类合并
2. 一键定位: traceId 直达日志时间线
3. 修复模板化: 常见问题类型有修复清单
4. 灰度自动化: 指标无劣化自动扩量
5. 复盘轻量化: 模板化复盘, 不流于形式

六、高阶总结与最佳实践

  1. 闭环是体系不是工具:监控—告警—采集—定位—修复—灰度—复盘,七环缺一不可。
  2. 自动化为先:能自动的不人工,发现、采集、上报全部自动化。
  3. traceId 是钥匙:全链路 ID 让"大海捞针"变成"精确检索"。
  4. 灰度是安全网:任何修复都要小步验证,回滚预案常备。
  5. 复盘是护城河:归档的知识和用例,让同类问题不再复发。

一句话记住:线上问题闭环 = 埋点监控自动发现 + traceId 全链路定位 + 根因修复 + 灰度验证 + 复盘归档,让每个问题都"发现得了、定位得准、修得干净、不再重来"。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐