服务端实现与可视化展示.docx
《服务端实现与可视化展示.docx》由会员分享,可在线阅读,更多相关《服务端实现与可视化展示.docx(12页珍藏版)》请在冰豆网上搜索。
服务端实现与可视化展示
课程概要:
1.tuling-agent项目架构
2.tuling-agent采集机制
3.服务端与可视化实现
一、tuling-agent项目架构
知识点:
1.工程结构
2.版本发布
3.特殊问题解决方案
1.工程结构
●bootstrap:
启动器,用于部署至监控目标环境装载agent。
此外其能根据版本号下载最新Agent进行启动。
●Base:
Agent上下文、会话等核心功能都在该工程中实现。
●collects:
该项目当中包含了一些通用采集器如dubbo、jdbc、jms、redis等
●collects-servlet:
仅包含了Servlet采集器
关于插件机制:
为了方便扩展,采集器设计成了插件的形式其包含结构如下:
在base.jar做为一个整体的发布包对外发布,其Cbt_collects_lib目录下包含了所有的插件jar包。
所有的插件包中必须包含agentConfg/agent.xml,否则视为非法的采集器插件。
采集器上下文正是基于agent.xml来构建采集器实例。
2.版本发布
●版本构建
这里需要将包自动构建成插件机制中所描述的结构,在Maven中暂时没有找到相关插件可以实现其自动构建,所以就直接采用idea来构建。
◆构建演示。
●版本发布
版本发布暂时没有实现相关后台功能,需要手动插入至mysql表中实现发布。
表结构如下表:
CREATETABLE`client_version`(
`version_id`int(11)NOTNULLCOMMENT'ID 主键',
`client_id`int(11)NOTNULLCOMMENT'客户端分组ID',
`version_name`varchar(50)NOTNULLCOMMENT'版本名称',
`version_number`int(5)NOTNULLCOMMENT'版本序号 随客户版本数而增加,最大数为最新版本',
`data_byte`mediumblobNOTNULLCOMMENT'数据字节包。
客户端包存储至此',
`data_MD5`varchar(32)NOTNULLCOMMENT'数据md5签名',
`describes`varchar(255)DEFAULTNULLCOMMENT'描述说明',
`create_time`datetimeNOTNULLCOMMENT'创建时间',
`last_update_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'记录最后更新时间',
`disable`bit
(1)NOTNULLDEFAULTb'1'COMMENT'记录是否有效1有效0逻辑删除',
PRIMARYKEY(`version_id`),
UNIQUEKEY`version_name`(`version_name`)USINGBTREE
)ENGINE=MyISAMDEFAULTCHARSET=utf8;
◆发布演示
●自动更新
分了方便Agent更新,特设计了Agent除bootstrap之外都可以自动更新流程机制如
下图:
⏹演示自动更新流程
3.特殊问题解决方案
●ClassLoader装载问题
在第三节课的时候讲到Sevlet采集器,在jetty中可以正常采集,而在Tomcat中却不行,原因是Tomcat的ClassLoader分了好几层,采集器与目标类(HttpRequestServlet)并不在同一级导致,这里有三种解决方案:
1.将agent.jar强行注入到目标类的ClassLoader中
2.将目标类直接打包进agent.jar
3.不直接调用servlet-api对像,而是通过反谢去访问HttpServletRequest对象的值。
课堂上我们采用的是第2种解决方案,但存在很大我版本依赖隐患,这里采用第一种解决方案,将采集器插件强行注入至其需要插桩的目标类对应用classLoader当中.过程如下图:
●应用识别的问题
不同应用有不同采集需求,这就需要自定义配置。
为每一个应用编写部署环境是一件非常麻烦的事情这里就采用远程配置方式,在启动的时候远程读取相应配置文件。
实现该功能时有一个困难在于,如何认识当前应用。
有以下三种方法:
1.在jvm参数中指明appId
2.读取web.xm中的display-name属性
3.基于项目包路径,认别系统。
这里采用的是第三种,相对严谨且简单。
这种方式称作是系统指纹,因为每个系统肯定都有唯一的一个文件名,或目录名
二、tuling-agent采集机制
知识点:
1.Agent初始化过程
2.采集器执行过程
3.现有采集器介绍
1.Agent初始化过程
agent初始过程是指Agent如何开始准备采集工作的,其流程如下图:
流程说明:
1.装载AgentBase包至当前ClassLoader(该loader与bootstrapLoader为同一个)
2.扫描base/Cbt_collects_lib中的插件包
3.读取插件包中的agentConfg/agent.xml文件
4.基于agent.xml文件生成采集器实例
2.采集执行过程
埋点对象:
即埋点的目标对象
collect(采集器):
采集逻辑执行器
Context(上下文):
存储配置会话等上下文信息
Session(会话):
存储会话信息
Transfer(传输器):
传输解决方案实现
3.现有采集器介绍
dubbo:
采集dubbo远程调用信息
采集目标:
com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter#invoke与com.alibaba.dubbo.rpc.filter.EchoFilter#invoke
httpClient
采集java自带URL的Http请求,基于URLStreamHandlerFactory来构建Http代理实现。
jdbc
采集SQl执行信息,基于对驱动插桩实现对Connection的代理
jms
基于org.springframework.jms.listener.AbstractMessageListenerContainer#invokeListener
插桩实现拦截jms消息
redis
基于对jedis中的redis.clients.jedis.Protocol拦截实现数据采集。
三、服务端与可视化实现
知识点:
1.日志传输解决方案
2.日志存储解决方案
3.日志可视化展示
4.部署启动项目
服务端概述
一个调用链系统的实现最基本的模块包括:
a.日志采集
b.数据传输
c.数据存储
d.图表展示
前面三节课基本上都是在讲采集,这是系统是重点和难点。
剩下的传输、存储、图表展示虽然没有那么复杂但不代表它们不重要,接下来就一起搞清楚剩下的三个模块是如何实现的。
1.日志传输解决方案
可选的传输解决方案:
1.先打印性能日志至本地,然后在基于logstash、flume日志收集工具进行发送至存储中心
2.直接通过Http上传至中心服务器
简单起见这里采用的是第2个方案实现流程见下图:
上传流程说明:
a.初化一个限定容量的阻塞队列
b.采集器抓取数据并上传至队列,超出容量直接丢弃
c.线程池分配上传线程
d.控制器取出指定数量数据,如果数量小于0线程阻塞。
e.调用上传服务,根据策略选择具体(http、logger、jms)服务进行发送
2.日志存储解决方案
●存储的要求:
a.大文本的存储
b.足够快的写入速度
●方案选择:
a.mysql
b.MongoDB
c.ElasticSearch
d.Redis
基于上述要求mysql作为关系型数据肯定不能和NoSQL相比。
剩下的MongoDB与ElasticSearch都满足需求,只不过ElasticSearch关于日志传输有完整的解决方案,即ELK。
另外加上其搜索功能加持,所以选择了ElasticSearch。
●具体实现
具体实现并不复杂只需要注意两点即可:
接收到数据后异步发送至ElasticSearch
Agent 采用fastjson作为数据存储,而ElasticSearch采用的是jackson,特殊字符转义的时候会存在格式化失败的问。
3.日志可视化展示
列表视图
主要功能:
1.时间过滤
2.IP过滤
3.关键字搜索
4.基于条件查询并展示相关节点
源码位置:
com.cbt.server.control.TraceRequestControl
页面:
page/trace/requestTableView.ftl
节点展示表格视图(TreeTable)
目的只有一个以TreeTable的形式展示链条节点,并重点标记状态,简单起见这里直接选择了EasyuI。
源码位置:
com.cbt.server.control.TraceDetailViewControl#openTraceListView
页面:
page/trace/traceListView.ftl
调用链关系图
其目的是以图的形式直观展示调用关系。
JsPlumb:
是一套开源的流程图创建工具,早期一款画图工具,
D3.js:
html5领域,d3可谓是最好的可视化基础库,提供方面的DOM操作,非常强大
Go.js:
go.js提供一整套的JS工具 ,支持各种交互式图表的创建。
有免费版和收费版
非简单起见最终选择了Go.js的免费版,直接基于Json进行渲染,几乎没有额外的学习成本。
相关源码:
com.cbt.server.control.TraceConsoleControl#getflowChartNodeData
页面:
page/trace/traceListView.ftl216L
节点详情视图
弹窗组件:
layer.js
布局组件:
bootstrap.js
SQL语法高亮:
highlight.pack.js
SQL格式化:
com.alibaba.druid.sql.SQLUtils#formatMySql(java.lang.String)
相关源码:
com.cbt.server.control.TraceDetailViewControl#openDetailView
普通节点页面:
page/trace/NormalDetailsView.ftl
SQL节点页面:
page/trace/SqlDetailsView.ftl