We are executing a service end points which were passing earlier for all the end points for the below configuration.
atOnceUsers=2;constantUsersPerSec=5;constantUsersPerSecDuration=120;startRampUsersPerSec=10;endRampUsersPerSecParam=10;randomizedDuration=1;
Gatling Execution Result:
---- Requests ------------------------------------------------------------------
> Global (OK=9856 KO=920 )
> POST (OK=5388 KO=0 )
> Articles - Widget Name: keyword-cloud-widget (OK=441 KO=49 )
> Articles - Details (OK=430 KO=59 )
> Articles - Widget Name: sentiment-overview-widget (OK=422 KO=65 )
> Articles - Inside -- Frustated Contacts Top Categori... (OK=370 KO=118 )
> Articles - Entity Sentiment (OK=389 KO=101 )
> Articles - Silence (OK=396 KO=96 )
> Articles - Volatility (OK=392 KO=95 )
> Articles - Widget Name: EnlightenSummaryController (OK=406 KO=82 )
> Articles - Widget Name: top-entities-bubble-chart En... (OK=400 KO=95 )
> Articles - Widget Name: sentimentTrendWidgetControll... (OK=405 KO=84 )
> Articles - Contacts (OK=417 KO=76 )
---- Errors --------------------------------------------------------------------
> status.find.is(200), but actually found 401 920 (100.0%)
================================================================================
---- Global Information --------------------------------------------------------
> request count 10776 (OK=9856 KO=920 )
> min response time 259 (OK=295 KO=259 )
> max response time 3500 (OK=3500 KO=1152 )
> mean response time 613 (OK=640 KO=329 )
> std deviation 327 (OK=325 KO=161 )
> response time 50th percentile 538 (OK=544 KO=286 )
> response time 75th percentile 616 (OK=631 KO=304 )
> response time 95th percentile 1212 (OK=1247 KO=443 )
> response time 99th percentile 2160 (OK=2204 KO=1076 )
> mean requests/sec 84.188 (OK=77 KO=7.188 )
---- Response Time Distribution ------------------------------------------------
> t < 1500 ms 9587 ( 89%)
> 1500 ms < t < 3000 ms 264 ( 2%)
> t > 3000 ms 5 ( 0%)
> failed 920 ( 9%)
---- Errors --------------------------------------------------------------------
> status.find.is(200), but actually found 401 920 (100.0%)
================================================================================
Simulation Code:
package gatling.analytics.simulations
import gatling.analytics.constants.CxoneAnalyticsConstants
import io.gatling.core.Predef._
import io.gatling.core.scenario.Simulation
import io.gatling.http.Predef._
import scala.concurrent.duration.DurationInt
class ArticleServiceTopTenSimulation extends Simulation {
//Environment Variables Value
//ENV=PERF;AT_ONCE_USERS=2;CONSTANT_USERS_PER_SEC=10;CONSTANT_USERS_PER_SEC_DURATION=120;START_RAMP_USERS_PER_SEC=1;END_RAMP_USERS_PER_SEC=20;RANDOMIZED_DURATION=120
//env=perf;atOnceUsers=2;constantUsersPerSec=1;constantUsersPerSecDuration=30;startRampUsersPerSec=1;endRampUsersPerSecParam=2;randomizedDuration=30
private val devHttpConf = http
.baseUrl(CxoneAnalyticsConstants.baseUrlStaging)
.acceptHeader("application/json, text/plain, */*")
.acceptEncodingHeader("gzip, deflate, br")
private val perfHttpConf = http.shareConnections
.baseUrl(CxoneAnalyticsConstants.basePerfUrl)
.acceptHeader("application/json, text/plain, */*")
.acceptEncodingHeader("gzip, deflate, br")
val execLocalSetup: String = sys.env.getOrElse("execSetup","NULL")
val execFrontSetup: String = sys.props.getOrElse("execSetupFront", "NULL")
println("ENV::::::::::",execLocalSetup)
println("ENV_FRONTLINE::::::::::",execFrontSetup)
if (execLocalSetup.equals("local")) {
val envParam: String = sys.env.getOrElse("env", "perf")
println("ENV::::::::::",envParam)
val atOnceUsersParam: Int = sys.env.getOrElse("atOnceUsers", "2").toInt
println("AT_ONCE_USERS::::::::::",atOnceUsersParam)
val constantUsersPerSecParam: Int = sys.env.getOrElse("constantUsersPerSec", "1").toInt
println("CONSTANT_USERS_PER_SEC::::::::::",constantUsersPerSecParam)
val constantUsersPerSecDurationParam: Int = sys.env.getOrElse("constantUsersPerSecDuration", "30").toInt
println("CONSTANT_USERS_PER_SEC_DURATION::::::::::",constantUsersPerSecDurationParam)
val startRampUsersPerSecParam: Int = sys.env.getOrElse("startRampUsersPerSec", "1").toInt
println("START_RAMP_USERS_PER_SEC::::::::::",startRampUsersPerSecParam)
val endRampUsersPerSecParam: Int = sys.env.getOrElse("endRampUsersPerSec", "2").toInt
println("END_RAMP_USERS_PER_SEC::::::::::",endRampUsersPerSecParam)
val randomizedDurationParam: Int = sys.env.getOrElse("randomizedDuration", "30").toInt
println("RANDOMIZED_DURATION::::::::::",randomizedDurationParam)
if (envParam.equals("dev")) {
setUp(
gatling.analytics.scenarios.DevArticleServiceTopTenScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(devHttpConf)
)
} else if (envParam.equals("perf")){
setUp(
//gatling.analytics.scenarios.perf.PerfArticleServiceTopTenScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf)
gatling.analytics.scenarios.perf.PerfArticleServiceFrustContactsScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceContactsScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceDetailsScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceKeywordCloudWidgetScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceVolatilityScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceSentimentOverviewWidgetScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceSentimentTrendWidgetScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceSilenceScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceEnlightenSummaryControllerScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceEntitySentimentScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceEntitySentimentDocTypeScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf)
)
}
}
if (execFrontSetup.equals("frontline")){
val envParam: String = sys.props.getOrElse("env", "perf")
println("ENV::::::::::",envParam)
val atOnceUsersParam: Int = sys.props.getOrElse("atOnceUsers", "2").toInt
println("AT_ONCE_USERS::::::::::",atOnceUsersParam)
val constantUsersPerSecParam: Int = sys.props.getOrElse("constantUsersPerSec", "1").toInt
println("CONSTANT_USERS_PER_SEC::::::::::",constantUsersPerSecParam)
val constantUsersPerSecDurationParam: Int = sys.props.getOrElse("constantUsersPerSecDuration", "30").toInt
println("CONSTANT_USERS_PER_SEC_DURATION::::::::::",constantUsersPerSecDurationParam)
val startRampUsersPerSecParam: Int = sys.props.getOrElse("startRampUsersPerSec", "1").toInt
println("START_RAMP_USERS_PER_SEC::::::::::",startRampUsersPerSecParam)
val endRampUsersPerSecParam: Int = sys.props.getOrElse("endRampUsersPerSec", "2").toInt
println("END_RAMP_USERS_PER_SEC::::::::::",endRampUsersPerSecParam)
val randomizedDurationParam: Int = sys.props.getOrElse("randomizedDuration", "30").toInt
println("RANDOMIZED_DURATION::::::::::",randomizedDurationParam)
if (envParam.equals("dev")) {
setUp(
gatling.analytics.scenarios.DevArticleServiceTopTenScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(devHttpConf)
)
} else if (envParam.equals("perf")){
setUp(
gatling.analytics.scenarios.perf.PerfArticleServiceFrustContactsScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceContactsScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceDetailsScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceKeywordCloudWidgetScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceVolatilityScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceSentimentOverviewWidgetScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceSentimentTrendWidgetScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceSilenceScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceEnlightenSummaryControllerScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceEntitySentimentScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf),
gatling.analytics.scenarios.perf.PerfArticleServiceEntitySentimentDocTypeScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf)
//gatling.analytics.scenarios.perf.PerfArticleServiceTopTenScenario.scn.inject(atOnceUsers(atOnceUsersParam),constantUsersPerSec(constantUsersPerSecParam) during(constantUsersPerSecDurationParam),rampUsersPerSec(startRampUsersPerSecParam).to(endRampUsersPerSecParam).during(randomizedDurationParam).randomized).protocols(perfHttpConf)
)
}
}
}
One of the Scenario Code :
package gatling.analytics.scenarios.perf
import com.typesafe.scalalogging.LazyLogging
import gatling.analytics.constants.CxoneAnalyticsConstants
import gatling.analytics.feeders.ArticleServiceFeeder
import gatling.analytics.scenarios.perf.PerfArticleServiceFrustContactsScenario.access_token
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.http.request.builder.HttpRequestBuilder.toActionBuilder
object PerfArticleServiceSilenceScenario extends LazyLogging {
private var access_token = ""
private var username = ""
private var tenantId = ""
private var bodyTenantId = ""
object authCXOne {
val authCXOne = scenario("Authentication Env:" +CxoneAnalyticsConstants.perfEnvVar)
.feed(ArticleServiceFeeder.userFeederCXOnePerf)
.exec(
http("POST")
.post(CxoneAnalyticsConstants.perfLoginUrl)
.body(StringBody("""{"userName": "${username}","password": "${password}" }""")).asJson
.header("accept", "application/json")
.header("Accept-Language", "en-us")
.header("Content-Type", "application/json")
.check(status.is(200))
.check(jsonPath("$.token").exists.saveAs("access_token"))
)
.exec{session => { access_token = session("access_token").as[String]
println("ACCESS_TOKEN:" +access_token)
session}}
.exec{session => { username = session("username").as[String]
println("username:" +username)
session}}
.exec{session => { tenantId = session("tenantId").as[String]
println("tenantId:" +tenantId)
session}}
}
object articlServSilence {
val artServSilence = scenario("Article Service Silence")
.feed(ArticleServiceFeeder.csvArtCXOnePerfSilenceFeeder )
.exec{session => { bodyTenantId = session("bodyTenantId").as[String]
println("bodyTenantId:" +bodyTenantId)
session}}
.exec{session => { tenantId = session("tenantId").as[String]
println("User Feeder:" +tenantId)
session}}
.doIf(bodyTenantId==tenantId) {
//.exec(session => session.set("access_token", access_token))
exec(_.set("access_token", access_token))
.exec(http("Articles - Silence")
.post("https://analytics-na1.perf.nice-incontact.com/attensityq-gateway/articles/silence")
.header("Authorization", "bearer ${access_token}")
.body(StringBody("""{"topicIDs":["${topicIDs}"],"loadAllForDatasourceId":"${loadAllForDatasourceId}","filters":[],"widgetFilters":[{"field":"${field}","comparison":"${comparison}","values":["${values}"]}],"samplePercent":"${samplePercent}","dateRange":{"startDate":"${startDate}","endDate":"${endDate}","name":"${name}"},"backendType":"OS"}""".stripMargin))
//Working in Perf
//.body(StringBody("""{"topicIDs":[100417],"loadAllForDatasourceId":"237","filters":[],"widgetFilters":[{"field":"document_content_type_alt","comparison":"EQ","values":["call"]}],"samplePercent":20.997110797554257,"dateRange":{"startDate":1653042749090,"endDate":1658227449419,"name":"DAY"}}""".stripMargin)).asJson
.check(status.is(200))
)
}
}
val scn = scenario("SCN Scenario Silence")
.exec(authCXOne.authCXOne)
.pause(5)
.exec(articlServSilence.artServSilence)
}
The same token generated when used in postman is successful with 200 status code but we are not able to find out why we are getting the 401 error only for few requests.