本文对kieker工具做一个简单的介绍。
kieker简介
Kieker提供了动态分析功能,即监控和分析软件系统的运行时行为,从而实现应用程序性能监控和体系结构显示。由于是为连续运行而设计的,它只花费较低的开销。该工具由德国基尔大学软件工程组和德国汉堡大学共同维护,我在Google中搜索到kieker在德语中名为“瞭望台”的意思。
官网:https://kieker-monitoring.net/
github:https://github.com/kieker-monitoring/kieker
文档地址:https://kieker-monitoring.net/documentation/(在1.15版本之前,都提供了pdf版用户文档,但从1.15开始,文档改为了网页版。)
最新版本:1.15(2021年11月8日发行)。
目前看来,该工具主要应用于学术领域。
可以从以下两篇论文中搜索关于kieker的介绍,
- Wilhelm Hasselbring and André van Hoorn (2020) “Kieker: A monitoring framework for software engineering research”. Software Impacts, 5. https://doi.org/10.1016/j.simpa.2020.100019
- André van Hoorn, Jan Waller, and Wilhelm Hasselbring (2012) “Kieker: A Framework for Application Performance Monitoring and Dynamic Software Analysis”. In: 3rd joint ACM/SPEC International Conference on Performance Engineering (ICPE 2012), April 22-25, 2012, Boston, Massachusetts, USA. https://doi.org/10.1145/2188286.2188326
我对kieker的理解是可以监控java应用程序(当然官方也有提供其他语言的探针),获取到java程序运行时的方法调用关系,并保存为日志。
kieker功能
应用程序性能监控 (APM) 关注的是持续观察软件系统特定于性能的运行时行为,包括评估服务级别合规性 或 检测并诊断性能问题等分析。
Kieker 为收集和分析监控数据提供 APM 支持,尤其是对于Java EE系统。
其中,Kieker配备了用于收集以下APM信息的探测器::
层次 | 信息 |
---|---|
应用层和服务层 | 操作响应时间、用户session、trace等 |
系统层 | CPU利用率、内存占用等 |
虽然官网给的介绍中说能够探测到CPU利用率和内存占用信息等,但我没有试过这些功能,因为我利用这款工具是希望获取到系统在动态运行时内部方法的调用情况。
kieker架构
kieker基于两个主要组件KiekerMonitoring
部分和KiekerAnalysis
部分。
- KiekerMonitoring组件负责程序检测,数据收集和日志记录。它的核心是 MonitoringController。
- KiekerAnalysis组件负责读取、分析和可视化监控数据。它的核心是 AnalysisController,它管理分析插件的管道和过滤器架构的生命周期,包括监控阅读器和分析过滤器。
上图描述了自定义组件的可能扩展点(浅黄色部分),以及已经包含在Kieker分布中的组件(深黄色部分),详情如下:
- 监视文件系统和 SQL 数据库的写入器和相应的读取器(Monitoring writers and corresponding readers)、内存中记录流(命名管道)以及使用 Java 管理扩展 (JMX) 和 Java 消息传递服务 (JMS) 技术的写入器和读取器。
- 时间源(Time sources)利用Java的System.nanoTime()(默认)或System.current/TimeMillis()方法。
- 监控记录类型(Monitoring record types)允许存储有关操作执行(包括计时、控制流和会话信息)、CPU和资源利用率、内存/交换使用率的监控数据,以及可用于存储当前时间的记录类型。
- 监视探针(Monitoring probes):Kieker的一个特点是能够监视方法执行的跟踪和相应的时间信息。为了监控这些数据,Kieker包括使用AspectJ、JavaEE、Servlet、Spring和ApacheCXF技术的监控探针。此外,Kieker还包括采用OSHi的(定期)系统级资源监测探头。
- 分析/可视化插件(Analysis/Visualization plugins)可以根据输入和输出端口组装成管道和过滤器体系结构。
KiekerTraceAnalysis
工具本身是基于Kieker分析过滤器实现的,允许重建和可视化监控系统的体系结构模型,如依赖关系图、序列图和调用树。
kieker监控结果
以下是我写的一个用于测试的程序,利用kieker监控得出的日志结果。
$0;1641821632522961100;1.15;KIEKER;LAPTOP-QRJSTFAO;1;false;0;NANOSECONDS;0
$1;1641821632542161700;public com.zy.demo.BookService.<init>();<no-session-id>;1154751091955466241;1641821632542016100;1641821632542024600;LAPTOP-QRJSTFAO;1;1
$1;1641821632554542300;public com.zy.demo.BookDao.<init>();<no-session-id>;1154751091955466241;1641821632554533300;1641821632554538900;LAPTOP-QRJSTFAO;3;2
$1;1641821633351693800;public com.zy.demo.Book.<init>();<no-session-id>;1154751091955466241;1641821633351682800;1641821633351690400;LAPTOP-QRJSTFAO;5;3
$1;1641821633351722100;public void com.zy.demo.Book.setBookID(int);<no-session-id>;1154751091955466241;1641821633351718200;1641821633351721000;LAPTOP-QRJSTFAO;6;3
$1;1641821633351877800;public void com.zy.demo.Book.setBookCount(int);<no-session-id>;1154751091955466241;1641821633351873400;1641821633351876500;LAPTOP-QRJSTFAO;7;3
$1;1641821633351906000;public void com.zy.demo.Book.setBookName(java.lang.String);<no-session-id>;1154751091955466241;1641821633351902700;1641821633351905100;LAPTOP-QRJSTFAO;8;3
$1;1641821633351928100;public void com.zy.demo.Book.setDetail(java.lang.String);<no-session-id>;1154751091955466241;1641821633351924700;1641821633351927100;LAPTOP-QRJSTFAO;9;3
$1;1641821633353095100;public com.zy.demo.Book com.zy.demo.BookDao.FindById(int);<no-session-id>;1154751091955466241;1641821632554570500;1641821633353092400;LAPTOP-QRJSTFAO;4;2
$1;1641821633353103100;public com.zy.demo.Book com.zy.demo.BookService.getInfoById(int);<no-session-id>;1154751091955466241;1641821632542842900;1641821633353102200;LAPTOP-QRJSTFAO;2;1
$1;1641821633353164500;public java.lang.String com.zy.demo.Book.toString();<no-session-id>;1154751091955466241;1641821633353138100;1641821633353163400;LAPTOP-QRJSTFAO;10;1
$1;1641821633353207600;public static void com.zy.demo.BookController.main(java.lang.String[]);<no-session-id>;1154751091955466241;1641821632527120100;1641821633353206400;LAPTOP-QRJSTFAO;0;0
上述每条监控日志的解释为:
【监测记录的类型;日志记录时间戳(时间单位:ns);操作签名(完整限定词);SessionID (仅限于web应用);TraceID(trace的唯一ID);执行开始时间;执行结束时间;计算机名称;执行顺序索引eoi;执行堆栈大小ess】
注:
eoi:执行顺序索引值为i,表示在一个trace中开始的第i个执行(eoi初始为0)。
ess:执行栈大小值为j,表示在相应的trace调用栈深度为j。
如下图所示的执行情况,注释了相应的eoi和ess值(图中第一个是eoi,第二个是ess)。显然,一个执行顺序索引在trace中是唯一的,但一个执行堆栈大小的值可以出现不止一次。可以根据traceid、eoi、ess来判断方法的调用关系
图形表示:
利用kieker提供的trace-analysis
工具将上述日志结果用图形表示,生成图形需要提前安装Graphviz
软件。
注:我使用的是kieker 1.13版本中提供的trace-analysis-gui工具,因为我本地无法运行kieker1.15版本提供的trace-analysis-gui工具,初步分析是由于1.15版本工具
trace-analysis-gui.bat
中代码过长造成。
图形如下,连接线旁的数字表示为调用次数:
更详细图形信息如下,同样可以使用trace-analysis
得出: