You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2013/11/04 11:23:23 UTC

svn commit: r1538543 - in /incubator/sirona/trunk: aop/src/test/java/org/apache/sirona/aop/ collector/src/main/resources/ collector/src/test/java/org/apache/sirona/collector/server/ core/src/main/java/org/apache/sirona/gauges/ core/src/main/java/org/ap...

Author: rmannibucau
Date: Mon Nov  4 10:23:22 2013
New Revision: 1538543

URL: http://svn.apache.org/r1538543
Log:
adding gauge report

Added:
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugeEndpoints.java
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugePlugin.java
    incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/
    incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/detail.vm
    incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/home.vm
    incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/GaugesTest.java
      - copied, changed from r1538515, incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/ThreadsTest.java
Removed:
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/jvm/gauges/
Modified:
    incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/DynamicInterceptionTest.java
    incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/MonitoringProxyFactoryTest.java
    incubator/sirona/trunk/collector/src/main/resources/collector-sirona.properties
    incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/CubeDataStoreCompatibilityTest.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/DefaultGaugeManager.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/GaugeManager.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/DefaultRepository.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/Repository.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchCounterDataStore.java
    incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeCounterDataStore.java
    incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteCounterDataStore.java
    incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/EMFTest.java
    incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/QueryTest.java
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/handler/api/Template.java
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/JSONFormat.java
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/MapFormat.java
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/XMLFormat.java
    incubator/sirona/trunk/reporting/src/main/resources/META-INF/services/org.apache.sirona.reporting.web.plugin.Plugin
    incubator/sirona/trunk/reporting/src/main/resources/resources/js/sirona.js
    incubator/sirona/trunk/reporting/src/main/resources/templates/jta/jta.vm
    incubator/sirona/trunk/reporting/src/main/resources/templates/jvm/jvm.vm
    incubator/sirona/trunk/reporting/src/main/resources/templates/web/web.vm
    incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java
    incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/MonitoringSessionListener.java

