Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
AMQP Gatling Test (Gatling 3.1.2, Scala 2.12.8, com.rabbitmq:amqp-client:5.3.0)
package simulations
import io.gatling.commons.validation.Validation
import io.gatling.core.Predef._
import io.gatling.core.action.{RequestAction}
import io.gatling.core.action.builder.ActionBuilder
import io.gatling.core.session.{Expression, Session}
import io.gatling.core.structure.ScenarioContext
import io.gatling.core.action.Action
import scala.concurrent.duration._
import scala.language.postfixOps
import com.rabbitmq.client.ConnectionFactory
import com.typesafe.scalalogging.StrictLogging
import io.gatling.commons.stats.OK
import io.gatling.commons.util.Clock
import io.gatling.core.stats.StatsEngine
import io.gatling.core.util.NameGen
import io.gatling.commons.validation._
class RabbitTest extends Simulation {
def amqpSend(message: String) = new ActionBuilder {
def build(ctx: ScenarioContext, next: Action): Action = {
new AmqpSend(message, ctx, next)
}
}
val scn = scenario("AMQP protocol test")
.exec(amqpSend("Hello, World"))
setUp(
scn.inject(
rampUsersPerSec(1) to (60) during(180 seconds),
)
)
}
class Around(before: () => Unit, after: () => Unit) {
def apply(f: => Any): Unit = {
before()
f
after()
}
}
trait AmqpLogging extends StrictLogging {
def logMessage(text: => String, msg: String): Unit = {
logger.debug(text)
logger.trace(msg.toString)
}
}
class AmqpSend(val message: String, val ctx: ScenarioContext, val next: Action) extends RequestAction with AmqpLogging with NameGen {
override val name: String = genName("amqp publish")
override val requestName: Expression[String] = "amqp publish"
override def clock: Clock = ctx.coreComponents.clock
override def statsEngine: StatsEngine = ctx.coreComponents.statsEngine
def send(): Unit = {
val factory = new ConnectionFactory()
factory.setUsername("guest")
factory.setPassword("guest")
factory.setHost("localhost")
factory.setVirtualHost("/")
factory.setPort(5672)
val conn = factory.newConnection()
val channel = conn.createChannel()
channel.exchangeDeclare("amqp.direct.1", "direct", true)
val messageBodyBytes = message.getBytes()
channel.basicPublish("amqp.direct.1", "routing.key.1", null, messageBodyBytes)
channel.close()
conn.close()
}
override def sendRequest(requestName: String, session: Session): Validation[Unit] =
for {
around <- aroundSend(requestName, session)
} yield {
around(
send()
)
}
protected def aroundSend(requestName: String, session: Session): Validation[Around] = {
new Around(
before = () => {
if (logger.underlying.isDebugEnabled) {
logMessage(s"Message sent", message)
}
},
after = () => {
ctx.coreComponents.configuration.resolve(
{
val now = clock.nowMillis
statsEngine.logResponse(session, requestName, session.startDate, now, OK, None, None)
}
)
next ! session
}
).success
}
}
@polarnik

This comment has been minimized.

Copy link
Owner Author

polarnik commented Jun 9, 2019

изображение
Report Example

@polarnik

This comment has been minimized.

Copy link
Owner Author

polarnik commented Jun 9, 2019

gatling report
rabbitmq admin stats

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.