跳至主要內容
基于JavaAgent的全链路监控(3)

《利用javaagent进行 JVM内存与GC信息的采集》

1、介绍

	除了监控java方法的执行耗时,我们还需要获取应用实例的jvm内存与gc信息,以实时把控我们的服务器性能是否在安全范围。监控jvm内存与gc信息是非常重要的,尤其是在大促以及微博火热爆点的时候,我们需要根据监控信息进行扩容,以保证系统稳定。

2、编码

在---
title: 基于JavaAgent的全链路监控(2)的基础上增加

(1)MyAgent.java

package cn.edu.bjut.agent;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.*;

/**
 * @author zhengtianqi
 */
public class MyAgent {

    /**
     * JVM 首先尝试在代理类上调用以下方法
     */
    public static void premain(String agentArgs, Instrumentation inst) {
            // 使用ScheduledExecutorService创建定时任务
        ScheduledExecutorService schedule =
                new ScheduledThreadPoolExecutor(1, new ThreadFactoryBuilder().setNameFormat("scheduled-%d").build());
        // 创建并执行在给定延迟后启用的一次性操作
        schedule.scheduleAtFixedRate(() ->

        {
            // 此方法为打印jvm信息喝gc信息
            JvmStack.printMemoryMetric();
            JvmStack.printGcMetric();
        }, 0L, 1000L, TimeUnit.MILLISECONDS);
     }

    /**
     * 如果代理类没有实现上面的方法,那么 JVM 将尝试调用该方法
     */
    public static void premain(String agentArgs) {
    }
}

zheng大约 1 分钟java基础javaagent
基于JavaAgent的全链路监控(2)

《利用javaagent进行方法耗时的监控》

1、介绍

	方法耗时利用前人轮子字节码操作工具ByteBuddy:Byte Buddy是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助。 除了Java类库附带的代码生成实用程序外,Byte Buddy还允许创建任意类,并且不限于实现用于创建运行时代理的接口。 此外,Byte Buddy提供了一个方便的API,可以使用Java代理或在构建过程中手动更改类。

2、pom.xml

引入ByteBuddy并打入到Agent包中


zheng大约 3 分钟java基础javaagent
基于JavaAgent的全链路监控(1)

《手写一个最简单的javaagent》

1、javaagent介绍

	在使用skywalking时,使用到了Javaagent技术作为节点的探针,使用Javaagent做字节码植入,无侵入式的收集,并通过HTTP或者gRPC方式发送数据到Skywalking Collector。

	后来查阅资料发现javaagent用途还是很广的,有JRebel,各种线上诊断工具(Btrace, Greys),还有阿里开源的 Arthas,在此记录一下javaagent的学习历程。

	其实 Java Agent 一点都不神秘,也是一个 Jar 包,只是启动方式和普通 Jar 包有所不同,对于普通的Jar包,通过指定类的 main 函数进行启动,但是 Java Agent 并不能单独启动,必须依附在一个 Java 应用程序运行。

	我们可以使用 Agent 技术构建一个独立于应用程序的代理程序,用来协助监测、运行甚至替换其他 JVM 上的程序,使用它可以实现虚拟机级别的 AOP 功能。

zheng大约 4 分钟java基础javaagent