Okhttp全链路监控

news2024/11/24 13:52:36

目标:

1).监控网络请求的各个阶段

2)获取每一个阶段的耗时和性能,用于性能分析。包括dns解析,socket连接时间,tls连接时间,请求发送时间,服务器接口处理时间,应答传输时间,应答数据处理时间等。

一、Okhttp全链路监控工具

Okhttp3提供了全链路监控工具EventListener。

1.1 注册全链路监听方法

OkhttpClient.Builder提供了注册链路监听的方法。

        public Builder eventListener(EventListener eventListener) {
            if (eventListener == null) {
                throw new NullPointerException("eventListener == null");
            } else {
                this.eventListenerFactory = EventListener.factory(eventListener);
                return this;
            }
        }

        public Builder eventListenerFactory(EventListener.Factory eventListenerFactory) {
            if (eventListenerFactory == null) {
                throw new NullPointerException("eventListenerFactory == null");
            } else {
                this.eventListenerFactory = eventListenerFactory;
                return this;
            }
        }

因此,用户只需要注册全链路监听方法,就可以在链路监听中进行逻辑处理。

1.2 全链路监控工具EventListener

一个HTTP请求过程主要如下:

1.callStart:一次请求开始了
2.dns:dns解析过程
3.connectStart: 开始建立连接了
4.secureConnect: 开始建立TSL安全链接
5.connectEnd: 链接建立结束:可能建立失败,失败后可以重试
6.requestHeaders:发送请求头
7.requestBody:发送请求body

8.服务器端处理请求
9.responseHeaders:客户端接受响应头
10.responseBody:客户端接受响应body
11.connectionReleased:链接释放
12.callEnd:一次请求结束 

根据链路监听方法,我们对主要过程进行耗时计算:

请求时长=callEnd/callFailed - callStart=请求结束时间-请求开始时间

请求队列等待时间=dnsStart-callStart=DNS开始解析时间-请求开始时间

DNS解析时长=dnsEnd-dnsStart=DNS解析结束时间- DNS解析开始时间

TCP连接时长=secureConnectStart-connectStart=TLS连接开始时间-连接开始时间

TLS连接时长=secureConnectEnd-secureConnectStart=TLS连接结束时间- TLS连接开始时间

连接总时长=connectEnd/connectFailed-connectStart=连接结束时间/连接失败时间-连接开始时间

请求时长=requestBodyEnd-connectEnd=请求报文体结束时间-连接结束时间

服务器处理时长=responseHeadersStart-requestBodyEnd=响应头开始时间-请求体结束时间

应答响应时长=responseBodyEnd-responseHeadersStart=应答报文体结束时间-应答请求头开始时间

应答解析时间=callEnd-responseBodyEnd=请求结束时间-应答报文体结束时间

解析时间如果是Retrofit,可以在用户层进行二次解析。

另外还可以添加一些辅助监控信息

- 请求url:请求url。
- 请求方式 : get , post ....
- 是否Https:
- 是否开了代理:
- 上行流量:包括整个请求上行header和body的总的流量,包含重试和重定向的上行流量。用于监控上行流量开销。
- 下行流量:包括整个请求下行header和body的总的流量,包含重试和重定向的下行流量。用于监控下行流量开销。
- 目标IP地址:对于多出口IP的客户,支持IP地址维度的数据分析。
- dns解析结果:请求url的域名解析ip列表,用于分析是否存在域名劫持的问题。
- tls握手记录:用于排查问题
- http code:根据http code确定请求状态。
- 网络库类型及版本:对于客户更换网络库或者升级网络库版本的情况,可以提供前后的网络数据的差异。
- 网络状态:NO,2G,3G,4G,5G,WIFI
- 异常信息:异常信息主要是收集网络请求各阶段出现异常时的异常栈的信息。比如常见的java.net.UnknownHostException、java.net.SocketTimeoutException等。

二、增加全链路监听

2.1 构建监听对象

2.2 实现链路监听对象计算

2.3 监听结果回调

参考文献:

OkHttp 全链路 网络监控 - 简书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1588925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows搭建LightPicture图片管理网站结合内网穿透实现公网访问本地图片

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

数字证书在网络安全中的关键作用与日常应用

在当今数字化的时代,网络安全问题日益凸显,保护数据安全和用户隐私成为了人们关注的焦点。数字证书作为一种重要的网络安全技术,其在网络安全中扮演着关键的角色,并且在我们的日常生活中有着广泛的应用。现在给大家介绍简单介绍下…

数据结构——链表变形

数据结构——链表变形 带尾指针的链表尾插的变化 循环双向双向循环 我们在上次已经了解了单链表,今天我们来了解一下链表的各种变形,如果还没有了解过上面单链表的小伙伴可以点击这里: https://blog.csdn.net/qq_67693066/article/details/13…

避坑指南: “低代码开发平台”怎么选看这篇!附案例参考

从事TOB行业 9 年,深入体验过 10 余款低代码产品。 下面基于我的个人认知给大家讲一讲: 低代码开发平台该如何选?从哪些维度可以判断低代码平台适合你的企业?多家企业采用低代码平台的实践案例! 目前市面上有超过 2…

vue快速入门(十)v-bind动态属性绑定

注释很详细&#xff0c;直接上代码 上一篇 新增内容 图片切换逻辑动态绑定的完整写法与简写方法 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

IDM激活步骤-亲测可用

前言&#xff1a;我试了3种方法&#xff0c;仅以下方法激活成功&#xff0c;其他都是30天试用 使用步骤&#xff1a; 1.从官网下载IDM并安装&#xff1a;https://www.internetdownloadmanager.com/ 2.下载激活工具&#xff1a;https://wwif.lanzouw.com/iSY2N16s81xi &#…

2024年第十四届MathorCup数学应用挑战赛B题解题思路

B题https://mbd.pub/o/bread/ZZ6Wm5dx 问题1:对于附件I(Pre_test文件夹)给定的三张甲骨文原始拓片图 片进行图像预处理&#xff0c;提取图像特征&#xff0c;建立甲骨文图像预处理模型&#xff0c;实现对 甲骨文图像干扰元素的初步判别和处理。 针对问题1&#xff0c;对于附件…

备战蓝桥杯---刷杂题2

显然我们直接看前一半&#xff0c;然后我们按照斜行看&#xff0c;我们发现斜行是递增的&#xff0c;而同一行从左向右也是递增的&#xff0c;因此我们可以直接二分&#xff0c;同时我们发现对称轴的数为Ck,2k. 我们从16斜行枚举即可 #include<bits/stdc.h> using name…

文心一言 VS 讯飞星火 VS chatgpt (235)-- 算法导论17.2 3题

三、假定我们不仅对计数器进行增 1 操作&#xff0c;还会进行置 0 操作(即将所有位复位)。设检测或修改一个位的时间为 Θ(1) &#xff0c;说明如何用一个位数组来实现计数器&#xff0c;使得对一个初值为 0 的计数器执行一个由任意 n 个 INCREMENT 和 RESET 操作组成的序列花费…

【每日练习】二叉树

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;二叉树 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 文章目录 一、100. 相同的树1. 题目简介2.…

程序员需要考证吗?程序员考证真的有用吗?

程序员需要考证吗?程序员考证真的有用吗? 软考简介 软考&#xff0c;即软件设计师考试&#xff0c;是由中国人事部主管的一项专业技术资格考试。通过软考&#xff0c;考生可以获得软件设计师等级证书&#xff0c;这是国家认可的专业技术资格证书之一。软考作为我国软件行业的…

docker安装华为高斯-opengauss

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

【XR806开发板试用】自带mqtt的调试教学

1、下载代码 mkdir xr806_openharmony cd xr806_openharmony repo init -u ssh://gitgitee.com/openharmony-sig/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify -m devboard_xr806.xml repo sync -c repo forall -c git lfs pull **最近仓库在整合&#xff…

软件设计师-基础知识科目-算法设计与分析8

八、算法设计与分析&#xff1a; 常见算法&#xff1a; 回溯方法&#xff1a; 用深度优先的探索问题的解空间。应用场景&#xff1a;N皇后问题。&#xff08;背&#xff09; 分支界限法&#xff1a; 用广度优先的探索问题的解空间&#xff0c;采用的是分支界限法算法设计策…

【数据库】PostgreSQL源码编译安装方式与简单配置(v16.2)

PostgreSQL源码编译安装方式与简单配置&#xff08;v16.2&#xff09; 一、PostgreSQL安装基本介绍1.1 几种PostgreSQL的安装方式1.2 删除原有的PostgreSQL1.3 编译安装过程简介 二、源码编译安装方式详情2.1 下载源代码2.2 编译安装运行 configure执行 make执行 make install …

监控服务zabbix的部署

监控服务zabbix部署 文章目录 监控服务zabbix部署1. zabbix介绍2. zabbix特点3. zabbix配置文件4. 部署zabbix4.1apache安装4.2mysql安装php安装(yum方式)4.3php安装&#xff08;源码方式&#xff09;4.4配置apache代理4.5zabbix安装4.6zabbix服务端配置4.7zabbix服务端web界面…

Python应用|获取矢量数据的多边形个数

import geopandas as gpd #首先导入geopandas包# 读取Shapefile文件 shp_file "E:\python\china" gdf gpd.read_file(shp_file)# 获取多边形个数 num_polygons len(gdf)print("Number of polygons:", num_polygons) 图1|输出结果

淄博、哈尔滨、天水…社交媒体助推下的网红城市能“长红”吗?

烧烤卷饼带火山东传统工业小镇淄博&#xff1b; 冰雪狂欢让东北的哈尔滨在寒冬爆火&#xff1b; 一碗麻辣烫让西北天水小城变“网红”…… 在刚刚过去的清明假期&#xff0c;甘肃天水可谓是“热辣滚烫”&#xff0c;在春暖花开时节&#xff0c;迎来了属于它的春天。而被人们逐…

QT:QMainWindow、ui界面、资源文件的添加、信号和槽

1.练习&#xff1a;使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(…

【STL】栈(stack)

笔者在做下面这道题的时候想到用栈&#xff0c;但写的很麻烦 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define MAXC 255 typedef int SElemType; typedef struct StackNode {SElemType data;struct StackNode *next; }StackNode,*LinkStack; bool…