Gatling 401 Authorization Issue only for few requests and Passing for majority of the Requests with Valid Auth Token Passed

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.

@slandelle - Could you please help here? We got stucked and not able to find root cause.

Hi,

  1. You should not call scenario inside a scenario (authCXOne.authCXOne is a scenario that is called in PerfArticleServiceSilenceScenario.scn)
  2. Don’t use var (global or not) for user values (session API should be used)
  3. Please, provide a SCCE. This one is not short, and analyzing it would require time and efforts that would be part of a dedicated service contract.

Hope it helps.
Cheers!

Can’t say.
BTW, your doIf is broken: you’re passing a value, evaluated once, while you should be passing a function.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.