JMeter 插件:使用 Log4j2 在每次循环迭代中生成 TraceId 模拟调用链
以下是一个简单的 JMeter 插件示例,用于在每次线程组开始执行时设置一个 traceId,并使用 Log4j2.xml 配置将其输出到日志中。该插件还会在每次循环迭代时自动更改 traceId,以模拟调用链。
- 创建一个名为 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;
}
}
- 在插件项目的 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>
- 在插件项目的 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>
-
将插件项目打包为 jar 文件,并将其放置在 JMeter 的 lib/ext 目录下。
-
启动 JMeter,创建一个新的测试计划,并添加一个线程组和一个 TraceIdSampler。
-
在 TraceIdSampler 的属性面板中,将名称设置为 TraceIdSampler,然后保存并运行测试计划。
-
在运行测试计划时,您将在控制台中看到类似以下的输出,其中包含每次迭代的 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 著作权归作者所有。请勿转载和采集!