kieker初探:java程序动态分析工具

本文对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来判断方法的调用关系
ess与eoi

图形表示

利用kieker提供的trace-analysis工具将上述日志结果用图形表示,生成图形需要提前安装Graphviz软件。

注:我使用的是kieker 1.13版本中提供的trace-analysis-gui工具,因为我本地无法运行kieker1.15版本提供的trace-analysis-gui工具,初步分析是由于1.15版本工具trace-analysis-gui.bat中代码过长造成。

图形如下,连接线旁的数字表示为调用次数:

在这里插入图片描述

更详细图形信息如下,同样可以使用trace-analysis得出:

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java2D 是 Java 平台上的 2D 图形 API,提供了强大的绘制工具和灵活的绘制方式,可以用来绘制各种效果的图形。 下面是一个用 Java2D 绘制一个简单图形的示例代码: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.Ellipse2D; import javax.swing.JFrame; import javax.swing.JPanel; public class DrawingExample extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setPaint(Color.gray); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.setPaint(Color.yellow); g2d.fill(new Ellipse2D.Double(10, 10, 100, 100)); } public static void main(String[] args) { JFrame frame = new JFrame("Drawing Example"); frame.add(new DrawingExample()); frame.setSize(300, 300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ``` 这个示例代码绘制了一个灰色背景和一个黄色的圆形。首先,我们继承 JPanel 类并重写 paintComponent 方法,在方法内部进行绘制操作。我们首先将 Graphics 对象转换成 Graphics2D 对象,这样我们就可以使用更多的绘制方法和选项。然后,我们开启了抗锯齿选项,这样绘制的图形会更加平滑。接着,我们设置了绘制颜色为灰色,并使用 fillRect 方法填充整个面板。最后,我们设置了绘制颜色为黄色,并使用 Ellipse2D 类绘制了一个圆形。 我们可以通过运行这个示例代码来看到它的效果。这只是一个简单的示例,Java2D 还提供了更多的绘制工具和选项,可以用来创建更加复杂的图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值