当前位置: 首页 > 科技观察

如何埋点监控系统,监控数据库和HTTP请求

时间:2023-03-18 23:09:30 科技观察

JDBC做过java开发的都知道JDBC是干什么的。RestApi其实就是http调用,http调用就是调用第三方服务的时候。该服务不在我们自己的系统范围内。如果它变得不稳定并挂起,那是我们无法控制的。因此,第三方服务对我们来说是显而易见的。JDBC和RestApi的监控对系统来说意义重大。数据库有多重要,系统内部的监控更能体现SQL的执行性能。(1)JDBC调用拦截JDBC存根插入的目的是对监控、开发、运维最有用的。SQL语句、SQL参数、耗时多长时间、SQL类型、结果集大小、返回字段、规范、join次数拦截监控SQL语句查找慢查询语句模型结构字段类型描述sqltextsql语句paramsjson参数resultSizeint结果大小urlvarchar数据库连接路径userNamevarchar数据库用户名errortext异常堆栈useTimeint时间JDBC存根位置这些用户、框架、连接池和驱动都依赖于jdbc。什么是jdbc?实现了。Servlet也是一种接口规范,是一种j2ee规范,由tomcat、jetty等容器实现。任何层都可以作为存根插入的入口,但是用户层、框架层、连接池&数据源层、驱动层的实现是多种多样的,不能通用。因此这里选择JDBC作为存根插入的入口。JDBC插桩机制从上图我们可以分析JDBC的执行过程1.从驱动中获取连接(Connection)2.根据连接构建预处理对象(prepareStatement)3.执行SQL4.读取结果集(ResultSet)5.关闭并释放连接。涉及的对象构造逻辑如下:Driver==》Connection==》prepareStatement==》ResultSet(2)Http调用拦截Http埋点目的很多时候我们会调用第三方API。例如:消息推送,短信发送、第三方支付接口等,因为服务是由第三方提供的,如果服务出现性能或者可用性问题,是我们无法控制的,所以这类接口的稳定性是我们需要关注的对象在。通常这类接口会基于Http协议实现,Htpp协议的监控就是实现对第三方接口的监控。Http埋点定位1.用户层:无法判断User的具体执行方式,无法根据配置进行普适。2、Http协议层:具体的方法可以自己找,也可以实现通用性。Http协议需要全面分析,Http协议是文本协议,比较难分析,实现成本高。3、专有的SDK,自定义封装的Http工具包,特定的业务耦合也不能通用。4、javanetURL和HttpClient都是Http客户端。基于这两个实现,我们的目标可以在一定程度上实现。http埋点机制(java.net.URL)URL常用:URLurl=newURL("https://www.baidu.com");URLConnectionconn=url.openConnection();conn.setDoInput(true);conn.setDoOutput(true);conn.connect();OutputStreamoutput=conn.getOutputStream();output.write("a=c&b=1".getBytes());InputStreaminput=conn.getInputStream();byte[]bytes=IOUtils。readFully(input,-1,false);System.out.println(newString(bytes));URL加载执行过程:URL根据协议构建对应的UrlStreamHandlerUrlStreamHandler.openConnection()打开连接,返回URlConnectionURlConnection集合连接属性URlConnection打开outPutStream写入参数URlConnection打开inPutStream读取结果,其中涉及到对象构造逻辑如下:URL==》URLStreamHandler==》URLConnection==》outPutStream、InputStream。如果上面的流程加了一层静态代理,就可以监听这些对象的所有执行过程,获取需要的监听数据:URL==》Proxy(URLStreamHandler)==》Proxy(URLConnection)==》Proxy(outPutStream),代理(输入流)。如何在URL的类结构中加入这一层代理呢?关键方法是使用静态代理。java.net.URL#setURLStreamHandlerFactory。此方法允许用户定义的URL协议实现。