如何集成PTS的JMeter OpenAPI搭建压测平台

本文涉及的产品
对象存储 OSS,20GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
对象存储 OSS,恶意文件检测 1000次 1年
简介: 1 前言jmeter是性能压测领域应用最广泛开源软件,提供了非常好的扩展能力,通过社区支持非常多类型的压测,但是jmeter的分布式压测、监控等方面的能力还有待提高。而PTS(Performance Testing Service,性能测试)能够提供全国多地域、大规模分布式施压能力、全面的压测监控能力、压测分析能力,弥补了jmeter在性能压测中的劣势。所以PTS将jmeter和PTS的能力结合,

1 前言

jmeter是性能压测领域应用最广泛开源软件,提供了非常好的扩展能力,通过社区支持非常多类型的压测,但是jmeter的分布式压测、监控等方面的能力还有待提高。而PTS(Performance Testing Service,性能测试)能够提供全国多地域、大规模分布式施压能力、全面的压测监控能力、压测分析能力,弥补了jmeter在性能压测中的劣势。所以PTS将jmeter和PTS的能力结合,各取所长,并开放了PTS的JMeter OpenAPI,方便用户直接通过引入pom的方式编码调用API。本文主要介绍如何使用 PTS的JMeter OpenAPI搭建一个压测平台,实现直接使用PTS分布式能力运行jmeter脚本进行压测。其中包含OpenAPI种类和实现的功能,以及如何使用OpenAPI。并附了一份详细的使用教程,基本可以实现填空式编程。

1.1 场景

pts的jmeter压测以场景为核心,压测对象为一个场景,场景中包括jmeter脚本、jmeter依赖、及一些压测配置,每次压测会生成一个压测任务同时生成一个报告。对场景的操作分为两方面,一是对场景配置的增删改查,二是对场景的压测和调试。

1.2 jmx脚本

即jmeter的原生脚本,可直接在jmeter的GUI页面中配置导出。

1.3 环境

环境为jmeter压测的依赖,一个环境包括一系列依赖jar包和一系列properties配置。场景可以绑定某一个环境,以便在压测过程中引用环境中jar包,而不用每次配置场景都上传依赖jar包。对环境的操作主要是增删改查。

1.4 其他压测配置

其他配置主要是PTS压测的配置,例如公网/VPC压测、并发量、引擎数量、压测时长等。

2 依赖

最新版本可以在maven公网地址查询。

				<!--创建pts场景需要的实体类,如果只使用jmeter压测则不需要引入-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>pts-api-entity</artifactId>
            <version>1.0.1</version>
        </dependency>

        <!--PTS Java SDK依赖。-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>pts20201020</artifactId>
            <version>1.8.2</version>
            <exclusions>
              <exclusion>
                <groupId>com.aliyun</groupId>
                <artifactId>tea</artifactId>
              </exclusion>
            </exclusions>
        </dependency>
        <dependency>
          <groupId>com.aliyun</groupId>
          <artifactId>tea</artifactId>
            <version>1.1.14</version>
        </dependency>

        <!--阿里云核心库。-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.2</version>
        </dependency>

3 功能

PTS压测以场景为中心,借助PTS能力压测的jmeter也不例外。围绕jmeter场景,OpenAPI提供了如下几类功能:编辑场景、调试场景、压测场景、查看运行时数据、查看报告。

  • 编辑场景:实现场景的增、删、改、查各种操作。
  • 调试场景:实现场景的压测前调试。调试过程中可以通过压测数据接口获取调试结果数据,判断待压测API是否通,若不通过可提前停止调试。
  • 压测场景:实现场景的启动、停止。调试成功后,可通过启动压测接口,实现一键启动压测,并在压测过程中,随时停止压测。
  • 查看运行时数据:获取压测和调试过程中的实时数据。场景启动压测后,pts后端会5s上传一次数据,这个过程中可以实时看到压测执行情况,包括采样器实时采样的情况、压测任务所处阶段、执行压测引擎、实时消耗的vum等。
  • 查看报告:查询压测最终报告数据。场景每次压测都会生成一个压测任务,同时生成一个压测任务对应的压测报告,压测报告中除了jmeter原生的日志外,还有pts针对某个采样器的成功率、TPS、RT指标的聚合数据。对报告的操作主要包括查看报告列表、查看jmeter原生日志以及pts对jmeter采样器压测指标的聚合数据。

4 使用

// 使用OpenAPI之前都需要构建一个client
Config config = new Config();
config.setAccessKeyId(accessKeyId);
config.setAccessKeySecret(accessKeySecret);
Client client = new Client(config);

4.1 编辑场景

创建/修改场景

SaveOpenJMeterSceneRequest request = new SaveOpenJMeterSceneRequest();
// 定义场景
SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterScene scene = new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterScene();
// 设置引擎数量
scene.setAgentCount(2);
// 设置场景名
scene.setSceneName("test");
// 设置文件列表,包括jmeter脚本、jmeter压测依赖jar包、配置额度数据文件等
List<SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList> fileList = new ArrayList<>();
// 设置文件的属性 需要设置文件的名称和文件公网可访问的oss地址
SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList file = new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList();
file.setFileName("json.jar");
file.setFileOssAddress("https://xx.oss-cn-shanghai.aliyuncs.com/json.jar");
fileList.add(file);
SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList testFile = new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList();
testFile.setFileName("baidu.jmx");
testFile.setFileOssAddress("https://xx.oss-cn-shanghai.aliyuncs.com/baidu.jmx");
fileList.add(testFile);
scene.setFileList(fileList);
// 设置场景并发
scene.setConcurrency(1000);
// 设置压测持续时间
scene.setDuration(600);
// 设置测试文件的名称,这个文件需包括在文件列表中
scene.setTestFile("baidu.jmx");
// 若依赖了jmeter环境,课设置jmeter环境
scene.setEnviromentId("UKS1LH");

// 新建场景不需要设置id,修改场景需要设置id
scene.setSceneId("6FZQUTH");
request.setOpenJMeterScene(scene);
SaveOpenJMeterSceneResponse response = client.saveOpenJMeterScene(request);

查询场景

// 获取场景详细信息
GetOpenJMeterSceneRequest request = new GetOpenJMeterSceneRequest();
request.setSceneId("6FZQUTH");
GetOpenJMeterSceneResponse response = client.getOpenJMeterScene(request);

删除场景

RemoveOpenJMeterSceneRequest request = new RemoveOpenJMeterSceneRequest();
request.setSceneId("6FZQUTH");
RemoveOpenJMeterSceneResponse response = client.removeOpenJMeterScene(request);

4.2 调试场景

开始调试

StartDebuggingJMeterSceneRequest request = new StartDebuggingJMeterSceneRequest();
request.setSceneId("6FZQUTH");
StartDebuggingJMeterSceneResponse response = client.startDebuggingJMeterScene(request);

停止调试

StopDebuggingJMeterSceneRequest request = new StopDebuggingJMeterSceneRequest();
request.setSceneId("6FZQUTH");
StopDebuggingJMeterSceneResponse response = client.stopDebuggingJMeterScene(request);

4.3 压测场景

开始压测

StartTestingJMeterSceneRequest request = new StartTestingJMeterSceneRequest();
request.setSceneId("6FZQUTH");
StartTestingJMeterSceneResponse response = client.startTestingJMeterScene(request);

停止压测

StopTestingJMeterSceneRequest request = new StopTestingJMeterSceneRequest();
request.setSceneId("6FZQUTH");
StopTestingJMeterSceneResponse response = client.stopTestingJMeterScene(request);

4.4 查看运行时数据

GetJMeterSceneRunningDataRequest request = new GetJMeterSceneRunningDataRequest();
request.setSceneId("6FZQUTH");
GetJMeterSceneRunningDataResponse response = client.getJMeterSceneRunningData(request);

4.5 查看报告

报告列表

ListJMeterReportsRequest request = new ListJMeterReportsRequest();
// 分页设置
request.setPageNumber(1);
request.setPageSize(10);
// 查询条件设置
request.setSceneId("DYYPZIH");
request.setReportId("FLCAE382");
request.setKeyword("test");
request.setBeginTime(1637485804233L);
request.setEndTime(1637485804300L);
ListJMeterReportsResponse response = client.listJMeterReports(request);

采样器聚合数据

GetJMeterSampleMetricsRequest request = new GetJMeterSampleMetricsRequest();
// 设置报告id
request.setReportId("FLCAE382");
// 设置采样器的索引,为空或者<0时,赋值为-1返回全场景
request.setSamplerId(0);
request.setBeginTime(1637485804233L);
request.setEndTime(1637485804300L);
GetJMeterSampleMetricsResponse response = client.getJMeterSampleMetrics(request);

采样器采样日志

GetJMeterSamplingLogsRequest request = new GetJMeterSamplingLogsRequest();
// 分页设置
request.setPageNumber(1);
request.setPageSize(10);
// 条件设置
request.setReportId("FLCAE382");
request.setBeginTime(1637224899406L);
request.setEndTime(1637224976000L);
// 关键字
request.setKeyword("test");
// 采样器索引
request.setSamplerId(0);
// 结果是否成功
request.setSuccess(true);
// 线程
request.setThread("main");
// 响应码
request.setResponseCode("200");
// 最小响应时间
request.setMinRT(0);
// 最大响应时间
request.setMaxRT(1000);
// 压测引擎编号
request.setAgentId(14201002L);
GetJMeterSamplingLogsResponse response = client.getJMeterSamplingLogs(request);

压测机器运行日志

GetJMeterLogsRequest request = new GetJMeterLogsRequest();
// 分页设置
request.setPageNumber(1);
request.setPageSize(10);
// 查询的压测引擎索引
request.setAgentIndex(0);
request.setReportId("FLCAE382");
GetJMeterLogsResponse response = client.getJMeterLogs(request);

5 一键启动

压测的核心步骤:创建场景->压测场景->查看报告,以下代码实现了使用SDK一键启动压测场景,并且在完成压测后查看压测报告。具体步骤如下:

  1. 引入pom依赖
  2. 复制下列代码
  3. 填写自己的ak/sk
  4. 点击启动
import com.aliyun.pts20201020.Client;
import com.aliyun.pts20201020.models.*;
import com.aliyun.teaopenapi.models.Config;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


public class StartingDemo {

    public static void main(String[] args) throws Exception {
        Client client = getClient();
        // 创建场景
        String sceneId = createScene(client);
        // 启动场景
        String reportId = startTesting(client, sceneId);
        // 最多等待次数
        int count = 0;
        // 查询是否已生成报告
        while (!hasReport(client, reportId) && count++ < 20) {
            // 若报告还未生成,则等待(30s)一段时间再查询
            // 根据压测时间酌情等待
            Thread.sleep(30 * 1000);
        }
        // 查看报告
        getJMeterReport(client, reportId);
    }

    private static boolean hasReport(Client client, String reportId) throws Exception {
        ListJMeterReportsRequest request = new ListJMeterReportsRequest();
        // 分页设置
        request.setPageNumber(1);
        request.setPageSize(1);
        // 查询条件设置
        request.setReportId(reportId);
        ListJMeterReportsResponse response = client.listJMeterReports(request);
        return response.getBody().getReports().size() > 0;
    }

    private static void getJMeterReport(Client client, String reportId) throws Exception {
        // 查看机器日志
        GetJMeterLogsResponse getJMeterLogsResponse = getJMeterLogs(client, reportId);
        List<Map<String, ?>> logs = getJMeterLogsResponse.getBody().getLogs();
        // 查看采样器聚合数据
        GetJMeterSampleMetricsResponse getJMeterSampleMetrics = getJMeterSampleMetrics(client, reportId);
        List<String> sampleMetricList = getJMeterSampleMetrics.getBody().getSampleMetricList();
        // 查看采样日志
        GetJMeterSamplingLogsResponse getJMeterSamplingLogs = getJMeterSamplingLogs(client, reportId);
        List<String> sampleResults = getJMeterSamplingLogs.getBody().getSampleResults();
    }

    private static GetJMeterSamplingLogsResponse getJMeterSamplingLogs(Client client, String reportId) throws Exception {
        GetJMeterSamplingLogsRequest request = new GetJMeterSamplingLogsRequest();
        // 分页设置
        request.setPageNumber(1);
        request.setPageSize(10);
        // 条件设置
        request.setReportId(reportId);
        GetJMeterSamplingLogsResponse response = client.getJMeterSamplingLogs(request);
        return response;
    }

    private static GetJMeterSampleMetricsResponse getJMeterSampleMetrics(Client client, String reportId) throws Exception {
        GetJMeterSampleMetricsRequest request = new GetJMeterSampleMetricsRequest();
        // 设置报告id
        request.setReportId(reportId);
        GetJMeterSampleMetricsResponse response = client.getJMeterSampleMetrics(request);
        return response;
    }

    private static GetJMeterLogsResponse getJMeterLogs(Client client, String reportId) throws Exception {
        GetJMeterLogsRequest request = new GetJMeterLogsRequest();
        // 分页设置
        request.setPageNumber(1);
        request.setPageSize(10);
        // 查询的压测引擎索引
        request.setReportId(reportId);
        GetJMeterLogsResponse response = client.getJMeterLogs(request);
        return response;
    }

    private static String startTesting(Client client, String sceneId) throws Exception {
        StartTestingJMeterSceneResponse startTestingSceneResponse = startTestingScene(client, sceneId);
        String reportId = startTestingSceneResponse.getBody().getReportId();
        return reportId;
    }

    private static StartTestingJMeterSceneResponse startTestingScene(Client client, String sceneId) throws Exception {
        StartTestingJMeterSceneRequest request = new StartTestingJMeterSceneRequest();
        request.setSceneId(sceneId);
        StartTestingJMeterSceneResponse response = client.startTestingJMeterScene(request);
        return response;
    }

    private static String createScene(Client client) throws Exception {
        SaveOpenJMeterSceneRequest request = new SaveOpenJMeterSceneRequest();
        // 定义场景
        SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterScene scene = new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterScene();
        // 设置场景名
        scene.setSceneName("test");
        // 设置文件列表,包括jmeter脚本、jmeter压测依赖jar包、配置额度数据文件等
        List<SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList> fileList = new ArrayList<SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList>();
        // 设置文件的属性 需要设置文件的名称和文件公网可访问的oss地址
        SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList testFile = new SaveOpenJMeterSceneRequest.SaveOpenJMeterSceneRequestOpenJMeterSceneFileList();
        testFile.setFileName("baidu.jmx");
        testFile.setFileOssAddress("https://pts-openapi-test.oss-cn-shanghai.aliyuncs.com/baidu.jmx");
        fileList.add(testFile);
        scene.setFileList(fileList);
        // 设置场景并发
        scene.setConcurrency(1000);
        // 设置引擎数量 说明:一台引擎最多能发500并发,最少1并发所以此处能设置的引擎数为[2,1000],另外引擎数量越多消耗vum越快
        scene.setAgentCount(2);
        // 设置压测持续时间 60s
        scene.setDuration(60);
        // 设置测试文件的名称,这个文件需包括在文件列表中
        scene.setTestFile("baidu.jmx");
        request.setOpenJMeterScene(scene);
        SaveOpenJMeterSceneResponse response = client.saveOpenJMeterScene(request);
        return response.getBody().getSceneId();
    }

    private static Client getClient() throws Exception {
        // 填写自己的AK/SK
        String accessKeyId = "ak";
        String accessKeySecret = "sk";
        Config config = new Config();
        config.setAccessKeyId(accessKeyId);
        config.setAccessKeySecret(accessKeySecret);
        Client client = new Client(config);
        return client;
    }
}

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
2月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【10月更文挑战第1天】Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
168 3
|
3月前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
124 2
|
1月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
77 3
|
2月前
|
IDE API 开发工具
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
Alibaba Cloud API Toolkit for VSCode 是集成了 OpenAPI 开发者门户多项功能的 VSCode 插件,开发者可以通过这个插件方便地查找API文档、进行API调试、插入SDK代码,并配置基础环境设置。我们的目标是缩短开发者在门户和IDE之间的频繁切换,实现API信息和开发流程的无缝结合,让开发者的工作变得更加高效和紧密。
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
58 1
|
3月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
120 10
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
2月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【10月更文挑战第1天】告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
83 4
|
3月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【9月更文挑战第10天】随着软件应用的不断扩展,性能测试成为确保系统稳定运行的关键环节。本文通过对比Apache JMeter和Locust,探讨了如何在Python环境中利用这两款工具挖掘更多性能测试潜力。JMeter是一款成熟且功能强大的开源工具,支持多种协议,适用于各种应用的测试;而Locust则基于Python,通过简单脚本模拟HTTP请求,更适合Web应用测试。
106 3
|
3月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【9月更文挑战第5天】性能测试是确保应用在高负载下稳定运行的关键。本文介绍Apache JMeter和Locust两款常用性能测试工具,帮助识别并解决性能瓶颈。JMeter适用于测试静态和动态资源,而Locust则通过Python脚本模拟HTTP请求。文章详细讲解了安装、配置及使用方法,并提供了实战案例,帮助你掌握性能测试技巧,提升应用性能。通过分析测试结果、模拟并发、检查资源使用情况及代码优化,确保应用在高并发环境下表现优异。
88 5
|
3月前
|
消息中间件 监控 测试技术
惊呆了!Python性能测试高手都用这些神器:JMeter+Locust,效率翻倍📈
【9月更文挑战第8天】在软件开发中,性能测试对确保应用稳定性和高效运行至关重要。对于Python开发者而言,选择合适的性能测试工具能显著提升测试效率并精准定位性能瓶颈。本文深入探讨了JMeter和Locust这两款工具的独特优势。JMeter作为跨平台的性能测试工具,支持多种协议,具备高度可定制性和扩展性;而Locust则专为Python应用设计,利用协程实现高并发,提供实时监控和分布式测试功能。两者结合使用,可在实际项目中实现1+1&gt;2的效果,帮助开发者构建全面高效的测试方案,保障应用稳定运行。
218 1