使用HttpClient精准测量REST API响应时间(排除TLS、DNS开销验证SLA)
解决方案
关于EventSource事件关联的性能顾虑
你担心的ConcurrentDictionary存储ID带来的性能影响完全可以忽略。System.Net.Http EventSource发布的所有和单个请求绑定的事件,都会携带同一个long类型的RequestId字段,不需要做复杂的GUID字节运算,直接用这个RequestId作为字典key即可。单请求仅涉及1次写入、1次读取删除操作,都是纳秒级耗时,即使在QPS过万的生产环境下,也不会产生可观测的性能损耗。
事件关联实现要点
- 监听
System.Net.HttpEventSource的RequestContentStop和ResponseContentStop事件 - 收到
RequestContentStop事件时,将对应RequestId和事件的时间戳存入ConcurrentDictionary - 收到
ResponseContentStop事件时,根据RequestId取出对应RequestContentStop的时间戳,二者差值就是你需要的、排除了DNS解析、TLS握手、连接建立耗时的纯请求响应时长 - 额外增加定时清理逻辑,清除字典中存在时间超过HttpClient超时阈值的条目,避免请求异常中断导致的内存泄漏
更轻量的替代方案
如果不想自己维护事件监听和匹配逻辑,可以直接订阅.NET内置的DiagnosticListener诊断事件,这套体系已经封装好了请求全链路的各个阶段数据,直接订阅System.Net.Http.HttpRequestOut.Stop事件,对应上下文已经包含了请求各阶段的耗时统计,可以直接提取你需要的指标,不需要自行做事件匹配。
内容的提问来源于stack exchange,提问作者Oleg Golovkov
相关产品推荐
相关产品推荐

