当前位置: 首页 > news >正文

OkHttp Interceptor日志上报

最近为了做一些网络上的优化,所以就得提前埋点,为后续网络优化提供数据支持。
主要是对发起请求埋点,请求错误埋点,客户端请求耗时埋点。
事件上报到阿里云,接入的是阿里的应用实时监控服务。

网络请求使用的是OhHttp + Retrofit ,现在很多都是这么实现的了吧。
网络的埋点切入口,很容易就想到了 Interceptor,用起来了才觉得 Interceptor 是真的香,以前还只是觉得这个设计模式是真好。用到了才感觉是太香了。

上代码:

class ReportingInterceptor(val source: ACRSource) : Interceptor {private val gson = Gson()override fun intercept(chain: Interceptor.Chain): Response {val request = chain.request()val url = request.url.toString()AlibabaCloudRumUtil.requestStart(source, snapshots = url)val startTime = System.currentTimeMillis()val response = chain.proceed(request)AlibabaCloudRumUtil.requestCost(source,snapshots = url,System.currentTimeMillis() - startTime)// 判断是否是 HTTP 错误if (!response.isSuccessful) {AlibabaCloudRumUtil.requestFail(source,snapshots = url,params = AlibabaCloudRumUtil.errorMap(response.code.toString(),response.message))} else {val source = response.body?.source()source?.request(Long.MAX_VALUE)try {val buffer = source?.buffer// 业务错误逻辑上报val result = gson.fromJson(buffer?.clone()?.readString(Charset.forName("UTF-8")),BaseModel::class.java)if (result?.code != 0) {AlibabaCloudRumUtil.requestFail(ACRSource.COROUTINE,snapshots = url,params = ResultException("${result.code}",result?.message ?: "Unknown error").toMap())}} catch (ex: Exception) {AlibabaCloudRumUtil.requestFail(ACRSource.COROUTINE,snapshots = url,params = BusinessException.handlerException(ex).toMap())} finally {source?.close()}}return response}
}

网络请求上报是带上了URL,现在的Retrofit 的URL 在其他地方是真的不好拿,这 Interceptor 确实方便的很。
而网络耗时也比较容易,在
val response = chain.proceed(request)
前后记录时间就可以了,虽然跟抓包数据显示的网络耗时有差距,但是我们毕竟只是粗略的统计而已。
错误上报的话,包括了 http 请求错误和 code != 0 的业务数据错误,都是需要上报的。

如果需要在其他地方拿到 URL ,需要在 Interceptor 里处理,重新 new 一个 Response 返回,然后把 URL 塞到 Header 里面,在其他地方把 Header 中的 URL 读取出来。但是会产生一点性能开销,毕竟每个请求都需要 new 一个新的 Response 。

http://www.lryc.cn/news/434537.html

相关文章:

  • 高性能反向代理--HAProxy
  • 数据结构应用实例(四)——最小生成树
  • 为OneAPI配置MySQL数据库及设置开机启动
  • 完整的k8s搭建服务器流程
  • 【Petri网导论学习笔记】Petri网导论入门学习(一)
  • Zabbix监控自动化
  • pytorch pyro 贝叶斯神经网络 bnn beyesean neure network svi ​定制SVI目标和培训循环,变更推理
  • Openeuler22 部署 RackTables0.22.0
  • 从传统到智能:高标准农田灌区信息化助力农业现代化
  • 堆排序-建堆,增删替换
  • 使用AI写WebSocket知识是一种怎么样的体验?
  • 若依系统(Security)增加微信小程序登录(自定义登录)
  • 道可云人工智能元宇宙每日资讯|2024互联网岳麓峰会在长沙召开
  • MySQL JDBC URL各参数详解
  • celery control.shutdown
  • 数据库设计与软件工程阶段的对应关系
  • 基于ASP+ACCESS的教师信息管理系统
  • 【智能体】浅谈大模型之AI Agent
  • 大疆 嵌入式 笔记 面试题目汇总大全[嵌入式找工作必看] 比较有难度适合进阶收藏学习
  • 线程池以及详解使用@Async注解异步处理方法
  • css鼠标移动过去变成手的图标
  • uniapp 懒加载、预加载、缓存机制深度解析
  • 《OpenCV计算机视觉》—— 图像形态学(腐蚀、膨胀等)
  • 【Rust光年纪】海洋学研究的利器:Rust语言海洋学计算库详解
  • Word文档的读入【2】
  • 报名开启 | 游戏开发缺队友?首期繁星招聘会来袭!
  • 无法加载源https://api.nuget.org/v3/index.json的服务索引
  • C#--CM+Fody+HCWPF开发组合
  • 力扣474-一和零(Java详细题解)
  • 【话题】量子计算:前沿技术与应用前景深度解析