【Java】DockerでGatling環境を作って CustomActionを実装する(1)

技術

Gatlingって・・・?

最近、本業の方では AWS上で稼働する Webアプリケーションの負荷試験を担当しているんだけど、お客様の要望で Gatling(ガトリング)いうOSS負荷試験フレームワークを使って負荷をかけている。

Gatling 自体は Scala でできていてシナリオもScalaで書くんだけど、私はScalaをあまりやらない。

ところが、Gatling3.7 以降なら Java(あと Kotlin) でもシナリオが書けることになっていて、Java なら私も割と慣れているので非常にやりやすいです。
(日本語のドキュメントがないのが、ちょっと厄介だけど)

シナリオは割と直感的に書けるし、非常に便利で強力なツールなんだけど、今回はシナリオの中で AWS S3 へのファイルアップロードをシナリオに組み込む必要が出てきた。

Gatlingでは HTTP(S)/JMS/MQTT(※) のプロトコルをサポートしていて、S3へも REST API を使えばできるけどめんどくさそう。
できれば AWS SDK でやりたいなと。
(※ MQTTのサポートはGatling Enterpriseのみ)

調べてみると自前でCustomActionを実装できそうなことは分かったけど、見つかる記事はどれも Scala のサンプルばかり。
ってことで、CustomActionをJavaで実装してみようと思います。

今回は前段階としてGatlingが動くDockerコンテナを作ります。

Dockerfile を作る

【環境】
windows11
Docker desktop 4.5.1
VSCode 1.67.2
Remote Development(VSCode拡張) 0.21.0

Gatling は JVM で動くので OpenJDK が必要です。
DockerHubには OpenJDK セットアップ済みなコンテナイメージが公式から出ているので、これを利用すれば、あとはGatlingのセットアップだけ。

Gatling の最新バージョンは 2022年5月29日時点で Gatling 3.7.6です。

ということで Dockerfile はこうなりました。

FROM openjdk:11

WORKDIR /opt/gatling

# 2022/5/29現在の最新は Gatling 3.7.6
RUN wget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.7.6/gatling-charts-highcharts-bundle-3.7.6-bundle.zip && \
    unzip gatling-charts-highcharts-bundle-3.7.6-bundle.zip && \
    mkdir gatling-charts-highcharts-bundle-3.7.6-bundle/systemcraft


ビルドは、Dockerfileが保存されているフォルダ上で↓このコマンドを実行。

docker build -t gatling .

gatling という名前で dockerイメージができているはずです。

コンテナを起動してGatlingを動かしてみる

『任意のフォルダ(A)』に「src」フォルダを作っておきます。
この「src」フォルダにはシナリオやリソースを保存する予定。

で、コンテナの起動はこんな感じ。
もちろん「src」フォルダを作った『任意のフォルダ(A)』で実行します。

docker run -itd --name gatling -v $pwd/src:/opt/gatling/gatling-charts-highcharts-bundle-3.7.6-bundle/systemcraft gatling

「src」フォルダをコンテナ内のフォルダとマウントしてます。
シナリオ、feederなどのリソース、負荷試験結果などがコンテナを終了しても残っておくようにするためです。

起動したコンテナには VS Code の Remote Development で接続します。

コンテナ内には「/opt/gatling/gatling-charts-highcharts-bundle-3.7.6」というディレクトリができているはずです。
これが Gatlingのホームディレクトリ(GATLING_HOME)ということになります。

「$GATLING_HOME/user-files」の下にsimulationsresourcesというディレクトリがあって、それぞれシナリオを実装したjavaファイルを保存するディレクトリ(simulations)と、feederを保存するディレクトリ(resources)ということになっています。

「$GATLING_HOME/gatling.conf」を編集して、この保存先を変更します。

#########################
# Gatling Configuration #
#########################

# This file contains all the settings configurable for Gatling with their default values

gatling {
  core {
    ・
    ・
    ・
    directory {
      simulations = "systemcraft/simulations" # シナリオの保存先を変更
      resources = "systemcraft/resources"     # リソースの保存先を変更
      #reportsOnly = ""
      #binaries = ""
      results = "systemcraft/results"         # 試験結果レポートの出力先を変更
    }
    ・
    ・
    ・
  }

simulationsディレクトリ、resourcesディレクトリを
「$GATLING_HOME/user-files」から「$GATLING_HOME/systemcraft」に変更しています。

合わせて負荷試験結果レポートの出力先も
「$GATLING_HOME/results」から「$GATLING_HOME/systemcraft/results」に変更しました。

これで、simulations、resouces、resultsの3つのディレクトリをホストから参照することができます。

次回はCustomActionを実装します

これでGatlingがセットアップ済みのをdockerコンテナができました。

Gatlingのホームディレクトリ直下の独自ディレクトリ(systemcraftディレクトリ)でホストとマウントしてシナリオやリソースを共有させたわけですが、マウントするだけなら直接「user-files」とマウントさせるという手もありました。
ただ、その場合デフォルトで用意されているサンプルのシナリオやリソースが消えてしまうので、今回はあえて独自ディレクトリとマウントするようにしました。

今回紹介した方法以外にも MavenやGradleによるGatlingのパッケージ化が可能なセットアップ方法もあるようです。機会があれば、そちらもいずれやってみるかもしれません。
https://gatling.io/docs/gatling/reference/3.6/extensions/maven_plugin/


ということで次回は、今回作ったこのGatling環境を使って、いよいよCustomActionをJavaで実装してみます。

コメント

タイトルとURLをコピーしました