S3のPUT性能を測ってほしいと頼まれて、Gatlingでできないか試してみたのがことの経緯です。
GatlingはHTTP/HTTPSの負荷テストをサポートしていますが、それ以外の方法はJMS
とMQTTをサポートしていますが、普通のScalaコードから負荷を書ける方法はドキュメントを探してもみあたりません。
S3のPUTはHTTPでできますが、SDKなしでGatlingのシナリオで再現するのはとても面倒です。通常利用する際はSDKで簡単にアクセスできるので、せっかくのScalaなのですから、SDKでアクセスするコードそのままに負荷テストしたいのです。
通常、Gatlingのシナリオはこのように書きます。
そこで、execに渡している型を自作できれば、その中にSDKでアクセスするコードを書いてやりたいことができるという算段です。
まずはexecの実装を見て見ましょう。
ExecsトレイトのexecメソッドがActionBuilderを返しています。
次にActionBuilderを見て見ます。
ActionトレイトにはbuildメソッドがありActionを返します。
Actionトレイトにはexecuteメソッドがあり、名前から考えるとこれを実装すれば良さそうです。
しかし、引数のSessionはなんでも入ってるようなクラスなのでこのメソッド内で何をしているかわかりません。コメントも
Core method executed when the Action received a Session message
「アクションがセッションメッセージを受信したときに実行されるコアメソッド」
としか書いておらず参考になりそうにありません。
そこで「Gatling Custom Action」などでググって参考になるページを探して実装できたんですが、今はそのページ消えていました。
いろいろあってActionBuilderとActionの実装はこうなりました。
ActionBuilderのbuildメソッドの引数で渡されているScenarioContextからstatsEngineを取り出しlogReponseメソッドで実行データを記録しています。
利用方法はこんな感じになります。
適当な処理を書いてStatusを返しています。
これをgatling:testで実行すると無事負荷テストが実行され、レポートも出力されました。
これでAWSやGCP、RedisなどHTTPアクセスが難しい対象に対しても簡単に負荷をかけられるようになりました。
コードはここにおいてあります