2007-11-17 02:53:02 +01:00
// serverProfiling.java
// (C) 2007 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany
// first published 17.11.2007 on http://yacy.net
//
// This is a part of YaCy, a peer-to-peer based web search engine
//
// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $
// $LastChangedRevision: 1986 $
// $LastChangedBy: orbiter $
//
// LICENSE
//
// 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
package de.anomic.server ;
import java.util.Iterator ;
2007-12-04 21:19:13 +01:00
import java.util.Map ;
2008-02-27 16:16:47 +01:00
import java.util.concurrent.ConcurrentHashMap ;
2008-03-30 23:17:12 +02:00
import java.util.concurrent.ConcurrentLinkedQueue ;
2007-11-17 02:53:02 +01:00
2009-01-30 23:44:20 +01:00
import de.anomic.kelondro.util.MemoryControl ;
2009-01-30 15:48:11 +01:00
2007-12-04 21:19:13 +01:00
public class serverProfiling extends Thread {
2008-09-03 01:49:48 +02:00
private static final Map < String , ConcurrentLinkedQueue < Event > > historyMaps = new ConcurrentHashMap < String , ConcurrentLinkedQueue < Event > > ( ) ; // value=TreeMap of Long/Event
private static final Map < String , Long > eventAccess = new ConcurrentHashMap < String , Long > ( ) ; // value: last time when this was accessed
2008-05-03 11:06:00 +02:00
private static serverProfiling systemProfiler = null ;
2007-12-04 21:19:13 +01:00
public static void startSystemProfiling ( ) {
systemProfiler = new serverProfiling ( 1000 ) ;
systemProfiler . start ( ) ;
}
public static void stopSystemProfiling ( ) {
systemProfiler . running = false ;
}
2007-11-17 02:53:02 +01:00
2008-08-02 14:12:04 +02:00
private final long delaytime ;
2007-12-04 21:19:13 +01:00
private boolean running ;
2008-08-02 14:12:04 +02:00
public serverProfiling ( final long time ) {
2007-12-04 21:19:13 +01:00
this . delaytime = time ;
running = true ;
}
public void run ( ) {
while ( running ) {
2009-01-30 16:33:00 +01:00
update ( " memory " , Long . valueOf ( MemoryControl . used ( ) ) ) ;
2007-12-04 21:19:13 +01:00
try {
Thread . sleep ( this . delaytime ) ;
2008-08-02 14:12:04 +02:00
} catch ( final InterruptedException e ) {
2007-12-04 21:19:13 +01:00
this . running = false ;
}
}
}
2008-08-02 14:12:04 +02:00
public static void update ( final String eventName , final Object eventPayload ) {
2007-12-04 21:19:13 +01:00
// get event history container
2008-09-03 01:49:48 +02:00
Long lastAcc = eventAccess . get ( eventName ) ;
if ( lastAcc = = null ) {
eventAccess . put ( eventName , new Long ( System . currentTimeMillis ( ) ) ) ;
} else {
if ( System . currentTimeMillis ( ) - lastAcc . longValue ( ) > 1000 ) {
eventAccess . put ( eventName , new Long ( System . currentTimeMillis ( ) ) ) ;
} else {
return ; // protect against too heavy load
}
}
ConcurrentLinkedQueue < Event > history = historyMaps . get ( eventName ) ;
if ( history ! = null ) {
2007-11-17 02:53:02 +01:00
2008-03-30 23:17:12 +02:00
// update entry
2008-09-03 01:49:48 +02:00
history . add ( new Event ( eventPayload ) ) ;
2008-03-30 23:17:12 +02:00
// clean up too old entries
Event e ;
2008-08-02 14:12:04 +02:00
final long now = System . currentTimeMillis ( ) ;
2008-03-30 23:17:12 +02:00
while ( history . size ( ) > 0 ) {
e = history . peek ( ) ;
if ( now - e . time < 600000 ) break ;
history . poll ( ) ;
}
} else {
2008-09-03 01:49:48 +02:00
history = new ConcurrentLinkedQueue < Event > ( ) ;
2008-03-30 23:17:12 +02:00
// update entry
2008-09-03 01:49:48 +02:00
history . add ( new Event ( eventPayload ) ) ;
2008-03-30 23:17:12 +02:00
// store map
historyMaps . put ( eventName , history ) ;
}
2007-12-04 21:19:13 +01:00
}
2008-08-02 14:12:04 +02:00
public static Iterator < Event > history ( final String eventName ) {
2008-03-30 23:17:12 +02:00
return ( historyMaps . containsKey ( eventName ) ? ( historyMaps . get ( eventName ) ) : new ConcurrentLinkedQueue < Event > ( ) ) . iterator ( ) ;
2007-11-17 02:53:02 +01:00
}
2007-12-04 21:19:13 +01:00
public static class Event {
public Object payload ;
2007-11-17 02:53:02 +01:00
public long time ;
2008-09-03 01:49:48 +02:00
public Event ( final Object payload ) {
2007-12-04 21:19:13 +01:00
this . payload = payload ;
this . time = System . currentTimeMillis ( ) ;
2007-11-17 02:53:02 +01:00
}
}
}