/**
*
*/
package org.minnal.metrics;
import java.util.concurrent.TimeUnit;
import org.minnal.core.MessageListenerAdapter;
import org.minnal.core.server.MessageContext;
import com.codahale.metrics.Clock;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
/**
* @author ganeshs
*
*/
public class ResponseMetricCollector extends MessageListenerAdapter {
public static final String EXCEPTIONS = "exceptions";
public static final String RESPONSE_TIME = "responseTime";
public static final String SUCCESSFUL = "successful";
public static final String START_TIME = "startTime";
private Clock clock = Clock.defaultClock();
@Override
public void onReceived(MessageContext context) {
context.addAttribute(START_TIME, clock.getTick());
}
private String formatName(String name){
String slashRemoved = CharMatcher.anyOf("/").trimAndCollapseFrom(name, '.');
return CharMatcher.anyOf("{}").removeFrom(slashRemoved);
}
protected String getMetricName(MessageContext context, String metricName) {
String name = null;
if (! Strings.isNullOrEmpty(context.getMatchedRoute())) {
name = context.getMatchedRoute();
} else {
name = context.getApplication().getConfiguration().getName();
}
name = formatName(name);
return MetricRegistry.name(name, context.getRequest().getMethod().toString(), metricName);
}
@Override
public void onSuccess(MessageContext context) {
context.addAttribute(SUCCESSFUL, context.getResponse().getStatus().code() < 400);
}
@Override
public void onComplete(MessageContext context) {
String name = null;
Boolean successful = (Boolean) context.getAttribute(SUCCESSFUL);
if (successful == null) {
name = MetricRegistry.name(context.getApplication().getConfiguration().getName(), EXCEPTIONS);
MetricRegistries.getRegistry(context.getApplication().getConfiguration().getName()).meter(name).mark();
} else {
if (! successful) {
name = getMetricName(context, Integer.toString(context.getResponse().getStatus().code()));
MetricRegistries.getRegistry(context.getApplication().getConfiguration().getName()).meter(name).mark();
}
name = getMetricName(context, RESPONSE_TIME);
Timer timer = MetricRegistries.getRegistry(context.getApplication().getConfiguration().getName()).timer(name);
timer.update(clock.getTick() - (Long) context.getAttribute(START_TIME), TimeUnit.NANOSECONDS);
}
}
}