Modified: incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/DynamicInterceptionTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/DynamicInterceptionTest.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/DynamicInterceptionTest.java (original)
+++ incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/DynamicInterceptionTest.java Mon Nov  4 10:23:22 2013
@@ -44,32 +44,32 @@ public class DynamicInterceptionTest {
     @Test
     public void playWithInterceptor() throws Throwable {
         final ConfigurablePerfInterceptor interceptor = new ConfigurablePerfInterceptor();
-        assertFalse(repository.iterator().hasNext());
+        assertFalse(repository.counters().iterator().hasNext());
 
         interceptor.invoke(THRESHOLD * 5);
-        assertTrue(repository.iterator().hasNext());
-        assertEquals(1, repository.iterator().next().getHits());
-        assertEquals("dynamic", repository.iterator().next().getKey().getName());
+        assertTrue(repository.counters().iterator().hasNext());
+        assertEquals(1, repository.counters().iterator().next().getHits());
+        assertEquals("dynamic", repository.counters().iterator().next().getKey().getName());
 
         interceptor.invoke(THRESHOLD / 20);
-        assertEquals(2, repository.iterator().next().getHits());
+        assertEquals(2, repository.counters().iterator().next().getHits());
 
         for (int i = 0; i < MAX_IT; i++) {
             interceptor.invoke(THRESHOLD * 5);
         }
-        assertEquals(2, repository.iterator().next().getHits());
+        assertEquals(2, repository.counters().iterator().next().getHits());
 
         interceptor.invoke(THRESHOLD / 5);
-        assertEquals(3, repository.iterator().next().getHits());
+        assertEquals(3, repository.counters().iterator().next().getHits());
 
         for (int i = 0; i < MAX_IT; i++) {
             interceptor.invoke(THRESHOLD * 2);
         }
-        assertEquals(3, repository.iterator().next().getHits());
+        assertEquals(3, repository.counters().iterator().next().getHits());
 
         interceptor.invoke(THRESHOLD * 5);
         interceptor.invoke(THRESHOLD * 5);
-        assertEquals(5, repository.iterator().next().getHits());
+        assertEquals(5, repository.counters().iterator().next().getHits());
     }
 
     public static class ConfigurablePerfInterceptor extends AbstractPerformanceInterceptor<Long> {

Modified: incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/MonitoringProxyFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/MonitoringProxyFactoryTest.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/MonitoringProxyFactoryTest.java (original)
+++ incubator/sirona/trunk/aop/src/test/java/org/apache/sirona/aop/MonitoringProxyFactoryTest.java Mon Nov  4 10:23:22 2013
@@ -52,7 +52,7 @@ public class MonitoringProxyFactoryTest 
         }
 
         Counter failures = null;
-        for (final Counter c : Repository.INSTANCE) {
+        for (final Counter c : Repository.INSTANCE.counters()) {
             if (c.getKey().getName().contains("UnsupportedOperationException")) {
                 if (failures != null) {
                     fail();

Modified: incubator/sirona/trunk/collector/src/main/resources/collector-sirona.properties
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/main/resources/collector-sirona.properties?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/main/resources/collector-sirona.properties (original)
+++ incubator/sirona/trunk/collector/src/main/resources/collector-sirona.properties Mon Nov  4 10:23:22 2013
@@ -21,3 +21,7 @@ org.apache.sirona.store.DataStoreFactory
 # web module doesn't need to register locally otherwise locally it will not set a marker and all will fail
 org.apache.sirona.web.activated = false
 org.apache.sirona.core.gauge.activated = false
+
+# deactivate plugins which are local since we can only rely on gauges and counters here
+JMX.activated = false
+Threads.activated = false

Modified: incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/CubeDataStoreCompatibilityTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/CubeDataStoreCompatibilityTest.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/CubeDataStoreCompatibilityTest.java (original)
+++ incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/CubeDataStoreCompatibilityTest.java Mon Nov  4 10:23:22 2013
@@ -17,13 +17,12 @@
 package org.apache.sirona.collector.server;
 
 import org.apache.sirona.Role;
-import org.apache.sirona.counters.CollectorCounterStore;
 import org.apache.sirona.configuration.Configuration;
+import org.apache.sirona.counters.CollectorCounterStore;
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.counters.DefaultCounter;
 import org.apache.sirona.counters.Unit;
 import org.apache.sirona.cube.CubeCounterDataStore;
-import org.apache.sirona.repositories.DefaultRepository;
 import org.apache.sirona.repositories.Repository;
 import org.apache.sirona.store.CounterDataStore;
 import org.junit.After;
@@ -31,7 +30,6 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.util.Arrays;
-import java.util.Iterator;
 
 import static org.junit.Assert.assertEquals;
 
@@ -64,17 +62,14 @@ public class CubeDataStoreCompatibilityT
 
     private static class SeeMyProtectedStuffStore extends CubeCounterDataStore {
         public void doPush() {
-            pushCountersByBatch(new DefaultRepository() {
-                @Override
-                public Iterator<Counter> iterator() {
-                    return Arrays.<Counter>asList(new DefaultCounter(new Counter.Key(new Role("cube", Unit.UNARY), "client"), null) {
-                        @Override
-                        public long getHits() {
-                            return 50;
-                        }
-                    }).iterator();
-                }
-            });
+            pushCountersByBatch(Arrays.<Counter>asList(
+                new DefaultCounter(new Counter.Key(new Role("cube", Unit.UNARY), "client"), null) {
+                    @Override
+                    public long getHits() {
+                        return 50;
+                    }
+                })
+            );
         }
     }
 }

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/DefaultGaugeManager.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/DefaultGaugeManager.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/DefaultGaugeManager.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/DefaultGaugeManager.java Mon Nov  4 10:23:22 2013
@@ -22,13 +22,16 @@ import org.apache.sirona.gauges.jvm.CPUG
 import org.apache.sirona.gauges.jvm.UsedMemoryGauge;
 import org.apache.sirona.store.GaugeDataStore;
 
+import java.util.Collection;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.ConcurrentHashMap;
 
 public final class DefaultGaugeManager implements GaugeManager {
-    private final Map<Role, Timer> timers = new ConcurrentHashMap<Role, Timer>();
+    private final Map<Gauge, Timer> timers = new ConcurrentHashMap<Gauge, Timer>();
+    private final Map<String, Role> roleMapping = new ConcurrentHashMap<String, Role>();
     private final GaugeDataStore store;
 
     public DefaultGaugeManager(final GaugeDataStore dataStore) {
@@ -48,16 +51,23 @@ public final class DefaultGaugeManager i
     }
 
     @Override
-    public void stopGauge(final Role role) {
-        final Timer timer = timers.remove(role);
+    public void stopGauge(final Gauge gauge) {
+        final Timer timer = timers.remove(gauge);
+        roleMapping.remove(gauge.role().getName());
         if (timer != null) {
             timer.cancel();
         }
     }
 
     @Override
+    public Role findGaugeRole(final String name) {
+        return roleMapping.get(name);
+    }
+
+    @Override
     public void addGauge(final Gauge gauge) {
         final Role role = gauge.role();
+        roleMapping.put(role.getName(), role);
 
         this.store.createOrNoopGauge(role);
 
@@ -65,13 +75,18 @@ public final class DefaultGaugeManager i
         Thread.currentThread().setContextClassLoader(gauge.getClass().getClassLoader());
         try {
             final Timer timer = new Timer("gauge-" + role.getName() + "-timer", true); // this starts a thread so ensure the loader is the right one
-            timers.put(role, timer);
+            timers.put(gauge, timer);
             timer.scheduleAtFixedRate(new GaugeTask(store, gauge), 0, gauge.period());
         } finally {
             Thread.currentThread().setContextClassLoader(old);
         }
     }
 
+    @Override
+    public Collection<Gauge> gauges() {
+        return timers.keySet();
+    }
+
     private static class GaugeTask extends TimerTask {
         private final Gauge gauge;
         private final GaugeDataStore store;

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java Mon Nov  4 10:23:22 2013
@@ -80,7 +80,7 @@ public interface Gauge {
 
         public void destroy() {
             for (final Gauge gauge : gauges) {
-                Repository.INSTANCE.stopGauge(gauge.role());
+                Repository.INSTANCE.stopGauge(gauge);
             }
             gauges.clear();
         }

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/GaugeManager.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/GaugeManager.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/GaugeManager.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/GaugeManager.java Mon Nov  4 10:23:22 2013
@@ -18,10 +18,16 @@ package org.apache.sirona.gauges;
 
 import org.apache.sirona.Role;
 
+import java.util.Collection;
+
 public interface GaugeManager {
     void stop();
 
     void addGauge(Gauge gauge);
 
-    void stopGauge(Role role);
+    void stopGauge(Gauge role);
+
+    Collection<Gauge> gauges();
+
+    Role findGaugeRole(String name);
 }

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/DefaultRepository.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/DefaultRepository.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/DefaultRepository.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/DefaultRepository.java Mon Nov  4 10:23:22 2013
@@ -31,6 +31,7 @@ import org.apache.sirona.store.DataStore
 import org.apache.sirona.store.GaugeDataStore;
 import org.apache.sirona.store.GaugeValuesRequest;
 
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
 
@@ -85,6 +86,11 @@ public class DefaultRepository implement
     }
 
     @Override
+    public Collection<Counter> counters() {
+        return counterDataStore.getCounters();
+    }
+
+    @Override
     public void clear() {
         counterDataStore.clearCounters();
     }
@@ -95,13 +101,18 @@ public class DefaultRepository implement
     }
 
     @Override
-    public Iterator<Counter> iterator() {
-        return counterDataStore.getCounters().iterator();
+    public Map<Long, Double> getGaugeValues(final long start, final long end, final Role role) {
+        return gaugeDataStore.getGaugeValues(new GaugeValuesRequest(start, end, role));
+    }
+
+    @Override
+    public Collection<Gauge> gauges() {
+        return gaugeManager.gauges();
     }
 
     @Override
-    public Map<Long, Double> getGaugeValues(final long start, final long end, final Role role) {
-        return gaugeDataStore.getGaugeValues(new GaugeValuesRequest(start, end, role));
+    public Role findGaugeRole(final String name) {
+        return gaugeManager.findGaugeRole(name);
     }
 
     @Override
@@ -110,7 +121,7 @@ public class DefaultRepository implement
     }
 
     @Override
-    public void stopGauge(final Role role) {
+    public void stopGauge(final Gauge role) {
         gaugeManager.stopGauge(role);
     }
 }

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/Repository.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/Repository.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/Repository.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/repositories/Repository.java Mon Nov  4 10:23:22 2013
@@ -23,20 +23,27 @@ import org.apache.sirona.counters.Counte
 import org.apache.sirona.gauges.Gauge;
 import org.apache.sirona.stopwatches.StopWatch;
 
+import java.util.Collection;
 import java.util.Map;
 
-public interface Repository extends Iterable<Counter> {
+public interface Repository {
     Repository INSTANCE = Configuration.findOrCreateInstance(Repository.class);
 
     Counter getCounter(Counter.Key key);
 
+    Collection<Counter> counters();
+
     void clear();
 
     StopWatch start(Counter counter);
 
     void addGauge(final Gauge gauge);
 
-    void stopGauge(Role role);
+    void stopGauge(Gauge role);
 
     Map<Long, Double> getGaugeValues(long start, long end, Role role);
+
+    Collection<Gauge> gauges();
+
+    Role findGaugeRole(String name);
 }

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchCounterDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchCounterDataStore.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchCounterDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchCounterDataStore.java Mon Nov  4 10:23:22 2013
@@ -17,9 +17,11 @@
 package org.apache.sirona.store;
 
 import org.apache.sirona.configuration.Configuration;
+import org.apache.sirona.counters.Counter;
 import org.apache.sirona.repositories.Repository;
 import org.apache.sirona.util.DaemonThreadFactory;
 
+import java.util.Collection;
 import java.util.Locale;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -52,13 +54,13 @@ public abstract class BatchCounterDataSt
         scheduledTask.done();
     }
 
-    protected abstract void pushCountersByBatch(final Repository instance);
+    protected abstract void pushCountersByBatch(final Collection<Counter> instance);
 
     private class BatchPushCountersTask implements Runnable {
         @Override
         public void run() {
             try {
-                pushCountersByBatch(Repository.INSTANCE);
+                pushCountersByBatch(Repository.INSTANCE.counters());
             } catch (final Exception e) {
                 LOGGER.log(Level.SEVERE, e.getMessage(), e);
             }

Modified: incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeCounterDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeCounterDataStore.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeCounterDataStore.java (original)
+++ incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeCounterDataStore.java Mon Nov  4 10:23:22 2013
@@ -18,9 +18,10 @@ package org.apache.sirona.cube;
 
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.counters.Counter;
-import org.apache.sirona.repositories.Repository;
 import org.apache.sirona.store.BatchCounterDataStore;
 
+import java.util.Collection;
+
 public class CubeCounterDataStore extends BatchCounterDataStore {
     private static final String COUNTER_TYPE = "counter";
 
@@ -39,10 +40,10 @@ public class CubeCounterDataStore extend
     private final Cube cube = Configuration.findOrCreateInstance(CubeBuilder.class).build();
 
     @Override
-    protected synchronized void pushCountersByBatch(final Repository instance) {
+    protected synchronized void pushCountersByBatch(final Collection<Counter> instances) {
         final long ts = System.currentTimeMillis();
         final StringBuilder events = cube.newEventStream();
-        for (final Counter counter : instance) {
+        for (final Counter counter : instances) {
             cube.buildEvent(events, COUNTER_TYPE, ts, new MapBuilder()
                     .add(NAME, counter.getKey().getName())
                     .add(ROLE, counter.getKey().getRole().getName())

Modified: incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteCounterDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteCounterDataStore.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteCounterDataStore.java (original)
+++ incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteCounterDataStore.java Mon Nov  4 10:23:22 2013
@@ -19,10 +19,10 @@ package org.apache.sirona.graphite;
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.counters.MetricData;
-import org.apache.sirona.repositories.Repository;
 import org.apache.sirona.store.BatchCounterDataStore;
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -35,13 +35,13 @@ public class GraphiteCounterDataStore ex
     private final Graphite graphite = Configuration.findOrCreateInstance(GraphiteBuilder.class).build();
 
     @Override
-    protected synchronized void pushCountersByBatch(final Repository instance) {
+    protected synchronized void pushCountersByBatch(final Collection<Counter> instances) {
         try {
             graphite.open();
 
             final long ts = System.currentTimeMillis();
 
-            for (final Counter counter : instance) {
+            for (final Counter counter : instances) {
                 final Counter.Key key = counter.getKey();
                 final String prefix = COUNTER_PREFIX + key.getRole().getName() + SEP + key.getName() + SEP;
 

Modified: incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/EMFTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/EMFTest.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/EMFTest.java (original)
+++ incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/EMFTest.java Mon Nov  4 10:23:22 2013
@@ -30,6 +30,7 @@ import javax.persistence.spi.Persistence
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
+import java.util.Collection;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -70,7 +71,7 @@ public class EMFTest {
     }
 
     private static void assertCreateCalled() {
-        final List<Counter> counters = IteratorUtils.toList(Repository.INSTANCE.iterator());
+        final Collection<Counter> counters = Repository.INSTANCE.counters();
         assertEquals(1, counters.size());
 
         final Counter counter = counters.iterator().next();

Modified: incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/QueryTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/QueryTest.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/QueryTest.java (original)
+++ incubator/sirona/trunk/jpa/src/test/java/org/apache/sirona/jpa/QueryTest.java Mon Nov  4 10:23:22 2013
@@ -110,9 +110,9 @@ public class QueryTest {
     }
 
     private static void assertCounter(final String method) {
-        assertTrue(Repository.INSTANCE.iterator().hasNext());
+        assertTrue(Repository.INSTANCE.counters().iterator().hasNext());
 
-        final Counter counter = Repository.INSTANCE.iterator().next();
+        final Counter counter = Repository.INSTANCE.counters().iterator().next();
         assertEquals(1, counter.getHits());
         assertThat(counter.getKey().getName(), containsString(method));
     }

Modified: incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/handler/api/Template.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/handler/api/Template.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/handler/api/Template.java (original)
+++ incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/handler/api/Template.java Mon Nov  4 10:23:22 2013
@@ -16,19 +16,22 @@
  */
 package org.apache.sirona.reporting.web.handler.api;
 
+import org.apache.sirona.reporting.web.template.MapBuilder;
+
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 public class Template {
     private final String template;
-    private final Map<String, ?> userParams;
+    private final Map<String, Object> userParams;
     private final boolean html;
 
     public Template(final String template) {
-        this(template, Collections.<String, Object>emptyMap());
+        this(template, new HashMap<String, Object>());
     }
 
-    public Template(final String template, final Map<String, ?> userParams) {
+    public Template(final String template, final Map<String, Object> userParams) {
         this(template, userParams, true);
     }
 
@@ -37,7 +40,7 @@ public class Template {
      * @param userParams variables used by the template
      * @param isHtml should the template be rendered with the site them or not (= is it a page fragment).
      */
-    public Template(final String template, final Map<String, ?> userParams, final boolean isHtml) {
+    public Template(final String template, final Map<String, Object> userParams, final boolean isHtml) {
         this.template = template;
         this.userParams = userParams;
         this.html = isHtml;
@@ -54,4 +57,9 @@ public class Template {
     public boolean isHtml() {
         return html;
     }
+
+    public Template set(final String attribute, final Object value) {
+        userParams.put(attribute, value);
+        return this;
+    }
 }

Added: incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugeEndpoints.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugeEndpoints.java?rev=1538543&view=auto
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugeEndpoints.java (added)
+++ incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugeEndpoints.java Mon Nov  4 10:23:22 2013
@@ -0,0 +1,81 @@
+/*
+ * 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.sirona.reporting.web.plugin.gauge;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.sirona.gauges.Gauge;
+import org.apache.sirona.reporting.web.handler.api.Regex;
+import org.apache.sirona.reporting.web.handler.api.Template;
+import org.apache.sirona.repositories.Repository;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.Collection;
+import java.util.Map;
+import java.util.TreeMap;
+
+import static org.apache.sirona.reporting.web.graph.Line.generateReport;
+
+// gauge names can be not so URL friendly so using urlencode(base64), encoding is not in an utility class since it can change depending the data
+public class GaugeEndpoints {
+    private static final String UTF8 = "UTF-8";
+
+    @Regex
+    public Template home() {
+        return new Template("gauge/home.vm").set("gauges", sortNames(Repository.INSTANCE.gauges()));
+    }
+
+    @Regex("/([^/]*)")
+    public Template detail(final String role) {
+        return new Template("gauge/detail.vm")
+            .set("gauge", decode(role))
+            .set("gauge64", role);
+    }
+
+    @Regex("/([^/]*)/([0-9]*)/([0-9]*)")
+    public String jsonDetail(final String base64Role, final long start, final long end) {
+        final String role = decode(base64Role);
+        return generateReport(role, Repository.INSTANCE.findGaugeRole(role), start, end);
+    }
+
+    private static String decode(final String base64Role) {
+        try {
+            return new String(Base64.decodeBase64(URLDecoder.decode(base64Role, UTF8)));
+        } catch (final UnsupportedEncodingException e) {
+            return base64Role; // shouldn't occur
+        }
+    }
+
+    private static String encode(final String role) {
+        final String base64 = new String(Base64.encodeBase64(role.getBytes()));
+        try {
+            return URLEncoder.encode(base64, UTF8);
+        } catch (final UnsupportedEncodingException e) {
+            return base64; // shouldn't occur
+        }
+    }
+
+    private static Map<String, String> sortNames(final Collection<Gauge> gauges) {
+        final Map<String, String> names = new TreeMap<String, String>();
+        for (final Gauge gauge : gauges) {
+            final String name = gauge.role().getName();
+            names.put(name, encode(name));
+        }
+        return names;
+    }
+}

Added: incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugePlugin.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugePlugin.java?rev=1538543&view=auto
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugePlugin.java (added)
+++ incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/gauge/GaugePlugin.java Mon Nov  4 10:23:22 2013
@@ -0,0 +1,36 @@
+/*
+ * 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.sirona.reporting.web.plugin.gauge;
+
+import org.apache.sirona.reporting.web.plugin.Plugin;
+
+public class GaugePlugin implements Plugin {
+    @Override
+    public String name() {
+        return "Gauges";
+    }
+
+    @Override
+    public Class<?> endpoints() {
+        return GaugeEndpoints.class;
+    }
+
+    @Override
+    public String mapping() {
+        return "/gauges";
+    }
+}

Modified: incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/JSONFormat.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/JSONFormat.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/JSONFormat.java (original)
+++ incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/JSONFormat.java Mon Nov  4 10:23:22 2013
@@ -30,7 +30,7 @@ public class JSONFormat implements Forma
         return new Template("/templates/report/report-json.vm",
             new MapBuilder<String, Object>()
                 .set("MetricData", MetricData.class)
-                .set("counters", Repository.INSTANCE.iterator())
+                .set("counters", Repository.INSTANCE.counters())
                 .build(), false);
     }
 

Modified: incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/MapFormat.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/MapFormat.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/MapFormat.java (original)
+++ incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/MapFormat.java Mon Nov  4 10:23:22 2013
@@ -102,7 +102,7 @@ public abstract class MapFormat {
 
     protected static Map<String, Collection<String>> snapshotByPath(final Unit timeUnit, final String format) {
         final Map<String, Collection<String>> data = new TreeMap<String, Collection<String>>();
-        for (final Counter counter : Repository.INSTANCE) {
+        for (final Counter counter : Repository.INSTANCE.counters()) {
             final Counter.Key key = counter.getKey();
             data.put(generateCounterKeyString(key), generateLine(counter, timeUnit, format));
         }
@@ -120,7 +120,7 @@ public abstract class MapFormat {
 
     protected static Collection<Collection<String>> snapshot(final Unit timeUnit, final String format) {
         final Collection<Collection<String>> data = new ArrayList<Collection<String>>();
-        for (final Counter counter : Repository.INSTANCE) {
+        for (final Counter counter : Repository.INSTANCE.counters()) {
             data.add(generateLine(counter, timeUnit, format));
         }
         return data;

Modified: incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/XMLFormat.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/XMLFormat.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/XMLFormat.java (original)
+++ incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/report/format/XMLFormat.java Mon Nov  4 10:23:22 2013
@@ -30,7 +30,7 @@ public class XMLFormat implements Format
         return new Template("/templates/report/report-xml.vm",
             new MapBuilder<String, Object>()
                 .set("MetricData", MetricData.class)
-                .set("counters", Repository.INSTANCE.iterator())
+                .set("counters", Repository.INSTANCE.counters())
                 .build(), false);
     }
 

Modified: incubator/sirona/trunk/reporting/src/main/resources/META-INF/services/org.apache.sirona.reporting.web.plugin.Plugin
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/resources/META-INF/services/org.apache.sirona.reporting.web.plugin.Plugin?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/resources/META-INF/services/org.apache.sirona.reporting.web.plugin.Plugin (original)
+++ incubator/sirona/trunk/reporting/src/main/resources/META-INF/services/org.apache.sirona.reporting.web.plugin.Plugin Mon Nov  4 10:23:22 2013
@@ -1,4 +1,5 @@
 org.apache.sirona.reporting.web.plugin.report.ReportPlugin
+org.apache.sirona.reporting.web.plugin.gauge.GaugePlugin
 org.apache.sirona.reporting.web.plugin.jmx.JMXPlugin
 org.apache.sirona.reporting.web.plugin.jvm.JVMPlugin
 org.apache.sirona.reporting.web.plugin.jta.JTAPlugin

Modified: incubator/sirona/trunk/reporting/src/main/resources/resources/js/sirona.js
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/resources/resources/js/sirona.js?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/resources/resources/js/sirona.js (original)
+++ incubator/sirona/trunk/reporting/src/main/resources/resources/js/sirona.js Mon Nov  4 10:23:22 2013
@@ -17,6 +17,10 @@
 (function (Sirona, $, undefined) {
     var dayDuration = 24 * 3600 * 1000;
 
+    Sirona.escapeId = function (id) { // we use base64 etc so we need escaping
+        return id.replace( /(%|:|\.|\[|\])/g, "\\$1" );
+    };
+
     Sirona.extractTimeFromPicker = function (picker) {
         return picker.data('datetimepicker').getLocalDate().getTime();
     };
@@ -27,7 +31,7 @@
             type: "GET",
             dataType: "json",
             success: function (data) {
-                $.plot("#" + graph + "-graph", data, options);
+                $.plot("#" + Sirona.escapeId(graph + "-graph"), data, options);
             },
             //complete: complete, // TODO: find a better way to refresh the plot
             timeout: timeout
@@ -35,19 +39,24 @@
     };
 
     Sirona.initGraph = function(mapping, plugin, graph, options) {
+        var startDateTimePicker = $('#' + Sirona.escapeId(graph + '-datetimepicker-start'));
+        var endDateTimePicker = $('#' + Sirona.escapeId(graph + '-datetimepicker-end'));
+        startDateTimePicker.datetimepicker();
+        endDateTimePicker.datetimepicker();
+
         var yesterday = new Date();
         yesterday.setTime(yesterday.getTime() - dayDuration);
 
         var tomorrow = new Date();
         tomorrow.setTime(tomorrow.getTime() + dayDuration);
 
-        $('#' + graph + '-datetimepicker-start').data('datetimepicker').setLocalDate(yesterday);
-        $('#' + graph + '-datetimepicker-end').data('datetimepicker').setLocalDate(tomorrow);
+        startDateTimePicker.data('datetimepicker').setLocalDate(yesterday);
+        endDateTimePicker.data('datetimepicker').setLocalDate(tomorrow);
 
         (function doUpdateGraph() {
             Sirona.updateGraph(mapping, plugin, graph,
-                Sirona.extractTimeFromPicker($('#' + graph + '-datetimepicker-start')),
-                Sirona.extractTimeFromPicker($('#' + graph + '-datetimepicker-end')),
+                Sirona.extractTimeFromPicker(startDateTimePicker),
+                Sirona.extractTimeFromPicker(endDateTimePicker),
                 options, doUpdateGraph, 4000); // refresh interval = 4s
         })();
     };

Added: incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/detail.vm
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/detail.vm?rev=1538543&view=auto
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/detail.vm (added)
+++ incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/detail.vm Mon Nov  4 10:23:22 2013
@@ -0,0 +1,36 @@
+#*
+  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.
+*#
+<div class="container-fluid">
+    <div class="row-fluid">
+        #graphBlock("$gauge", "$gauge64")
+    </div>
+</div>
+
+<script type="text/javascript" src="$mapping/resources/js/bootstrap-datetimepicker.min.js"></script>
+<script type="text/javascript" src="$mapping/resources/js/jquery.flot.min.js"></script>
+<script type="text/javascript" src="$mapping/resources/js/jquery.flot.time.min.js"></script>
+<script type="text/javascript">
+    $(function() {
+        Sirona.initGraph("$mapping", 'gauges', "$gauge64", {
+            canvas: true,
+            series: { lines: { show: true }, points: { show: true } },
+            grid: { hoverable: true, clickable: true },
+            xaxes: [ { mode: "time", timezone: "browser" } ],
+            yaxes: [ { min: 0 } ]
+        });
+    });
+</script>

Added: incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/home.vm
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/home.vm?rev=1538543&view=auto
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/home.vm (added)
+++ incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/home.vm Mon Nov  4 10:23:22 2013
@@ -0,0 +1,26 @@
+#*
+  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.
+*#
+<h1>Gauges</h1>
+
+<div>
+    Here is the list of available gauges, click on one of them to get its details:
+    <ul>
+        #foreach ($gauge in $gauges.entrySet())
+            <li><a href="$mapping/gauges/$gauge.value">$gauge.key<a/></li>
+        #end
+    </ul>
+</div>

Modified: incubator/sirona/trunk/reporting/src/main/resources/templates/jta/jta.vm
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/resources/templates/jta/jta.vm?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/resources/templates/jta/jta.vm (original)
+++ incubator/sirona/trunk/reporting/src/main/resources/templates/jta/jta.vm Mon Nov  4 10:23:22 2013
@@ -35,11 +35,6 @@
 <script type="text/javascript" src="$mapping/resources/js/jquery.flot.time.min.js"></script>
 <script type="text/javascript">
     $(function() {
-        #foreach ($item in $parts )
-            $('#${item}-datetimepicker-start').datetimepicker();
-            $('#${item}-datetimepicker-end').datetimepicker();
-        #end
-
         var options = {
             canvas: true,
             series: { lines: { show: true }, points: { show: true } },

Modified: incubator/sirona/trunk/reporting/src/main/resources/templates/jvm/jvm.vm
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/resources/templates/jvm/jvm.vm?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/resources/templates/jvm/jvm.vm (original)
+++ incubator/sirona/trunk/reporting/src/main/resources/templates/jvm/jvm.vm Mon Nov  4 10:23:22 2013
@@ -68,11 +68,6 @@
 <script type="text/javascript" src="$mapping/resources/js/jquery.flot.time.min.js"></script>
 <script type="text/javascript">
     $(function() {
-        $('#memory-datetimepicker-start').datetimepicker();
-        $('#memory-datetimepicker-end').datetimepicker();
-        $('#cpu-datetimepicker-start').datetimepicker();
-        $('#cpu-datetimepicker-end').datetimepicker();
-
         var cpuOptions = {
             canvas: true,
             series: { lines: { show: true }, points: { show: true } },

Modified: incubator/sirona/trunk/reporting/src/main/resources/templates/web/web.vm
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/main/resources/templates/web/web.vm?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/main/resources/templates/web/web.vm (original)
+++ incubator/sirona/trunk/reporting/src/main/resources/templates/web/web.vm Mon Nov  4 10:23:22 2013
@@ -27,9 +27,6 @@
 <script type="text/javascript" src="$mapping/resources/js/jquery.flot.time.min.js"></script>
 <script type="text/javascript">
     $(function() {
-        $('#sessions-datetimepicker-start').datetimepicker();
-        $('#sessions-datetimepicker-end').datetimepicker();
-
         var options = {
             canvas: true,
             series: { lines: { show: true }, points: { show: true } },

Copied: incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/GaugesTest.java (from r1538515, incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/ThreadsTest.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/GaugesTest.java?p2=incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/GaugesTest.java&p1=incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/ThreadsTest.java&r1=1538515&r2=1538543&rev=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/ThreadsTest.java (original)
+++ incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/GaugesTest.java Mon Nov  4 10:23:22 2013
@@ -22,23 +22,31 @@ import org.junit.Test;
 
 import java.io.IOException;
 
-import static com.gargoylesoftware.htmlunit.WebAssert.assertElementPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
 
-public class ThreadsTest extends SironaReportingTestBase {
-    private static final String CONTAINER_BACKGROUND_THREAD = "Q29udGFpbmVyQmFja2dyb3VuZFByb2Nlc3NvcltTdGFuZGFyZEVuZ2luZVthcnF1aWxsaWFuLXRvbWNhdC1lbWJlZGRlZC03XV0="; // always exists
+public class GaugesTest extends SironaReportingTestBase {
+    private static final String CPU_GAUGE_ENCODED = "Q1BV";
 
     @Test
-    public void checkThreadsAreListed() throws IOException {
-        final HtmlPage page = page("threads");
-        assertElementPresent(page, CONTAINER_BACKGROUND_THREAD);
+    public void checkGaugesAreListed() throws IOException {
+        final HtmlPage page = page("gauges");
+        final String content = page.getWebResponse().getContentAsString();
+        assertThat(content, containsString("<a href=\"/sirona-test/monitoring/gauges/" + CPU_GAUGE_ENCODED + "\">"));
+        assertThat(content, containsString("CPU"));
     }
 
     @Test
     public void checkDetail() throws IOException {
-        final TextPage page = page("threads/" + CONTAINER_BACKGROUND_THREAD);
-        assertThat(page.getWebResponse().getContentAsString(), containsString("org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run"));
+        final HtmlPage page = page("gauges/" + CPU_GAUGE_ENCODED);
+        assertThat(page.getWebResponse().getContentAsString(), containsString("id=\"" + CPU_GAUGE_ENCODED + "-graph\""));
+    }
+
+    @Test
+    public void checkJsonDetail() throws IOException {
+        final TextPage page = page("gauges/" + CPU_GAUGE_ENCODED + "/0/" + (System.currentTimeMillis() + 1000));
+        final String json = page.getWebResponse().getContentAsString();
+        assertThat(json, containsString("[{\"label\":\"CPU\",\"color\":"));
+        assertThat(json, containsString("\"data\":"));
     }
 }

Modified: incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java (original)
+++ incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java Mon Nov  4 10:23:22 2013
@@ -53,9 +53,15 @@ public class GaugeDiscoveryListener impl
         final ConcurrentMap<Integer, StatusGauge> gauges = new ConcurrentHashMap<Integer, StatusGauge>(35);
         if ("true".equalsIgnoreCase((String) sce.getServletContext().getAttribute(MonitoringFilter.MONITOR_STATUS))) {
             final String monitoredStatuses = sce.getServletContext().getInitParameter(Configuration.CONFIG_PROPERTY_PREFIX + "web.monitored-statuses");
+
+            String contextPath = sce.getServletContext().getContextPath();
+            if (contextPath == null || contextPath.isEmpty()) {
+                contextPath = "/";
+            }
+
             if (monitoredStatuses == null) {
                 for (final int status : DEFAULT_STATUSES) {
-                    gauges.put(status, statusGauge(sce.getServletContext().getContextPath(), gauges, status));
+                    gauges.put(status, statusGauge(contextPath, gauges, status));
                 }
                 /* we could use it but it defines 25 statuses, surely too much
                 for (final Field f : HttpURLConnection.class.getDeclaredFields()) {
@@ -74,7 +80,7 @@ public class GaugeDiscoveryListener impl
             } else {
                 for (final String status : monitoredStatuses.split(",")) {
                     final int statusInt = Integer.parseInt(status.trim());
-                    gauges.put(statusInt, statusGauge(sce.getServletContext().getContextPath(), gauges, statusInt));
+                    gauges.put(statusInt, statusGauge(contextPath, gauges, statusInt));
                 }
             }
             sce.getServletContext().setAttribute(STATUS_GAUGES_ATTRIBUTE, gauges);

Modified: incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/MonitoringSessionListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/MonitoringSessionListener.java?rev=1538543&r1=1538542&r2=1538543&view=diff
==============================================================================
--- incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/MonitoringSessionListener.java (original)
+++ incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/MonitoringSessionListener.java Mon Nov  4 10:23:22 2013
@@ -68,6 +68,6 @@ public class MonitoringSessionListener i
 
     @Override
     public void contextDestroyed(final ServletContextEvent sce) {
-        Repository.INSTANCE.stopGauge(gauge.role());
+        Repository.INSTANCE.stopGauge(gauge);
     }
 }