/*
* Copyright 2012 Research Studios Austria Forschungsges.m.b.H.
*
* 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 won.bot.framework.eventbot.action.impl.monitor;
import org.javasimon.SimonManager;
import org.javasimon.Split;
import org.javasimon.Stopwatch;
import won.bot.framework.eventbot.EventListenerContext;
import won.bot.framework.eventbot.action.BaseEventBotAction;
import won.bot.framework.eventbot.event.Event;
import won.bot.framework.eventbot.event.impl.wonmessage.HintFromMatcherEvent;
import won.bot.framework.eventbot.event.impl.needlifecycle.NeedCreatedEvent;
import won.bot.framework.eventbot.listener.EventListener;
import java.util.*;
/**
* Created by hfriedrich on 02.10.2015.
*/
public class MatchingLoadTestMonitorAction extends BaseEventBotAction
{
Map<String, Long> needEventStartTime = Collections.synchronizedMap(new HashMap<>());
Map<String, List<Long>> hintEventReceivedTime = Collections.synchronizedMap(new HashMap<>());
Map<String, Split> needSplits = Collections.synchronizedMap(new HashMap<>());
private long startTestTime = -1;
public MatchingLoadTestMonitorAction(final EventListenerContext eventListenerContext) {
super(eventListenerContext);
}
@Override
protected void doRun(final Event event, EventListener executingListener) throws Exception {
Stopwatch stopwatch = SimonManager.getStopwatch("needHintFullRoundtrip");
if (event instanceof NeedCreatedEvent) {
Split split = stopwatch.start();
needSplits.put(((NeedCreatedEvent) event).getNeedURI().toString(), split);
logger.info("RECEIVED EVENT {} for uri {}", event, ((NeedCreatedEvent) event).getNeedURI().toString());
long startTime = System.currentTimeMillis();
String needUri = ((NeedCreatedEvent) event).getNeedURI().toString();
needEventStartTime.put(needUri, startTime);
} else if (event instanceof HintFromMatcherEvent) {
logger.info("RECEIVED EVENT {} for uri {}", event, ((HintFromMatcherEvent) event).getMatch().getFromNeed().toString());
long hintReceivedTime = System.currentTimeMillis();
String needUri = ((HintFromMatcherEvent) event).getMatch().getFromNeed().toString();
needSplits.get(((HintFromMatcherEvent) event).getMatch().getFromNeed().toString()).stop();
if (hintEventReceivedTime.get(needUri) == null) {
hintEventReceivedTime.put(needUri, new LinkedList<Long>());
}
hintEventReceivedTime.get(needUri).add(hintReceivedTime);
}
if (startTestTime == -1) {
startTestTime = System.currentTimeMillis();
}
logger.info("Number of Needs: {}", needEventStartTime.size());
logger.info("Number of Hints: {}", getTotalHints());
logger.info("Number of Needs with Hints: {}", getNeedsWithHints());
logger.info("Average Duration: {}", getAverageHintDuration());
logger.info("Minimum Duration: {}", getMinHintDuration());
logger.info("Maximum Duration: {}", getMaxHintDuration());
logger.info("Needs with Hints per Second: {}", getNeedsWithNeedsPerSecond(startTestTime));
logger.info("Hints per Second: {}", getHintsPerSecondThroughput(startTestTime));
}
private int getTotalHints() {
int total = 0;
for (List<Long> hintList : hintEventReceivedTime.values()) {
total += hintList.size();
}
return total;
}
private long getAverageHintDuration() {
long num = 0;
long duration = 0;
for (String needUri : hintEventReceivedTime.keySet()) {
long started = needEventStartTime.get(needUri);
for (Long received : hintEventReceivedTime.get(needUri)) {
num++;
duration += (received - started);
}
}
return (num != 0) ? duration / num : 0;
}
private long getMinHintDuration() {
long min = Long.MAX_VALUE;
for (String needUri : hintEventReceivedTime.keySet()) {
long started = needEventStartTime.get(needUri);
for (Long received : hintEventReceivedTime.get(needUri)) {
long duration = received - started;
if (duration < min) {
min = duration;
}
}
}
return min;
}
private long getMaxHintDuration() {
long max = 0;
for (String needUri : hintEventReceivedTime.keySet()) {
long started = needEventStartTime.get(needUri);
for (Long received : hintEventReceivedTime.get(needUri)) {
long duration = received - started;
if (duration > max) {
max = duration;
}
}
}
return max;
}
private long getNeedsWithHints() {
long numNeedsWithHints = 0;
for (String needUri : hintEventReceivedTime.keySet()) {
if (hintEventReceivedTime.get(needUri).size() != 0) {
numNeedsWithHints++;
}
}
return numNeedsWithHints;
}
private float getHintsPerSecondThroughput(long startTime) {
long duration = System.currentTimeMillis() - startTime;
return ((float) getTotalHints() * 1000) / duration;
}
private float getNeedsWithNeedsPerSecond(long startTime) {
long duration = System.currentTimeMillis() - startTime;
return ((float)getNeedsWithHints() * 1000) / duration;
}
}