/**
*
*/
package vnet.sms.gateway.nettysupport.monitor.outgoing;
import static org.apache.commons.lang.Validate.notNull;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import vnet.sms.common.wme.acknowledge.SendLoginRequestAckEvent;
import vnet.sms.common.wme.acknowledge.SendLoginRequestNackEvent;
import vnet.sms.common.wme.send.SendPingRequestEvent;
import vnet.sms.gateway.nettysupport.ChannelUtils;
import vnet.sms.gateway.nettysupport.WindowedChannelHandler;
import com.yammer.metrics.core.Meter;
import com.yammer.metrics.core.MetricName;
import com.yammer.metrics.core.MetricsRegistry;
/**
* @author obergner
*
*/
public class OutgoingMessagesMonitoringChannelHandler<ID extends Serializable>
extends WindowedChannelHandler<ID> {
public static final String NAME = "vnet.sms.gateway:outgoing-messages-monitoring-handler";
private final MetricsRegistry metricsRegistry;
private Meter numberOfAcceptedLoginRequests;
private Meter numberOfRejectedLoginRequests;
private Meter numberOfSentPingRequests;
public OutgoingMessagesMonitoringChannelHandler(
final MetricsRegistry metricsRegistry) {
notNull(metricsRegistry, "Argument 'metricsRegistry' must not be null");
this.metricsRegistry = metricsRegistry;
}
/**
* @return the numberOfAcceptedLoginRequests
*/
public final Meter getNumberOfAcceptedLoginRequests() {
return this.numberOfAcceptedLoginRequests;
}
/**
* @return the numberOfRejectedLoginRequests
*/
public final Meter getNumberOfRejectedLoginRequests() {
return this.numberOfRejectedLoginRequests;
}
/**
* @return the numberOfSentPingRequests
*/
public final Meter getNumberOfSentPingRequests() {
return this.numberOfSentPingRequests;
}
@Override
protected void writePingRequestRequested(final ChannelHandlerContext ctx,
final SendPingRequestEvent<ID> e) throws Exception {
this.numberOfSentPingRequests.mark();
super.writePingRequestRequested(ctx, e);
}
@Override
protected void writeLoginRequestAcceptedRequested(
final ChannelHandlerContext ctx,
final SendLoginRequestAckEvent<ID> e) throws Exception {
this.numberOfAcceptedLoginRequests.mark();
super.writeLoginRequestAcceptedRequested(ctx, e);
}
@Override
protected void writeLoginRequestRejectedRequested(
final ChannelHandlerContext ctx,
final SendLoginRequestNackEvent<ID> e) throws Exception {
this.numberOfRejectedLoginRequests.mark();
super.writeLoginRequestRejectedRequested(ctx, e);
}
/**
* @see org.jboss.netty.channel.SimpleChannelUpstreamHandler#channelConnected(org.jboss.netty.channel.ChannelHandlerContext,
* org.jboss.netty.channel.ChannelStateEvent)
*/
@Override
public void channelConnected(final ChannelHandlerContext ctx,
final ChannelStateEvent e) throws Exception {
final Channel channel = ctx.getChannel();
this.numberOfAcceptedLoginRequests = this.metricsRegistry.newMeter(
numberOfAcceptedLoginRequestsMetricName(channel),
"login-request-accepted", TimeUnit.SECONDS);
this.numberOfRejectedLoginRequests = this.metricsRegistry.newMeter(
numberOfRejectedLoginRequestsMetricName(channel),
"login-request-rejected", TimeUnit.SECONDS);
this.numberOfSentPingRequests = this.metricsRegistry.newMeter(
numberOfSentPingRequestsMetricName(channel),
"ping-request-sent", TimeUnit.SECONDS);
super.channelOpen(ctx, e);
}
/**
* @see org.jboss.netty.channel.SimpleChannelUpstreamHandler#channelDisconnected(org.jboss.netty.channel.ChannelHandlerContext,
* org.jboss.netty.channel.ChannelStateEvent)
*/
@Override
public void channelDisconnected(final ChannelHandlerContext ctx,
final ChannelStateEvent e) throws Exception {
final Channel channel = ctx.getChannel();
this.metricsRegistry
.removeMetric(numberOfAcceptedLoginRequestsMetricName(channel));
this.metricsRegistry
.removeMetric(numberOfRejectedLoginRequestsMetricName(channel));
this.metricsRegistry
.removeMetric(numberOfSentPingRequestsMetricName(channel));
super.channelClosed(ctx, e);
}
private MetricName numberOfAcceptedLoginRequestsMetricName(
final Channel channel) {
return new MetricName(Channel.class, "accepted-login-requests",
ChannelUtils.toString(channel));
}
private MetricName numberOfSentPingRequestsMetricName(final Channel channel) {
return new MetricName(Channel.class, "sent-ping-requests",
ChannelUtils.toString(channel));
}
private MetricName numberOfRejectedLoginRequestsMetricName(
final Channel channel) {
return new MetricName(Channel.class, "rejected-login-requests",
ChannelUtils.toString(channel));
}
}