Return-Path: Delivered-To: apmail-commons-commits-archive@locus.apache.org Received: (qmail 61171 invoked from network); 29 Jan 2008 11:15:44 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 29 Jan 2008 11:15:44 -0000 Received: (qmail 24957 invoked by uid 500); 29 Jan 2008 11:15:33 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 24905 invoked by uid 500); 29 Jan 2008 11:15:32 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 24896 invoked by uid 99); 29 Jan 2008 11:15:32 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 29 Jan 2008 03:15:32 -0800 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 29 Jan 2008 11:15:03 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 725C11A9832; Tue, 29 Jan 2008 03:15:10 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r616258 - in /commons/sandbox/monitoring/trunk/src: main/java/org/apache/commons/monitoring/ main/java/org/apache/commons/monitoring/impl/ main/java/org/apache/commons/monitoring/reporting/ site/xdoc/ test/java/org/apache/commons/monitoring... Date: Tue, 29 Jan 2008 11:15:04 -0000 To: commits@commons.apache.org From: nicolas@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080129111510.725C11A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: nicolas Date: Tue Jan 29 03:15:00 2008 New Revision: 616258 URL: http://svn.apache.org/viewvc?rev=616258&view=rev Log: - Event based notification for StatValue threshold - some tiny doc - simplified ExecutionStack usage via StopWatches auto-registration and auto-cleanup Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java (with props) Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Counter.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Gauge.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/RepositoryBase.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleCounter.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleGauge.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleMonitor.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleValue.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java commons/sandbox/monitoring/trunk/src/site/xdoc/index.xml commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/MonitoringTest.java commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java?rev=616258&view=auto ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java (added) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java Tue Jan 29 03:15:00 2008 @@ -0,0 +1,51 @@ +/* + * 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.commons.monitoring; + +import java.util.Collection; + +/** + * A composite component that delegates to a primary implementation and + * maintains a set of secondary instances. + * + * @author Nicolas De Loof + */ +public interface Composite +{ + /** + * @return the primary instance + */ + T getPrimary(); + + /** + * @return an (unmodifiable) collection of secondary instances + */ + Collection getSecondary(); + + /** + * Register a secondary instance + * @param secondary + */ + public void addSecondary( T secondary ); + + /** + * Deregister a secondary instance + * @param secondary + */ + public void removeSecondary( T secondary ); +} Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Counter.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Counter.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Counter.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Counter.java Tue Jan 29 03:15:00 2008 @@ -18,12 +18,19 @@ package org.apache.commons.monitoring; /** + * A counter to collect application processed items (bytes received, lines processed by a batch, + * time elapsed by some processing ...). + * * @author Nicolas De Loof */ public interface Counter extends StatValue { + /** + * Add value to the counter. Delta should not be negative (in such case a Gauge should be used). + * @param delta + */ void add( long delta ); /** Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/ExecutionStack.java Tue Jan 29 03:15:00 2008 @@ -71,6 +71,22 @@ } /** + * + * @return true if all stopWatches are stopped (execution is finished) + */ + public static boolean isFinished() + { + for ( StopWatch stopWatch : getExecution() ) + { + if (!stopWatch.isStoped()) + { + return false; + } + } + return true; + } + + /** * @return the ordered list of StopWatches used during execution */ public static List getExecution() Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Gauge.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Gauge.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Gauge.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Gauge.java Tue Jan 29 03:15:00 2008 @@ -18,7 +18,7 @@ package org.apache.commons.monitoring; /** - * + * A StatValue to expose application state, or resource consumption (open connections, active threads, ...) * * @author Nicolas De Loof */ @@ -26,5 +26,8 @@ { void increment(); + void add( long delta ); + void decrement(); + } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java Tue Jan 29 03:15:00 2008 @@ -44,7 +44,7 @@ * based on a "role" String. The monitor can handle as many values as needed, * until any of them has a dedicated role. This allows to easily extend the * monitor by registering custom values. - * + * * @author Nicolas De Loof */ public interface Monitor @@ -79,10 +79,15 @@ StatValue getValue( String role ); /** + * Reset all StatValues (don't remove them) + */ + void reset(); + + /** * Register a StatValue to the monitor with the specified role. If the * monitor already had a StatValue for the specified role, the registration * is rejected and the method returns false - * + * * @param value the StatValue * @param role the StatValue role in the monitor. * @return false if there is already a StatValue for this Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitoring.java Tue Jan 29 03:15:00 2008 @@ -21,7 +21,7 @@ /** * Utility class for simpified application instrumentation - * + * * @author Nicolas De Loof */ public final class Monitoring @@ -66,6 +66,11 @@ public static void setRepository( Repository repository ) { Monitoring.repository = repository; + } + + public static Repository getRepository() + { + return repository; } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Repository.java Tue Jan 29 03:15:00 2008 @@ -34,30 +34,35 @@ /** * @return all monitors registered in the repository */ - public Collection getMonitors(); + Collection getMonitors(); /** * @param category a category name * @return all monitors in the repository that declare this category in * there Key */ - public Collection getMonitorsFromCategory( String category ); + Collection getMonitorsFromCategory( String category ); /** * @param subsystem a subsystem name * @return all monitors in the repository that declare this subsystem in * there Key */ - public Collection getMonitorsFromSubSystem( String subsystem ); + Collection getMonitorsFromSubSystem( String subsystem ); /** * @return the categories declared by monitors in the repository */ - public Set getCategories(); + Set getCategories(); /** * @return the subsystems declared by monitors in the repository */ - public Set getSubSystems(); + Set getSubSystems(); + + /** + * Reset all monitors (don't remove them) + */ + void reset(); } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StatValue.java Tue Jan 29 03:15:00 2008 @@ -17,6 +17,7 @@ package org.apache.commons.monitoring; + /** * A StatValue is a numerical indicator of some monitored * application state with support for simple statistics. @@ -38,6 +39,11 @@ void set( long l ); /** + * reset the statValue + */ + void reset(); + + /** * @return the minimum value */ long getMin(); @@ -60,4 +66,22 @@ */ double getStandardDeviation(); + void setMonitor( Monitor monitor ); + + Monitor getMonitor(); + + void setRole( String role ); + + String getRole(); + + void addListener( Listener listener ); + + void removeListener( Listener listener ); + + public static interface Listener + { + long getThreshold(); + + void exceeded( StatValue value, long l ); + } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/StopWatch.java Tue Jan 29 03:15:00 2008 @@ -43,6 +43,8 @@ /** Monitor that is notified of process execution state */ private final Monitor monitor; + private static boolean useExecutionStack; + /** * Constructor. *

