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

我是寺冈,一名基础设施工程师。
在某个项目中,我需要在IDCF上搭建一个JMeter执行环境,我
想分享一下我在搭建过程中使用CloudStack API的一些巧妙方法。

■你最初想做什么?

在启动 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 获取了这些地址。

CloudStack API是用Python编写的,因此可以使用pip轻松安装。
安装说明可在IDCF官方网站上找到,请参考该网站。

入门指南 | IDCF 文档

官方页面上也对 API 参考进行了总结,我们一起来看看。

API 参考 | IDCF 文档

好了,我们开始吧。
以下命令可以一次性获取所有远程服务器的 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
加载中...
0票,平均分:0.00/10
992
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

寺冈由纪

我于 2016 年加入 Beyond,目前
担任基础设施工程师和 MSP(托管服务提供商)已有六年。我负责处理突发事件的故障排除,
并使用 AWS 等公有云设计和构建基础设施。最近,我一直在
Docker 和 Kubernetes 等容器基础设施。此外,
使用 HashiCorp 的 Terraform 和 Packer 等工具来构建和自动化
我还担任技术推广者的角色,在外部学习小组和研讨会上进行演讲。

・GitHub
https://github.com/nezumisannn

• 演讲邀约
:https://github.com/nezumisannn/my-profile

• 演示材料(SpeakerDeck)
https://speakerdeck.com/nezumisannn

・认证:
AWS认证解决方案架构师 - 助理级、
Google Cloud专业云架构师