关于ZAKER 融媒体解决方案 合作 加入

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

51CTO 10-22

JDBC 做过 java 开发的都知道 JDBC 是干什么的,RestApi 其实就是 http 的调用,http 的调用就是调用第三方的服务的时候,第三方的服务并不是在自己的系统范围内,如果出现不稳定挂掉,对自身来说是不可控了,所以第三方服务而言对我们而言是非常的明感的。JDBC 和 RestApi 的监控对系统来讲意义很大,数据库得多重要,在系统的内部进行监控更能良好的反应 sql 的执行性能。

( 一 ) JDBC 调用拦截

JDBC 插桩目的

哪些监控怼开发运维来说最有用的。

SQL 语句、SQL 参数、用了多长时间、SQL 类型、结果集大小、返回字段、规范、Join 次数

拦截监听 SQL 语句

找出慢查询语句

模型结构

字段类型描述 sqltextsql 语句 paramsjson 参数 resultSizeint 结果大小 urlvarchar 数据库连接路径 userNamevarchar 数据库用户名 errortext 异常堆栈 useTimeint 用时

JDBC 插桩位置

这些 user,框架,连接池,驱动都依赖 jdbc,jdbc 是一个什么东西 ?jdbc 是一种规范,一堆接口组成的规范 j2se,由驱动来实现的。servlet 也是一种接口规范,是 j2ee 的规范,由 tomcat,jetty 等容器实现的。任任何一层都可以做为插桩的切入点,但是选用 User 层、框架层、连接池 & 数据源层、驱动层其实现是多样的,无法做到普适性。所以在此选用 JDBC 作为插桩切入 点。

JDBC 插桩机制

从上图可以分析出 JDBC 执行过程

1. 从驱动获取连接 ( Connection )

2. 基于连接构建预处理对象 ( prepareStatement )

3. 执行 SQL

4. 读取结果集 ( ResultSet )

5. 关闭释放连接。

其中涉及对象构建逻辑如下:

Driver==》Connection==》prepareStatement==》ResultSet

( 二 ) Http 调用拦截

Http 埋点目的

很多时候我们会调用第三方 API。比如:消息推送、短信发送、第三方支付接口等,因为服务是第三方提供,如果服务出现性能或可用性问题对于我方而言不可控,所以这类接口的稳定性是我们需要重点关注的对象。

通常这类接口会基于 Http 协议实现,所对 Htpp 协议监控,即实现了对第三方接口的监控。

Http 埋点位置

1.user 层:无法判断 User 具体执行方法,基于配置又做不到普适性。

2.Http 协议层:能找到具体方法,也能做到普适性。需要对 Http 协议进行全面解析,而且 Http 协议为文本协议,解析难度更大,实现成本居高。

3. 专有 SDK、与自定义封装的 Http 工具包,跟具体业务偶合同样无法做到普适应。

4.java net URL 与 HttpClient 都是 Http client 基于二者实现可以在一定程度上达成我们的目标。

Http 埋点机制 ( java.net.URL )

URL 常用写法:

URL url = new URL ( "https://www.baidu.com" ) ;

URLConnection conn = url.openConnection ( ) ;

conn.setDoInput ( true ) ;

conn.setDoOutput ( true ) ;

conn.connect ( ) ;

OutputStream output = conn.getOutputStream ( ) ;

output.write ( "a=c&b=1".getBytes ( ) ) ;

InputStream input = conn.getInputStream ( ) ;

byte [ ] bytes = IOUtils.readFully ( input, -1, false ) ;

System.out.println ( new String ( bytes ) ) ;

URL 装载执行过程:

URL 基于 protocol 构建对应 UrlStreamHandler

UrlStreamHandler.openConnection ( ) 打开连接,返回 URlConnection

URlConnection 设置连接属性

URlConnection 打开 outPutStream 写入参数

URlConnection 打开 inPutStream 读取结果

URL==》URLStreamHandler==》URLConnection==》outPutStream、InputStream。

如果上述过程加一层静态代理即可监控这些对象所有的执行过程从而得到所需监控数据 :

URL==》Proxy ( URLStreamHandler ) ==》Proxy ( URLConnection ) ==》Proxy ( outPutStream ) 、Proxy ( InputStream ) 。

URL 的类结构

怎么样才能加上这层代理呢 ? 其关键方法在于 通过静态代理的方式。 java.net.URL#setURLStreamHandlerFactory。该方法允许用户自定义 URL 协议实现 .

【编辑推荐】

想吃透监控系统,就这一篇够不够 ?

HTTPS 虐我千百遍,我却待她如初恋!

聊一聊几款流行监控系统,你知道几个?

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

以上内容由"51CTO"上传发布 查看原文
相关标签 数据库堆栈

觉得文章不错,微信扫描分享好友

扫码分享