@@ -60,6 +62,10 @@ { monitor.getGauge( Monitor.CONCURRENCY ).increment(); } + if ( useExecutionStack ) + { + ExecutionStack.push( this ); + } } /** @@ -127,6 +133,10 @@ monitor.getCounter( Monitor.PERFORMANCES ).add( getElapsedTime() ); } } + if ( useExecutionStack && ExecutionStack.isFinished() ) + { + ExecutionStack.clear(); + } } /** @@ -171,6 +181,10 @@ monitor.getGauge( Monitor.CONCURRENCY ).decrement(); } } + if ( useExecutionStack && ExecutionStack.isFinished() ) + { + ExecutionStack.clear(); + } } /** @@ -247,5 +261,16 @@ } return stb.toString(); + } + + /** + * Enable automatic registration to the ExecutionStack and cleanup after the + * last stopWatch has been stopped. + * + * @param useExecutionStack + */ + public static void setUseExecutionStack( boolean useExecutionStack ) + { + StopWatch.useExecutionStack = useExecutionStack; } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeCounter.java Tue Jan 29 03:15:00 2008 @@ -18,9 +18,13 @@ package org.apache.commons.monitoring.impl; import java.util.Collection; +import java.util.Collections; import java.util.concurrent.CopyOnWriteArrayList; +import org.apache.commons.monitoring.Composite; import org.apache.commons.monitoring.Counter; +import org.apache.commons.monitoring.Monitor; +import org.apache.commons.monitoring.StatValue.Listener; /** * A composite implementation of {@link Counter} that delegates to a primary @@ -32,12 +36,22 @@ * * @author Nicolas De Loof */ -public class CompositeCounter implements Counter +public class CompositeCounter implements Counter, Composite { private Counter primary; private Collection secondary; + public Counter getPrimary() + { + return primary; + } + + public Collection getSecondary() + { + return Collections.unmodifiableCollection( secondary ); + } + public CompositeCounter( Counter primary ) { super(); @@ -111,6 +125,41 @@ public String getUnit() { return primary.getUnit(); + } + + public void reset() + { + primary.reset(); + } + + public Monitor getMonitor() + { + return primary.getMonitor(); + } + + public String getRole() + { + return primary.getRole(); + } + + public void setMonitor( Monitor monitor ) + { + primary.setMonitor( monitor ); + } + + public void setRole( String role ) + { + primary.setRole( role ); + } + + public void addListener( Listener listener ) + { + primary.addListener( listener ); + } + + public void removeListener( Listener listener ) + { + primary.removeListener( listener ); } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeGauge.java Tue Jan 29 03:15:00 2008 @@ -18,9 +18,13 @@ package org.apache.commons.monitoring.impl; import java.util.Collection; +import java.util.Collections; import java.util.concurrent.CopyOnWriteArrayList; +import org.apache.commons.monitoring.Counter; import org.apache.commons.monitoring.Gauge; +import org.apache.commons.monitoring.Monitor; +import org.apache.commons.monitoring.StatValue.Listener; /** * A composite implementation of {@link Gauge} that delegates to a primary @@ -38,7 +42,15 @@ private Collection secondary; + public Gauge getPrimary() + { + return primary; + } + public Collection getSecondary() + { + return Collections.unmodifiableCollection( secondary ); + } public CompositeGauge( Gauge primary ) { @@ -67,6 +79,15 @@ } } + public void add( long delta ) + { + primary.add( delta ); + for ( Gauge gauge : secondary ) + { + gauge.add( delta ); + } + } + public synchronized void decrement() { primary.decrement(); @@ -113,6 +134,41 @@ public String getUnit() { return primary.getUnit(); + } + + public void reset() + { + primary.reset(); + } + + public Monitor getMonitor() + { + return primary.getMonitor(); + } + + public String getRole() + { + return primary.getRole(); + } + + public void setMonitor( Monitor monitor ) + { + primary.setMonitor( monitor ); + } + + public void setRole( String role ) + { + primary.setRole( role ); + } + + public void addListener( Listener listener ) + { + primary.addListener( listener ); + } + + public void removeListener( Listener listener ) + { + primary.removeListener( listener ); } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/RepositoryBase.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/RepositoryBase.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/RepositoryBase.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/RepositoryBase.java Tue Jan 29 03:15:00 2008 @@ -91,8 +91,8 @@ { Monitor monitor; monitor = new SimpleMonitor( key ); - monitor.setValue( new SimpleCounter(), Monitor.PERFORMANCES ); - monitor.setValue( new SimpleGauge(), Monitor.CONCURRENCY ); + monitor.setValue( new CompositeCounter( new SimpleCounter() ), Monitor.PERFORMANCES ); + monitor.setValue( new CompositeGauge( new SimpleGauge() ), Monitor.CONCURRENCY ); return monitor; } @@ -125,5 +125,14 @@ } } return filtered; + } + + + public void reset() + { + for ( Monitor monitor : monitors.values() ) + { + monitor.reset(); + } } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleCounter.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleCounter.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleCounter.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleCounter.java Tue Jan 29 03:15:00 2008 @@ -18,9 +18,11 @@ package org.apache.commons.monitoring.impl; import org.apache.commons.monitoring.Counter; +import org.apache.commons.monitoring.Monitor; public class SimpleCounter - extends SimpleValue implements Counter + extends SimpleValue + implements Counter { private long value; @@ -36,19 +38,34 @@ return value; } - /** - * {@inheritDoc} - */ - public synchronized void set( long l ) + public synchronized void reset() { - value = l; - computeStats( l ); + sum = 0; + sumOfSquares = 0; + value = 0; } - public synchronized void add( long delta ) + /** + * {@inheritDoc} + */ + public void set( long l ) { - value += delta; - computeStats( delta ); + synchronized ( this ) + { + value = l; + computeStats( l ); + } + notifyValueChanged( l ); + } + + public void add( long delta ) + { + synchronized ( this ) + { + value += delta; + computeStats( delta ); + } + notifyValueChanged( delta ); } @Override @@ -62,7 +79,7 @@ @Override public double getMean() { - return ((double) sum) / getHits(); + return ( (double) sum ) / getHits(); } @Override @@ -77,7 +94,5 @@ // TODO Auto-generated method stub return 0; } - - } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleGauge.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleGauge.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleGauge.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleGauge.java Tue Jan 29 03:15:00 2008 @@ -18,6 +18,7 @@ package org.apache.commons.monitoring.impl; import org.apache.commons.monitoring.Gauge; +import org.apache.commons.monitoring.Monitor; /** * Simple implementation of a Gauge. Maintains a total of (value * time) on each @@ -40,16 +41,55 @@ // Use a double so that unset can be detected as "Not a Number" private double firstUse = Double.NaN; - public synchronized void increment() + public synchronized void reset() { - long now = nanoTime(); - computeSums( now ); - computeStats( ++value ); - lastUse = now; + // Don't reset value ! + sum = 0; + sumOfSquares = 0; + lastUse = 0; + firstUse = Double.NaN; + } + + public void increment() + { + long l; + synchronized ( this ) + { + computeSums(); + l = ++value; + computeStats( l ); + } + notifyValueChanged( l ); } - private void computeSums( long now ) + public void add( long delta ) { + long l; + synchronized ( this ) + { + computeSums(); + value += delta; + l = value; + computeStats( value ); + } + notifyValueChanged( l ); + } + + public void decrement() + { + long l; + synchronized ( this ) + { + computeSums(); + l = --value; + computeStats( l ); + } + notifyValueChanged( l ); + } + + protected void computeSums() + { + long now = nanoTime(); if ( Double.isNaN( firstUse ) ) { firstUse = now; @@ -57,10 +97,11 @@ else { long delta = now - lastUse; - long s = get() * delta; + long s = value * delta; sum += s; sumOfSquares += s * s; } + lastUse = now; } protected long nanoTime() @@ -68,14 +109,6 @@ return System.nanoTime(); } - public synchronized void decrement() - { - long now = nanoTime(); - computeSums( now ); - computeStats( --value ); - lastUse = now; - } - @Override public synchronized double getMean() { @@ -100,14 +133,11 @@ return value; } - public void set( long l ) + public synchronized void set( long l ) { - long now = nanoTime(); - computeSums( now ); - computeStats( ++value ); + computeSums(); value = l; - lastUse = now; + computeStats( value ); } - } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleMonitor.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleMonitor.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleMonitor.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleMonitor.java Tue Jan 29 03:15:00 2008 @@ -71,7 +71,17 @@ public boolean setValue( StatValue value, String role ) { + value.setMonitor( this ); + value.setRole( role ); return values.putIfAbsent( role, value ) != null; + } + + public void reset() + { + for ( StatValue value : values.values() ) + { + value.reset(); + } } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleValue.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleValue.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleValue.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/SimpleValue.java Tue Jan 29 03:15:00 2008 @@ -17,6 +17,10 @@ package org.apache.commons.monitoring.impl; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.commons.monitoring.Monitor; import org.apache.commons.monitoring.StatValue; /** @@ -28,6 +32,10 @@ public abstract class SimpleValue implements StatValue { + private Monitor monitor; + + private String role; + private int hits; private long max; @@ -36,12 +44,23 @@ private String unit; + private List listeners = new CopyOnWriteArrayList(); + + public void addListener( Listener listener ) + { + listeners.add( listener ); + } + + public void removeListener( Listener listener ) + { + listeners.remove( listener ); + } + /** * {@inheritDoc} */ public abstract double getMean(); - /** * {@inheritDoc} */ @@ -71,6 +90,18 @@ hits++; } + protected void notifyValueChanged( long l ) + { + // Notify listeners if Threshold exceeded + for ( Listener listener : listeners ) + { + if ( listener.getThreshold() < l ) + { + listener.exceeded( this, l ); + } + } + } + /** * Computes the * {@link http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance} @@ -103,5 +134,25 @@ public int getHits() { return hits; + } + + public Monitor getMonitor() + { + return monitor; + } + + public String getRole() + { + return role; + } + + public void setMonitor( Monitor monitor ) + { + this.monitor = monitor; + } + + public void setRole( String role ) + { + this.role = role; } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java Tue Jan 29 03:15:00 2008 @@ -17,16 +17,19 @@ package org.apache.commons.monitoring.reporting; +import java.util.Arrays; import java.util.Collection; import org.apache.commons.monitoring.Monitor; /** * Render a collection of monitor for reporting - * + * * @author Nicolas De Loof */ public interface Renderer { + Collection DEFAULT_ROLES = Arrays.asList( new String[] { Monitor.CONCURRENCY, Monitor.PERFORMANCES } ); + void render( Collection monitors ); } Modified: commons/sandbox/monitoring/trunk/src/site/xdoc/index.xml URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/site/xdoc/index.xml?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/site/xdoc/index.xml (original) +++ commons/sandbox/monitoring/trunk/src/site/xdoc/index.xml Tue Jan 29 03:15:00 2008 @@ -25,9 +25,31 @@

+

+ Commons Monitoring provides a simple, lightweight toolkit to instrument java application. + Default monitoring capabilities includes performances and thread concurrency, but can easily be + extended to expose application state and resource monitoring, based on Counters and Gauges. +

+
+
+

+ A Monitor defines a control point in the application. It can be associated to a resource, + a code fragment or anything relevant for the application. The monitor is unique and retrieved from + a Repository. It is identified by a name, a category (technical description of the application + component) and a subsystem (functional description). +

+

+ The monitor maintains a set of StatValues, that can be either Counters or Gauges. A + Counter will get incremented any time the application does its work and expose the result to + the monitoring backbone (byte received, lines processed, ...). A Gauge allows the application to + expose how a resource is used (active connections). Each StatValue is identified by a ROLE in the + monitor. +

- Commons Monitoring. + Commons Monitoring provides Helpers to instrument application, for example to monitor web application + Request or JDBC operations, so that in many case you don't have to know commons-monitoring API to + get basic instrumentation on your application.

Modified: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/MonitoringTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/MonitoringTest.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/MonitoringTest.java (original) +++ commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/MonitoringTest.java Tue Jan 29 03:15:00 2008 @@ -44,4 +44,47 @@ stopWatch1.stop(); assertEquals( 0, concurrency.get() ); } + + public void testListeners() + throws Exception + { + Repository repository = new RepositoryBase(); + final Monitor monitor = repository.getMonitor( "MonitoringTest.testMonitoring", "test", "utils" ); + Counter counter = monitor.getCounter( Monitor.PERFORMANCES ); + + TestListener listener = new TestListener( monitor ); + counter.addListener( listener ); + + counter.add( 1 ); + assertEquals( "unexpected listener notification", 0, listener.count ); + counter.add( 10 ); + assertEquals( "listener didn't get notified", 1, listener.count ); + } + + private final class TestListener + implements StatValue.Listener + { + private final Monitor monitor; + + long count = 0; + + private TestListener( Monitor monitor ) + { + this.monitor = monitor; + } + + public void exceeded( StatValue value, long l ) + { + count++; + assertEquals( 10, l ); + assertEquals( Monitor.PERFORMANCES, value.getRole() ); + assertEquals( monitor, value.getMonitor() ); + } + + public long getThreshold() + { + return 5; + } + } + } Modified: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java?rev=616258&r1=616257&r2=616258&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java (original) +++ commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/reporting/RendererTest.java Tue Jan 29 03:15:00 2008 @@ -20,7 +20,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; @@ -36,8 +35,6 @@ public class RendererTest extends TestCase { - Collection roles = Arrays.asList( new String[] { Monitor.CONCURRENCY, Monitor.PERFORMANCES } ); - Collection monitors; @Override @@ -62,7 +59,7 @@ throws Exception { StringWriter out = new StringWriter(); - Renderer renderer = new JsonRenderer( new PrintWriter( out ), roles ); + Renderer renderer = new JsonRenderer( new PrintWriter( out ), Renderer.DEFAULT_ROLES ); renderer.render( monitors ); assertEqualsIgnoreLineEnds( expected( "js" ), out.toString() ); } @@ -71,7 +68,7 @@ throws Exception { StringWriter out = new StringWriter(); - Renderer renderer = new XmlRenderer( new PrintWriter( out ), roles ); + Renderer renderer = new XmlRenderer( new PrintWriter( out ), Renderer.DEFAULT_ROLES ); renderer.render( monitors ); assertEqualsIgnoreLineEnds( expected( "xml" ), out.toString() ); } @@ -80,7 +77,7 @@ throws Exception { StringWriter out = new StringWriter(); - Renderer renderer = new TxtRenderer( new PrintWriter( out ), roles ); + Renderer renderer = new TxtRenderer( new PrintWriter( out ), Renderer.DEFAULT_ROLES ); renderer.render( monitors ); assertEqualsIgnoreLineEnds( expected( "txt" ), out.toString() ); }