站点的 INP 在 CrUX 里是 180ms,但客服反馈 Safari 上点按钮有明显延迟。查了采集逻辑,自建的 RUM 只上报了 Chrome 的数据。

把日志和配置对完,能解释这个现象的基本就这几处。INP 是 Chromium 系指标,Safari 与 Firefox 不上报;自建埋点按 UA 过滤,非 Chrome 的事件被直接丢弃;Safari 没有 PerformanceEventTiming,只能用长任务近似;移动端 Safari 的后台切换让事件时长失真。

上来先确认埋点覆盖的浏览器

curl -s https://www.example.com/rum/stats | jq '.browsers'

去掉 UA 过滤并区分浏览器上报

navigator.sendBeacon('/rum/beacon', JSON.stringify({ua:navigator.userAgent,inp:window.__inp}))

接着用长任务近似 Safari 的交互延迟

new PerformanceObserver(l => l.getEntries().forEach(e => report(e.duration))).observe({entryTypes:['longtask']})

末了按浏览器分组看分位数

python rum_group.py --metric inp --by browser

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

改完先别撤,确认这几项。Safari 的长任务分位数从 340ms 降到 190ms,Chromium 的 INP 同步改善,客服反馈的点击延迟问题消失。

这里还有个坑。Core Web Vitals 的采集面本身有偏向,只看 CrUX 会漏掉 Safari 用户,自建 RUM 时要把浏览器维度拆开看。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189