这篇笔记里简单总结一下使用Kieker获取普通Java程序运行状态的步骤,希望对初学的朋友有所帮助。
kieker简介
前言
如今微服务架构已经逐渐普及,而采用微服务架构一般都会使用链路追踪工具,如SkyWalking、jaeger等,来定位故障或者查看系统资源占用。因此对于微服务架构软件的调用链路获取,现在已经很普遍。
但是在单体架构软件中,如何获取软件内部的方法调用链路?Pinpoint的监控粒度可以达到对单个服务的方法级别,也就意味着能够监控单体应用,而且使用Pinpoint对javaweb程序进行监控可以做到无侵入式监控,即无需修改系统的代码,并且能够获取自动获取到对数据库操作的SQL语句。但进行了更深入的了解之后,发现Pinpoint也存在它的局限性。
- 首先,Pinpoint Agent需要一个入口点来启动一个新的事件追踪,这是由各种Web容器(如Tomcat,Jetty等)完成的,因此想要傻瓜式地对java程序进行监控,只能将程序部署在web容器中,对于普通的java程序,则需要进行手动设置。
- 其次,使用Pinpoint收集到的方法调用关系,会加入许多框架内部包含的一些方法,如Mybatis、Spring等框架内部的方法。然而,我只想纯粹地获取到自己所写的程序内部方法调用关系,因此框架内部的方法很多余。
目前看了许多的微服务相关领域的学术论文,了解到kieker这个工具。按照kieker的官方文档,能够了解kieker可以做到侵入式、半侵入式、无侵入式的程序监控,除此之外,kieker能够对普通的java程序进行监控。
kieker使用步骤
kieker版本:Kieker 1.15(2021年10月7日发行)
本步骤使用基于AspectJ的kieker监控自定义java程序。
一、导入jar包
使用maven导入jar包,我用的是目前的最新版本。
在pom.xml
中添加:
<dependency>
<groupId>net.kieker-monitoring</groupId>
<artifactId>kieker</artifactId>
<version>1.15</version>
<classifier>aspectj</classifier>
</dependency>
二、编写测试程序
自己写了一个很简单的java程序,程序结构如下:
aop.xml
和kieker.monitoring.properties
是kieker需要使用的配置文件,文件名不允许修改,且必须新建一个META-INF
文件夹并放在该文件夹下,配置文件之后再讲。
代码如下:
Book类,其实就是简单的pojo类:
package com.zy.demo;
public class Book {
private int Id;
private String name;
private int count;
public Book() {
}
public Book(int id, String name, int count) {
this.Id = id;
this.name = name;
this.count = count;
}
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public String toString() {
return "Book{" +
"Id=" + Id +
", name='" + name + '\'' +
", count=" + count +
'}';
}
}
BookController类:
package com.zy.demo;
public class BookController {
public void getInfo(Book book){
System.out.println(book.getName());
System.out.println(book.getId());
System.out.println(book.getCount());
}
}
Main类,主类:
package com.zy.demo;
public class Main {
public static void main(String[] args) {
BookController bc = new BookController();
Book book = new Book(1,"Golang",20);
bc.getInfo(book);
}
}
三、kieker配置文件
aop.xml配置文件
按照官方文档,如果无侵入式监控类中的方法,需要在aop.xml
中添加如下配置:
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.aspectj.org/dtd/aspectj_1_5_0.dtd">
<aspectj>
<weaver options="">
<include within="com.zy..*"/>
</weaver>
<aspects>
<aspect name="kieker.monitoring.probe.aspectj.operationExecution.OperationExecutionAspectFull"/>
</aspects>
</aspectj>
aop.xml
文件在官方下载的kieker发行版中存在并有使用说明,这里不详细介绍。
此配置文件第5行表示监控com.zy
包及其子包下的所有方法,可以参考AspectJ的切点表达式。
第9行表示使用无侵入的方式,注意末尾是OperationExecutionAspectFull
。
kieker.monitoring.properties配置文件
该配置文件同样在发行版中存在,这里主要设置一下日志的输出位置,找到FileWriter.customStoragePath
,我这里设置为了F:\\zy
,注意确保文件夹是存在的。
## In order to use a custom directory, set customStoragePath as desired. Examples:
## /var/kieker or C:\\KiekerData (ensure the folder exists).
## Otherwise the default temporary directory will be used
kieker.monitoring.writer.filesystem.FileWriter.customStoragePath=F:\\zy
#
如果没有设置日志输出的位置,则会存在系统的临时文件夹下面,可以查看用户变量来找到临时文件夹位置,如下图所示:
四、运行程序
点击Edit Configurations
。
在VM options
中添加如下命令。之后便可运行。
五、运行结果
运行之后,结果如下,我这里没有设置SLF4J,因此会报警告,但不影响结果。
没有问题的话,会生成如下2个文件: