Locust + Boomer In Docker

原文由花菜发表于TesterHome社区,点击原文链接可与作者直接交流。

背景

在压测时,使用locust + boomer,需要配置python和go环境,稍微有点麻烦。每次接口压测,都需要手动编写go脚本。因此想做对boomer做一个封装,可以快速的完成这些需求,需要支持单接口 + 动态读取csv,curl命令

启动Locust-master

# run locust master
docker run --name locust-master -it -d -p 8089:8089 -p 5557:5557 rikasai/locust-master:latest

Boomer

调试模式启动boomer

$ docker run rikasai/boomer:latest --run-tasks worker -master-host=10.0.20.16 --url='http://httpbin.org/post' --method=POST --content-type="application/json"  --raw-data='{"ids": [123,234]}'
--verbose 1
2022/05/17 13:30:44 /usr/src/app/boomer_fasthttp.go:295: Fasthttp is running with these args:
method: POST
url: http://httpbin.org/post
timeout: 10s
post-file:
raw-data: {"ids": [123,234]}
replace-str-index:
json-value-type:
content-type: application/json
disable-keepalive: false
remove-json-string-backslash: true
verbose: true
2022/05/17 13:30:44 /go/pkg/mod/github.com/myzhan/boomer@v1.6.0/boomer.go:214: Running worker
2022/05/17 13:30:44 /usr/src/app/boomer_fasthttp.go:211: resp: {
  "args": {},
  "data": "{\"ids\": [123,234]}",
  "files": {},
  "form": {},
  "headers": {
    "Content-Length": "18",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "fasthttp",
    "X-Amzn-Trace-Id": "Root=1-6283a384-7d87389417a84df642d87a91"
  },
  "json": {
    "ids": [
      123,
      234
    ]
  },
  "url": "http://httpbin.org/post"
}

参数说明

docker run rikasai/boomer:latest, 启动一个容器

–run-tasks worker,调试模式,固定写法

-master-host=10.0.20.16,指定locust-master的ip

–url=‘http://httpbin.org/post’,请求url

–method=POST,请求方法

–content-type=“application/json”

–raw-data=‘{“ids”: [123,234]}’

–verbose 1,打印响应结果

locust worker模式启动

get请求

# 10.0.20.16 is master ip addr
# 5557 is default port
docker run rikasai/boomer:latest -master-host=10.0.20.16 -master-port=5557 --url='http://httpbin.org/get?a=123' --method=GET

post请求

docker run rikasai/boomer:latest -master-host=10.0.20.16 --url='http://httpbin.org/post' --method=POST --content-type="application/json"  --raw-data='{"ids": [123,234]}'

指定请求头

docker run rikasai/boomer:latest --run-tasks worker -master-host=10.0.20.16 --url='http://httpbin.org/post' --method=POST --content-type="application/json"  --raw-data='{"ids": [123,234]}'  --json-headers='{"User-Agent": "python-requests/2.22.0"}'

直接使用curl命令

docker run rikasai/boomer:latest --run-tasks worker -master-host=10.0.20.16 --curl="curl --location --request POST 'http://httpbin.org/post' \ --header 'Content-Type: application/json' \ --data-raw '{ "string": "hello,boomer" }'"

动态读取csv

docker run -d --name boomer -v /root/data/data.csv:/app/data.csv rikasai/boomer:latest  -master-host=10.0.20.16 --url=http://httpbin.org/post  --method=POST --content-type="application/json"  --raw-data='{"a": "$a", "b": "$b"}'  --replace-str-index='{"$a":0,"$b":1,"$c":2}' --json-value-type "int" --verbose 1

参数说明

-d,后台模式启动容器

–name boomer,指定容器的名字叫boomer,可以随意起,不重名就行

-v /root/data/data.csv:/app/data.csv,把宿主机的csv文件挂载到容器里,/root/data/data.csv是宿主机文件路径,/app/data.csv是容器里固定路径

–raw-data=‘{“a”: “ a " , " b " : " a", "b": " a","b":"b”}’, a 是 取 变 量 a , a是取变量a, aab是取变量b

