Angular应用向CloudWatch RUM发送数据异常问题求助
兄弟,我之前在Angular项目里集成CloudWatch RUM的时候,也碰到过这种「只有第一次好使,之后彻底躺平」的诡异问题,给你几个亲测有效的排查和解决方向,你挨个试试:
先清掉RUM的本地会话存储:CloudWatch RUM会把会话状态存在浏览器的
localStorage里,以aws-rum-为前缀。你打开浏览器开发者工具的「Application」标签,找到localStorage里的这些键,全部删掉之后刷新页面,看看会不会重新触发dataplan API请求并发送数据。大概率是它认死了旧会话,即使你刷新也不肯重新初始化。调整RUM的初始化时机和Angular Zone的隔离:Angular的Zone.js会劫持很多浏览器事件,可能干扰了RUM的正常运行。你可以把RUM的初始化代码放到
NgZone.runOutsideAngular里,避开Angular的变更检测,比如在AppComponent的ngOnInit里这么写:
import { NgZone } from '@angular/core'; constructor(private ngZone: NgZone) {} ngOnInit() { this.ngZone.runOutsideAngular(() => { // 这里放你的CloudWatch RUM初始化代码 (window as any).AWS_RUM.init({ appMonitorId: '你的监控ID', applicationVersion: '1.0.0', sessionSampleRate: 1, // 其他配置项 }); }); }
检查RUM的dataplan缓存机制:RUM会缓存第一次请求到的dataplan配置,要是缓存里的采样策略或者上报规则有问题,之后就不会再发数据了。你可以在初始化配置里加上
disableDataplanCache: true(新版SDK支持),或者强制每次页面加载都重新拉取dataplan。排查生产环境的编译优化问题:如果是生产模式下的AOT编译,Angular的Tree Shaking可能误把RUM的代码当成无用代码删掉了。要是你用的是npm包形式的RUM SDK,记得在
angular.json的architect.build.options.scripts里把RUM的脚本加进去,或者在main.ts里显式import它,别用CDN脚本直接插在HTML里。打开RUM的调试模式抓细节:虽然你说控制台没报错,但普通模式下RUM会隐藏很多调试信息。你在初始化时加上
enableDebug: true,然后刷新页面,仔细看控制台的debug日志,说不定能找到它「躺平」的真正原因。
要是这些方法都试过还不行,你可以把RUM的初始化代码贴出来,咱们再一起抠细节~
内容来源于stack exchange

