Author: nicolas Date: Mon Apr 7 07:13:13 2008 New Revision: 645530 URL: http://svn.apache.org/viewvc?rev=645530&view=rev Log: historization of repository based on a decorator : - complete Detachable interface - EmptyMonitor to avoid nullPointer - enhance Reporter to support detachable - Refactored MonitoringListener for webapps
Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java (with props) Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/Monitor.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Renderer.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml 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=645530&r1=645529&r2=645530&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 Apr 7 07:13:13 2008 @@ -110,7 +110,7 @@ */ public static class Key { - public final static String DEFAULT = ""; + public final static String DEFAULT = "default"; private final String name; Modified: 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=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/Detachable.java Mon Apr 7 07:13:13 2008 @@ -27,4 +27,10 @@ * event will not affect datas in this component. */ void detach(); + + long getDetachedAt(); + + long getAttachedAt(); + + boolean isDetached(); } Added: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java?rev=645530&view=auto ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java (added) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java Mon Apr 7 07:13:13 2008 @@ -0,0 +1,67 @@ +/* + * 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.impl.monitors.AbstractMonitor; + + +/** + * A (detached) Monitor implementation used by SecondaryRepository to avoid + * returning <tt>null</tt> when a non-existing monitor is requested. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + */ +public class EmpyMonitor + extends AbstractMonitor implements Detachable +{ + private long attachedAt; + + private long detachedAt; + + public EmpyMonitor( Key key, long attachedAt, long detachedAt ) + { + super( key ); + this.attachedAt = attachedAt; + this.detachedAt = detachedAt; + } + + /** + * [EMAIL PROTECTED] + * @see org.apache.commons.monitoring.listeners.Detachable#detach() + */ + public void detach() + { + // Nothing to do + } + + public long getAttachedAt() + { + return attachedAt; + } + + public long getDetachedAt() + { + return detachedAt; + } + + public boolean isDetached() + { + return true; + } + +} Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/EmpyMonitor.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/HistorizedRepositoryDecorator.java Mon Apr 7 07:13:13 2008 @@ -26,15 +26,14 @@ import org.apache.commons.monitoring.Monitor; import org.apache.commons.monitoring.Repository; import org.apache.commons.monitoring.StopWatch; -import org.apache.commons.monitoring.Repository.Listener; -import org.apache.commons.monitoring.Repository.Observable; import org.apache.commons.monitoring.reporting.AbstractPeriodicLogger; /** - * * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> */ -public class HistorizedRepositoryDecorator extends AbstractPeriodicLogger +public class HistorizedRepositoryDecorator + extends AbstractPeriodicLogger + implements Repository.Observable { /** The decorated repository */ private Repository.Observable repository; @@ -43,7 +42,7 @@ private int size; - @SuppressWarnings("serial") + @SuppressWarnings( "serial" ) public HistorizedRepositoryDecorator( long period, final int size, Observable repository ) { super( period, repository ); @@ -53,9 +52,11 @@ } /** - * Store the period Repository into the history Map, using System.currentTimeMillis(). + * Store the period Repository into the history Map, using + * System.currentTimeMillis(). * <p> * [EMAIL PROTECTED] + * * @see org.apache.commons.monitoring.reporting.AbstractPeriodicLogger#log(SecondaryRepository) */ @Override @@ -63,7 +64,7 @@ throws IOException { history.add( period ); - while (history.size() > size) + while ( history.size() > size ) { history.remove( history.size() ); } Modified: 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=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryMonitor.java Mon Apr 7 07:13:13 2008 @@ -36,16 +36,20 @@ extends AbstractMonitor implements Monitor.Listener, Detachable { - /** The primary monitor */ private Monitor.Observable monitor; private boolean detached; + private long attachedAt; + + private long detachedAt; + public SecondaryMonitor( Monitor.Observable monitor ) { super( monitor.getKey() ); this.monitor = monitor; + this.attachedAt = System.currentTimeMillis(); this.detached = false; for ( StatValue value : monitor.getValues() ) { @@ -65,6 +69,7 @@ ( (Composite<StatValue>) value ).removeSecondary( getValue( value.getRole() ) ); } } + this.detachedAt = System.currentTimeMillis(); } @SuppressWarnings("unchecked") @@ -74,6 +79,21 @@ { register( ( (Composite<StatValue>) value ).createSecondary() ); } + } + + public boolean isDetached() + { + return detached; + } + + public long getAttachedAt() + { + return attachedAt; + } + + public long getDetachedAt() + { + return detachedAt; } } Modified: 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=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/listeners/SecondaryRepository.java Mon Apr 7 07:13:13 2008 @@ -20,6 +20,7 @@ import org.apache.commons.monitoring.Monitor; import org.apache.commons.monitoring.Repository; import org.apache.commons.monitoring.StopWatch; +import org.apache.commons.monitoring.Monitor.Key; import org.apache.commons.monitoring.impl.repositories.AbstractRepository; /** @@ -73,6 +74,22 @@ } /** + * [EMAIL PROTECTED] + * @see org.apache.commons.monitoring.impl.repositories.AbstractRepository#getMonitor(org.apache.commons.monitoring.Monitor.Key) + */ + @Override + protected Monitor getMonitor( Key key ) + { + Monitor m = super.getMonitor( key ); + if (detached && m == null) + { + // To avoid NullPointerExceptions + return new EmpyMonitor( key, attachedAt, detachedAt ); + } + return m; + } + + /** * @see org.apache.commons.monitoring.Repository.Listener#newMonitorInstance(org.apache.commons.monitoring.Monitor) */ public void newMonitorInstance( Monitor monitor ) @@ -110,4 +127,14 @@ { return detachedAt; } + + /** + * [EMAIL PROTECTED] + * @see org.apache.commons.monitoring.listeners.Detachable#isDetached() + */ + public boolean isDetached() + { + return detached; + } + } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractPeriodicLogger.java Mon Apr 7 07:13:13 2008 @@ -58,6 +58,7 @@ timer.scheduleAtFixedRate( this, period, period ); } + private SecondaryRepository observeRepositoryForPeriod() { SecondaryRepository previous = this.secondary; Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/AbstractRenderer.java Mon Apr 7 07:13:13 2008 @@ -32,6 +32,8 @@ import org.apache.commons.monitoring.StatValue; import org.apache.commons.monitoring.Unit; import org.apache.commons.monitoring.Monitor.Key; +import org.apache.commons.monitoring.listeners.Detachable; +import org.apache.commons.monitoring.listeners.SecondaryMonitor; /** * Render a collection of monitor for reporting @@ -83,16 +85,27 @@ protected void render( Context ctx, Monitor monitor, Options options ) { + if ( isDetatched( monitor ) ) + { + renderDetached( ctx, (Detachable) monitor, options ); + } render( ctx, monitor.getKey() ); renderStatValues( ctx, monitor, options ); } + protected boolean isDetatched( Monitor monitor ) + { + return monitor instanceof Detachable && ( (Detachable) monitor ).isDetached(); + } + + protected abstract void renderDetached( Context ctx, Detachable detached, Options options ); + protected void renderStatValues( Context ctx, Monitor monitor, Options options, List<String> roles ) { renderStatValues( ctx, monitor, options ); } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) protected void renderStatValues( Context ctx, Monitor monitor, Options options ) { List<String> roles = (List<String>) ctx.get( "roles" ); @@ -100,7 +113,7 @@ { String role = iterator.next(); StatValue value = monitor.getValue( role ); - if (value != null) + if ( value != null ) { render( ctx, value, options ); } @@ -117,6 +130,7 @@ /** * Render an expected value not supported by the current monitor + * * @param ctx * @param role */ @@ -196,11 +210,11 @@ * @param value the StatValue that hold data to be rendered * @param attribute the StatValue attribute name to be rendered * @param number the the StatValue attribute value to be rendered - * @param ratio the ratio between attribute unit and statValue unit (in power of 10) + * @param ratio the ratio between attribute unit and statValue unit (in + * power of 10) * @param options the rendering options */ - protected void render( Context ctx, StatValue value, String attribute, Number number, Options options, - int ratio ) + protected void render( Context ctx, StatValue value, String attribute, Number number, Options options, int ratio ) { if ( number instanceof Double ) { @@ -212,8 +226,7 @@ } } - private void renderInternal( Context ctx, StatValue value, String attribute, long l, Options options, - int ratio ) + private void renderInternal( Context ctx, StatValue value, String attribute, long l, Options options, int ratio ) { Unit unit = options.unitFor( value ); if ( unit != null ) @@ -227,8 +240,7 @@ ctx.print( options.getNumberFormat().format( l ) ); } - private void renderInternal( Context ctx, StatValue value, String attribute, double d, Options options, - int ratio ) + private void renderInternal( Context ctx, StatValue value, String attribute, double d, Options options, int ratio ) { if ( Double.isNaN( d ) ) { @@ -256,11 +268,11 @@ Set<String> roles = new HashSet<String>(); for ( Monitor monitor : monitors ) { - if (options.render( monitor )) + if ( options.render( monitor ) ) { for ( String role : monitor.getRoles() ) { - if (options.renderRole( role )) + if ( options.renderRole( role ) ) { roles.add( role ); } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/HtmlRenderer.java Mon Apr 7 07:13:13 2008 @@ -18,6 +18,7 @@ package org.apache.commons.monitoring.reporting; import java.util.Collection; +import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -26,6 +27,8 @@ import org.apache.commons.monitoring.StatValue; import org.apache.commons.monitoring.Unit; import org.apache.commons.monitoring.Monitor.Key; +import org.apache.commons.monitoring.listeners.Detachable; +import org.apache.commons.monitoring.listeners.SecondaryMonitor; /** * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> @@ -90,7 +93,14 @@ Collection<String> roles = (Collection<String>) ctx.get( "roles" ); Map<String, Integer> columns = new HashMap<String, Integer>(); - ctx.println( "<thead><tr><th rowspan='2'>name</th>" ); + ctx.println( "<thead><tr>" ); + boolean detached = ( monitors.size() > 0 && monitors.iterator().next()instanceof Detachable ); + + if ( detached ) + { + ctx.println( "<td colspan='2'>period</td>" ); + } + ctx.println( "<th rowspan='2'>name</th>" ); ctx.println( "<th rowspan='2'>category</th>" ); ctx.println( "<th rowspan='2'>subsystem</th>" ); for ( String role : roles ) @@ -129,7 +139,13 @@ } } ctx.print( "</tr>" ); + ctx.print( "<tr>" ); + if ( detached ) + { + ctx.println( "<th>from</th>" ); + ctx.println( "<th>to</th>" ); + } for ( String role : roles ) { @@ -164,6 +180,20 @@ ctx.print( attribute ); ctx.print( "</th>" ); } + } + + /** + * [EMAIL PROTECTED] + * @see org.apache.commons.monitoring.reporting.AbstractRenderer#renderDetached(org.apache.commons.monitoring.reporting.Context, org.apache.commons.monitoring.listeners.SecondaryMonitor, org.apache.commons.monitoring.reporting.Renderer.Options) + */ + @Override + protected void renderDetached( Context ctx, Detachable detached, Options options ) + { + ctx.print( "<td>" ); + ctx.print( options.getDateFormat().format( new Date( detached.getAttachedAt()) ) ); + ctx.print( "</td><td>" ); + ctx.print( options.getDateFormat().format( new Date( detached.getDetachedAt()) ) ); + ctx.print( "</td>" ); } protected void renderUnit( Context ctx, Unit unit ) Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/JsonRenderer.java Mon Apr 7 07:13:13 2008 @@ -18,11 +18,14 @@ package org.apache.commons.monitoring.reporting; import java.util.Collection; +import java.util.Date; import java.util.List; import org.apache.commons.monitoring.Monitor; import org.apache.commons.monitoring.StatValue; import org.apache.commons.monitoring.Monitor.Key; +import org.apache.commons.monitoring.listeners.Detachable; +import org.apache.commons.monitoring.listeners.SecondaryMonitor; public class JsonRenderer extends AbstractRenderer @@ -59,7 +62,27 @@ { ctx.print( "," ); } + if ( isDetatched( monitor ) ) + { + renderDetached( ctx, (Detachable) monitor, options ); + ctx.print( "," ); + } render( ctx, monitor.getKey() ); + ctx.print( "}" ); + } + + /** + * [EMAIL PROTECTED] + * @see org.apache.commons.monitoring.reporting.AbstractRenderer#renderDetached(org.apache.commons.monitoring.reporting.Context, org.apache.commons.monitoring.listeners.SecondaryMonitor, org.apache.commons.monitoring.reporting.Renderer.Options) + */ + @Override + protected void renderDetached( Context ctx, Detachable detached, Options options ) + { + ctx.print( "period:{from:" ); + ctx.print( options.getDateFormat().format( new Date( detached.getAttachedAt()) ) ); + ctx.print( "," ); + ctx.print( "to:" ); + ctx.print( options.getDateFormat().format( new Date( detached.getDetachedAt()) ) ); ctx.print( "}" ); } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/OptionsSupport.java Mon Apr 7 07:13:13 2008 @@ -17,9 +17,12 @@ package org.apache.commons.monitoring.reporting; +import java.text.DateFormat; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Locale; import org.apache.commons.monitoring.Monitor; import org.apache.commons.monitoring.StatValue; @@ -65,6 +68,11 @@ public NumberFormat getNumberFormat() { return new DecimalFormat( "0" ); + } + + public DateFormat getDateFormat() + { + return DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT ); } } 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=645530&r1=645529&r2=645530&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 Mon Apr 7 07:13:13 2008 @@ -17,6 +17,7 @@ package org.apache.commons.monitoring.reporting; +import java.text.DateFormat; import java.text.NumberFormat; import java.util.Arrays; import java.util.Collection; @@ -51,5 +52,7 @@ NumberFormat getNumberFormat(); NumberFormat getDecimalFormat(); + + DateFormat getDateFormat(); } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/Selector.java Mon Apr 7 07:13:13 2008 @@ -25,6 +25,8 @@ import java.util.Stack; import java.util.StringTokenizer; +import org.apache.commons.monitoring.Monitor.Key; + /** * use a REST-style path to select a group of statValues. For example, to get * the mean performance for monitors in category "services" @@ -36,7 +38,7 @@ { /** - * + * */ private static final String SEP = "/"; private String path; @@ -67,7 +69,7 @@ { if ( SEP.equals( previous ) ) { - stack.push( "" ); + stack.push( Key.DEFAULT ); } } else @@ -78,7 +80,7 @@ } if ( path.endsWith( SEP ) ) { - stack.push( "" ); + stack.push( Key.DEFAULT ); } Collections.reverse( stack ); Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/TxtRenderer.java Mon Apr 7 07:13:13 2008 @@ -17,8 +17,11 @@ package org.apache.commons.monitoring.reporting; +import java.util.Date; + import org.apache.commons.monitoring.StatValue; import org.apache.commons.monitoring.Monitor.Key; +import org.apache.commons.monitoring.listeners.Detachable; /** * A simple TXT renderer, typically to dump monitoring status in a log file @@ -29,6 +32,19 @@ extends AbstractRenderer { private static final String HR = "--------------------------------------------------------------------------------"; + + /** + * [EMAIL PROTECTED] + * @see org.apache.commons.monitoring.reporting.AbstractRenderer#renderDetached(org.apache.commons.monitoring.reporting.Context, org.apache.commons.monitoring.listeners.SecondaryMonitor, org.apache.commons.monitoring.reporting.Renderer.Options) + */ + @Override + protected void renderDetached( Context ctx, Detachable detached, Options options ) + { + ctx.print( "from : " ); + ctx.println ( options.getDateFormat().format( new Date( detached.getAttachedAt()) ) ); + ctx.print( "to : " ); + ctx.print( options.getDateFormat().format( new Date( detached.getDetachedAt()) ) ); + } /** * [EMAIL PROTECTED] Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/XmlRenderer.java Mon Apr 7 07:13:13 2008 @@ -18,11 +18,14 @@ package org.apache.commons.monitoring.reporting; import java.util.Collection; +import java.util.Date; import java.util.List; import org.apache.commons.monitoring.Monitor; import org.apache.commons.monitoring.StatValue; import org.apache.commons.monitoring.Monitor.Key; +import org.apache.commons.monitoring.listeners.Detachable; +import org.apache.commons.monitoring.reporting.Renderer.Options; public class XmlRenderer extends AbstractRenderer @@ -71,6 +74,21 @@ } ctx.print( "\">" ); } + + /** + * [EMAIL PROTECTED] + * @see org.apache.commons.monitoring.reporting.AbstractRenderer#renderDetached(org.apache.commons.monitoring.reporting.Context, org.apache.commons.monitoring.listeners.SecondaryMonitor, org.apache.commons.monitoring.reporting.Renderer.Options) + */ + @Override + protected void renderDetached( Context ctx, Detachable detached, Options options ) + { + ctx.print( "<period from=\"" ); + ctx.println ( options.getDateFormat().format( new Date( detached.getAttachedAt()) ) ); + ctx.print( "\" to=\"" ); + ctx.print( options.getDateFormat().format( new Date( detached.getDetachedAt()) ) ); + ctx.print( "/>" ); + } + @Override Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/reporting/web/MonitoringServlet.java Mon Apr 7 07:13:13 2008 @@ -108,7 +108,8 @@ String path = request.getPathInfo(); Collection<Monitor> monitors = (Collection<Monitor>) new Selector( path ).select( repository ); Renderer.Options options = getOptions( request ); - renderer.render( new Context( response.getWriter() ), monitors, options ); + Context ctx = new Context( response.getWriter() ); + renderer.render( ctx, monitors, options ); return; } } Modified: commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java (original) +++ commons/sandbox/monitoring/trunk/src/main/java/org/apache/commons/monitoring/servlet/MonitoringListener.java Mon Apr 7 07:13:13 2008 @@ -17,15 +17,35 @@ package org.apache.commons.monitoring.servlet; +import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import org.apache.commons.monitoring.Monitor; import org.apache.commons.monitoring.Monitoring; import org.apache.commons.monitoring.Repository; +import org.apache.commons.monitoring.Unit; import org.apache.commons.monitoring.impl.repositories.DefaultRepository; +import org.apache.commons.monitoring.listeners.HistorizedRepositoryDecorator; /** - * A Servlet Context Listener to configure Monitoring + * A Servlet Context Listener to configure Monitoring, used to setup optional + * monitoring features + * <p> + * To enable repository historization, set the servlet context parameter + * <tt>org.apache.commons.monitoring.History</tt> using the format : + * <tt>[historization period][unit]:[size]</tt> + * <p> + * for example, to setup a 30 items history of 10 minutes periods : + * <pre> + * <context-param> + * <description>enable monitoring history</description> + * <param-name>org.apache.commons.monitoring.History</param-name> + * <param-value>10min:30</param-value> + * </context-param> + * </pre> + * + * </p> * * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> */ @@ -33,6 +53,12 @@ implements ServletContextListener { + public static final String HISTORY = "org.apache.commons.monitoring.History"; + + public static final String HISTORY_PERIOD = "org.apache.commons.monitoring.History.period"; + + public static final String HISTORY_SIZE = "org.apache.commons.monitoring.History.size"; + /** * [EMAIL PROTECTED] * @@ -40,13 +66,36 @@ */ public void contextInitialized( ServletContextEvent event ) { + ServletContext sc = event.getServletContext(); + Repository repository = createRepository( sc ); + + String history = sc.getInitParameter( HISTORY ); + if ( history != null ) + { + repository = setupHistory( repository, history ); + } + + sc.setAttribute( ServletContextUtil.REPOSITORY_KEY, repository ); + Monitoring.setRepository( repository ); + } + + /** + * Create the repository to be used in this web application. + * <p> + * User can override this method to change the repository instanciation strategy and/or to + * supply a custom implementation. + * @param sc + * @return + */ + protected Repository createRepository( ServletContext sc ) + { Repository repository; - String name = event.getServletContext().getInitParameter( ServletContextUtil.REPOSITORY_KEY ); + String name = sc.getInitParameter( ServletContextUtil.REPOSITORY_KEY ); if ( name != null ) { try { - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) Class repositoryClass = Class.forName( name ); if ( !Repository.class.isAssignableFrom( repositoryClass ) ) { @@ -72,8 +121,40 @@ { repository = new DefaultRepository(); } - event.getServletContext().setAttribute( ServletContextUtil.REPOSITORY_KEY, repository ); - Monitoring.setRepository( repository ); + return repository; + } + + /** + * Setup the historization feature on the repository + * + * @param repository the (observable) repository to historize + * @param history the historization configuration, in format + * [period][unit]:[size] + * @return + */ + protected Repository setupHistory( Repository repository, String history ) + { + Repository.Observable observable = (Repository.Observable) repository; + int idx = history.indexOf( ':' ); + char[] ch = history.toCharArray(); + long period = 0; + for ( int i = 0; i < idx; i++ ) + { + if ( Character.isDigit( ch[i] ) ) + continue; + period = Long.parseLong( history.substring( 0, i ) ); + String unit = history.substring( i, idx ); + if ( unit != null ) + { + Unit u = Unit.NANOS.getDerived( unit ); + period *= u.getScale() / Unit.MILLIS.getScale(); + break; + } + } + + int size = Integer.parseInt( history.substring( idx + 1 ) ); + repository = new HistorizedRepositoryDecorator( period, size, observable ); + return repository; } /** Modified: commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml?rev=645530&r1=645529&r2=645530&view=diff ============================================================================== --- commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml (original) +++ commons/sandbox/monitoring/trunk/src/main/webapp/WEB-INF/web.xml Mon Apr 7 07:13:13 2008 @@ -20,6 +20,16 @@ <web-app> + <context-param> + <description>enable monitoring history</description> + <param-name>org.apache.commons.monitoring.History</param-name> + <param-value>1min:10</param-value> + </context-param> + + <listener> + <listener-class>org.apache.commons.monitoring.servlet.MonitoringListener</listener-class> + </listener> + <filter> <filter-name>Monitoring</filter-name> <filter-class>org.apache.commons.monitoring.servlet.MonitoringFilter</filter-class>