这篇笔记里简单总结一下使用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程序,程序结构如下:

Java AST 调用链分析 java调用链监控_java程序

aop.xmlkieker.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
#

如果没有设置日志输出的位置,则会存在系统的临时文件夹下面,可以查看用户变量来找到临时文件夹位置,如下图所示:

Java AST 调用链分析 java调用链监控_java程序_02

四、运行程序

点击Edit Configurations

Java AST 调用链分析 java调用链监控_配置文件_03

VM options中添加如下命令。之后便可运行。

Java AST 调用链分析 java调用链监控_配置文件_04

五、运行结果

运行之后,结果如下,我这里没有设置SLF4J,因此会报警告,但不影响结果。

Java AST 调用链分析 java调用链监控_java_05


没有问题的话,会生成如下2个文件:

Java AST 调用链分析 java调用链监控_Java AST 调用链分析_06