Gatling для каждого пользователя создать свою ссесию

Всем привет! Пытаюсь написать нагрузочное тестирование для нашего сервера. Но пока, что не очень получается. Пока что получается, что все пользователи авторизуются в одной сессии. А как создать для каждого пользователя свою сессию?

Мой код

import BasicLoad.start
import Requests.usersLogin
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.core.scenario.Simulation
import io.socket.client.{Ack, IO, Socket}
import io.socket.emitter.Emitter
import org.json.JSONObject

import scala.concurrent.duration._
import scala.language.postfixOps
import play.api.libs.json._

class ServerLoad extends Simulation{

  val port = Integer.getInteger("port", 8080)
  val host = System.getProperty("host", "localhost")
  val wsUrl = "wss://$host:$port/socket.io/?EIO=3&transport=websocket&sid=" + "${sessionId}"
  val socketUrl = "https://localhost:8080"
  val optConnect = new IO.Options()
  var status_ack: Boolean = false
  //var cid_contacts: String = null
  optConnect.forceNew = false
  optConnect.timeout = 5000
  val socket = IO.socket(socketUrl, optConnect)
  var start: Long = 0L
  var jsonContacts = new JSONObject()

  val users = csv( "users.csv" )
    .circular
  val httpConf = http.baseUrl("https://localhost")
    .wsBaseUrl("wss://localhost:8080")
  val scn = scenario("UsersLogin")
      .feed(users)
        .exec(
          ws( "Send user-agent" ).connect( "/socket.io/?EIO=3&transport=websocket" )
            .headers(
              Map(
                "User-Agent" -> "${device}"
              )
            )
            .onConnected(
              exec(
                session_login => {
                  println(session_login)
                  val obj = new JSONObject()
                  status_ack = false
                  obj.put( "login", session_login( "login" ).as[String] )
                  obj.put( "password", session_login( "password" ).as[String] )
                  obj.put( "APILevel", session_login( "level" ).as[String] )
                  val printListenerLogin: Emitter.Listener = new Emitter.Listener {
                    override def call(args: AnyRef*): Unit = {
                      //println( "Login time: " + ((System.nanoTime - start) / 1000000) )
                    }
                  }
                  socket.on( Socket.EVENT_CONNECT, printListenerLogin )
                  socket.connect()
                  socket.emit( "login", obj, new Ack {
                    override def call(args: AnyRef*): Unit = {
                      val ackData = args.apply( 0 ).toString()
                      status_ack = (Json.parse( ackData ) \\ "status") ( 0 ).toString().contains( """ok""" )
                      if( ! status_ack){
                        exec( ws( "Close connect" ).close )
                      }else{
                        //println("Send emit get-user-info")
                        socket.emit("get-user-info", "", new Ack {
                          override def call(info: AnyRef*): Unit = {
                            //println( info )
                          }
                        })
                        //println("Send emit get-user-params")
                        socket.emit( "get-user-params", "", new Ack {
                          override def call(params: AnyRef*): Unit = {
                            //println( params )
                          }
                        } )
                        jsonContacts.put( "type", "global" )
                        socket.emit( "get-contacts", jsonContacts, new Ack {
                          override def call(args: AnyRef*): Unit = {
                            val getGlobalContacts = args.apply(0).toString
                            if ( (Json.parse( getGlobalContacts ) \\ "cid").length > 0 ){
                              println( (Json.parse( getGlobalContacts ) \\ "cid").length.toString())//(  ).toString() )
                            }

                          }
                        } )
                        jsonContacts.put( "type", "local" )
                        socket.emit( "get-contacts", jsonContacts, new Ack {
                          override def call(args: AnyRef*): Unit = {
                            /*val getLocalContacts = args.apply(0).toString
                            println( (Json.parse( getLocalContacts ) \\ "cid") (0).toString())*/
                          }
                        } )
                        socket.emit( "get-sessions", "", new Ack {
                          override def call(params: AnyRef*): Unit = {
                            //println( params )
                          }
                        } )
                        jsonContacts.put( "count", "50" )
                        socket.emit( "get-chats", jsonContacts, new Ack {
                          override def call(args: AnyRef*): Unit = {
                            //print( args )
                          }
                        } )
                      }
                    }
                  }
                  )
                  session_login
                }
              )
                .pause(15)
                .exec(
                  session => {
                    socket.emit("logout")
                    session
                  }
                )
                .exec(
                  ws( "Close connect" ).close
                )
            )
        )

  setUp(scn.inject(rampUsers(2) during(10 seconds))
    .protocols(httpConf))
    .maxDuration(30 seconds)
}

Вот, логи с сервера

09.08 12:25:49.833> server                   >  io connect: ::ffff:10.10.38.173:60970
09.08 12:25:49.833> server                   >  io connect user-agent: {"user-agent":"RosChat/3.5.1.14596 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) Mobile/15E148","accept":"*/*","host":"localhost:8080","upgrade":"websocket","connection":"upgrade","sec-websocket-key":"lBEJt3eT44mSYEZ6ViwOQg==","origin":"https://localhost:8080","sec-websocket-version":"13","sec-websocket-extensions":"permessage-deflate;client_no_context_takeover;client_max_window_bits,deflate-frame,x-webkit-deflate-frame"}
09.08 12:25:49.833> booster                  >  (163) none(): getDeviceInfo: {"status":"disconnected"}
09.08 12:25:49.835> server                   >  add client: 163, clients count: 1
09.08 12:25:49.938> server                   >  io connect: ::ffff:10.10.38.173:60972
09.08 12:25:49.938> server                   >  io connect user-agent: {"accept":"*/*","host":"localhost:8080","connection":"Keep-Alive","accept-encoding":"gzip","user-agent":"okhttp/3.8.1"}
09.08 12:25:49.938> booster                  >  (164) none(): getDeviceInfo: {"status":"disconnected"}
09.08 12:25:49.939> server                   >  add client: 164, clients count: 2
09.08 12:25:49.964> server-clients           >  (164) login: 9000
09.08 12:25:49.965> server                   >  create user-client: 9000
09.08 12:25:49.966> user-clients             >  (9000) auth
09.08 12:25:51.379> user-clients             >  (9000) login: params = {}
09.08 12:25:51.385> user-clients             >  (9000) _initUserData: _userProfile inited
09.08 12:25:51.385> server                   >  _checkUsageUserClient: 9000
09.08 12:25:51.385> server-clients           >  (164) _setState: ACTIVE
09.08 12:25:51.385> server-clients           >  (164) contacts - ok
09.08 12:25:51.557> server-clients           >  (164) get-user-info
09.08 12:25:51.558> server-clients           >  (164) get-user-params
09.08 12:25:51.558> server-clients           >  (164) get-contacts: type = global
09.08 12:25:51.559> server-clients           >  (164) get-contacts: type = local
09.08 12:25:51.559> server-clients           >  (164) get-sessions
09.08 12:25:51.559> server-clients           >  (164) get-chats: startMessageId = 0, count = 50, minMessageId = 0
09.08 12:25:54.798> server                   >  io connect: ::ffff:10.10.38.173:32788
09.08 12:25:54.799> server                   >  io connect user-agent: {"user-agent":"(Windows) Desktop/2.1.1172","accept":"*/*","host":"localhost:8080","upgrade":"websocket","connection":"upgrade","sec-websocket-key":"Ofyl9IEnj4YMAh4ZGuHYmQ==","origin":"https://localhost:8080","sec-websocket-version":"13","sec-websocket-extensions":"permessage-deflate;client_no_context_takeover;client_max_window_bits,deflate-frame,x-webkit-deflate-frame"}
09.08 12:25:54.799> booster                  >  (165) none(): getDeviceInfo: {"status":"disconnected"}
09.08 12:25:54.799> server                   >  add client: 165, clients count: 3
09.08 12:25:54.807> server-clients           >  (164) login: 9001
09.08 12:25:54.810> server-clients           >  (164) get-user-info
09.08 12:25:54.813> server-clients           >  (164) get-user-params
09.08 12:25:54.813> server-clients           >  (164) get-contacts: type = global
09.08 12:25:54.813> server-clients           >  (164) get-contacts: type = local
09.08 12:25:54.814> server-clients           >  (164) get-sessions
09.08 12:25:54.814> server-clients           >  (164) get-chats: startMessageId = 0, count = 50, minMessageId = 0
09.08 12:26:04.843> server-clients           >  (164) logout
09.08 12:26:04.848> server-clients           >  (163) disconnect: transport close
09.08 12:26:04.848> server                   >  remove client: 163, clients count: 2
09.08 12:26:04.852> server-clients           >  (164) disconnect: server namespace disconnect
09.08 12:26:04.852> server                   >  remove client: 164, clients count: 1
09.08 12:26:04.852> server                   >  _checkUsageUserClient: 9000
09.08 12:26:04.852> server                   >  removeUserClient: 9000
09.08 12:26:09.810> server-clients           >  (165) disconnect: transport close
09.08 12:26:09.810> server                   >  remove client: 165, clients count: 0

Число в скобочках, это номер сессии. Т.е. для пользователя

(164) login: 9000

(164) login: 9001

Должны быть созданы разные сессии.

Спасибо


Ответы (0 шт):