1 背景
因公司需要对开发的软件进行性能测试,需采集并记录测试过程中程序及系统的性能数据,包括cpu使用率、内存使用率、磁盘使用率等,方便开发人员对程序的性能表现进行分析。监控程序要求能够运行在x86或者Arm嵌入式平台上的linux系统,采集性能数据的程序须尽可能轻量化和可定制,于是个人利用工作之余设计本方案。
为了使用者能够实时查看到监视目标的 运行情况,方案选择C/S架构实现功能。性能采集服务运行在检测目标所在的环境,采集并记录性能数据,用户可通过客户端远程连接服务,并实时获取数据。
方案划分为三个子模块:
PD-001 | 性能数据采集模块 |
PD-002 | 性能数据网络传输模块 |
PD-003 | 数据可视化模块 |
2 方案描述
2.1 性能数据采集模块
2.1.1 模块说明
在服务器测试或运行的过程中,实时监测程序的性能数据是判断程序是否运行健康的重要依据。随着物联网领域的不断发展,数据采集点、边缘节点爆发式增长,为了能够实时监视这些节点的运行健康状况,需要专门的性能数据采集服务器,对节点的维护相关的数据进行实时采集,并对采集的数据进行分析、决策、展示。从而在海量的设备、节点、服务中定位问题点,提高服务质量,同时降低运维成本。
本方案仅涉及数据采集相关技术,描述类Unix系统中,有哪些运维相关的性能数据源、描述采集方法、提供基本性能数据采集库、并提供数据采集开发框架。
2.1.2 方案设计
系统性能数据
/proc/stat | 系统cpu使用率统计,多核时包括各个核心 |
/proc/<PID>/stat | 进程基本信息 |
/proc/<PID>/commandLine | 进程执行指令 |
/proc/meminfo | 系统内存使用统计 |
/proc/top | 进程列表数据 |
【1】项目路径:https://github.com/csjy309450/Pump/tree/master/modules/drone
2.2 性能数据网络传输模块
2.2.1 模块说明
性能监视主体和目标往往不在同一台主机上,因此需要在采集数据后实现数据的网络传输。
为了实现网络传输,需要开发接收性能采集请求并处理采集任务的服务器程序和发出性能数据采集请求并收受性能数据返回的客户端程序,并制定性能数据在网络上传输的通信协议。为方便与现有的应用程序体系集成,服务器、客户端遵循http协议,性能数据采集协议则采用restful风格http+json。采集服务运行在被监视点,如远程服务端或者边缘节点。
2.2.2 方案设计
协议URI规范
名称 | URI | 操作 | 说明 |
系统全局性能参数 | /drone/proc/top | GET/POST | GET 获取全部数据 |
服务数据采集能力 | /drone/system/capacity | OPTION | 获取采集服务支持的接口 |
单个进程性能参数 | /drone/proc/<PID>/xxx | GET/POST | GET 获取全部数据 |
http服务器基于ACE JAWS改造,之后单独写博文介绍。
2.3 数据可视化模块
2.3.1 echarts简介
echarts是百度提供基于JavaScript 实现的开源可视化库。可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等)。底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。
特性:
1.丰富的可视化类型
2.多种数据格式无需转换直接使用
3.千万数据的前端展现
4.移动端优化
...
具体自己查看官网
2.3.2 方案说明
在桌面应用程序领域,一直缺乏类似web页面一般友好直观的数据可视化工具。虽然也有mathGL\Gnuplot之类的c++数据可视化库,但是与基于js的数据可视化库所带来的体验相比,无论从数据展现的角度还是从交互体验的角度,都逊色很多。个人认为基于js的数据可视化库之所以在用户体验上能够领先其他技术的根本原因,在于html+js+css三种技术多年来专注于数据可视化领域,经过多年发展,相互分工明确、配合密切,自然在体验上领先于其他技术。
而echarts是众多基于js的数据可视化解决方案中非常优秀的一套解决方案,其设计初衷是在网站页面上完美展现数据图表。进过前几代的发展,echarts4无论是在性能上、可视化类型上以及交互体验上都已经非常成熟。如此优秀的数据可视化方案,仅能在web页面上集成对开发者来说是可惜的。近些年,虽然随着web服务器技术的不断发展,越来越多的公司选择通过远程服务器+web浏览器这种方式向客户提供服务,但传统的桌面应用程序在很多应用领域仍然具有不可替代性,因此若能够在桌面应用程序中集成echarts库,将极大提高应用程序数据可视化的用户体验。
2.3.3 方案设计
要在桌面窗口程序中集成echarts库,最关键的技术是实现在桌面窗口程序中渲染网页。所幸,随着google chromium的开源,当前已经有相当多的桌面应用框架集成了chromium,并实现了在桌面窗口中渲染web页面的功能。
c++ | Qt5.x WebEngine |
python | PyQt5 WebEngine |
c# | CefSharp |
java | JxBrowser |
js | Electron |
方案的另一个技术点,在于根据用户的要求产生echarts配置代码。echarts提供的图标类型及配置项非常丰富,如果只是提供固定模板供界面调用无法获得最优的体现,因此可以对echarts提供的配置项进行封装,程序根据用户的要求产生echarts配置代码,从而在界面上渲染出图表。因为echarts的配置代码是一个json对象,产生配置代码的过程就是json序列化的过程,因此需要实现内存数据->json功能。
本方案的目标是能够使各种语言开发的桌面应用程序能够集成,因此提供的SDK由c++开发,并提供c接口的动态库,方便多语言集成。
总之,为了实现在桌面应用中集成echarts,本方案采用的技术首先是通过对c++对echarts配置项进行封装,为客户提供配置、生成echarts图表模板的API,然后在现有窗口类的比如Qt WebEngineView的基础上,封装Echarts窗口,方便用户集成。并提供使用说明文档和实例代码。
注:当前echart桌面化代码不够完善,工作量比我预想的很多,特别是各种图标的配置。目前只实现了折线图的基本功能,所以没有放在github上。另外,数据序列化方案采用自家开发的AC框架。
参考: