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
Должны быть созданы разные сессии.
Спасибо