You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by jv...@apache.org on 2006/09/05 14:46:17 UTC
svn commit: r440334 - in
/directory/sandbox/jvermillard/jmx/src/org/apache/mina: ./ jmx/
jmx/IoServiceManager.java jmx/IoServiceManagerMBean.java
jmx/IoSessionManager.java jmx/IoSessionManagerMBean.java stats/
stats/StatCollector.java
Author: jvermillard
Date: Tue Sep 5 05:46:17 2006
New Revision: 440334
URL: http://svn.apache.org/viewvc?view=rev&rev=440334
Log:
* throughput stats collector
* JMX MBeans for IoService and IoSession
Added:
directory/sandbox/jvermillard/jmx/src/org/apache/mina/
directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/
directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManager.java
directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManagerMBean.java
directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManager.java
directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManagerMBean.java
directory/sandbox/jvermillard/jmx/src/org/apache/mina/stats/
directory/sandbox/jvermillard/jmx/src/org/apache/mina/stats/StatCollector.java
Added: directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManager.java
URL: http://svn.apache.org/viewvc/directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManager.java?view=auto&rev=440334
==============================================================================
--- directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManager.java (added)
+++ directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManager.java Tue Sep 5 05:46:17 2006
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.mina.jmx;
+
+
+import java.net.SocketAddress;
+import java.util.Iterator;
+
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
+import org.apache.mina.common.IoServiceListener;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.stats.StatCollector;
+
+
+/**
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ */
+public class IoServiceManager implements IoServiceManagerMBean
+{
+ private IoService service;
+
+ private StatCollector collector = null;
+
+
+ public IoServiceManager( IoService service )
+ {
+ this.service = service;
+ }
+
+
+ public int getManagedSessionCount()
+ {
+
+ int count = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ count += service.getManagedSessions( element ).size();
+ }
+ return count;
+ }
+
+
+ public void startCollectingStats( int millisecondsPolling )
+ {
+ if ( collector != null && collector.isRunning() )
+ {
+ throw new RuntimeException( "Already collecting stats" );
+ }
+
+ collector = new StatCollector( service, millisecondsPolling );
+ collector.start();
+
+ }
+
+
+ public void stopCollectingStats()
+ {
+ if ( collector != null && collector.isRunning() )
+ collector.stop();
+
+ }
+
+
+ public float getTotalByteReadThroughput()
+ {
+ float total = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ total += ( ( StatCollector.IoSessionStats ) session.getAttribute( StatCollector.STAT_ID ) )
+ .getByteReadThroughput();
+ }
+ }
+ return total;
+ }
+
+
+ public float getTotalByteWrittenThroughput()
+ {
+ float total = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ total += ( ( StatCollector.IoSessionStats ) session.getAttribute( StatCollector.STAT_ID ) )
+ .getByteWrittenThroughput();
+ }
+ }
+ return total;
+ }
+
+
+ public float getTotalMessageReadThroughput()
+ {
+ float total = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ total += ( ( StatCollector.IoSessionStats ) session.getAttribute( StatCollector.STAT_ID ) )
+ .getMessageReadThroughput();
+ }
+ }
+ return total;
+ }
+
+
+ public float getTotalMessageWrittenThroughput()
+ {
+ float total = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ total += ( ( StatCollector.IoSessionStats ) session.getAttribute( StatCollector.STAT_ID ) )
+ .getMessageWrittenThroughput();
+ }
+ }
+ return total;
+ }
+
+
+ public float getAverageByteReadThroughput()
+ {
+ float total = 0;
+ int count = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ total += ( ( StatCollector.IoSessionStats ) session.getAttribute( StatCollector.STAT_ID ) )
+ .getByteReadThroughput();
+ count++;
+ }
+ }
+ return total / count;
+ }
+
+
+ public float getAverageByteWrittenThroughput()
+ {
+ float total = 0;
+ int count = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ total += ( ( StatCollector.IoSessionStats ) session.getAttribute( StatCollector.STAT_ID ) )
+ .getByteWrittenThroughput();
+ count++;
+ }
+ }
+ return total / count;
+ }
+
+
+ public float getAverageMessageReadThroughput()
+ {
+ float total = 0;
+ int count = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ total += ( ( StatCollector.IoSessionStats ) session.getAttribute( StatCollector.STAT_ID ) )
+ .getMessageReadThroughput();
+ count++;
+ }
+ }
+ return total / count;
+ }
+
+
+ public float getAverageMessageWrittenThroughput()
+ {
+ float total = 0;
+ int count = 0;
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ total += ( ( StatCollector.IoSessionStats ) session.getAttribute( StatCollector.STAT_ID ) )
+ .getMessageWrittenThroughput();
+ count++;
+ }
+ }
+ return total / count;
+ }
+
+
+ public void closeAllSessions()
+ {
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter2.next();
+ session.close();
+ }
+ }
+
+ }
+}
Added: directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManagerMBean.java
URL: http://svn.apache.org/viewvc/directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManagerMBean.java?view=auto&rev=440334
==============================================================================
--- directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManagerMBean.java (added)
+++ directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoServiceManagerMBean.java Tue Sep 5 05:46:17 2006
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.mina.jmx;
+
+/**
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ */
+public interface IoServiceManagerMBean
+{
+ /**
+ * amount of session currently managed
+ * @return session count
+ */
+ int getManagedSessionCount();
+
+ /**
+ * start collecting throughput statistics for all the managed sessions
+ * @param millisecondsPolling polling time in milliseconds like 5000 for computing throughput every 5 seconds
+ */
+ void startCollectingStats(int millisecondsPolling);
+
+ /**
+ * stop collecting throughput statistics
+ */
+ void stopCollectingStats();
+
+ /**
+ * bytes read per seconds sum of all the managed sessions
+ * @return bytes per seconds
+ */
+ float getTotalByteReadThroughput();
+
+ /**
+ * bytes written per seconds sum for all the managed sessions
+ * @return bytes per seconds
+ */
+ float getTotalByteWrittenThroughput();
+
+ /**
+ * messages read per seconds sum of all the managed sessions
+ * @return messages per seconds
+ */
+ float getTotalMessageReadThroughput();
+
+ /**
+ * messages written per seconds sum for all the managed sessions
+ * @return messages per seconds
+ */
+ float getTotalMessageWrittenThroughput();
+
+ /**
+ * average bytes read per seconds for all the managed sessions
+ * @return bytes per seconds
+ */
+ float getAverageByteReadThroughput();
+
+ /**
+ * average bytes written per seconds for all the managed sessions
+ * @return bytes per seconds
+ */
+ float getAverageByteWrittenThroughput();
+
+ /**
+ * average messages read per seconds for all the managed sessions
+ * @return messages per seconds
+ */
+ float getAverageMessageReadThroughput();
+
+ /**
+ * average messages written per seconds for all the managed sessions
+ * @return messages per seconds
+ */
+ float getAverageMessageWrittenThroughput();
+
+ /**
+ * close all the managed sessions
+ */
+ void closeAllSessions();
+
+}
\ No newline at end of file
Added: directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManager.java
URL: http://svn.apache.org/viewvc/directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManager.java?view=auto&rev=440334
==============================================================================
--- directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManager.java (added)
+++ directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManager.java Tue Sep 5 05:46:17 2006
@@ -0,0 +1,257 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.mina.jmx;
+
+
+import java.util.Date;
+import java.util.List;
+
+
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.IoFilterChain;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.support.BaseIoSession;
+import org.apache.mina.filter.LoggingFilter;
+import org.apache.mina.stats.StatCollector;
+import org.apache.mina.stats.StatCollector.IoSessionStats;
+
+
+/**
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ */
+public class IoSessionManager implements IoSessionManagerMBean
+{
+
+ private IoSession session;
+
+
+ /**
+ * create the session manager
+ * @param session the MINA's session to manage
+ */
+ public IoSessionManager( IoSession session )
+ {
+ this.session = session;
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#isConnected()
+ */
+ public boolean isConnected()
+ {
+ return session.isConnected();
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getReadBytes()
+ */
+ public long getReadBytes()
+ {
+ return session.getReadBytes();
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getWrittenBytes()
+ */
+ public long getWrittenBytes()
+ {
+ return session.getWrittenBytes();
+ }
+
+
+ public long getReadMessages()
+ {
+ return ( ( BaseIoSession ) session ).getReadMessages();
+ }
+
+
+ public long getWrittenMessages()
+ {
+ return ( ( BaseIoSession ) session ).getWrittenMessages();
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#close()
+ */
+ public void close()
+ {
+ session.close().join();
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getCreationTime()
+ */
+ public Date getCreationTime()
+ {
+ return new Date( session.getCreationTime() );
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getLastIoTime()
+ */
+ public Date getLastIoTime()
+ {
+ return new Date( session.getLastIoTime() );
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getLastReadTime()
+ */
+ public Date getLastReadTime()
+ {
+ return new Date( session.getLastReadTime() );
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getLastWriteTime()
+ */
+ public Date getLastWriteTime()
+ {
+ return new Date( session.getLastWriteTime() );
+ }
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getInstalledFilters()
+ */
+ public String[] getInstalledFilters()
+ {
+ List filters = session.getFilterChain().getAll();
+ String[] res = new String[filters.size()];
+ for ( int i = 0; i < res.length; i++ )
+ {
+ res[i] = ( ( IoFilterChain.Entry ) filters.get( i ) ).getName();
+ }
+ return res;
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#addLastLoggingFilter()
+ */
+ public void addLastLoggingFilter()
+ {
+ LoggingFilter f = new LoggingFilter();
+ session.getFilterChain().addLast( "LoggerLast", f );
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#removeLastLoggingFilter()
+ */
+ public void removeLastLoggingFilter()
+ {
+
+ session.getFilterChain().remove( "LoggerLast" );
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#addFirstLoggingFilter()
+ */
+ public void addFirstLoggingFilter()
+ {
+ LoggingFilter f = new LoggingFilter();
+ session.getFilterChain().addFirst( "LoggerFirst", f );
+ }
+
+
+ public void removeFirstLoggingFilter()
+ {
+
+ session.getFilterChain().remove( "LoggerFirst" );
+ }
+
+
+ // IDLE monitoring
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getReadIdleTime()
+ */
+ public long getReadIdleTime()
+ {
+ return session.getIdleTimeInMillis( IdleStatus.READER_IDLE );
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getWriteIdleTime()
+ */
+ public long getWriteIdleTime()
+ {
+ return session.getIdleTimeInMillis( IdleStatus.WRITER_IDLE );
+ }
+
+
+ /**
+ * @see archean.util.mina.IoSessionManagerMBean#getBothIdleTime()
+ */
+ public long getBothIdleTime()
+ {
+ return session.getIdleTimeInMillis( IdleStatus.BOTH_IDLE );
+ }
+
+
+ public float getByteReadThroughtput()
+ {
+ IoSessionStats stats=(IoSessionStats)session.getAttribute(StatCollector.STAT_ID);
+ if(stats==null)
+ return Float.NaN;
+ else
+ return stats.getByteReadThroughput();
+ }
+
+
+ public float getByteWrittenThroughtput()
+ {
+ IoSessionStats stats=(IoSessionStats)session.getAttribute(StatCollector.STAT_ID);
+ if(stats==null)
+ return Float.NaN;
+ else
+ return stats.getByteWrittenThroughput();
+ }
+
+
+ public float getMessageReadThroughtput()
+ {
+ IoSessionStats stats=(IoSessionStats)session.getAttribute(StatCollector.STAT_ID);
+ if(stats==null)
+ return Float.NaN;
+ else
+ return stats.getMessageReadThroughput();
+ }
+
+
+ public float getMessageWrittenThroughtput()
+ {
+ IoSessionStats stats=(IoSessionStats)session.getAttribute(StatCollector.STAT_ID);
+ if(stats==null)
+ return Float.NaN;
+ else
+ return stats.getMessageWrittenThroughput();
+ }
+}
Added: directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManagerMBean.java
URL: http://svn.apache.org/viewvc/directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManagerMBean.java?view=auto&rev=440334
==============================================================================
--- directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManagerMBean.java (added)
+++ directory/sandbox/jvermillard/jmx/src/org/apache/mina/jmx/IoSessionManagerMBean.java Tue Sep 5 05:46:17 2006
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.mina.jmx;
+
+
+import java.util.Date;
+
+
+/**
+ * MBean interface for the session manager, it's used for instrumenting IoSession
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ */
+public interface IoSessionManagerMBean
+{
+ /**
+ * is the session is connected
+ * @return connection status
+ */
+ public boolean isConnected();
+
+
+ /**
+ * bytes read from the beginning
+ * @return total of bytes read
+ */
+ public long getReadBytes();
+
+
+ /**
+ * bytes written from the beginning
+ * @return total of bytes written
+ */
+ public long getWrittenBytes();
+
+
+ /**
+ * PDU decoded from the beginning. Only revelent if a ProtocolCodecFilter is installed.
+ * @return
+ */
+ public long getReadMessages();
+
+
+ /**
+ * PDU encoded from the beginning. Only revelent if a ProtocolCodecFilter is installed.
+ * @return
+ */
+ public long getWrittenMessages();
+
+
+ /**
+ * close the session
+ */
+ public void close();
+
+
+ /**
+ * when the session was created
+ * @return the date of session creation
+ */
+ public Date getCreationTime();
+
+
+ /**
+ * last time the session processed an IO
+ * @return date of last IO
+ */
+ public Date getLastIoTime();
+
+
+ /**
+ * last time the session processed a write
+ * @return date of last write
+ */
+ public Date getLastWriteTime();
+
+
+ /**
+ * last time the session processed an read
+ * @return date of last read
+ */
+ public Date getLastReadTime();
+
+ /**
+ * get the list of filters installed in the filter chain
+ * @return array of filter names
+ */
+ public String[] getInstalledFilters();
+
+ /**
+ * add a logging filter at end of the chain
+ */
+ public void addLastLoggingFilter();
+
+
+ /**
+ * remove the logging filter at end of the chain
+ */
+ public void removeLastLoggingFilter();
+
+
+ /**
+ * add a logging filter at begining of the chain
+ */
+ public void addFirstLoggingFilter();
+
+
+ /**
+ * remove the logging filter at begining of the chain
+ */
+ public void removeFirstLoggingFilter();
+
+
+ /**
+ * read and write IDLE time
+ * @return idle time in milli-seconds
+ */
+ public long getBothIdleTime();
+
+
+ /**
+ * read IDLE time
+ * @return read idle time in milli-seconds
+ */
+ public long getReadIdleTime();
+
+
+ /**
+ * write IDLE time
+ * @return write idle time in milli-seconds
+ */
+ public long getWriteIdleTime();
+
+
+ /**
+ * get the read bytes per second throughput
+ * works only if a stat collector is inspecting this session,
+ * @return read bytes per seconds
+ */
+ public float getByteReadThroughtput();
+
+ /**
+ * get the written bytes per second throughput
+ * works only if a stat collector is inspecting this session,
+ * @return written bytes per seconds
+ */
+ public float getByteWrittenThroughtput();
+
+ /**
+ * get the read messages per second throughput
+ * works only if a stat collector is inspecting this session, and only if a ProtocolDecoderFilter is used
+ * @return read messages per seconds
+ */
+ public float getMessageReadThroughtput();
+
+ /**
+ * get the written messages per second throughput
+ * works only if a stat collector is inspecting this session, and only if a ProtocolDecoderFilter is used
+ * @return written messages per seconds
+ */
+ public float getMessageWrittenThroughtput();
+
+}
\ No newline at end of file
Added: directory/sandbox/jvermillard/jmx/src/org/apache/mina/stats/StatCollector.java
URL: http://svn.apache.org/viewvc/directory/sandbox/jvermillard/jmx/src/org/apache/mina/stats/StatCollector.java?view=auto&rev=440334
==============================================================================
--- directory/sandbox/jvermillard/jmx/src/org/apache/mina/stats/StatCollector.java (added)
+++ directory/sandbox/jvermillard/jmx/src/org/apache/mina/stats/StatCollector.java Tue Sep 5 05:46:17 2006
@@ -0,0 +1,299 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.mina.stats;
+
+
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceConfig;
+import org.apache.mina.common.IoServiceListener;
+import org.apache.mina.common.IoSession;
+
+
+/**
+ * @author The Apache Directory Project (mina-dev@directory.apache.org)
+ */
+public class StatCollector
+{
+ private IoService service;
+
+ public static String STAT_ID = "StatCollected";
+
+ private Worker worker;
+
+ private int pollingInterval = 5000;
+
+ private ArrayList polledSessions;
+
+ private IoServiceListener serviceListener = new IoServiceListener()
+ {
+
+ public void serviceActivated( IoService service, SocketAddress serviceAddress, IoHandler handler,
+ IoServiceConfig config )
+ {
+ }
+
+
+ public void serviceDeactivated( IoService service, SocketAddress serviceAddress, IoHandler handler,
+ IoServiceConfig config )
+ {
+ }
+
+
+ public void sessionCreated( IoSession session )
+ {
+ addSession( session );
+ }
+
+
+ public void sessionDestroyed( IoSession session )
+ {
+ removeSession( session );
+ }
+
+ };
+
+ /**
+ * create a stat collector for the given given service with the default polling time
+ * @param service the IoService to inspect
+ */
+ public StatCollector( IoService service )
+ {
+ this(service,5000);
+
+ }
+
+ /**
+ * create a stat collector for the given given service
+ * @param service the IoService to inspect
+ * @param pollingInterval milliseconds
+ */
+ public StatCollector( IoService service, int pollingInterval )
+ {
+ this.service = service;
+ this.pollingInterval = pollingInterval;
+ }
+
+ /**
+ * start collecting stats
+ */
+ public void start()
+ {
+ if ( worker != null && worker.isAlive() )
+ throw new RuntimeException( "Stat collecting already started" );
+
+ // add all current sessions
+
+ polledSessions = new ArrayList();
+
+ for ( Iterator iter = service.getManagedServiceAddresses().iterator(); iter.hasNext(); )
+ {
+ SocketAddress element = ( SocketAddress ) iter.next();
+
+ for ( Iterator iter2 = service.getManagedSessions( element ).iterator(); iter2.hasNext(); )
+ {
+ addSession( ( IoSession ) iter2.next() );
+
+ }
+ }
+
+ // listen for new ones
+ service.addListener( serviceListener );
+
+ // start polling
+ worker = new Worker();
+ worker.start();
+ }
+
+ /**
+ * stop collecting stats
+ */
+ public void stop()
+ {
+ service.removeListener( serviceListener );
+
+ // stop worker
+ worker.stop = true;
+ try
+ {
+ synchronized ( worker )
+ {
+ worker.join();
+ }
+ }
+ catch ( InterruptedException e )
+ {
+ // ignore
+ }
+
+ polledSessions.clear();
+
+ }
+
+ /**
+ * is the stat collector collecting
+ * @return true if started
+ */
+ public boolean isRunning()
+ {
+ return worker != null && worker.stop != true;
+ }
+
+
+ private void addSession( IoSession session )
+ {
+ polledSessions.add( session );
+ session.setAttribute( STAT_ID, new IoSessionStats() );
+ }
+
+
+ private void removeSession( IoSession session )
+ {
+ polledSessions.remove( session );
+ session.removeAttribute( STAT_ID );
+ }
+
+ private class Worker extends Thread
+ {
+
+ boolean stop = false;
+
+
+ private Worker()
+ {
+ super( "StatCollectorWorker" );
+ }
+
+ public void run()
+ {
+ while ( !stop )
+ {
+ for ( Iterator iter = polledSessions.iterator(); iter.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter.next();
+ IoSessionStats sessStat = ( IoSessionStats ) session.getAttribute( STAT_ID );
+
+ sessStat.lastByteRead = session.getReadBytes();
+ sessStat.lastByteWrite = session.getWrittenBytes();
+ sessStat.lastMessageRead = session.getReadMessages();
+ sessStat.lastMessageWrite = session.getWrittenMessages();
+ }
+
+ // wait polling time
+ try
+ {
+ Thread.sleep( pollingInterval );
+ }
+ catch ( InterruptedException e )
+ {
+ }
+
+ for ( Iterator iter = polledSessions.iterator(); iter.hasNext(); )
+ {
+ IoSession session = ( IoSession ) iter.next();
+ IoSessionStats sessStat = ( IoSessionStats ) session.getAttribute( STAT_ID );
+
+ sessStat.byteReadThroughput = ( ( float ) ( session.getReadBytes() - sessStat.lastByteRead ) )
+ / ( ( ( float ) pollingInterval ) / 1000f );
+ sessStat.byteWrittenThroughput = ( ( float ) ( session.getWrittenBytes() - sessStat.lastByteWrite ) )
+ / ( ( ( float ) pollingInterval ) / 1000f );
+
+ sessStat.messageReadThroughput = ( ( float ) ( session.getReadMessages() - sessStat.lastMessageRead ) )
+ / ( ( ( float ) pollingInterval ) / 1000f );
+ sessStat.messageWrittenThroughput = ( ( float ) ( session.getWrittenMessages() - sessStat.lastMessageWrite ) )
+ / ( ( ( float ) pollingInterval ) / 1000f );
+
+ }
+
+ }
+ }
+ }
+
+ /**
+ * the collected stats for a session.
+ */
+ public class IoSessionStats
+ {
+
+ long lastByteRead = -1;
+ long lastByteWrite = -1;
+ long lastMessageRead = -1;
+ long lastMessageWrite = -1;
+
+ float byteWrittenThroughput = 0;
+ float byteReadThroughput = 0;
+
+ float messageWrittenThroughput = 0;
+ float messageReadThroughput = 0;
+
+
+ public float getByteReadThroughput()
+ {
+ return byteReadThroughput;
+ }
+
+
+ public float getByteWrittenThroughput()
+ {
+ return byteWrittenThroughput;
+ }
+
+
+ public long getLastByteRead()
+ {
+ return lastByteRead;
+ }
+
+
+ public long getLastByteWrite()
+ {
+ return lastByteWrite;
+ }
+
+
+ public long getLastMessageRead()
+ {
+ return lastMessageRead;
+ }
+
+
+ public long getLastMessageWrite()
+ {
+ return lastMessageWrite;
+ }
+
+
+ public float getMessageReadThroughput()
+ {
+ return messageReadThroughput;
+ }
+
+
+ public float getMessageWrittenThroughput()
+ {
+ return messageWrittenThroughput;
+ }
+ }
+
+}