Liberent-Dev’s blog

株式会社リベル・エンタテインメントのテックブログです。

試してみたlocustバージョンアップ対応

こんにちは!
システム開発部のK.Mです。

以前こちらで紹介した負荷試験ツールのlocustですが、当時使っていたバージョンがv1.6.0でしたが、既にv2.8.2(記事執筆時、現在の最新はv2.8.6)までバージョンアップされている状況でしたので、最新のものにバージョンアップを行い以前に実施した各種手順やテストシナリオに影響が出ていないかを確認していきます。

メジャーバージョンアップ時に破壊的な仕様変更が入っていたりするので要注意ですが、v2.0.0のリリース内容を見る限りそこまで影響があるような変更は無さそうです。

1.6.0から2.8.2へのバージョンアップ

  • 現バージョン確認
$ locust -V
locust 1.6.0
  • pipの更新 locust2.8.2のインストール前にpipを更新しておきます。
    locustの更新時にpipのバージョンが古いため、警告文が常に出てしまうのを回避するためになります。
$ pip3 -V
pip 21.3.1 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
$ pip3 install --upgrade pip
〜ログ省略〜
$ pip3 -V                   
pip 22.0.3 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
  • locustの更新
    下記コマンドですと、新規インストール扱いになり最新のバージョンがインストールされません。
$ pip3 install locust

下記のようにバージョンを指定してあげると指定されたバージョンがインストールされます。
または、pip3 install -U locustという形でアップデート指定すると最新のバージョンでアップデートされます。

$ pip3 install locust==2.8.2
〜ログ省略〜
$ locust -V                 
locust 2.8.2
  • ローカルでlocustの起動確認
$ locust -f locustTest.py                    
[2022-02-15 17:04:01,662] MacBook-Pro.local/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2022-02-15 17:04:01,677] MacBook-Pro.local/INFO/locust.main: Starting Locust 2.8.2

起動後にブラウザでhttp://0.0.0.0:8089にアクセスすることでlocustの画面が表示されることを確認します。
aboutを表示してバージョンが2.8.2になっていることも確認できます。

GKE環境の更新

以前の記事の手順内で紹介していた、locust-tasks/requirements.txtを修正する必要があります

certifi==2019.3.9
chardet==3.0.4
Click==7.1.2              //7.0から7.1.2に変更
Flask==2.0.2              //1.1.2から2.0.2に変更
gevent==20.9.0
greenlet==0.4.17
idna==2.8
itsdangerous==2.0.1       //1.1.0から2.0.1に変更
Jinja2==3.0.3             //2.10.1から3.0.3に変更
locust==2.8.2             //1.6.0から2.8.2に変更
MarkupSafe==2.0.1         //1.1.1から2.0.1に変更
msgpack==1.0.0
pyzmq==22.3.0             //18.0.1から22.3.0に変更
requests==2.23.0          //2.21.0から2.23.0に変更
six==1.12.0
urllib3==1.24.2
Werkzeug==2.0.2           //1.0.1から2.0.2に変更
roundrobin==0.0.2         //新規追加
typing-extensions==4.0.0  //新規追加
geventhttpclient==1.5.3   //新規追加
brotli==1.0.9             //新規追加

requirements.txtの修正のみでGKE環境に関しては以前の記事同様の手順で動くことを確認しています

テストシナリオの修正

バージョンがv2.8.2になった影響なのかは不明ですが、v1.6.0で使用していたテストシナリオが正常に動かない状態になっていたため、修正した部分があります。

以前の記事では下記のようなテストシナリオ(一部抜粋)でしたが、v2.8.2だとターゲットになっているサーバに通知されるpostの値が空になっており、想定通りに動かなくなっていました。

# ユーザー作成用
def userCreate(self, post):
    path = "/userCreate"
    res = self.client.post(path, post, headers=headerCreate(path, self.id, post))

    return res

# シナリオ用のクラス
class UserBehavior(TaskSet):
    tasks = {home: 1}

    def on_start(self):
        self.id = ""
        appVersion = "0.0.1"

        res = userCreate(self, json.dumps({'name':'testname', 'family_name': 'myouji', 'given_name':'namae'}))
        logging.info(res.json())
  • 修正前
    post = json.dumps({'data': data})
    res = self.client.post(path, post)
  • 修正後
    res = self.client.post(path, json={'data': data})

jsonの指定方法が間違っていたようで、json.dumps()ではなくjson={}で定義するとpostに値が入って正常に動くのを確認できました。

ここまで記載した修正でローカル環境・GKE環境にて最新バージョンのlocustが正常に動くことを確認できました!

最後に

リベル・エンタテインメントでは、このような最新技術などの取り組みに興味のある方を募集しています。もしご興味を持たれましたら下記サイトにアクセスしてみてください。 https://liberent.co.jp/recruit/