Skip to content

Commit

Permalink
Use group duration as a response time for group statistics, close #886
Browse files Browse the repository at this point in the history
  • Loading branch information
Grégory Coutant committed Jan 3, 2013
1 parent 18d62a1 commit 5b05faa
Show file tree
Hide file tree
Showing 22 changed files with 170 additions and 96 deletions.
Expand Up @@ -25,6 +25,5 @@ contents: {
<% if (it.hasNext) { %>,<% } %> <% if (it.hasNext) { %>,<% } %>
<% } %> <% } %>
}, },
duration: <%= group.groupStats.duration.toString %>,
<% attributes("request") = group.requestStats %> <% attributes("request") = group.requestStats %>
${include("stats_request.js.ssp")} ${include("stats_request.js.ssp")}
Expand Up @@ -53,4 +53,6 @@ abstract class ComponentLibrary {
def getRequestDetailsScatterChartComponent(successData: Series[Int, Int], failuresData: Series[Int, Int]): Component def getRequestDetailsScatterChartComponent(successData: Series[Int, Int], failuresData: Series[Int, Int]): Component
def getRequestDetailsIndicatorChartComponent: Component def getRequestDetailsIndicatorChartComponent: Component
def getNumberOfRequestsChartComponent: Component def getNumberOfRequestsChartComponent: Component
def getGroupDurationChartComponent(runStart: Long, durations: Series[Int, (Int, Int)]): Component
def getGroupDetailsDurationDistributionChartComponent(durations: Series[Int, Int]): Component
} }
Expand Up @@ -83,8 +83,6 @@ case class RequestStatistics(name: String,
.toString .toString
} }


case class GroupStatistics(duration: Long)

class StatisticsTextComponent extends Component { class StatisticsTextComponent extends Component {


def getHTMLContent: String = TEMPLATE_ENGINE.layout(GATLING_TEMPLATE_STATISTICS_COMPONENT_URL) def getHTMLContent: String = TEMPLATE_ENGINE.layout(GATLING_TEMPLATE_STATISTICS_COMPONENT_URL)
Expand Down
Expand Up @@ -36,4 +36,6 @@ class ComponentLibraryImpl extends ComponentLibrary {
def getRequestDetailsScatterChartComponent(successData: Series[Int, Int], failuresData: Series[Int, Int]): Component = throw new UnsupportedOperationException def getRequestDetailsScatterChartComponent(successData: Series[Int, Int], failuresData: Series[Int, Int]): Component = throw new UnsupportedOperationException
def getRequestDetailsIndicatorChartComponent: Component = throw new UnsupportedOperationException def getRequestDetailsIndicatorChartComponent: Component = throw new UnsupportedOperationException
def getNumberOfRequestsChartComponent: Component = throw new UnsupportedOperationException def getNumberOfRequestsChartComponent: Component = throw new UnsupportedOperationException
def getGroupDurationChartComponent(runStart: Long, durations: Series[Int, (Int, Int)]): Component = throw new UnsupportedOperationException
def getGroupDetailsDurationDistributionChartComponent(durations: Series[Int, Int]): Component = throw new UnsupportedOperationException
} }
Expand Up @@ -21,7 +21,7 @@ import scala.annotation.tailrec
import scala.collection.JavaConversions._ import scala.collection.JavaConversions._
import scala.collection.mutable import scala.collection.mutable


import com.excilys.ebi.gatling.charts.component.{ GroupStatistics, RequestStatistics } import com.excilys.ebi.gatling.charts.component.RequestStatistics
import com.excilys.ebi.gatling.core.result.Group import com.excilys.ebi.gatling.core.result.Group


object Container { object Container {
Expand All @@ -34,7 +34,7 @@ trait Container
case class RequestContainer(name: String, stats: RequestStatistics) extends Container case class RequestContainer(name: String, stats: RequestStatistics) extends Container


object GroupContainer { object GroupContainer {
def root(groupStats: GroupStatistics, requestStats: RequestStatistics) = GroupContainer("ROOT", groupStats, requestStats) def root(requestStats: RequestStatistics) = GroupContainer("ROOT", requestStats)


def getGroup(root: GroupContainer, group: Option[Group]) = { def getGroup(root: GroupContainer, group: Option[Group]) = {
@tailrec @tailrec
Expand All @@ -51,12 +51,11 @@ object GroupContainer {
} }


case class GroupContainer(name: String, case class GroupContainer(name: String,
groupStats: GroupStatistics,
requestStats: RequestStatistics, requestStats: RequestStatistics,
contents: mutable.Map[String, Container] = new JLinkedHashMap[String, Container]) extends Container { contents: mutable.Map[String, Container] = new JLinkedHashMap[String, Container]) extends Container {


def addGroup(group: Group, groupStats: GroupStatistics, requestStats: RequestStatistics) { def addGroup(group: Group, requestStats: RequestStatistics) {
GroupContainer.getGroup(this, group.parent).contents += (group.name -> GroupContainer(group.name, groupStats, requestStats)) GroupContainer.getGroup(this, group.parent).contents += (group.name -> GroupContainer(group.name, requestStats))
} }


def addRequest(parent: Option[Group], request: RequestStatistics) { def addRequest(parent: Option[Group], request: RequestStatistics) {
Expand Down
@@ -0,0 +1,67 @@
/**
* Copyright 2011-2012 eBusiness Information, Groupe Excilys (www.excilys.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.excilys.ebi.gatling.charts.report

import com.excilys.ebi.gatling.charts.component.{ Component, ComponentLibrary, StatisticsTextComponent }
import com.excilys.ebi.gatling.charts.config.ChartsFiles.requestFile
import com.excilys.ebi.gatling.charts.series.Series
import com.excilys.ebi.gatling.charts.template.GroupDetailsPageTemplate
import com.excilys.ebi.gatling.charts.util.Colors.BLUE
import com.excilys.ebi.gatling.core.result.message.OK
import com.excilys.ebi.gatling.core.result.reader.DataReader
import com.excilys.ebi.gatling.core.result.Group

class GroupDetailsReportGenerator(runOn: String, dataReader: DataReader, componentLibrary: ComponentLibrary) extends ReportGenerator(runOn, dataReader, componentLibrary) {

def generate {
def generateDetailPage(group: Group) {
def responseTimeChartComponent: Component = {
val durationsData = dataReader.responseTimeGroupByExecutionStartDate(OK, None, Some(group))
val durationsSeries = new Series[Int, (Int, Int)]("Group duration", durationsData, List(BLUE))

componentLibrary.getGroupDurationChartComponent(dataReader.runStart, durationsSeries)
}

def responseTimeDistributionChartComponent: Component = {
val (distribution, _) = dataReader.responseTimeDistribution(100, None, Some(group))
val distributionSeries = new Series[Int, Int]("Group duration", distribution, List(BLUE))

componentLibrary.getGroupDetailsDurationDistributionChartComponent(distributionSeries)
}

def statisticsComponent: Component = new StatisticsTextComponent

def indicatorChartComponent: Component = componentLibrary.getRequestDetailsIndicatorChartComponent


// Create template
val template =
new GroupDetailsPageTemplate(group,
responseTimeChartComponent,
responseTimeDistributionChartComponent,
statisticsComponent,
indicatorChartComponent)

// Write template result to file
new TemplateWriter(requestFile(runOn, group.path)).writeToFile(template.getOutput)
}

dataReader.groupsAndRequests.foreach {
case (Some(group), None) => generateDetailPage(group)
case _ => {}
}
}
}
Expand Up @@ -44,7 +44,8 @@ object ReportsGenerator extends Logging {
val reportGenerators = val reportGenerators =
List(new AllSessionsReportGenerator(outputDirectoryName, dataReader, ComponentLibrary.instance), List(new AllSessionsReportGenerator(outputDirectoryName, dataReader, ComponentLibrary.instance),
new GlobalReportGenerator(outputDirectoryName, dataReader, ComponentLibrary.instance), new GlobalReportGenerator(outputDirectoryName, dataReader, ComponentLibrary.instance),
new RequestDetailsReportGenerator(outputDirectoryName, dataReader, ComponentLibrary.instance)) new RequestDetailsReportGenerator(outputDirectoryName, dataReader, ComponentLibrary.instance),
new GroupDetailsReportGenerator(outputDirectoryName, dataReader, ComponentLibrary.instance))


copyAssets copyAssets
generateMenu generateMenu
Expand Down
Expand Up @@ -68,14 +68,14 @@ class RequestDetailsReportGenerator(runOn: String, dataReader: DataReader, compo


def indicatorChartComponent: Component = componentLibrary.getRequestDetailsIndicatorChartComponent def indicatorChartComponent: Component = componentLibrary.getRequestDetailsIndicatorChartComponent


def pageTitle: String = requestName match { /*def pageTitle: String = requestName match {
case None => path + " (Duration = " + dataReader.groupStats(group) + " ms)" case None => path + " (Duration = " + dataReader.groupStats(group) + " ms)"
case Some(_) => path case Some(_) => path
} }*/


// Create template // Create template
val template = val template =
new RequestDetailsPageTemplate(pageTitle, new RequestDetailsPageTemplate(path,
requestName, requestName,
group, group,
responseTimeChartComponent, responseTimeChartComponent,
Expand All @@ -91,8 +91,7 @@ class RequestDetailsReportGenerator(runOn: String, dataReader: DataReader, compo


dataReader.groupsAndRequests.foreach { dataReader.groupsAndRequests.foreach {
case (group, Some(request)) => generateDetailPage(RequestPath.path(request, group), Some(request), group) case (group, Some(request)) => generateDetailPage(RequestPath.path(request, group), Some(request), group)
case (Some(group), None) => generateDetailPage(group.path, None, Some(group)) case _ => {}
case _ => throw new UnsupportedOperationException
} }
} }
} }
Expand Up @@ -15,7 +15,7 @@
*/ */
package com.excilys.ebi.gatling.charts.report package com.excilys.ebi.gatling.charts.report


import com.excilys.ebi.gatling.charts.component.{ ComponentLibrary, GroupStatistics, RequestStatistics, Statistics } import com.excilys.ebi.gatling.charts.component.{ ComponentLibrary, RequestStatistics, Statistics }
import com.excilys.ebi.gatling.charts.config.ChartsFiles.{ GLOBAL_PAGE_NAME, jsStatsFile, jsonStatsFile, tsvStatsFile } import com.excilys.ebi.gatling.charts.config.ChartsFiles.{ GLOBAL_PAGE_NAME, jsStatsFile, jsonStatsFile, tsvStatsFile }
import com.excilys.ebi.gatling.charts.template.{ StatsJsTemplate, StatsJsonTemplate, StatsTsvTemplate } import com.excilys.ebi.gatling.charts.template.{ StatsJsTemplate, StatsJsonTemplate, StatsTsvTemplate }
import com.excilys.ebi.gatling.core.config.GatlingConfiguration.configuration import com.excilys.ebi.gatling.core.config.GatlingConfiguration.configuration
Expand Down Expand Up @@ -57,13 +57,11 @@ class StatsReportGenerator(runOn: String, dataReader: DataReader, componentLibra
RequestStatistics(name, path, numberOfRequestsStatistics, minResponseTimeStatistics, maxResponseTimeStatistics, meanResponseTimeStatistics, stdDeviationStatistics, percentiles1, percentiles2, groupedCounts, meanNumberOfRequestsPerSecondStatistics) RequestStatistics(name, path, numberOfRequestsStatistics, minResponseTimeStatistics, maxResponseTimeStatistics, meanResponseTimeStatistics, stdDeviationStatistics, percentiles1, percentiles2, groupedCounts, meanNumberOfRequestsPerSecondStatistics)
} }


def computeGroupStats(group: Option[Group]) = GroupStatistics(dataReader.groupStats(group)) val stats = GroupContainer.root(computeRequestStats(GLOBAL_PAGE_NAME, None, None))

val stats = GroupContainer.root(computeGroupStats(None), computeRequestStats(GLOBAL_PAGE_NAME, None, None))


dataReader.groupsAndRequests.foreach { dataReader.groupsAndRequests.foreach {
case (group, Some(request)) => stats.addRequest(group, computeRequestStats(request, Some(request), group)) case (group, Some(request)) => stats.addRequest(group, computeRequestStats(request, Some(request), group))
case (Some(group), None) => stats.addGroup(group, computeGroupStats(Some(group)), computeRequestStats(group.name, None, Some(group))) case (Some(group), None) => stats.addGroup(group, computeRequestStats(group.name, None, Some(group)))
case _ => throw new UnsupportedOperationException case _ => throw new UnsupportedOperationException
} }


Expand Down
Expand Up @@ -205,8 +205,6 @@ class FileDataReader(runUuid: String) extends DataReader(runUuid) with Logging {
.getGeneralStatsBuffers(requestName, group, status) .getGeneralStatsBuffers(requestName, group, status)
.compute .compute


def groupStats(group: Option[Group]) = resultsHolder.getStatsGroupBuffer(group)

def numberOfRequestInResponseTimeRange(requestName: Option[String], group: Option[Group]): Seq[(String, Int)] = { def numberOfRequestInResponseTimeRange(requestName: Option[String], group: Option[Group]): Seq[(String, Int)] = {


val counts = resultsHolder.getResponseTimeRangeBuffers(requestName, group) val counts = resultsHolder.getResponseTimeRangeBuffers(requestName, group)
Expand Down
Expand Up @@ -33,21 +33,25 @@ class ResultsHolder(minTime: Long, maxTime: Long)
record.event match { record.event match {
case START => case START =>
addStartSessionBuffers(record) addStartSessionBuffers(record)
startGroup(record.user, record.scenario, record.executionDate, None) //startGroup(record.user, record.scenario, record.executionDate, None)
addScenarioName(record) addScenarioName(record)
case END => case END =>
addEndSessionBuffers(record) addEndSessionBuffers(record)
endGroup(record.user, record.scenario, record.executionDate) //endGroup(record.user, record.scenario, record.executionDate)
} }
} }


def addGroupRecord(record: GroupRecord) { def addGroupRecord(record: GroupRecord) {
record.event match { record.event match {
case START => case START =>
startGroup(record.user, record.scenario, record.executionDate, Some(record.group)) startGroup(record)
addGroupName(getCurrentGroup(record.user, record.scenario).get, record.executionDate) addGroupName(getCurrentGroup(record.user, record.scenario).get, record.executionDate)
case END => case END =>
endGroup(record.user, record.scenario, record.executionDate) val (startGroupRecord, group) = endGroup(record)
val duration = record.executionDate - startGroupRecord.executionDate
updateGroupGeneralStatsBuffers(duration, group)
updateGroupResponseTimePerSecBuffers(startGroupRecord.executionDateBucket, duration, group)
updateGroupResponseTimeRangeBuffer(duration, group)
} }
} }


Expand Down
Expand Up @@ -24,7 +24,7 @@ import scala.collection.JavaConversions._
import com.excilys.ebi.gatling.charts.result.reader.ActionRecord import com.excilys.ebi.gatling.charts.result.reader.ActionRecord
import com.excilys.ebi.gatling.core.result.Group import com.excilys.ebi.gatling.core.result.Group


trait Buffers { /*trait Buffers {
@tailrec @tailrec
final def recursivelyUpdate(record: ActionRecord, group: Option[Group])(update: (ActionRecord, Option[Group]) => Unit) { final def recursivelyUpdate(record: ActionRecord, group: Option[Group])(update: (ActionRecord, Option[Group]) => Unit) {
Expand All @@ -35,7 +35,7 @@ trait Buffers {
case None => {} case None => {}
} }
} }
} }*/


class CountBuffer { class CountBuffer {
val map: mutable.Map[Int, Int] = new JHashMap[Int, Int] val map: mutable.Map[Int, Int] = new JHashMap[Int, Int]
Expand Down
Expand Up @@ -20,30 +20,32 @@ import java.util.{ HashMap => JHashMap }
import scala.collection.JavaConversions._ import scala.collection.JavaConversions._
import scala.collection.mutable import scala.collection.mutable


import com.excilys.ebi.gatling.charts.result.reader.ActionRecord import com.excilys.ebi.gatling.charts.result.reader.{ ActionRecord, FileDataReader }
import com.excilys.ebi.gatling.charts.result.reader.FileDataReader
import com.excilys.ebi.gatling.charts.result.reader.stats.PercentilesHelper import com.excilys.ebi.gatling.charts.result.reader.stats.PercentilesHelper
import com.excilys.ebi.gatling.charts.result.reader.stats.StatsHelper import com.excilys.ebi.gatling.charts.result.reader.stats.StatsHelper
import com.excilys.ebi.gatling.core.config.GatlingConfiguration.configuration import com.excilys.ebi.gatling.core.config.GatlingConfiguration.configuration
import com.excilys.ebi.gatling.core.result.Group import com.excilys.ebi.gatling.core.result.Group
import com.excilys.ebi.gatling.core.result.message.RequestStatus import com.excilys.ebi.gatling.core.result.message.{ OK, RequestStatus }
import com.excilys.ebi.gatling.core.result.reader.GeneralStats import com.excilys.ebi.gatling.core.result.reader.GeneralStats


abstract class GeneralStatsBuffers(durationInSec: Long) extends Buffers { abstract class GeneralStatsBuffers(durationInSec: Long) {


val generalStatsBuffers: mutable.Map[BufferKey, GeneralStatsBuffer] = new JHashMap[BufferKey, GeneralStatsBuffer] val generalStatsBuffers: mutable.Map[BufferKey, GeneralStatsBuffer] = new JHashMap[BufferKey, GeneralStatsBuffer]


def getGeneralStatsBuffers(request: Option[String], group: Option[Group], status: Option[RequestStatus]): GeneralStatsBuffer = def getGeneralStatsBuffers(request: Option[String], group: Option[Group], status: Option[RequestStatus]): GeneralStatsBuffer =
generalStatsBuffers.getOrElseUpdate(computeKey(request, group, status), new GeneralStatsBuffer(durationInSec)) generalStatsBuffers.getOrElseUpdate(computeKey(request, group, status), new GeneralStatsBuffer(durationInSec))


def updateGeneralStatsBuffers(record: ActionRecord, group: Option[Group]) { def updateGeneralStatsBuffers(record: ActionRecord, group: Option[Group]) {
recursivelyUpdate(record, group) { (record, group) =>
getGeneralStatsBuffers(None, group, None).update(record.responseTime)
getGeneralStatsBuffers(None, group, Some(record.status)).update(record.responseTime)
}

getGeneralStatsBuffers(Some(record.request), group, None).update(record.responseTime) getGeneralStatsBuffers(Some(record.request), group, None).update(record.responseTime)
getGeneralStatsBuffers(Some(record.request), group, Some(record.status)).update(record.responseTime) getGeneralStatsBuffers(Some(record.request), group, Some(record.status)).update(record.responseTime)

getGeneralStatsBuffers(None, None, None).update(record.responseTime)
getGeneralStatsBuffers(None, None, Some(record.status)).update(record.responseTime)
}

def updateGroupGeneralStatsBuffers(duration: Int, group: Group) {
getGeneralStatsBuffers(None, Some(group), None).update(duration)
getGeneralStatsBuffers(None, Some(group), Some(OK)).update(duration)
} }


class GeneralStatsBuffer(duration: Long) extends CountBuffer { class GeneralStatsBuffer(duration: Long) extends CountBuffer {
Expand Down
Expand Up @@ -21,42 +21,33 @@ import scala.collection.JavaConversions._
import scala.collection.mutable import scala.collection.mutable


import com.excilys.ebi.gatling.core.result.Group import com.excilys.ebi.gatling.core.result.Group
import com.excilys.ebi.gatling.charts.result.reader.GroupRecord


trait GroupBuffers extends Buffers { trait GroupBuffers {


class GroupStack { class GroupStack {
val stack = new JLinkedList[(Option[Group], Long)] val stack = new JLinkedList[(GroupRecord, Group)]

def start(groupName: Option[String], time: Long) {
val group = groupName match {
case Some(groupName) => Some(Group(groupName, getCurrentGroup()))
case None => None
}
stack.push((group, time))
}

def end(executionEnd: Long) {
val (group, executionStart) = stack.pop()


val duration = executionEnd - executionStart def start(record: GroupRecord) {
statsGroupBuffers += (group -> (duration max statsGroupBuffers.getOrElse(group, Long.MinValue))) stack.push((record, Group(record.group, getCurrentGroup)))
} }


def getCurrentGroup(): Option[Group] = stack.peek()._1 def end = stack.pop()

def getCurrentGroup(): Option[Group] = if (stack.isEmpty) None else Some(stack.peek()._2)
} }


val groupStacksByUserAndScenario: mutable.Map[(Int, String), GroupStack] = new JHashMap[(Int, String), GroupStack] val groupStacksByUserAndScenario: mutable.Map[(Int, String), GroupStack] = new JHashMap[(Int, String), GroupStack]
val statsGroupBuffers: mutable.Map[Option[Group], Long] = new JHashMap[Option[Group], Long] val statsGroupBuffers: mutable.Map[Option[Group], Long] = new JHashMap[Option[Group], Long]


def startGroup(user: Int, scenario: String, time: Long, group: Option[String]) { def startGroup(record: GroupRecord) {
groupStacksByUserAndScenario.getOrElseUpdate((user, scenario), new GroupStack).start(group, time) groupStacksByUserAndScenario.getOrElseUpdate((record.user, record.scenario), new GroupStack).start(record)
} }


def endGroup(user: Int, scenario: String, time: Long) { def endGroup(record: GroupRecord) =
groupStacksByUserAndScenario.getOrElseUpdate((user, scenario), throw new IllegalAccessException).end(time) groupStacksByUserAndScenario.getOrElseUpdate((record.user, record.scenario), throw new IllegalAccessException).end
}


def getCurrentGroup(user: Int, scenario: String) = groupStacksByUserAndScenario.getOrElseUpdate((user, scenario), new GroupStack).getCurrentGroup() def getCurrentGroup(user: Int, scenario: String) = groupStacksByUserAndScenario.getOrElseUpdate((user, scenario), new GroupStack).getCurrentGroup()


def getStatsGroupBuffer(group: Option[Group]) = statsGroupBuffers(group) //def getStatsGroupBuffer(group: Option[Group]) = statsGroupBuffers(group)
} }
Expand Up @@ -24,17 +24,13 @@ import com.excilys.ebi.gatling.charts.result.reader.ActionRecord
import com.excilys.ebi.gatling.core.result.Group import com.excilys.ebi.gatling.core.result.Group
import com.excilys.ebi.gatling.core.result.message.RequestStatus import com.excilys.ebi.gatling.core.result.message.RequestStatus


trait LatencyPerSecBuffers extends Buffers { trait LatencyPerSecBuffers {


val latencyPerSecBuffers: mutable.Map[BufferKey, RangeBuffer] = new JHashMap[BufferKey, RangeBuffer] val latencyPerSecBuffers: mutable.Map[BufferKey, RangeBuffer] = new JHashMap[BufferKey, RangeBuffer]


def getLatencyPerSecBuffers(requestName: Option[String], group: Option[Group], status: Option[RequestStatus]): RangeBuffer = latencyPerSecBuffers.getOrElseUpdate(computeKey(requestName, group, status), new RangeBuffer) def getLatencyPerSecBuffers(requestName: Option[String], group: Option[Group], status: Option[RequestStatus]): RangeBuffer = latencyPerSecBuffers.getOrElseUpdate(computeKey(requestName, group, status), new RangeBuffer)


def updateLatencyPerSecBuffers(record: ActionRecord, group: Option[Group]) { def updateLatencyPerSecBuffers(record: ActionRecord, group: Option[Group]) {
recursivelyUpdate(record, group) {
(record, group) => getLatencyPerSecBuffers(None, group, Some(record.status)).update(record.executionStartBucket, record.latency)
}

getLatencyPerSecBuffers(Some(record.request), group, Some(record.status)).update(record.executionStartBucket, record.latency) getLatencyPerSecBuffers(Some(record.request), group, Some(record.status)).update(record.executionStartBucket, record.latency)
} }
} }
Expand Up @@ -24,19 +24,17 @@ import com.excilys.ebi.gatling.charts.result.reader.ActionRecord
import com.excilys.ebi.gatling.core.result.Group import com.excilys.ebi.gatling.core.result.Group
import com.excilys.ebi.gatling.core.result.message.RequestStatus import com.excilys.ebi.gatling.core.result.message.RequestStatus


trait RequestsPerSecBuffers extends Buffers { trait RequestsPerSecBuffers {


val requestsPerSecBuffers: mutable.Map[BufferKey, CountBuffer] = new JHashMap[BufferKey, CountBuffer] val requestsPerSecBuffers: mutable.Map[BufferKey, CountBuffer] = new JHashMap[BufferKey, CountBuffer]


def getRequestsPerSecBuffer(requestName: Option[String], group: Option[Group], status: Option[RequestStatus]): CountBuffer = requestsPerSecBuffers.getOrElseUpdate(computeKey(requestName, group, status), new CountBuffer) def getRequestsPerSecBuffer(requestName: Option[String], group: Option[Group], status: Option[RequestStatus]): CountBuffer = requestsPerSecBuffers.getOrElseUpdate(computeKey(requestName, group, status), new CountBuffer)


def updateRequestsPerSecBuffers(record: ActionRecord, group: Option[Group]) { def updateRequestsPerSecBuffers(record: ActionRecord, group: Option[Group]) {
recursivelyUpdate(record, group) { (record, group) =>
getRequestsPerSecBuffer(None, group, None).update(record.executionStartBucket)
getRequestsPerSecBuffer(None, group, Some(record.status)).update(record.executionStartBucket)
}

getRequestsPerSecBuffer(Some(record.request), group, None).update(record.executionStartBucket) getRequestsPerSecBuffer(Some(record.request), group, None).update(record.executionStartBucket)
getRequestsPerSecBuffer(Some(record.request), group, Some(record.status)).update(record.executionStartBucket) getRequestsPerSecBuffer(Some(record.request), group, Some(record.status)).update(record.executionStartBucket)

getRequestsPerSecBuffer(None, None, None).update(record.executionStartBucket)
getRequestsPerSecBuffer(None, None, Some(record.status)).update(record.executionStartBucket)
} }
} }

0 comments on commit 5b05faa

Please sign in to comment.