/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.web.tomcat.statistics;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/** A session replication statistics collection class.
*
* @author Scott.Stark@jboss.org
* @version $Revision: 81134 $
*/
public class ReplicationStatistics implements Serializable
{
/** The serial version ID */
private static final long serialVersionUID = 9153807780893455734L;
/** A HashMap<String, TimeStatistic> of the method invocations */
private Map<String, TimeStatistic> ctxStats;
/** Time of the last resetStats call */
public long lastResetTime = System.currentTimeMillis();
public static class TimeStatistic
{
public long replicationCount;
public long minPassivationTime = Long.MAX_VALUE;
public long maxPassivationTime;
public long totalPassivationTime;
public long minReplicationTime = Long.MAX_VALUE;
public long maxReplicationTime;
public long totalReplicationlTime;
public long loadCount;
public long minLoadTime = Long.MAX_VALUE;
public long maxLoadTime;
public long totalLoadlTime;
public void reset()
{
replicationCount = 0;
minPassivationTime = Long.MAX_VALUE;
maxPassivationTime = 0;
totalPassivationTime = 0;
minReplicationTime = Long.MAX_VALUE;
maxReplicationTime = 0;
totalReplicationlTime = 0;
loadCount = 0;
minLoadTime = Long.MAX_VALUE;
maxLoadTime = 0;
totalLoadlTime = 0;
}
}
public ReplicationStatistics()
{
ctxStats = new ConcurrentHashMap<String, TimeStatistic>(256, 0.75f, 32);
}
public void updatePassivationStats(String ctx, long elapsed)
{
TimeStatistic stat = getTimeStatistic(ctx);
stat.totalPassivationTime += elapsed;
if( stat.minPassivationTime > elapsed )
stat.minPassivationTime = elapsed;
if( stat.maxPassivationTime < elapsed )
stat.maxPassivationTime = elapsed;
}
/** Update the TimeStatistic for the given ctx. This does not synchronize
* on the TimeStatistic so the results are an approximate values.
*
* @param ctx the method to update the statistics for.
* @param elapsed the elapsed time in milliseconds for the invocation.
*/
public void updateReplicationStats(String ctx, long elapsed)
{
TimeStatistic stat = getTimeStatistic(ctx);
stat.replicationCount ++;
stat.totalReplicationlTime += elapsed;
if( stat.minReplicationTime > elapsed )
stat.minReplicationTime = elapsed;
if( stat.maxReplicationTime < elapsed )
stat.maxReplicationTime = elapsed;
}
public void updateLoadStats(String ctx, long elapsed)
{
TimeStatistic stat = getTimeStatistic(ctx);
stat.loadCount ++;
stat.totalLoadlTime += elapsed;
if( stat.minLoadTime > elapsed )
stat.minLoadTime = elapsed;
if( stat.maxLoadTime < elapsed )
stat.maxLoadTime = elapsed;
}
/** Resets all current TimeStatistics.
*
*/
public void resetStats()
{
synchronized( ctxStats )
{
for(TimeStatistic stat: ctxStats.values())
{
stat.reset();
}
}
lastResetTime = System.currentTimeMillis();
}
public void removeStats(String id)
{
ctxStats.remove(id);
}
/** Access the current collection of ctx invocation statistics
*
* @return A HashMap<String, TimeStatistic> of the ctx invocations
*/
public Map<String, TimeStatistic> getStats()
{
return ctxStats;
}
public String toString()
{
StringBuffer tmp = new StringBuffer();
for(Map.Entry<String, TimeStatistic> entry : ctxStats.entrySet())
{
TimeStatistic stat = (TimeStatistic) entry.getValue();
if (stat != null)
{
tmp.append("[sessionID: ");
tmp.append(entry.getKey());
tmp.append(", replicationCount=");
tmp.append(stat.replicationCount);
tmp.append(", minPassivationTime=");
tmp.append(stat.minPassivationTime);
tmp.append(", maxPassivationTime=");
tmp.append(stat.maxPassivationTime);
tmp.append(", totalPassivationTime=");
tmp.append(stat.totalPassivationTime);
tmp.append(", minReplicationTime=");
tmp.append(stat.minReplicationTime);
tmp.append(", maxReplicationTime=");
tmp.append(stat.maxReplicationTime);
tmp.append(", totalReplicationlTime=");
tmp.append(stat.totalReplicationlTime);
tmp.append(", loadCount=");
tmp.append(stat.loadCount);
tmp.append(", minLoadTime=");
tmp.append(stat.minLoadTime);
tmp.append(", maxLoadTime=");
tmp.append(stat.maxLoadTime);
tmp.append(", totaLoadlTime=");
tmp.append(stat.totalLoadlTime);
tmp.append("];");
}
}
tmp.append(")");
return tmp.toString();
}
private TimeStatistic getTimeStatistic(String ctx)
{
TimeStatistic stat = (TimeStatistic) ctxStats.get(ctx);
if( stat == null )
{
stat = new TimeStatistic();
ctxStats.put(ctx, stat);
}
return stat;
}
}