All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.twitter.finagle.example.stress.Stress.scala Maven / Gradle / Ivy

The newest version!
package com.twitter.finagle.example.stress

import com.google.common.util.concurrent.AtomicLongMap
import com.twitter.finagle.Service
import com.twitter.finagle.builder.ClientBuilder
import com.twitter.finagle.http.Http
import com.twitter.finagle.stats.SummarizingStatsReceiver
import com.twitter.util.{Stopwatch, Future}
import java.net.{InetSocketAddress, URI}
import java.util.concurrent.atomic.AtomicInteger
import org.jboss.netty.handler.codec.http._
import scala.collection.JavaConverters._

/**
 * A program to stress an HTTP server. The code below throttles request using an
 * asynchronous semaphore. Specify the uri, concurrency level,  and the total number
 * of requests at the command line.
 */
object Stress {
  def main(args: Array[String]) {
    val uri           = new URI(args(0))
    val concurrency   = args(1).toInt
    val totalRequests = args(2).toInt

    val errors    = new AtomicInteger(0)
    val responses = AtomicLongMap.create[HttpResponseStatus]()

    val request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri.getPath)
    HttpHeaders.setHost(request, uri.getHost)

    val statsReceiver = new SummarizingStatsReceiver

    val client: Service[HttpRequest, HttpResponse] = ClientBuilder()
      .codec(Http())
      .hosts(new InetSocketAddress(uri.getHost, uri.getPort))
      .hostConnectionCoresize(concurrency)
      .reportTo(statsReceiver)
      .retries(3)
      .hostConnectionLimit(concurrency)
      .build()

    val completedRequests = new AtomicInteger(0)

    val requests = Future.parallel(concurrency) {
      Future.times(totalRequests / concurrency) {
        client(request) onSuccess { response =>
          responses.incrementAndGet(response.getStatus)
        } handle { case e =>
          errors.incrementAndGet()
        } ensure {
          completedRequests.incrementAndGet()
        }
      }
    }

    val elapsed = Stopwatch.start()

    Future.join(requests) ensure {
      client.close()

      val duration = elapsed()
      println("%20s\t%s".format("Status", "Count"))
      for ((status, count) <- responses.asMap.asScala)
        println("%20s\t%d".format(status, count))
      println("================")
      println("%d requests completed in %dms (%f requests per second)".format(
        completedRequests.get, duration.inMilliseconds,
        totalRequests.toFloat / duration.inMillis.toFloat * 1000))
      println("%d errors".format(errors.get))

      println("stats")
      println("=====")

      statsReceiver.print()
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy