/*
* Created on May 19, 2005
* Created by Alon Rohter
* Copyright (C) 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program 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 General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package com.aelitis.azureus.core.networkmanager.impl;
import java.util.*;
import org.gudy.azureus2.core3.util.Timer;
import org.gudy.azureus2.core3.util.TimerEvent;
import org.gudy.azureus2.core3.util.TimerEventPerformer;
public class TransportStats {
private static final int PRINT_INTERVAL = 60*1000;
private static final int GRANULARITY = 10; //bytes
private final TreeMap read_sizes = new TreeMap();
private final TreeMap write_sizes = new TreeMap();
private long total_reads = 0;
private long total_writes = 0;
public TransportStats() {
Timer printer = new Timer("TransportStats:Printer");
printer.addPeriodicEvent(
PRINT_INTERVAL,
new TimerEventPerformer() {
public void perform( TimerEvent ev ) {
printStats();
}
}
);
}
public void bytesRead( int num_bytes_read ) {
total_reads++;
updateSizes( read_sizes, num_bytes_read );
}
public void bytesWritten( int num_bytes_written ) {
total_writes++;
updateSizes( write_sizes, num_bytes_written );
}
private void updateSizes( TreeMap io_sizes, int num_bytes ) {
Integer size_key;
if( num_bytes == 0 ) {
size_key = new Integer( 0 );
}
else {
size_key = new Integer( (num_bytes / GRANULARITY) +1 );
}
Long count = (Long)io_sizes.get( size_key );
if( count == null ) {
io_sizes.put( size_key, new Long( 1 ) );
}
else {
io_sizes.put( size_key, new Long( count.longValue() +1 ) );
}
}
private void printStats() {
System.out.println( "\n------------------------------" );
System.out.println( "***** TCP SOCKET READ SIZE STATS *****" );
printSizes( read_sizes, total_reads );
System.out.println( "\n***** TCP SOCKET WRITE SIZE STATS *****" );
printSizes( write_sizes, total_writes );
System.out.println( "------------------------------" );
}
private void printSizes( TreeMap size_map, long num_total ) {
int prev_high = 1;
for( Iterator it = size_map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = (Map.Entry)it.next();
int key = ((Integer)entry.getKey()).intValue();
long count = ((Long)entry.getValue()).longValue();
long percentage = (count *100) / num_total;
if( key == 0 ) {
if( percentage > 3 ) {
System.out.println( "[0 bytes]= x" +percentage+ "%" );
}
}
else {
int high = key * GRANULARITY;
if( percentage > 3 ) {
System.out.println( "[" +prev_high+ "-" +(high -1)+ " bytes]= x" +percentage+ "%" );
}
prev_high = high;
}
}
}
}