blob: aaff7665114db03cc82c6ccf8e77b869b6c0e638 [file] [log] [blame]
package org.eclipse.osee.ote.message;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
import org.eclipse.osee.ote.core.log.TestLevel;
import org.eclipse.osee.ote.message.data.MessageData;
/**
* This class will time the send call of a message. From just after you call send to after socket.send() has been called.
*
* The results will be written to System.out or System.out and the Outfile, depending on which constructor you use.
*
* @author Andrew M. Finkbeiner
*
*/
public class MessageSendTrace extends TimeTrace {
private SendTimer sendTimer;
@SuppressWarnings("rawtypes")
private Message message;
private int maxFlag = Integer.MAX_VALUE;
private ITestLogger logger = null;
private TimeUnit timeUnit;
/**
* This version of the constructor will log results to the outfile.
*
* @param message
* @param logger
*/
@SuppressWarnings("rawtypes")
public MessageSendTrace(TimeUnit timeUnit, Message message, ITestLogger logger) {
this(timeUnit, message);
this.logger = logger;
}
@SuppressWarnings("rawtypes")
public MessageSendTrace(TimeUnit timeUnit, Message message) {
super(String.format("MessageSendTrace[%s]", message.getMessageName()));
this.timeUnit = timeUnit;
this.message = message;
sendTimer = new SendTimer(this);
}
/**
* Set the time that you want to flag for exceeding the expected time. It is in the scale of the passed in TimeUnit.
*
* @param maxFlagNS
*/
public void setMaxFlag(int maxFlag){
this.maxFlag = maxFlag;
}
public void addStartEvent(String message){
add(new TimeEvent(message));
}
@Override
public void start(){
super.start();
message.getDefaultMessageData().addSendListener(sendTimer);
}
@Override
public void stop(){
super.stop();
message.getDefaultMessageData().removeSendListener(sendTimer);
}
public void printResults(){
List<TimeEvent> events = get();
int count = 0;
int exceedanceCount = 0;
double average = 0.0;
double max = -1.0;
double min = -1.0;
SendEvent pre = null;
SendEvent post = null;
for(TimeEvent event:events){
if(event instanceof SendEvent){
SendEvent sendEvent = (SendEvent)event;
if(sendEvent.type == SendEventType.pre){
pre = sendEvent;
} else {
post = sendEvent;
}
}
if(pre != null && post != null){
long nanoDiff = post.getNanoTime() - pre.getNanoTime();
pre = null;
post = null;
count++;
long currentTime = timeUnit.convert(nanoDiff, TimeUnit.NANOSECONDS);
if(currentTime >= 0){
if(max < 0 || currentTime > max){
max = currentTime;
}
if(min < 0 || currentTime < min){
min = currentTime;
}
if(currentTime > maxFlag){
exceedanceCount++;
String maxMessage = String.format("%s: count[%d] %d [%d (count)] [%s]", getName(), count, currentTime, exceedanceCount, timeUnit.name());
System.out.println(maxMessage);
if(logger != null){
logger.log(TestLevel.ATTENTION, maxMessage, null);
}
}
average = (((count-1) * average) + currentTime)/count;
}
}
}
String summaryMessage = String.format("%s: count[%d] avg[%f] min[%f] max[%f] units[%s] { exceedanceCount [%d] (%d) }", getName(), count, average, min, max, timeUnit.name(), exceedanceCount, maxFlag);
if(logger != null){
logger.log(TestLevel.ATTENTION, summaryMessage, null);
}
System.out.println(summaryMessage);
}
private static class SendTimer implements IMessageSendListener {
private MessageSendTrace messageSendOperator;
public SendTimer(MessageSendTrace messageSendOperator) {
this.messageSendOperator = messageSendOperator;
}
@Override
public void onPreSend(MessageData messageData) {
messageSendOperator.add(new SendEvent(SendEventType.pre));
}
@Override
public void onPostSend(MessageData messageData) {
messageSendOperator.add(new SendEvent(SendEventType.post));
}
}
private static class SendEvent extends TimeEvent {
public final SendEventType type;
public SendEvent(SendEventType type) {
super(type.name());
this.type = type;
}
}
private enum SendEventType {
pre,
post
}
}