<commit_before>---
layout: post
title:  "Java Agent"
date:   2019-10-12
excerpt: "使用bytebuddy创建java agent"
feature: https://static.justice-love.com/image/jpg/bjfj1.jpg
tag:
- thread
comments: true
---
## Java Agent

Java Agent是JVM提供的代理，可以用过添加JVM启动参数指定，也可以通过SUN API运行时attach。它提供了两种能力：
1. Java Agent与JVM应用服务同进程，可以获取到JVM应用服务运行时的状态，比如通过JMX获取运行时线程，堆，GC等信息。
2. Java Agent提供了对class字节码层面上的扩展能力，可以应用到JVM应用服务监控，打点等场景，而对业务开发无入侵。

## Java Agent扩展class

使用bytebuddy快速实现class扩展，屏蔽了asm或者Javassist操作字节码所需的class相关知识，下面直接上代码展示：

```java
        final ByteBuddy byteBuddy = new ByteBuddy()
            .with(TypeValidation.of(Config.Agent.IS_OPEN_DEBUGGING_CLASS));

        new AgentBuilder.Default(byteBuddy)
            .ignore(
                nameStartsWith("net.bytebuddy.")
                    .or(nameStartsWith("org.slf4j."))
                    .or(nameStartsWith("org.apache.logging."))
                    .or(nameStartsWith("org.groovy."))
                    .or(nameContains("javassist"))
                    .or(nameContains(".asm."))
                    .or(nameStartsWith("sun.reflect"))
                    .or(allSkyWalkingAgentExcludeToolkit())
                    .or(ElementMatchers.<TypeDescription>isSynthetic()))
            .type(pluginFinder.buildMatch())
            .transform(new Transformer(pluginFinder))
            .with(new Listener())
            .installOn(instrumentation);
<commit_msg>add blog<commit_after>---
layout: post
title:  "Java Agent"
date:   2019-10-12
excerpt: "使用bytebuddy创建java agent"
feature: https://static.justice-love.com/image/jpg/bjfj1.jpg
tag:
- thread
comments: true
---
## Java Agent

Java Agent是JVM提供的代理，可以用过添加JVM启动参数指定，也可以通过SUN API运行时attach。它提供了两种能力：
1. Java Agent与JVM应用服务同进程，可以获取到JVM应用服务运行时的状态，比如通过JMX获取运行时线程，堆，GC等信息。
2. Java Agent提供了对class字节码层面上的扩展能力，可以应用到JVM应用服务监控，打点等场景，而对业务开发无入侵。

## Java Agent扩展class

使用bytebuddy快速实现class扩展，屏蔽了asm或者Javassist操作字节码所需的class相关知识，下面直接上代码展示：

```java
        //创建AgentBuilder
        final ByteBuddy byteBuddy = new ByteBuddy()
            .with(TypeValidation.of(Config.Agent.IS_OPEN_DEBUGGING_CLASS));

        new AgentBuilder.Default(byteBuddy)
            .ignore(
                nameStartsWith("net.bytebuddy.")
                    .or(nameStartsWith("org.slf4j."))
                    .or(nameStartsWith("org.apache.logging."))
                    .or(nameStartsWith("org.groovy."))
                    .or(nameContains("javassist"))
                    .or(nameContains(".asm."))
                    .or(nameStartsWith("sun.reflect"))
                    .or(allSkyWalkingAgentExcludeToolkit())
                    .or(ElementMatchers.<TypeDescription>isSynthetic()))
            .type(pluginFinder.buildMatch())
            .transform(new Transformer(pluginFinder))
            .with(new Listener())
            .installOn(instrumentation);
    
    //定义class Transformer
{'fraction_non_alphanumeric': 0.11809923130677848, 'fraction_numerical': 0.008385744234800839, 'mean_word_length': 2.60125786163522, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2869048', 'n_tokens_mistral': 1130, 'n_tokens_neox': 1153, 'n_words': 116}