第十四篇:《JMeter插件扩展:自定义函数与第三方插件》

虽然 JMeter 本身功能强大,但在实际工作中,总有一些特定场景需要额外扩展:比如生成复杂的业务数据、实时监控服务器资源、实现更精细的负载模型等。JMeter 支持两种扩展方式:安装第三方插件和自定义开发。本文将介绍如何使用 Plugins Manager 安装常用插件,以及如何通过 Java 开发自定义函数和取样器。

一、JMeter 插件生态概览

JMeter 官方提供了核心功能,而大量高级特性由 JMeter Plugins 项目(https://jmeter-plugins.org)提供。

二、安装 JMeter Plugins Manager

2.1 下载安装

https://jmeter-plugins.org/install/Install/ 下载 jmeter-plugins-manager-*.jar

将 JAR 文件复制到 $JMETER_HOME/lib/ext 目录下

重启 JMeter

2.2 使用插件管理器

点击菜单栏 Options → Plugins Manager。Plugins Manager 包含三大标签页:

Installed Plugins:已安装的插件

Available Plugins:可用插件列表,勾选即可安装

Upgrades:已安装插件的更新

三、常用第三方插件详解

3.1 Custom Thread Groups(自定义线程组)

用于实现阶梯式加压和复杂负载模型,比默认线程组更适合负载测试。

安装:在 Available Plugins 中搜索 "Custom Thread Groups" 并安装。

安装后,添加线程组时会多出以下选项:

Stepping Thread Group:阶梯式增加/减少线程

Concurrency Thread Group:按目标并发/吞吐量调度线程

Stepping Thread Group 配置示例:

text

This group will start: 10 threads

Then start: 10 threads, every 30 seconds, using ramp-up: 5 seconds

Then hold load for: 300 seconds

Finally, stop: 10 threads every 10 seconds

该配置模拟:每 30 秒增加 10 个并发,达到峰值后保持 5 分钟,再逐步释放。

3.2 PerfMon Metrics Collector(服务器性能监控)

分布式压测时,不仅要关注 TPS 和响应时间,还需监控被测服务器的 CPU、内存、磁盘 I/O 等指标。PerfMon 插件正是为此而生。

安装:在 Available Plugins 中搜索 "PerfMon" 并安装。

配置步骤:

在被测服务器上启动 ServerAgent:

bash 复制代码
# 下载 ServerAgent
wget https://github.com/undera/perfmon-agent/releases/download/2.2.3/ServerAgent-2.2.3.zip
unzip ServerAgent-2.2.3.zip
cd ServerAgent-2.2.3
./startAgent.sh      # 默认端口 4444

在 JMeter 中添加监听器:右键线程组 → Add → Listener → jp@gc - PerfMon Metrics Collector

配置监控指标:添加要监控的服务器,选择指标类型(CPU、Memory、Swap、Disk I/O、Network I/O 等)。

启动压测:实时曲线会显示在监听器中。

3.3 Throughput Shaping Timer(吞吐量定时器)

普通的定时器(如 Constant Throughput Timer)存在性能问题,且精度不高。Throughput Shaping Timer 能精确控制 RPS,与 Concurrency Thread Group 配合可实现"面向目标的负载测试"。

安装:在 Available Plugins 中搜索 "Throughput Shaping Timer"。

配置示例:

text

Step1: start load: 10 rps, end load: 10 rps, duration: 60s

Step2: start load: 10 rps, end load: 50 rps, duration: 60s

Step3: start load: 50 rps, end load: 50 rps, duration: 180s

这表示:第 1 分钟固定 10 RPS,第 2 分钟从 10 爬升到 50 RPS,后 3 分钟保持 50 RPS。

3.4 Basic Graphs(基础图表)

提供比默认监听器更丰富的图表:

Transactions per Second:实时 TPS 曲线

Response Times Over Time:响应时间曲线

Response Times vs Threads:响应时间与并发数的关系

四、自定义 Java 请求(Java Sampler)

当 JMeter 内置的取样器无法满足需求时(如需要测试自定义 TCP/UDP 协议、调用本地 SDK),可以通过继承 AbstractJavaSamplerClient 类来实现自定义取样器。

4.1 开发步骤

Step 1:创建 Java 工程,引入 JMeter 的 ApacheJMeter_core.jar 和 ApacheJMeter_java.jar(位于 $JMETER_HOME/lib/ext)。

Step 2:创建类继承 AbstractJavaSamplerClient,实现四个主要方法:

getDefaultParameters():定义可配置的输入参数

setupTest():测试开始前执行一次(如初始化连接)

runTest(JavaSamplerContext context):核心逻辑,每次迭代调用

teardownTest():测试结束后执行一次(如释放资源)

示例代码:

java 复制代码
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

public class CustomJavaSampler extends AbstractJavaSamplerClient {
    
    // 定义可配置参数
    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("sleep_time", "100");
        return params;
    }
    
    // 每个取样器执行一次
    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        SampleResult result = new SampleResult();
        result.sampleStart();
        
        try {
            long sleepTime = Long.parseLong(context.getParameter("sleep_time"));
            Thread.sleep(sleepTime);
            result.setSuccessful(true);
            result.setResponseMessage("OK");
            result.setResponseData("Success".getBytes());
        } catch (Exception e) {
            result.setSuccessful(false);
            result.setResponseMessage(e.getMessage());
        }
        
        result.sampleEnd();
        return result;
    }
}

Step 3:打包成 JAR,放入所有 JMeter 节点(Master 和 Slave)的 lib/ext 目录,重启 JMeter。

Step 4:在线程组中添加 Java Request 取样器,选择自定义类,配置参数(如 sleep_time)。

4.2 使用场景

测试非 HTTP 协议的自定义后端服务

调用本地 SDK 或数据库存储过程

生成高精度的复杂测试数据(结合 CSV 读取)

五、自定义函数(Function)

自定义函数用于生成动态数据,比内置函数更灵活。

java 复制代码
import org.apache.jmeter.functions.AbstractFunction;

public class CustomFunction extends AbstractFunction {
    // 实现 getArgumentDesc、setParameters、execute 等方法
}

与自定义取样器相比,自定义函数更轻量,适合做数据处理;自定义取样器则适合实现完整的协议交互。

六、插件开发的最佳实践

性能优先:插件应在高并发下保持低开销,避免在 runTest 中创建重量级对象。

线程安全:同一线程内 runTest 是串行执行,但多线程下实例可能会重用,需注意并发安全。

日志规范:使用 JMeter 的 log 对象(如 log.info())输出日志,而非 System.out。

版本兼容性:针对主流 JMeter 版本(如 5.x)编译,测试稳定后再部署。

七、总结

本文核心:

Plugins Manager 是插件安装的统一入口

常用插件推荐:Custom Thread Groups(阶梯加压)、PerfMon(资源监控)、Throughput Shaping Timer(精确控压)

自定义 Java 请求:继承 AbstractJavaSamplerClient 实现 runTest 方法

自定义函数:更轻量,适合数据处理

相关推荐
敲代码的嘎仔1 小时前
力扣高频SQL基础50题详解
开发语言·数据库·笔记·sql·算法·leetcode·后端开发
码农-阿杰1 小时前
Java 线程等待唤醒机制深度解析:synchronized、ReentrantLock、LockSupport 底层实现对比
java·开发语言·c++
赤水无泪1 小时前
Qt 全模块汇总列表
开发语言·qt
yong99901 小时前
MATLAB仿真计算电磁波回波信号的技术路径与实现指南
开发语言·matlab
不是光头 强1 小时前
Spring Boot 多线程场景下 i18n 国际化失效问题排查与解决
java·开发语言·springboot
jieyucx1 小时前
Go 语言核心关键字:defer 深度解析与实战避坑
开发语言·后端·golang·defer
m0_702036531 小时前
mysql如何导出特定条件的查询数据_使用mysqldump加where参数
jvm·数据库·python
星恒随风1 小时前
四天学完前端基础三件套(JavaScript篇)
开发语言·前端·javascript·笔记
杜子不疼.2 小时前
【 C++ AI 大模型接入 SDK】 - 日志模块
开发语言·javascript·c++