Author: nicolas Date: Mon Feb 4 02:03:23 2008 New Revision: 618221 URL: http://svn.apache.org/viewvc?rev=618221&view=rev Log: secondary monitors : attach to live monitors, watch monitored activity and detach (base for history graphs and other time-based features)
Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java (with props) commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java - copied, changed from r616771, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java (with props) commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java (with props) commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java (with props) commons/sandbox/monitoring/trunk/src/site/resources/ commons/sandbox/monitoring/trunk/src/site/resources/images/ commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.png (with props) commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.xcf (with props) commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java (with props) Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.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/StopWatch.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.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/CompositeValuesMonitor.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java Modified: 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=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Composite.java Mon Feb 4 02:03:23 2008 @@ -33,13 +33,15 @@ Collection<T> getSecondary(); /** - * Register a secondary instance + * Create a secondary instance + * * @param secondary */ - public void addSecondary( T secondary ); + public T createSecondary(); /** * Deregister a secondary instance + * * @param secondary */ public void removeSecondary( T secondary ); 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=618221&r1=618220&r2=618221&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 Mon Feb 4 02:03:23 2008 @@ -17,6 +17,9 @@ package org.apache.commons.monitoring; +import java.util.Collection; + + /** * A <code>Monitor</code> is an abstraction of some application resource that * is instrumented with a set of indicators (Gauges or Counters). @@ -85,6 +88,18 @@ StatValue getValue( String role ); /** + * + * @return an unmodifiable collection of registered statValues roles + */ + Collection<String> getRoles(); + + /** + * + * @return an unmodifiable collection of registered statValues + */ + Collection<StatValue> getValues(); + + /** * Reset all StatValues (don't remove them) */ void reset(); @@ -205,5 +220,14 @@ return subsystem; } + } + + void addListener( Listener listener ); + + void removeListener( Listener listener ); + + public static interface Listener + { + void onStatValueRegistered( StatValue value ); } } 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=618221&r1=618220&r2=618221&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 Mon Feb 4 02:03:23 2008 @@ -57,7 +57,7 @@ { super(); this.monitor = monitor; - startedAt = nanotime(); + startedAt = time(); if ( monitor != null ) { monitor.getGauge( Monitor.CONCURRENCY ).increment(); @@ -81,7 +81,7 @@ else { // Still running ! - delay = nanotime() - startedAt - pauseDelay; + delay = time() - startedAt - pauseDelay; } return delay; } @@ -94,7 +94,7 @@ { if ( !paused && !stoped ) { - stopedAt = nanotime(); + stopedAt = time(); paused = true; } } @@ -106,7 +106,7 @@ { if ( paused && !stoped ) { - pauseDelay = nanotime() - stopedAt; + pauseDelay = time() - stopedAt; paused = false; stopedAt = 0; } @@ -120,7 +120,7 @@ { if ( !stoped ) { - long t = nanotime(); + long t = time(); if ( paused ) { pauseDelay = t - stopedAt; @@ -210,17 +210,16 @@ } /** - * Returns the current value of the most precise available system timer, in - * nanoseconds. The real precision depends on the JVM and the underlying - * system. On JRE before java5, <tt>backport-util-concurrent</tt> provides - * some limited support for equivalent timer. + * Simple benchmark demonstrates that java5 System.currentTimeMillis is FAR + * quicker than System.nanoTime. The lack of precision for using ms as time + * unit is not blocking for a monitoring toolkit (it may be for a profiler) * - * @see System#nanoTime() - * @return time in nanosecond + * @return time with ms precision + * @see org.apache.commons.monitoring.bench.CurrentTimeMillisVsNanoTime */ - protected long nanotime() + protected long time() { - return System.nanoTime(); + return System.currentTimeMillis(); } /** Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java?rev=618221&view=auto ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java (added) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java Mon Feb 4 02:03:23 2008 @@ -0,0 +1,108 @@ +/* + * 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.impl; + +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.apache.commons.monitoring.Counter; +import org.apache.commons.monitoring.Gauge; +import org.apache.commons.monitoring.Monitor; +import org.apache.commons.monitoring.StatValue; + +/** + * Abstract [EMAIL PROTECTED] Monitor} implementation with implementation for base methods + * + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + */ +public abstract class AbstractMonitor implements Monitor +{ + + private final ConcurrentMap<String, StatValue> values; + private final Key key; + + public AbstractMonitor( Key key ) + { + super(); + this.key = key; + this.values = new ConcurrentHashMap<String, StatValue>(); + } + + /** + * [EMAIL PROTECTED] + */ + public final Key getKey() + { + return key; + } + + /** + * [EMAIL PROTECTED] + */ + public final StatValue getValue( String role ) + { + return values.get( role ); + } + + public final Collection<String> getRoles() + { + return Collections.unmodifiableCollection( values.keySet() ); + } + + public final Collection<StatValue> getValues() + { + return Collections.unmodifiableCollection( values.values() ); + } + + /** + * Register a new StatValue in the monitor + * + * @param value StatValue instance to get registered + * @return a previously registered StatValue if existed, or <code>null</code> + * if value has been successfully registered + */ + protected <T extends StatValue> T register( T value ) + { + value.setMonitor( this ); + return (T) values.putIfAbsent( value.getRole(), value ); + } + + /** + * [EMAIL PROTECTED] + */ + public void reset() + { + for ( StatValue value : values.values() ) + { + value.reset(); + } + } + + public Counter getCounter( String role ) + { + return (Counter) getValue( role ); + } + + public Gauge getGauge( String role ) + { + return (Gauge) getValue( role ); + } + +} \ No newline at end of file Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java?rev=618221&view=auto ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java (added) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java Mon Feb 4 02:03:23 2008 @@ -0,0 +1,139 @@ +/* + * 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.impl; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.apache.commons.monitoring.Monitor; +import org.apache.commons.monitoring.Repository; +import org.apache.commons.monitoring.Monitor.Key; + +/** + * Abstract implementation of [EMAIL PROTECTED] Repository} with support for base methods + * + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + */ +public abstract class AbstractRepository + implements Repository +{ + private final ConcurrentMap<Monitor.Key, Monitor> monitors; + + public AbstractRepository() + { + super(); + this.monitors = new ConcurrentHashMap<Monitor.Key, Monitor>( 50 ); + } + + public Monitor getMonitor( String name ) + { + return getMonitor( name, null, null ); + } + + public Monitor getMonitor( String name, String category ) + { + return getMonitor( name, category, null ); + } + + public Monitor getMonitor( String name, String category, String subsystem ) + { + return getMonitor( new Monitor.Key( name, category, subsystem ) ); + } + + protected Monitor getMonitor( Key key ) + { + return monitors.get( key ); + } + + /** + * Register a new monitor in the repository + * + * @param monitor Monitor instance to get registered + * @return a previously registered monitor if existed, or <code>null</code> + * if monitor has been successfully registered + */ + protected Monitor register( Monitor monitor ) + { + return monitors.putIfAbsent( monitor.getKey(), monitor ); + } + + public Set<String> getCategories() + { + Set<String> categories = new HashSet<String>(); + for ( Key key : monitors.keySet() ) + { + categories.add( key.getCategory() ); + } + return categories; + } + + public Set<String> getSubSystems() + { + Set<String> subsystems = new HashSet<String>(); + for ( Key key : monitors.keySet() ) + { + subsystems.add( key.getSubsystem() ); + } + return subsystems; + } + + public Collection<Monitor> getMonitors() + { + return Collections.unmodifiableCollection( monitors.values() ); + } + + public Collection<Monitor> getMonitorsFromCategory( String category ) + { + Collection<Monitor> filtered = new LinkedList<Monitor>(); + for ( Monitor monitor : monitors.values() ) + { + if ( category.equals( monitor.getKey().getCategory() ) ) + { + filtered.add( monitor ); + } + } + return filtered; + } + + public Collection<Monitor> getMonitorsFromSubSystem( String subsystem ) + { + Collection<Monitor> filtered = new LinkedList<Monitor>(); + for ( Monitor monitor : monitors.values() ) + { + if ( subsystem.equals( monitor.getKey().getSubsystem() ) ) + { + filtered.add( monitor ); + } + } + return filtered; + } + + public void reset() + { + for ( Monitor monitor : monitors.values() ) + { + monitor.reset(); + } + } + +} \ No newline at end of file Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractRepository.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractStatValue.java Mon Feb 4 02:03:23 2008 @@ -46,6 +46,12 @@ private List<Listener> listeners = new CopyOnWriteArrayList<Listener>(); + public AbstractStatValue( String role ) + { + super(); + this.role = role; + } + public void addListener( Listener listener ) { listeners.add( listener ); 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=618221&r1=618220&r2=618221&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 Mon Feb 4 02:03:23 2008 @@ -43,15 +43,17 @@ return Collections.unmodifiableCollection( secondary ); } - public CompositeCounter() + public CompositeCounter( String role ) { - super(); + super( role ); this.secondary = new CopyOnWriteArrayList<Counter>(); } - public void addSecondary( Counter counter ) + public Counter createSecondary() { + Counter counter = new ThreadSafeCounter( getRole() ); secondary.add( counter ); + return counter; } public void removeSecondary( Counter counter ) 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=618221&r1=618220&r2=618221&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 Mon Feb 4 02:03:23 2008 @@ -43,16 +43,19 @@ return Collections.unmodifiableCollection( secondary ); } - public CompositeGauge() + public CompositeGauge( String role ) { - super(); + super( role ); this.secondary = new LinkedList<Gauge>(); } - public synchronized void addSecondary( Gauge gauge ) + public synchronized Gauge createSecondary() { + // Must be synchronized to ensure the new gauge shares the primary initial value + Gauge gauge = new ThreadSafeGauge( getRole() ); gauge.set( get() ); secondary.add( gauge ); + return gauge; } public synchronized void removeSecondary( Gauge gauge ) Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CompositeValuesMonitor.java Mon Feb 4 02:03:23 2008 @@ -34,15 +34,15 @@ } @Override - protected Counter newCounterInstance() + protected Counter newCounterInstance( String role ) { - return new CompositeCounter(); + return new CompositeCounter( role ); } @Override - protected Gauge newGaugeInstance() + protected Gauge newGaugeInstance( String role ) { - return new CompositeGauge(); + return new CompositeGauge( role ); } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/CreateValuesOnDemandMonitor.java Mon Feb 4 02:03:23 2008 @@ -28,7 +28,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> */ public class CreateValuesOnDemandMonitor - extends AbstractMonitor + extends ListenableMonitor { public CreateValuesOnDemandMonitor( Key key ) @@ -39,6 +39,7 @@ /** * Retrieve a Counter or create a new one for the role */ + @Override public Counter getCounter( String role ) { Counter counter = (Counter) getValue( role ); @@ -46,20 +47,24 @@ { return counter; } - return register( newCounterInstance(), role ); + counter = newCounterInstance( role ); + Counter previous = register( counter ); + return previous != null ? previous : counter; } /** * Create a new Counter instance */ - protected Counter newCounterInstance() + protected Counter newCounterInstance( String role ) { - return new ThreadSafeCounter(); + return new ThreadSafeCounter( role ); + } /** * Retrieve a Gauge or create a new one for the role */ + @Override public Gauge getGauge( String role ) { Gauge gauge = (Gauge) getValue( role ); @@ -67,15 +72,17 @@ { return gauge; } - return register( newGaugeInstance(), role ); + gauge = newGaugeInstance( role ); + Gauge previous = register( gauge ); + return previous != null ? previous : gauge; } /** * Create a new Gauge instance */ - protected Gauge newGaugeInstance() + protected Gauge newGaugeInstance( String role ) { - return new ThreadSafeGauge(); + return new ThreadSafeGauge( role ); } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/DefaultRepository.java Mon Feb 4 02:03:23 2008 @@ -17,32 +17,19 @@ package org.apache.commons.monitoring.impl; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedList; import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.commons.monitoring.Monitor; -import org.apache.commons.monitoring.Repository; -import org.apache.commons.monitoring.Monitor.Key; -public class DefaultRepository - implements Repository +public class DefaultRepository extends AbstractRepository { - public final ConcurrentMap<Monitor.Key, Monitor> monitors; - private List<Listener> listeners = new CopyOnWriteArrayList<Listener>(); public DefaultRepository() { super(); - this.monitors = new ConcurrentHashMap<Monitor.Key, Monitor>( 50 ); } public void addListener( Listener listener ) @@ -55,97 +42,27 @@ listeners.remove( listener ); } - public Monitor getMonitor( String name ) - { - return getMonitor( name, null, null ); - } - - public Monitor getMonitor( String name, String category ) - { - return getMonitor( name, category, null ); - } - - public Set<String> getCategories() - { - Set<String> categories = new HashSet<String>(); - for ( Key key : monitors.keySet() ) - { - categories.add( key.getCategory() ); - } - return categories; - } - - public Set<String> getSubSystems() - { - Set<String> subsystems = new HashSet<String>(); - for ( Key key : monitors.keySet() ) - { - subsystems.add( key.getSubsystem() ); - } - return subsystems; - } - - public Monitor getMonitor( String name, String category, String subsystem ) + public Monitor getMonitor( Monitor.Key key ) { - Monitor.Key key = new Monitor.Key( name, null, null ); - Monitor monitor = monitors.get( key ); + Monitor monitor = super.getMonitor( key ); if ( monitor == null ) { monitor = newMonitorInstance( key ); - - Monitor previous = monitors.putIfAbsent( key, monitor ); + Monitor previous = register( monitor ); if ( previous != null ) { - monitor = previous; - } - } - return monitor; - } - - protected Monitor newMonitorInstance( Monitor.Key key ) - { - Monitor monitor; - monitor = new CompositeValuesMonitor( key ); - return monitor; - } - - public Collection<Monitor> getMonitors() - { - return Collections.unmodifiableCollection( monitors.values() ); - } - - public Collection<Monitor> getMonitorsFromCategory( String category ) - { - Collection<Monitor> filtered = new LinkedList<Monitor>(); - for ( Monitor monitor : monitors.values() ) - { - if ( category.equals( monitor.getKey().getCategory() ) ) - { - filtered.add( monitor ); + return previous; } - } - return filtered; - } - - public Collection<Monitor> getMonitorsFromSubSystem( String subsystem ) - { - Collection<Monitor> filtered = new LinkedList<Monitor>(); - for ( Monitor monitor : monitors.values() ) - { - if ( subsystem.equals( monitor.getKey().getSubsystem() ) ) + for ( Listener listener : listeners ) { - filtered.add( monitor ); + listener.newMonitorInstance( monitor ); } } - return filtered; + return monitor; } - - public void reset() + protected Monitor newMonitorInstance( Monitor.Key key ) { - for ( Monitor monitor : monitors.values() ) - { - monitor.reset(); - } + return new CompositeValuesMonitor( key ); } } Copied: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java (from r616771, commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java) URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java?p2=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java&p1=commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java&r1=616771&r2=618221&rev=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/AbstractMonitor.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ListenableMonitor.java Mon Feb 4 02:03:23 2008 @@ -17,74 +17,62 @@ package org.apache.commons.monitoring.impl; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import org.apache.commons.monitoring.Monitor; import org.apache.commons.monitoring.StatValue; /** - * Abstract [EMAIL PROTECTED] Monitor} implementation with implementation fo base methods + * <code>Monitor</code> implementation with support for listeners * * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> */ -public abstract class AbstractMonitor implements Monitor +public abstract class ListenableMonitor extends AbstractMonitor implements Monitor { - protected final ConcurrentMap<String, StatValue> values; - protected final Key key; + private List<Listener> listeners; /** * Constructor * @param key the monitor identifier */ - public AbstractMonitor( Key key ) + public ListenableMonitor( Key key ) { - super(); - this.key = key; - this.values = new ConcurrentHashMap<String, StatValue>(); + super( key ); + this.listeners = new CopyOnWriteArrayList<Listener>(); } /** - * [EMAIL PROTECTED] - */ - public Key getKey() - { - return key; - } - - /** - * [EMAIL PROTECTED] - */ - public StatValue getValue( String role ) - { - return values.get( role ); - } - - /** * Register the StatValue for the role, if none was registered before * @param value * @param role * @return the value registered, or a previously existing one */ - public <T extends StatValue> T register( T value, String role ) + @Override + protected <T extends StatValue> T register( T value ) { - value.setMonitor( this ); - value.setRole( role ); - T previous = (T) values.putIfAbsent( role, value ); - return previous != null ? previous : value; + T previous = (T) super.register( value ); + if (previous != null) + { + return previous; + } + for ( Listener listener : listeners ) + { + listener.onStatValueRegistered( value ); + } + return null; } - /** - * [EMAIL PROTECTED] - */ - public void reset() + + public void addListener( Listener listener ) { - for ( StatValue value : values.values() ) - { - value.reset(); - } + listeners.add( listener ); } + public void removeListener( Listener listener ) + { + listeners.remove( listener ); + } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeCounter.java Mon Feb 4 02:03:23 2008 @@ -29,11 +29,17 @@ extends AbstractStatValue implements Counter { + private long value; private long sum; private long sumOfSquares; + + public ThreadSafeCounter( String role ) + { + super( role ); + } /** * [EMAIL PROTECTED] Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/impl/ThreadSafeGauge.java Mon Feb 4 02:03:23 2008 @@ -43,6 +43,11 @@ // Use a double so that unset can be detected as "Not a Number" private double firstUse = Double.NaN; + public ThreadSafeGauge( String role ) + { + super( role ); + } + public synchronized void reset() { // Don't reset value ! @@ -100,7 +105,7 @@ protected void computeSums() { - long now = nanoTime(); + long now = time(); if ( Double.isNaN( firstUse ) ) { firstUse = now; @@ -115,15 +120,15 @@ lastUse = now; } - protected long nanoTime() + protected long time() { - return System.nanoTime(); + return System.currentTimeMillis(); } @Override public synchronized double getMean() { - return ( (double) sum ) / ( nanoTime() - firstUse ); + return ( (double) sum ) / ( time() - firstUse ); } @Override Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java?rev=618221&view=auto ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java (added) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java Mon Feb 4 02:03:23 2008 @@ -0,0 +1,30 @@ +/* + * 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.listeners; + +/** + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + */ +public interface Detachable +{ + /** + * Detach the instance from live monitoring beackbone. Any new monitoring + * event will not affect datas in this component. + */ + void detach(); +} Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java?rev=618221&view=auto ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java (added) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java Mon Feb 4 02:03:23 2008 @@ -0,0 +1,87 @@ +/* + * 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.listeners; + +import org.apache.commons.monitoring.Composite; +import org.apache.commons.monitoring.Monitor; +import org.apache.commons.monitoring.StatValue; +import org.apache.commons.monitoring.impl.AbstractMonitor; + +/** + * A Monitor implementation that maintains a set of secondary StatValues in sync + * with the primary monitor. Register itself as a monitor listener to get notified + * on new StatValues and automatically create the required secondary. + * <p> + * When detached, deregister itself as Monitor.Listener and detaches all secondary + * from the primary StatValues. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + */ +public class SecondaryMonitor + extends AbstractMonitor + implements Monitor.Listener, Detachable +{ + + /** The primary monitor */ + private Monitor monitor; + + private boolean detached; + + public SecondaryMonitor( Monitor monitor ) + { + super( monitor.getKey() ); + this.monitor = monitor; + this.detached = false; + for ( StatValue value : monitor.getValues() ) + { + onStatValueRegistered( value ); + } + monitor.addListener( this ); + } + + public void detach() + { + this.detached = true; + for ( StatValue value : monitor.getValues() ) + { + if ( value instanceof Composite ) + { + ( (Composite<StatValue>) value ).removeSecondary( getValue( value.getRole() ) ); + } + } + } + + public void onStatValueRegistered( StatValue value ) + { + if ( !detached && value instanceof Composite ) + { + register( ( (Composite<StatValue>) value ).createSecondary() ); + } + } + + public void addListener( Listener listener ) + { + throw new UnsupportedOperationException( "Only primary Monitor accepts listeners" ); + } + + public void removeListener( Listener listener ) + { + throw new UnsupportedOperationException( "Only primary Monitor accepts listeners" ); + } + +} Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java?rev=618221&view=auto ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java (added) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java Mon Feb 4 02:03:23 2008 @@ -0,0 +1,86 @@ +/* + * 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.listeners; + +import java.util.Collection; + +import org.apache.commons.monitoring.Monitor; +import org.apache.commons.monitoring.Repository; +import org.apache.commons.monitoring.impl.AbstractRepository; + +/** + * + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + */ +public class SecondaryRepository + extends AbstractRepository implements Repository.Listener, Detachable +{ + private Repository repository; + + private boolean detached; + + public SecondaryRepository( Repository repository ) + { + super(); + this.repository = repository; + this.detached = false; + for ( Monitor monitor : repository.getMonitors() ) + { + register( new SecondaryMonitor( monitor ) ); + } + repository.addListener( this ); + } + + public void detach() + { + detached = true; + repository.removeListener( this ); + for ( Monitor monitor : getMonitors() ) + { + ((Detachable) monitor).detach(); + } + } + + /** + * @see org.apache.commons.monitoring.Repository.Listener#newMonitorInstance(org.apache.commons.monitoring.Monitor) + */ + public void newMonitorInstance( Monitor monitor ) + { + if ( ! detached ) + { + register( new SecondaryMonitor( monitor ) ); + } + } + + /** + * @see org.apache.commons.monitoring.Repository#addListener(org.apache.commons.monitoring.Repository.Listener) + */ + public void addListener( Listener listener ) + { + throw new UnsupportedOperationException( "Only primary Repository accepts listeners" ); + } + + /** + * @see org.apache.commons.monitoring.Repository#removeListener(org.apache.commons.monitoring.Repository.Listener) + */ + public void removeListener( Listener listener ) + { + throw new UnsupportedOperationException( "Only primary Repository accepts listeners" ); + } + +} Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.png URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.png?rev=618221&view=auto ============================================================================== Binary file - no diff available. Propchange: commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.png ------------------------------------------------------------------------------ svn:mime-type = image/png Added: commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.xcf URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.xcf?rev=618221&view=auto ============================================================================== Binary file - no diff available. Propchange: commons/sandbox/monitoring/trunk/src/site/resources/images/monitoring-logo-white.xcf ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Modified: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java (original) +++ commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/StopWatchTest.java Mon Feb 4 02:03:23 2008 @@ -104,7 +104,7 @@ super( monitor ); } - protected long nanotime() + protected long time() { return time; } Modified: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java (original) +++ commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/CompositeValuesMonitorTest.java Mon Feb 4 02:03:23 2008 @@ -51,14 +51,14 @@ { Monitor monitor = new CompositeValuesMonitor( new Monitor.Key( "MonitorTest.testComposite", "test", "utils" ) ); Counter counter = monitor.getCounter( "COUNTER" ); - Counter secondary = new ThreadSafeCounter(); Composite<Counter> composite = (Composite<Counter>) counter; counter.add( 1 ); assertEquals( 1, counter.get() ); + + Counter secondary = composite.createSecondary(); assertEquals( 0, secondary.get() ); - composite.addSecondary( secondary ); counter.add( 1 ); assertEquals( 2, counter.get() ); assertEquals( 1, secondary.get() ); @@ -78,14 +78,13 @@ { Monitor monitor = new CompositeValuesMonitor( new Monitor.Key( "MonitorTest.testComposite", "test", "utils" ) ); Gauge gauge = monitor.getGauge( "GAUGE" ); - Gauge secondary = new ThreadSafeGauge(); Composite<Gauge> composite = (Composite<Gauge>) gauge; gauge.increment(); assertEquals( 1, gauge.get() ); + Gauge secondary = composite.createSecondary(); assertEquals( 0, secondary.get() ); - composite.addSecondary( secondary ); gauge.increment(); assertEquals( 2, gauge.get() ); assertEquals( 2, secondary.get() ); Modified: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java (original) +++ commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeCounterTest.java Mon Feb 4 02:03:23 2008 @@ -28,7 +28,7 @@ public void testValue() throws Exception { - Counter counter = new ThreadSafeCounter(); + Counter counter = new ThreadSafeCounter( "test" ); counter.set( 1 ); assertEquals( 1, counter.getMin() ); Modified: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java?rev=618221&r1=618220&r2=618221&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java (original) +++ commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/impl/ThreadSafeGaugeTest.java Mon Feb 4 02:03:23 2008 @@ -29,7 +29,7 @@ public void testValue() throws Exception { - Gauge gauge = new ThreadSafeGauge(); + Gauge gauge = new ThreadSafeGauge( "test" ); gauge.set( 1 ); assertEquals( 1, gauge.getMin() ); @@ -68,7 +68,7 @@ public void testCompteMean() throws Exception { - Gauge gauge = new MockTimeGauge(); + Gauge gauge = new MockTimeGauge( "test" ); time = 0; gauge.increment(); @@ -84,11 +84,23 @@ assertEquals( 1.5D, gauge.getMean(), 0D ); } + /** + * A custom ThreadSafeGauge that use a mock nanoTime implementation to make + * timing predictable during unit test execution. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + */ private class MockTimeGauge extends ThreadSafeGauge { + + public MockTimeGauge( String role ) + { + super( role ); + } + @Override - protected long nanoTime() + protected long time() { return time; } Added: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java?rev=618221&view=auto ============================================================================== --- commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java (added) +++ commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java Mon Feb 4 02:03:23 2008 @@ -0,0 +1,66 @@ +/* + * 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.listener; + +import org.apache.commons.monitoring.Repository; +import org.apache.commons.monitoring.impl.DefaultRepository; +import org.apache.commons.monitoring.listeners.SecondaryRepository; + +import junit.framework.TestCase; + +/** + * + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + */ +public class SecondaryReposioryTest + extends TestCase +{ + public void testSecondaryRepository() + throws Exception + { + Repository primary = new DefaultRepository(); + primary.getMonitor( "test" ).getCounter( "COUNTER" ).add( 10 ); + primary.getMonitor( "test" ).getGauge( "GAUGE" ).set( 5 ); + + SecondaryRepository secondary = new SecondaryRepository( primary ); + assertNotNull( secondary.getMonitor( "test" ) ); + assertNotNull( secondary.getMonitor( "test" ).getCounter( "COUNTER" ) ); + assertNotNull( secondary.getMonitor( "test" ).getGauge( "GAUGE" ) ); + assertEquals( 0, secondary.getMonitor( "test" ).getCounter( "COUNTER" ).get() ); + assertEquals( 5, secondary.getMonitor( "test" ).getGauge( "GAUGE" ).get() ); + + primary.getMonitor( "test" ).getCounter( "COUNTER" ).add( 10 ); + primary.getMonitor( "test" ).getGauge( "GAUGE" ).increment(); + assertEquals( 10, secondary.getMonitor( "test" ).getCounter( "COUNTER" ).get() ); + assertEquals( 6, secondary.getMonitor( "test" ).getGauge( "GAUGE" ).get() ); + + primary.getMonitor( "new" ).getCounter( "COUNTER" ).add( 10 ); + assertEquals( 10, secondary.getMonitor( "new" ).getCounter( "COUNTER" ).get() ); + + secondary.detach(); + + primary.getMonitor( "anotherone" ).getCounter( "COUNTER" ).add( 10 ); + primary.getMonitor( "test" ).getCounter( "COUNTER" ).add( 10 ); + primary.getMonitor( "test" ).getGauge( "GAUGE" ).increment(); + assertNull( secondary.getMonitor( "anotherone" ) ); + assertEquals( 30, primary.getMonitor( "test" ).getCounter( "COUNTER" ).get() ); + assertEquals( 10, secondary.getMonitor( "test" ).getCounter( "COUNTER" ).get() ); + assertEquals( 7, primary.getMonitor( "test" ).getGauge( "GAUGE" ).get() ); + assertEquals( 6, secondary.getMonitor( "test" ).getGauge( "GAUGE" ).get() ); + } +} Propchange: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/sandbox/monitoring/trunk/src/test/java/org/apache/commons/monitoring/listener/SecondaryReposioryTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain