【得物技术】GOREPLAY流量录制回放实战

news/2024/10/17 12:27:29/

GoReplay 简介

随着应用程序的复杂度的增长,测试它所需要的工作量也呈指数级增长。 GoReplay 为我们提供了复用现有流量进行测试的简单想法。GoReplay是一个用golang开发的简单的流量录制插件,支持多种方式的过滤,限流放大,重写等等特性。GoReplay 可以做到对代码完全无侵入性,也不需要更改你的生产基础设施,并且与语言无关。它不是代理,而是直接监听网卡上的流量。

GoReplay 工作方式:listener server 捕获流量,并将其发送至 replay server 或者保存至文件,或者保存到kafka。然后replay server 会将流量转移至配置的地址

使用过程

需求:接到算法侧的需求,需要录制真实的生产环境流量,并且随时回放到任意环境。

由于算法侧部分场景为非Java语言编写,现存的流量录制平台暂时无法支持,需要采用新的录制组件来支撑压测需求,遂选择goreplay 。

GoReplay支持将录制的数据存储到本地文件中,然后回放时从文件中读取。考虑到每次录制回放时需要进行存储及下发文件的复杂度,我们期望使用更便捷的方式来管理数据。

GoReplay也是原生支持录制数据存储到kafka中的,但是在使用的时候,发现它有较大的限制;使用kafka存储数据时,必须是流量录制的同时进行流量回放,其架构图如下:

流程1-4 无法拆分,只能同时进行

这会显得流量录制回放功能很鸡肋,我们需要录制好的数据任意时刻重放,并且也要支持将一份录制好的数据多次重放。既然它已经将流量数据存储到了kafka,我们就可以考虑对GoReplay进行改造,以让他支持我们的需求。

改造后的流量录制回放架构图:

图中,1-2 与 3-5 阶段是相互独立的

也就是说,流量录制过程与回放过程可以拆开。只需要在录制开始与结束的时候记录kafka的offset,就可以知道这个录制任务包含了哪些数据,我们可以轻松的将每一段录制数据,整理成录制任务,然后在需要的时候进行流量回放。

改造与整合

kafka offset 支持改造

简要过程:

源码中的 InputKafkaConfig 的定义

type InputKafkaConfig struct {producer sarama.AsyncProducerconsumer sarama.ConsumerHost     string `json:"input-kafka-host"`Topic    string `json:"input-kafka-topic"`UseJSON  bool   `json:"input-kafka-json-format"`
}

修改后的 InputKafkaConfig 的定义

type InputKafkaConfig struct {producer  sarama.AsyncProducerconsumer  sarama.ConsumerHost      string `json:"input-kafka-host"`Topic     string `json:"input-kafka-topic"`UseJSON   bool   `json:"input-kafka-json-format"`StartOffset    int64  `json:"input-kafka-offset"`EndOffset int64  `json:"input-kafka-end-offset"`
}

源码中,从kafka读取数据的片段:
可以看到,它选取的offset 是 Newest

for index, partition := range partitions {consumer, err := con.ConsumePartition(config.Topic, partition, sarama.OffsetNewest)go func(consumer sarama.PartitionConsumer) {defer consumer.Close()for message := range consumer.Messages() {i.messages <- message}}(consumer)}

修改过后的从kafka读数据的片段:

for index, partition := range partitions {consumer, err := con.ConsumePartition(config.Topic, partition, config.StartOffset)offsetEnd := config.EndOffset - 1go func(consumer sarama.PartitionConsumer) {defer consumer.Close()for message := range consumer.Messages() {// 比较消息的offset, 当超过这一批数据的最大值的时候,关闭通道if offsetFlag && message.Offset > offsetEnd {i.quit <- struct{}{}break}i.messages <- message}}(consumer)}

此时,只要在启动回放任务时,指定kafka offset的范围。就可以达到我们想要的效果了。

整合到压测平台

通过页面简单的填写选择操作,然后生成启动命令,来替代冗长的命令编写

StringBuilder builder = new StringBuilder("nohup /opt/apps/gor/gor");
// 拼接参数 组合命令
builder.append(" --input-kafka-host ").append("'").append(kafkaServer).append("'");
builder.append(" --input-kafka-topic ").append("'").append(kafkaTopic).append("'");
builder.append(" --input-kafka-start-offset ").append(record.getStartOffset());
builder.append(" --input-kafka-end-offset ").append(record.getEndOffset());
builder.append(" --output-http ").append(replayDTO.getTargetAddress());
builder.append(" --exit-after ").append(replayDTO.getMonitorTimes()).append("s");
if (StringUtils.isNotBlank(replayDTO.getExtParam())) {builder.append(" ").append(replayDTO.getExtParam());
}
builder.append(" > /opt/apps/gor/replay.log 2>&1 &");
String completeParam = builder.toString();

压测平台通过 Java agent 暴露的接口来控制 GoReplay进程的启停

String sourceAddress = replayDTO.getSourceAddress();
String[] split = sourceAddress.split(COMMA);
for (String ip : split) {String uri = String.format(HttpTrafficRecordServiceImpl.BASE_URL + "/gor/start", ip, 	 											HttpTrafficRecordServiceImpl.AGENT_PORT);// 重新创建对象GoreplayRequest request = new GoreplayRequest();request.setConfig(replayDTO.getCompleteParam());request.setType(0);try {restTemplate.postForObject(uri, request, String.class);} catch (RestClientException e) {LogUtil.error("start gor fail,please check it!", e);MSException.throwException("start gor fail,please check it!", e);}
}

文/一码当先

关注得物技术,做最潮技术人!


http://www.ppmy.cn/news/533388.html

相关文章

UI自动化录制与回放系统

目录 一、本系统对传统UI自动化工作的改进二、系统架构粗略情况三、使用路径及进展情况四、使用效果&#xff08;已新增批量执行及报告查看、已支持用例嵌套&#xff09;1.录制过程2.单用例回放及远程监控3.多用例批量回放及报告生成4.Webdriver云多节点接入&#xff0c;执行记…

LoadRunner12.XX录制-回放脚本步骤

我安装的版本是LoadRunner12.55&#xff0c;软件支持对谷歌浏览器的录制&#xff0c;如果是其他版本&#xff0c;需要进行代理设置才可以录制谷歌浏览器。 1.首先进行软件的安装&#xff0c;安装步骤请自行百度 2.打开Virtual User Generator&#xff0c;新建一个脚本 根据项目…

如何模拟自动鼠标点击或记录鼠标和回放

在日常办公和娱乐中&#xff0c;我们可能经常想让鼠标自动化的多一点&#xff0c;能自动点击或者循环做一些简单的重复性的程序事务。有没有办法来解决这个小问题呢&#xff1f; 你可以使用极速自动鼠标点击器。它是一款鼠标自动点击软件工具&#xff0c;可以极快速的模拟自动…

monkeyrunner之monkeyrecorder录制回放脚本

二、monkeyrunner之monkeyrecorder录制回放脚本 MonkeyRunner强大的功能之一便是允许用户自由录制需要的脚本&#xff0c;录制和回放需要两个脚本文件monkey_recorder.py和monkey_playback.py 1. monkey_recorder.py 1.1 内容如下 #!/usr/bin/env monkeyrunner #!/usr/bin/py…

音视频开发知识一:基础名词

1. 音视频编解码&#xff08;熟知&#xff09; 音视频编解码的作用是为了将音视频数据压缩&#xff0c;在带宽有限的情况下以便在网络上高效的传输或存储。编解码是将音视频数据从一种格式转换为另一种格式的过程。 xinyuaa 未经编解码的数据也就是信源往往有着大量的冗余信息&…

Jmeter脚本的录制与回放

一、打开Jmeter,在测试计划处点击右键Add>Threads>Threads Group,新建一线程组如login 二、在名为login的线程组处右击Add>Logic Controller>Recording Controller,新建一个录制控制器 三、在login线程组新建察看结果树、聚合报告 四、右击测试计划新建Http(s) Tes…

流量录制与回放在vivo的落地实践

一、为什么要使用流量录制与回放&#xff1f; 1.1 vivo业务状况 近几年&#xff0c;vivo互联网领域处于高速发展状态&#xff0c;同时由于vivo手机出货量一直在国内名列前茅&#xff0c;经过多年积累&#xff0c;用户规模非常庞大。因此&#xff0c;vivo手机出厂内置很多应用…

python3实现鼠标键盘动作录制,并还原执行过程

这里写自定义目录标题 1.录制鼠标过程源代码&#xff0c;按esc键结束录制&#xff0c;最后保存在commands.json文件中2.执行上面代码得到的commands.json文件&#xff0c;运行程序&#xff0c;输入文件绝对路径或者文件名&#xff0c;输入文件名则搜索当前程序下的目录文件 1.录…