以下是一个简单的 JMeter 插件示例,用于在每次线程组开始执行时设置一个 traceId,并使用 Log4j2.xml 配置将其输出到日志中。该插件还会在每次循环迭代时自动更改 traceId,以模拟调用链。

  1. 创建一个名为 TraceIdSampler 的 Java 类,并继承 AbstractSampler 类。
package com.example.jmeter.plugin;

import org.apache.jmeter.samplers.AbstractSampler;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.SampleSaveConfiguration;
import org.apache.jmeter.testelement.TestStateListener;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class TraceIdSampler extends AbstractSampler implements TestStateListener {
    
    private static final long serialVersionUID = 1L;
    private static final Logger logger = LogManager.getLogger(TraceIdSampler.class);
    private static final String TRACE_ID = 'traceId';
    private static final String DEFAULT_TRACE_ID = 'null';
    private static final String LOG_MESSAGE = 'TraceId: {}';
    private String traceId = DEFAULT_TRACE_ID;

    public TraceIdSampler() {
        super();
        logger.debug('TraceIdSampler initialized.');
    }

    @Override
    public SampleResult sample(Entry entry) {
        SampleResult result = new SampleResult();
        result.setSampleLabel(getName());
        result.sampleStart();
        try {
            traceId = getNextTraceId(); // get next traceId for each iteration
            logger.debug(LOG_MESSAGE, traceId); // log traceId
            result.setSuccessful(true);
            result.setResponseCodeOK();
        } catch (Exception e) {
            result.setSuccessful(false);
            result.setResponseCode('500');
            result.setResponseMessage(e.getMessage());
        } finally {
            result.sampleEnd();
        }
        return result;
    }

    private String getNextTraceId() {
        return 'traceId_' + JMeterContextService.getThreadNum() + '_' + System.currentTimeMillis();
    }

    @Override
    public void testStarted() {
        logger.debug('Test started.');
        traceId = DEFAULT_TRACE_ID; // reset traceId when test starts
    }

    @Override
    public void testEnded() {
        logger.debug('Test ended.');
    }

    @Override
    public void testStarted(String host) {
        logger.debug('Test started on host: {}', host);
        traceId = DEFAULT_TRACE_ID; // reset traceId when test starts
    }

    @Override
    public void testEnded(String host) {
        logger.debug('Test ended on host: {}', host);
    }

    @Override
    public void testIterationStart(LoopIterationEvent event) {
        logger.debug('Test iteration started.');
        traceId = DEFAULT_TRACE_ID; // reset traceId when each iteration starts
    }

    @Override
    public SampleSaveConfiguration getSaveConfig() {
        SampleSaveConfiguration saveConfig = super.getSaveConfig();
        saveConfig.setAsXml(false);
        return saveConfig;
    }

    public String getTraceId() {
        return traceId;
    }

    public void setTraceId(String traceId) {
        this.traceId = traceId;
    }

}
  1. 在插件项目的 src/main/resources 目录下创建一个 log4j2.xml 文件,用于配置日志输出。
<?xml version='1.0' encoding='UTF-8'?>
<Configuration status='WARN'>
    <Appenders>
        <Console name='Console' target='SYSTEM_OUT'>
            <PatternLayout pattern='%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n' />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name='com.example.jmeter.plugin' level='debug' additivity='false'>
            <AppenderRef ref='Console' />
        </Logger>
        <Root level='warn'>
            <AppenderRef ref='Console' />
        </Root>
    </Loggers>
</Configuration>
  1. 在插件项目的 pom.xml 文件中添加以下依赖项:
<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.14.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.14.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.jmeter</groupId>
        <artifactId>ApacheJMeter_core</artifactId>
        <version>5.4.1</version>
    </dependency>
</dependencies>
  1. 将插件项目打包为 jar 文件,并将其放置在 JMeter 的 lib/ext 目录下。

  2. 启动 JMeter,创建一个新的测试计划,并添加一个线程组和一个 TraceIdSampler。

  3. 在 TraceIdSampler 的属性面板中,将名称设置为 TraceIdSampler,然后保存并运行测试计划。

  4. 在运行测试计划时,您将在控制台中看到类似以下的输出,其中包含每次迭代的 traceId:

09:28:36.581 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - TraceIdSampler initialized.
09:28:36.630 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - Test started.
09:28:36.631 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - Test iteration started.
09:28:36.632 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - TraceId: traceId_0_1630067316632
09:28:36.634 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - Test iteration started.
09:28:36.634 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - TraceId: traceId_0_1630067316634
09:28:36.635 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - Test iteration started.
09:28:36.636 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - TraceId: traceId_0_1630067316636
09:28:36.636 [Thread-0] DEBUG com.example.jmeter.plugin.TraceIdSampler - Test ended.

原文地址: https://www.cveoy.top/t/topic/ojKK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录