–replace-str-index='{“ a " : 0 , " a":0," a":0,"b”:1,"KaTeX parse error: Expected 'EOF', got '}' at position 5: c":2}̲',把csv中每一行着的第0值…a,第1个值赋给 b , 第 2 个 赋 给 b,第2个赋给 b,2c

–json-value-type “int” 指–raw-data中变量的值类型是int类型

/root/data/data.csv内容是:

1,2,3
3,4,5
4,5,6
455,56,633

请求log

2022/05/17 14:37:56 /usr/src/app/boomer_fasthttp.go:211: resp: {
  "args": {},
  "data": "{\"a\":1,\"b\":2}",
  "files": {},
  "form": {},
  "headers": {
    "Content-Length": "13",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "fasthttp",
    "X-Amzn-Trace-Id": "Root=1-6283b344-2ec1715202778cff233df950"
  },
  "json": {
    "a": 1,
    "b": 2
  },
  "url": "http://httpbin.org/post"
}

2022/05/17 14:37:56 /usr/src/app/boomer_fasthttp.go:211: resp: {
  "args": {},
  "data": "{\"a\":4,\"b\":5}",
  "files": {},
  "form": {},
  "headers": {
    "Content-Length": "13",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "fasthttp",
    "X-Amzn-Trace-Id": "Root=1-6283b344-155b24075acdcb214e963d51"
  },
  "json": {
    "a": 4,
    "b": 5
  },
  "url": "http://httpbin.org/post"
}

–json-value-type说明

--raw-data='{"a": "$a", "b": "$b"}'

csv内容是

1,2,3
3,4,5
4,5,6
455,56,633
  • –json-value-type=intArray,请求结果是

    {
        "a": [
            3
        ],
        "b": [
            4
        ]
    }
    
  • –json-value-type=string,请求结果是

    {
        "a": "3",
        "b": "4"
    }
    
  • –json-value-type=interface,请求结果是

    csv内容是

    3,4,5
    aa,bb,cc
    

    先尝试转换成int类型,转换成成功就是用int值,不成功就是用原始值

    3,4,5转换成

    {
        "a": 3,
        "b": 4
    }
    

    aa,bb,cc转换成int不成功,使用原始值

    {
        "a": "aa",
        "b": "bb"
    }
    
  • 不支持深层json,这里的$b是不支持的。

    {
        "a":{
        		"b": "$b"
        }
    }
    

目前动态替换并不完美,只能是一层json和body。后续再优化一波~

原文由花菜发表于TesterHome社区,点击原文链接可与作者直接交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Python和Locust来进行对ES7的压测。首先,确保你已经安装了Python和Locust。 接下来,你需要安装elasticsearch-py库,它是Python与Elasticsearch进行交互的库。可以使用以下命令安装: ``` pip install elasticsearch ``` 然后,创建一个Python脚本,导入必要的模块和库: ```python from locust import HttpUser, task, between from elasticsearch import Elasticsearch class ESUser(HttpUser): wait_time = between(1, 5) def on_start(self): # 创建一个Elasticsearch客户端连接 self.client = Elasticsearch(['localhost:9200']) @task def search(self): # 定义一个搜索任务 query = { "query": { "match_all": {} } } # 发送搜索请求 response = self.client.search(index='your_index', body=query) # 打印搜索结果 print(response) ``` 在上面的代码中,我们创建了一个名为ESUser的Locust用户类。在`on_start`方法中,我们创建了一个Elasticsearch客户端连接。 然后,在`@task`装饰的`search`方法中,我们定义了一个搜索任务。你可以根据自己的需求修改查询条件。在该方法中,我们发送了一个搜索请求,并打印了搜索结果。 最后,你可以在命令行中使用Locust命令来启动压测: ``` locust -f your_script.py --host=http://localhost:9200 ``` 替换`your_script.py`为你的脚本文件名,`http://localhost:9200`为你的ES7的地址。 然后,你可以在浏览器中访问Locust的Web界面(默认为http://localhost:8089)来配置并启动压测。 注意:在进行压测之前,请确保你已经在ES7中创建了索引,并且数据已经准备好。另外,压测会对目标系统造成一定的负载,请谨慎使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值