OkHttp的性能指标拦截(建链,握手,首包,剩余包时间)

最近,部门接到新的任务就是做httpClient,URLConnection,OKhttpClient,webview的网络性能指标进行监控,当然这些指标最准确的方法还是使用jni在底层建链与dns解析,发包等函数进行hook,再进行指标采集。但领导要求我们在java层尝试一下,今天主要记录下,我对OkHttp网络指标采集的调研结果和尝试。

1   OkHttpClient client = new OkHttpClient();
2   Request request = new Request.Builder().url(url).get().build();
3   Response response = client.newCall(request).execute();

对于httpClient我们通尝都是替换execute()方法,然后对httpClient的对像进行更改配置自己的拦截功能,查看源码,发现OkHttpClient相对不同的是execute方法并不在OkHttpClient,而是newCall方法中new 了一个call实例。

1 public Call newCall(Request request) {
2     return new Call(this, request);
3   }

//Call构造器中,对OkHttpClient进行了深拷备,所以对newCall之后的OkHttpClient配置都将无法生效,所以我们必须在newCall之前将拦截代码进行塞入 Call(OkHttpClient client, Request originalRequest) {  // Copy the client. Otherwise changes (socket factory, redirect policy,  // etc.) may incorrectly be reflected in the request when it is  // executed.  this.client = client.copyWithDefaults();  this.originalRequest = originalRequest; }

发现Call类并不是final的,所以决定对其继承,因为 Call的构造器是protected的,所以子类需要在相同的包名下,而上层的拦截于是这样实现的

1   public static Call newCall(OkHttpClient okHttpClient, Request paramRequest)
2     {
3       return new MyCall(okHttpClient, paramRequest, okHttpClient.newCall(paramRequest));
4     }

MyCall类的中的public,protected方法进行重写(execute(),enqueue(Callback paramCallback),cancel(),isCanceled()),实现使用传入的call进行调用,重写

时间: 2024-08-02 18:37:11

OkHttp的性能指标拦截(建链,握手,首包,剩余包时间)的相关文章

Redis源码解析:20sentinel(一)初始化、建链

sentinel(哨兵)是redis的高可用解决方案.由一个或多个sentinel实例组成的分布式系统,可以监控任意多个主节点,以及它们属下的所有从节点.当某个主节点下线时,sentinel可以将下线主节点属下的某个从节点升级为新的主节点. 一:哨兵进程 哨兵,本质上是redis服务器的一种运行模式.也就是说它们共用大部分的代码,只是哨兵模式中有部分代码是自己特有的. 在Makefile中,哨兵的编译和安装,实际上跟redis服务器是一模一样的: REDIS_SERVER_NAME=redis-

客户端非阻塞socket建链流程

TCP协议是面向连接的.可靠的.基于字节流的传输层协议.那使用tcp协议进行通信的两端是如何进行通信的?使用tcp协议进行通信的两端是通过套接字(scoket)来建立连接的.套接字socket主要有两种类型,阻塞和非阻塞.通常为了防止进程阻塞以及避免cpu被长时间占用,客户端和服务端一般都会采用非阻塞socket进行通信,其中Nginx就是一个典型的例子.下面我们就以Nginx的upstream机制所涉及的与后端服务器建链的流程来总结下使用非阻塞socket的客户端建链流程. 先来看下Nginx

spring---aop(3)---Spring AOP的拦截器链

写在前面 时间断断续续,这次写一点关于spring aop拦截器链的记载.至于如何获取spring的拦截器,前一篇博客已经写的很清楚(spring---aop(2)---Spring AOP的JDK动态代理) 获取拦截器链 final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable { public Object invoke(Object proxy, Method method, Ob

区块链的首个爆发场景会是游戏还是金融?

区块链的首个爆发场景会是游戏还是金融?记得之前有一次区块链会展,遇到了一位好久没联系过的,从事区块链金融行业的朋友,对方问我,你认为区块链落地的话,首先会出现在哪个领域?几乎没怎么思考的,我就脱口而出:游戏! 2018年是区块链的元年,也是充满泡沫的一年.如果你在大街上谈论区块链,健身的大妈,开出租的小哥都能同你瞎侃一段.然而,人人都看好,却并不意味着市场真的在向好,一切都是概念,轻轻的飘在空中. 这个时候你要说做区块链游戏,肯定会有人认为你疯了! 第一.研发层面的困难相当不完善的区块链基础设施

Spring异步调用原理及SpringAop拦截器链原理

一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AsyncConfigurationSelector.class) public @interface EnableAsync { /** * Indicate the 'async' annotation type to be detected at

java 动态代理—— Mybaties 拦截器链基本原理实现

1.摘要 Mybaties 中有个分页插件,之前有特意的去了解了一下原理 :https://www.cnblogs.com/jonrain0625/p/11168247.html,从了解中得知分页插件是基于Mybaties的拦截器去实现的,这个插件就是一个拦截器,和别的拦截器组成了Mybaties的拦截器链,然后所有的拦截器都对Executor 这个类 做了动态代理.本次主要的再次去学习下这个动态代理,去实现一个最基本的拦截器链的效果.当然还有spring aop 等很多地方都是基于动态代理去实

YottaChain或是区块链技术首个成功落地的商用项目

YottaChain 或是 区块链 技术首个成功落地的商用项目,它的一小步, 却是区块链技术向实际应用迈了一大步 ! 区块链目前并没有太多成功落地的应用项目,一直以来区块链技术只是作为底层技术去设计各种数字货币模型,不免总有些人会拿着区块链作为幌子去做骗局, 今年六月底,在以太坊技术及应用大 上,YottaChain 创始人王东临 就表示区块链改变世界的程度将远远超过互联网. 在这之前所有靠纯讲故事的区块链 数字货币泡沫 将要破灭,2019 年区块链 技术将回归 到实体应用价值. 区块链实际就是

80211N、80211AC建链速率值(对应MCS)

转:http://www.docin.com/p-1713976102.html?docfrom=rrela 注:各种技术对速率提升的贡献各项技术对提高传输速率的贡献如下:子载波数目增加: 802.11g 采用的OFDM机制采用48个子载波传输数据,4个子载波作为导频:而802.11n将52个子载波全部用来传输数据.从而将速率提高了8.33%.FEC效率提升: 802.11g 采用的FEC最大编码速率为3/4. 802.11n进一步剔除了冗余位,将编码速率提升为5/6,从而将速率提高了11.11

TCP三次握手及tcpdump抓包

1. TCP报文段的首部格式 说明: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN(SYNchronization) : 在连接建立时用来同步序号.当SYN=1而ACK=0时,表明这是一个连接请求报文.对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文 FIN (finis)即完,终结的意思, 用来释放一个连接.当 FIN = 1 时,表明此报文段的发送方的数据已经发