[IDCF] 一篇关于在构建用于负载测试的 JMeter 执行环境时,对 CloudStack API 进行调整的文章

目录
我叫寺冈,是一名基础设施工程师。
我之前参与了一个项目,需要在IDCF上构建JMeter运行时环境。
构建过程中我使用了CloudStack API,我想分享一些我使用的小技巧。
■你最初想做什么?
当我在作为 JMeter 控制器的服务器上启动 JMeter 时,
能够自动识别作为相应节点的服务器的 IP 地址。
是的,就是这样。JMeter远程测试的机制
在控制器服务器的配置文件中
注册运行远程 JMeter 的服务器(节点)
您可以生成比已注册服务器数量更大的负载。
然而,要注册的服务器数量会根据产生的负载而变化,
每次都更改配置文件很麻烦,因此
我们决定只识别正在运行的节点,并
在控制器端启动 jmeter 时
。
■ 你具体做了什么?
要在 JMeter 中注册远程服务器,
请将设置添加到“jmeter.properties”文件中的“remote_hosts”项。
例如,它看起来像这样:
remote_hosts=10.31.X.XX,10.31.X.XX,10.31.X.XX
如上所示,我们将添加以逗号分隔的 IP 地址,因此
首先需要一次性获取所有远程服务器的 IP 地址。
为此,我们使用了 CloudStack API。
CloudStackAPI是用Python编写的,因此可以使用pip轻松安装。
安装方法在IDCF官方页面上有详细说明,请参考该页面。
官方页面上也对 API 参考进行了总结,我们一起来看看。
我们开始吧。
以下命令可以一次性获取所有远程服务器的 IP 地址:
cloudstack-api listVirtualMachines --name "jmeter-node" --state "Running" | jq -r '.listvirtualmachinesresponse.virtualmachine[].nic[].ipaddress' | tr "\n" "," | sed -e "s/,$//g"
以下是对该命令功能的详细说明:
①使用 CloudStack API 获取虚拟服务器信息列表
② 使用 jq 命令格式化 JSON 数据
③ 使用 tr 命令将格式化的 JSON 数据格式化为“,”分隔的格式。
①使用 CloudStack API 获取虚拟服务器信息列表
cloudstack-api listVirtualMachines --name "jmeter-node" --state "Running"
这部分。
这次,我们使用了 CloudStack API 众多方法中的“listVirtualMachines”方法。
顾名思义,此方法用于检索虚拟服务器信息列表。
该方法的执行结果以 JSON 格式返回,如下所示。
$ cloudstack-api listVirtualMachines { "listvirtualmachinesresponse": { "count": 1, "virtualmachine": [ { "nic": [ { "ipaddress": "XXX.XXX.XXX.XXX" } ] } ] } }
*响应中除了“ip地址”之外还会返回许多其他项目,但
我们只摘录了本文所需的必要部分。
我们只需要从这个 JSON 数据中提取“ipaddress”项的值即可!
实际执行命令时,使用“--name”参数将范围缩小到节点服务器,
然后使用“--state”参数将范围缩小到状态为“Running”的虚拟服务器。
这意味着我们“排除已停止的节点,只提取正在运行的节点的信息”。
② 使用 jq 命令格式化 JSON 数据
jq -r '.listvirtualmachinesresponse.virtualmachine[].nic[].ipaddress'
这部分。
CloudStack API 的响应以 JSON 数据的形式返回,因此
您需要对 JSON 数据进行格式化,以便仅提取所需数据。
在本例中,我们需要提取“ipaddress”项。
您需要按照层级结构告诉 jq 命令要从 JSON 中提取哪些数据。
③ 使用 tr 命令将格式化的 JSON 数据格式化为“,”分隔的格式。
tr "\n" "," | sed -e "s/,$//g"
这部分。
当您在②中格式化json数据时,它将采用以下格式。
10.31.X.XX 10.31.X.XX 10.31.X.XX
它已被仔细地分成多行。
由于它本身无法嵌入到 JMeter 配置文件中,因此
您需要将换行符转换为“,”。
此外,转换后会在末尾添加一个额外的“,”,因此
请使用 sed 命令删除该部分。
进而..
10.31.X.XX,10.31.X.XX,10.31.X.XX
太好了,现在你可以直接把它嵌入到配置文件里了。你只需要
在启动 JMeter 之前编辑一下配置文件即可。
接下来我们创建一个启动脚本。
$ vi start-controller.sh #!/bin/sh NODE=$(cloudstack-api listVirtualMachines --name "jmeter-node" --state "Running" | jq -r '.listvirtualmachinesresponse.virtualmachine[].nic[].ipaddress' | tr "\n" "," | sed -e "s/,$//g") sed -i -e "s/^remote_hosts=.*/remote_hosts=${NODE}/" /usr/local/jmeter/bin/jmeter.properties /usr/local/jmeter/bin/jmeter & $ ./start-controller.sh
是的,现在启动 JMeter 时,节点会自动识别。
就这样,谢谢。
0