9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ScalaAdvent Calendar 2018

Day 16

Gatlingで普通のScalaコードの性能をテストする

Last updated at Posted at 2018-12-08

S3のPUT性能を測ってほしいと頼まれて、Gatlingでできないか試してみたのがことの経緯です。
GatlingはHTTP/HTTPSの負荷テストをサポートしていますが、それ以外の方法はJMS
とMQTTをサポートしていますが、普通のScalaコードから負荷を書ける方法はドキュメントを探してもみあたりません。
S3のPUTはHTTPでできますが、SDKなしでGatlingのシナリオで再現するのはとても面倒です。通常利用する際はSDKで簡単にアクセスできるので、せっかくのScalaなのですから、SDKでアクセスするコードそのままに負荷テストしたいのです。

通常、Gatlingのシナリオはこのように書きます。
スクリーンショット 2018-12-08 18.29.09.png
そこで、execに渡している型を自作できれば、その中にSDKでアクセスするコードを書いてやりたいことができるという算段です。

まずはexecの実装を見て見ましょう。
スクリーンショット 2018-12-08 18.50.09.png
ExecsトレイトのexecメソッドがActionBuilderを返しています。
次にActionBuilderを見て見ます。
スクリーンショット 2018-12-08 18.52.38.png
ActionトレイトにはbuildメソッドがありActionを返します。
スクリーンショット 2018-12-08 18.53.02.png
Actionトレイトにはexecuteメソッドがあり、名前から考えるとこれを実装すれば良さそうです。
しかし、引数のSessionはなんでも入ってるようなクラスなのでこのメソッド内で何をしているかわかりません。コメントも

Core method executed when the Action received a Session message
「アクションがセッションメッセージを受信したときに実行されるコアメソッド」

としか書いておらず参考になりそうにありません。
そこで「Gatling Custom Action」などでググって参考になるページを探して実装できたんですが、今はそのページ消えていました。
いろいろあってActionBuilderとActionの実装はこうなりました。
スクリーンショット 2018-12-08 19.02.55.png
ActionBuilderのbuildメソッドの引数で渡されているScenarioContextからstatsEngineを取り出しlogReponseメソッドで実行データを記録しています。
利用方法はこんな感じになります。
スクリーンショット 2018-12-08 19.06.53.png
適当な処理を書いてStatusを返しています。
これをgatling:testで実行すると無事負荷テストが実行され、レポートも出力されました。
スクリーンショット 2018-12-08 19.09.23.png
スクリーンショット 2018-12-08 19.09.50.png

これでAWSやGCP、RedisなどHTTPアクセスが難しい対象に対しても簡単に負荷をかけられるようになりました。
コードはここにおいてあります

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?