Flutter开发中如何获取成功HTTP请求的响应时间?
多公共端点对接场景下的HTTP请求响应时间统计方案
统计单请求响应时间核心要保证三点:数据精度足够、统计逻辑不侵入业务、不要把非网络请求的额外耗时算入结果,落地可以按下面的方式做:
通用拦截器埋点(全语言/全HTTP客户端适配)
不管你用什么技术栈,最稳妥的方式是在HTTP客户端的请求拦截层做统一埋点,不要在每个业务请求代码里零散加统计逻辑,避免漏统计或者统计口径不一致:
- 禁止用系统墙钟时间做耗时计算,必须用单调时钟API,避免系统时间跳变(比如NTP校时)导致统计出负数或者异常大的耗时,不同技术栈对应API如下:
- 前端/Node.js用
performance.now() - Python用
time.perf_counter() - Java/Go用纳秒级内置时间API
- 前端/Node.js用
- 统计维度不要只算总耗时,拆分分段数据对调优帮助更大:DNS解析耗时、TCP/TLS握手耗时、首字节等待时间、响应体下载时间
- 统计结果要和请求元数据绑定:对应端点地址、请求方法、响应状态码、是否复用了连接池连接,方便后续聚合分析
给个Python requests库可直接复用的实现:
import time import requests from requests.adapters import HTTPAdapter class TimingTrackingAdapter(HTTPAdapter): def send(self, request, **kwargs): req_start = time.perf_counter() resp = super().send(request, **kwargs) total_cost_ms = round((time.perf_counter() - req_start) * 1000, 2) resp.timing = { "total_ms": total_cost_ms, "endpoint": request.url } return resp # 全局会话挂载适配器后,所有走这个会话的请求自动统计耗时 http_session = requests.Session() http_session.mount("http://", TimingTrackingAdapter()) http_session.mount("https://", TimingTrackingAdapter())
如果是浏览器端场景,不需要手动埋点,直接用原生提供的性能API就能拿到所有请求的完整耗时数据:
// 过滤出接口请求的性能条目 const apiEntries = performance.getEntriesByType('resource') .filter(entry => ['fetch', 'xmlhttprequest'].includes(entry.initiatorType)); apiEntries.forEach(entry => { const timingData = { total_ms: Math.round(entry.duration), dns_ms: entry.domainLookupEnd - entry.domainLookupStart, tcp_ms: entry.connectEnd - entry.connectStart, tls_ms: entry.secureConnectionStart ? entry.connectEnd - entry.secureConnectionStart : 0, ttfb_ms: entry.responseStart - entry.requestStart, download_ms: entry.responseEnd - entry.responseStart } // 这里可以把数据上报到你的性能分析存储中 console.log(entry.name, timingData); });
统计分析避坑要点
- 不要在耗时统计的逻辑里加阻塞操作,比如同步打大段日志、同步写库,否则会把额外开销算到请求耗时里,导致数据不准
- 聚合分析的时候不要只看平均耗时,重点看P95、P99分位值,平均耗时会被大量正常的快请求拉低,完全反映不了慢请求问题
- 不同公共端点的耗时要分开聚合,不要把所有接口的数据混在一起算,否则根本定位不到具体是哪个端点性能差
- 用了HTTP连接池的场景,要给统计数据加「是否新建连接」的标记,新建连接的请求会额外多DNS、握手开销,和复用连接的请求混在一起统计会让数据波动极大,没有参考价值
内容的提问来源于stack exchange,提问作者Dharaneshvar
相关产品推荐
相关产品推荐

