第五课:服务端实现与可视化展示_第1页
第五课:服务端实现与可视化展示_第2页
第五课:服务端实现与可视化展示_第3页
第五课:服务端实现与可视化展示_第4页
第五课:服务端实现与可视化展示_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程概要:1. tuling-agent 项目架构2. tuling-agent 采集机制3. 服务端与可视化实现一、tuling-agent 项目架构知识点:1. 工程结构2. 版本发布3. 特殊问题解决方案1. 工程结构l bootstrap: 启动器,用于部署至监控目标环境装载agent。此外其能根据版本号下载最新Agent进行启动。l Base: Agent 上下文、会话等核心功能都在该工程中实现。l collects:该项目当中包含了一些通用采集器 如 dubbo、jdbc、jms、redis 等l collects-servlet: 仅包含了Servlet 采集器关于插件机制:为了方便扩展,采集器设计成了插件的形式其包含结构如下:在base.jar 做为一个整体的发布包对外发布,其Cbt_collects_lib目录下包含了所有的插件jar包。所有的插件包中必须包含 agentConfg/agent.xml,否则视为非法的采集器插件。采集器上下文正是基于agent.xml来构建采集器实例。2.版本发布l 版本构建这里需要将包自动构建成插件机制中所描述的结构,在Maven 中暂时没有找到相关插件可以实现其自动构建,所以就直接采用idea 来构建。u 构建演示。l 版本发布 版本发布暂时没有实现相关后台功能,需要手动插入至mysql 表中实现发布。表结构如下表:CREATE TABLE client_version ( version_id int(11) NOT NULL COMMENT ID 主键, client_id int(11) NOT NULL COMMENT 客户端分组ID, version_name varchar(50) NOT NULL COMMENT 版本名称, version_number int(5) NOT NULL COMMENT 版本序号 随客户版本数而增加,最大数为最新版本, data_byte mediumblob NOT NULL COMMENT 数据字节包。客户端包存储至此, data_MD5 varchar(32) NOT NULL COMMENT 数据md5 签名, describes varchar(255) DEFAULT NULL COMMENT 描述 说明, create_time datetime NOT NULL COMMENT 创建时间, last_update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 记录最后更新时间, disable bit(1) NOT NULL DEFAULT b1 COMMENT 记录是否有效 1 有效 0 逻辑删除, PRIMARY KEY (version_id), UNIQUE KEY version_name (version_name) USING BTREE) ENGINE=MyISAM DEFAULT CHARSET=utf8;u 发布演示l 自动更新分了方便Agent 更新,特设计了Agent 除bootstrap之外 都可以自动更新流程机制如下图:n 演示自动更新流程3.特殊问题解决方案l ClassLoader装载问题在第三节课的时候讲到Sevlet采集器,在jetty 中可以正常采集,而在Tomcat中却不行,原因是Tomcat的ClassLoader 分了好几层,采集器与目标类(HttpRequestServlet)并不在同一级导致,这里有三种解决方案:1. 将agent.jar 强行注入到目标类的ClassLoader中2. 将目标类直接打包进agent.jar3. 不直接调用servlet-api对像,而是通过反谢去访问HttpServletRequest 对象的值。课堂上我们采用的是第2种解决方案,但存在很大我版本依赖隐患,这里采用第一种解决方案,将采集器插件强行注入至其需要插桩的目标类对应用classLoader当中.过程如下图:l 应用识别的问题不同应用有不同采集需求,这就需要自定义配置。为每一个应用编写部署环境是一件非常麻烦的事情这里就采用远程配置方式,在启动的时候远程读取相应配置文件。实现该功能时有一个困难在于,如何认识当前应用。有以下三种方法:1. 在jvm参数中指明appId2. 读取web.xm 中的 display-name 属性3. 基于项目包路径,认别系统。这里采用的是第三种,相对严谨且简单。这种方式称作是系统指纹,因为每个系统肯定都有唯一的一个文件名,或目录名二、tuling-agent 采集机制知识点:1. Agent初始化过程2. 采集器执行过程3. 现有采集器介绍1. Agent初始化过程agent初始过程是指Agent如何开始准备采集工作的,其流程如下图:流程说明:1. 装载Agent Base包至当前ClassLoader (该loader 与bootstrap Loader为同一个)2. 扫描 base/Cbt_collects_lib 中的插件包3. 读取插件包中的agentConfg/agent.xml 文件4. 基于agent.xml 文件生成采集器实例2.采集执行过程埋点对象: 即埋点的目标对象collect (采集器): 采集逻辑执行器Context (上下文): 存储配置 会话等上下文信息Session (会话): 存储会话信息Transfer (传输器): 传输解决方案实现3.现有采集器介绍dubbo:采集dubbo远程调用信息采集目标:tocol.dubbo.filter.FutureFilter#invoke与 com.alibaba.dubbo.rpc.filter.EchoFilter#invokehttpClient采集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. 日志存储解决方案l 存储的要求:a. 大文本的存储b. 足够快的写入速度l 方案选择:a. mysqlb. MongoDBc. ElasticSearchd. Redis基于上述要求 mysql作为关系型数据肯定不能和NoSQL相比。剩下的MongoDB与ElasticSearch都满足需求,只不过ElasticSearch 关于日志传输有完整的解决方案,即ELK。另外加上其搜索功能加持 ,所以选择了ElasticSearch。l 具体实现具体实现并不复杂只需要注意两点即可:接收到数据后异步发送至ElasticSearchAgent 采用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.ftl 216L节点详情视图弹窗组件:layer.js 布局组件:bootstrap.jsSQL语法高亮:highlig

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论