package com.eucalyptus.ws.handlers; import java.util.concurrent.atomic.AtomicLong; import org.apache.log4j.Logger; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelPipelineCoverage; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; import com.eucalyptus.http.MappingHttpMessage; import com.eucalyptus.records.EventType; import edu.ucsb.eucalyptus.msgs.BaseMessage; import com.eucalyptus.records.EventRecord; @ChannelPipelineCoverage( "one" ) public class ChannelStateMonitor extends SimpleChannelHandler { private static Logger LOG = Logger.getLogger( ChannelStateMonitor.class ); private final AtomicLong readBytes = new AtomicLong( ); private final AtomicLong writeBytes = new AtomicLong( ); private AtomicLong openTime = new AtomicLong( ); private String eventUserId = "unknown"; private String correlationId = "unknown"; public void split( ChannelHandlerContext ctx ) { Long rb = readBytes.getAndSet( 0l ); Long wb = writeBytes.getAndSet( 0l ); Long roundTime = ( System.currentTimeMillis( ) - this.openTime.getAndSet( 0 ) ); LOG.trace( EventRecord.here( ctx.getPipeline( ).getLast( ).getClass( ), EventType.SOCKET_CLOSE, ""+roundTime.toString( ), ""+ctx.getChannel( ).getLocalAddress( ), ""+ctx.getChannel( ).getRemoteAddress( ) ) ); if( rb != null ) { LOG.trace( EventRecord.here( ctx.getPipeline( ).getLast( ).getClass( ), EventType.SOCKET_BYTES_READ, ""+rb, Float.toString( ( wb * 1024.0f ) / ( roundTime * 1024.0f ) ) ) ); } if( wb != null ) { LOG.trace( EventRecord.here( ctx.getPipeline( ).getLast( ).getClass( ), EventType.SOCKET_BYTES_WRITE, ""+wb, Float.toString( ( wb * 1024.0f ) / ( roundTime * 1024.0f ) ) ) ); } } @Override public void channelClosed( ChannelHandlerContext ctx, ChannelStateEvent e ) throws Exception { this.split( ctx ); super.channelClosed( ctx, e ); } @Override public void channelConnected( ChannelHandlerContext ctx, ChannelStateEvent e ) throws Exception { openTime.getAndSet( System.currentTimeMillis( ) ); EventRecord.here( ctx.getPipeline( ).getLast( ).getClass( ), EventType.SOCKET_OPEN, ctx.getChannel( ).getLocalAddress( ).toString( ), ctx.getChannel( ).getRemoteAddress( ).toString( ) ).trace( ); super.channelConnected( ctx, e ); } @Override public void messageReceived( ChannelHandlerContext ctx, MessageEvent e ) throws Exception { if ( e.getMessage( ) instanceof MappingHttpMessage ) { MappingHttpMessage msg = ( MappingHttpMessage ) e.getMessage( ); readBytes.addAndGet( msg.getContent( ).readableBytes( ) ); } else if ( e.getMessage( ) instanceof ChannelBuffer ) { ChannelBuffer msg = ( ChannelBuffer ) e.getMessage( ); readBytes.addAndGet( msg.readableBytes( ) ); } super.messageReceived( ctx, e ); } @Override public void writeRequested( ChannelHandlerContext ctx, MessageEvent e ) throws Exception { if ( e.getMessage( ) instanceof MappingHttpMessage ) { MappingHttpMessage msg = ( MappingHttpMessage ) e.getMessage( ); writeBytes.addAndGet( msg.getContent( ).readableBytes( ) ); if ( msg.getMessage( ) != null && msg.getMessage( ) instanceof BaseMessage ) { this.correlationId = ( ( BaseMessage ) msg.getMessage( ) ).getCorrelationId( ); this.eventUserId = ( ( BaseMessage ) msg.getMessage( ) ).getUserId( ); } } else if ( e.getMessage( ) instanceof ChannelBuffer ) { ChannelBuffer msg = ( ChannelBuffer ) e.getMessage( ); writeBytes.addAndGet( msg.readableBytes( ) ); } super.writeRequested( ctx, e ); } }