You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by rm...@apache.org on 2013/10/14 08:35:02 UTC

svn commit: r1531797 - in /commons/sandbox/monitoring/trunk: core/src/main/java/org/apache/commons/monitoring/configuration/ core/src/main/java/org/apache/commons/monitoring/gauges/ core/src/main/java/org/apache/commons/monitoring/store/ graphite/src/m...

Author: rmannibucau
Date: Mon Oct 14 06:35:01 2013
New Revision: 1531797

URL: http://svn.apache.org/r1531797
Log:
removing GaugeObserver and using DataStore API to write a GraphiteDataStore

Added:
    commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/BatchCounterDataStore.java
    commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/InMemoryCounterBaseStore.java
    commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/GraphiteDataStore.java
Removed:
    commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/gauges/GaugeObserver.java
    commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/GraphiteGaugeObserver.java
    commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/Graphites.java
Modified:
    commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/configuration/Configuration.java
    commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/gauges/DefaultGaugeManager.java
    commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/DefaultDataStore.java
    commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/Graphite.java
    commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/lifecycle/GraphiteLifecycle.java
    commons/sandbox/monitoring/trunk/graphite/src/test/java/org/apache/commons/monitoring/graphite/GraphiteTestBase.java
    commons/sandbox/monitoring/trunk/graphite/src/test/resources/commons-monitoring.properties
    commons/sandbox/monitoring/trunk/src/site/markdown/graphite.md

Modified: commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/configuration/Configuration.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/configuration/Configuration.java?rev=1531797&r1=1531796&r2=1531797&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/configuration/Configuration.java (original)
+++ commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/configuration/Configuration.java Mon Oct 14 06:35:01 2013
@@ -33,13 +33,16 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 public final class Configuration {
     private static final Logger LOGGER = Logger.getLogger(Configuration.class.getName());
 
+    private static final Map<Class<?>, Object> SINGLETONS = new ConcurrentHashMap<Class<?>, Object>();
     private static final Collection<ToDestroy> INSTANCES = new ArrayList<ToDestroy>();
 
     public static final String COMMONS_MONITORING_PREFIX = "org.apache.commons.monitoring.";
@@ -96,7 +99,9 @@ public final class Configuration {
                 }
             }
 
-            return newInstance(clazz, config);
+            final T t = newInstance(clazz, config);
+            SINGLETONS.put(clazz, t);
+            return t;
         } catch (final Exception e) {
             throw new MonitoringException(e);
         }
@@ -154,6 +159,10 @@ public final class Configuration {
         return clazz.cast(instance);
     }
 
+    public static <T> T getInstance(final Class<T> clazz) {
+        return clazz.cast(SINGLETONS.get(clazz));
+    }
+
     public static boolean is(final String key, final boolean defaultValue) {
         return Boolean.parseBoolean(getProperty(key, Boolean.toString(defaultValue)));
     }
@@ -171,6 +180,7 @@ public final class Configuration {
             c.destroy();
         }
         INSTANCES.clear();
+        SINGLETONS.clear();
     }
 
     private Configuration() {

Modified: commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/gauges/DefaultGaugeManager.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/gauges/DefaultGaugeManager.java?rev=1531797&r1=1531796&r2=1531797&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/gauges/DefaultGaugeManager.java (original)
+++ commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/gauges/DefaultGaugeManager.java Mon Oct 14 06:35:01 2013
@@ -17,7 +17,6 @@
 package org.apache.commons.monitoring.gauges;
 
 import org.apache.commons.monitoring.Role;
-import org.apache.commons.monitoring.configuration.Configuration;
 import org.apache.commons.monitoring.store.DataStore;
 
 import java.util.Map;
@@ -27,7 +26,6 @@ import java.util.concurrent.ConcurrentHa
 
 public final class DefaultGaugeManager implements GaugeManager {
     private final Map<Role, Timer> timers = new ConcurrentHashMap<Role, Timer>();
-    private final GaugeObserver[] observers = Configuration.newInstances(GaugeObserver.class);
     private final DataStore store;
 
     public DefaultGaugeManager(final DataStore dataStore) {
@@ -58,18 +56,16 @@ public final class DefaultGaugeManager i
 
         final Timer timer = new Timer("gauge-" + role.getName() + "-timer", true);
         timers.put(role, timer);
-        timer.scheduleAtFixedRate(new GaugeTask(store, gauge, observers), 0, gauge.period());
+        timer.scheduleAtFixedRate(new GaugeTask(store, gauge), 0, gauge.period());
     }
 
     private static class GaugeTask extends TimerTask {
         private final Gauge gauge;
         private final DataStore store;
-        private final GaugeObserver[] observers; // acceptable since gauges are not fast update entities
 
-        public GaugeTask(final DataStore store, final Gauge gauge, final GaugeObserver[] observers) {
+        public GaugeTask(final DataStore store, final Gauge gauge) {
             this.store = store;
             this.gauge = gauge;
-            this.observers = observers;
         }
 
         @Override
@@ -78,13 +74,6 @@ public final class DefaultGaugeManager i
             final double value = gauge.value();
 
             store.addToGauge(gauge, time, value);
-            for (final GaugeObserver observer : observers) {
-                try {
-                    observer.observe(gauge, time, value);
-                } catch (final Exception e) {
-                    // no-op: don't make the thread failling because of an observer
-                }
-            }
         }
     }
 }

Added: commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/BatchCounterDataStore.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/BatchCounterDataStore.java?rev=1531797&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/BatchCounterDataStore.java (added)
+++ commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/BatchCounterDataStore.java Mon Oct 14 06:35:01 2013
@@ -0,0 +1,82 @@
+/*
+ * 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.store;
+
+import org.apache.commons.monitoring.Role;
+import org.apache.commons.monitoring.configuration.Configuration;
+import org.apache.commons.monitoring.repositories.Repository;
+import org.apache.commons.monitoring.util.DaemonThreadFactory;
+
+import java.util.Locale;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+public abstract class BatchCounterDataStore extends InMemoryCounterBaseStore {
+    protected final BatchFuture scheduledTask;
+
+    protected BatchCounterDataStore() {
+        final String name = getClass().getSimpleName().toLowerCase(Locale.ENGLISH).replace("datastore", "");
+        final long period = Configuration.getInteger(Configuration.COMMONS_MONITORING_PREFIX + name + ".period", 60000);
+
+        final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(new DaemonThreadFactory(name + "-schedule-"));
+        final ScheduledFuture<?> future = ses.schedule(new BatchPushCountersTask(), period, TimeUnit.MILLISECONDS);
+        ses.shutdown(); // don't add anything more now
+        scheduledTask = new BatchFuture(ses, future);
+    }
+
+    public void shutdown() {
+        scheduledTask.done();
+    }
+
+    @Override
+    public void createOrNoopGauge(final Role role) {
+        // no-op
+    }
+
+    protected abstract void pushCountersByBatch(final Repository instance);
+
+    private class BatchPushCountersTask implements Runnable {
+        @Override
+        public void run() {
+            pushCountersByBatch(Repository.INSTANCE);
+        }
+    }
+
+    public static class BatchFuture {
+        private final ScheduledExecutorService executor;
+        private final ScheduledFuture<?> task;
+
+        public BatchFuture(final ScheduledExecutorService ses, final ScheduledFuture<?> future) {
+            this.executor = ses;
+            this.task = future;
+        }
+
+        public void done() {
+            try {
+                task.cancel(false);
+                executor.awaitTermination(1, TimeUnit.MINUTES);
+                if (!task.isDone()) {
+                    task.cancel(true);
+                }
+            } catch (final InterruptedException e) {
+                // no-op
+            }
+        }
+    }
+}

Modified: commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/DefaultDataStore.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/DefaultDataStore.java?rev=1531797&r1=1531796&r2=1531797&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/DefaultDataStore.java (original)
+++ commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/DefaultDataStore.java Mon Oct 14 06:35:01 2013
@@ -18,63 +18,18 @@ package org.apache.commons.monitoring.st
 
 import org.apache.commons.monitoring.Role;
 import org.apache.commons.monitoring.configuration.Configuration;
-import org.apache.commons.monitoring.counters.Counter;
-import org.apache.commons.monitoring.counters.DefaultCounter;
 import org.apache.commons.monitoring.gauges.Gauge;
 
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ConcurrentSkipListMap;
-import java.util.concurrent.locks.Lock;
 
-public class DefaultDataStore implements DataStore {
-    private final ConcurrentMap<Counter.Key, Counter> counters = new ConcurrentHashMap<Counter.Key, Counter>(50);
+public class DefaultDataStore extends InMemoryCounterBaseStore {
     private final Map<Role, Map<Long, Double>> gauges = new ConcurrentHashMap<Role, Map<Long, Double>>();
 
     @Override
-    public Counter getOrCreateCounter(final Counter.Key key) {
-        Counter counter = counters.get(key);
-        if (counter == null) {
-            counter = new DefaultCounter(key, this);
-            final Counter previous = counters.putIfAbsent(key, counter);
-            if (previous != null) {
-                counter = previous;
-            }
-        }
-        return counter;
-    }
-
-    @Override
-    public void clearCounters() {
-        counters.clear();
-    }
-
-    @Override
-    public Collection<Counter> getCounters() {
-        return counters.values();
-    }
-
-    @Override
-    public void addToCounter(final Counter counter, final double delta) {
-        if (!DefaultCounter.class.isInstance(counter)) {
-            throw new IllegalArgumentException(DefaultDataStore.class.getName() + " only supports " + DefaultCounter.class.getName());
-        }
-
-        final DefaultCounter defaultCounter = DefaultCounter.class.cast(counter);
-        final Lock lock = defaultCounter.getLock();
-        lock.lock();
-        try {
-            defaultCounter.addInternal(delta);
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    @Override
     public Map<Long, Double> getGaugeValues(GaugeValuesRequest gaugeValuesRequest) {
         final Map<Long, Double> map = gauges.get(gaugeValuesRequest.getRole());
         if (map == null) {

Added: commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/InMemoryCounterBaseStore.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/InMemoryCounterBaseStore.java?rev=1531797&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/InMemoryCounterBaseStore.java (added)
+++ commons/sandbox/monitoring/trunk/core/src/main/java/org/apache/commons/monitoring/store/InMemoryCounterBaseStore.java Mon Oct 14 06:35:01 2013
@@ -0,0 +1,68 @@
+/*
+ * 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.store;
+
+import org.apache.commons.monitoring.counters.Counter;
+import org.apache.commons.monitoring.counters.DefaultCounter;
+
+import java.util.Collection;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.locks.Lock;
+
+public abstract class InMemoryCounterBaseStore implements DataStore {
+    private final ConcurrentMap<Counter.Key, Counter> counters = new ConcurrentHashMap<Counter.Key, Counter>(50);
+
+    @Override
+    public Counter getOrCreateCounter(final Counter.Key key) {
+        Counter counter = counters.get(key);
+        if (counter == null) {
+            counter = new DefaultCounter(key, this);
+            final Counter previous = counters.putIfAbsent(key, counter);
+            if (previous != null) {
+                counter = previous;
+            }
+        }
+        return counter;
+    }
+
+    @Override
+    public void clearCounters() {
+        counters.clear();
+    }
+
+    @Override
+    public Collection<Counter> getCounters() {
+        return counters.values();
+    }
+
+    @Override
+    public void addToCounter(final Counter counter, final double delta) {
+        if (!DefaultCounter.class.isInstance(counter)) {
+            throw new IllegalArgumentException(DefaultDataStore.class.getName() + " only supports " + DefaultCounter.class.getName());
+        }
+
+        final DefaultCounter defaultCounter = DefaultCounter.class.cast(counter);
+        final Lock lock = defaultCounter.getLock();
+        lock.lock();
+        try {
+            defaultCounter.addInternal(delta);
+        } finally {
+            lock.unlock();
+        }
+    }
+}

Modified: commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/Graphite.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/Graphite.java?rev=1531797&r1=1531796&r2=1531797&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/Graphite.java (original)
+++ commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/Graphite.java Mon Oct 14 06:35:01 2013
@@ -62,6 +62,14 @@ public class Graphite implements Closeab
         this(factory, InetAddress.getByName(address), port, charset);
     }
 
+    public InetAddress getAddress() {
+        return address;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
     public void open() throws IOException {
         socket = factory.createSocket(address, port);
         writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), charset));

Added: commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/GraphiteDataStore.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/GraphiteDataStore.java?rev=1531797&view=auto
==============================================================================
--- commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/GraphiteDataStore.java (added)
+++ commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/GraphiteDataStore.java Mon Oct 14 06:35:01 2013
@@ -0,0 +1,80 @@
+/*
+ * 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.graphite;
+
+import org.apache.commons.monitoring.configuration.Configuration;
+import org.apache.commons.monitoring.counters.Counter;
+import org.apache.commons.monitoring.counters.MetricData;
+import org.apache.commons.monitoring.gauges.Gauge;
+import org.apache.commons.monitoring.repositories.Repository;
+import org.apache.commons.monitoring.store.BatchCounterDataStore;
+import org.apache.commons.monitoring.store.GaugeValuesRequest;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class GraphiteDataStore extends BatchCounterDataStore {
+    private static final Logger LOGGER = Logger.getLogger(GraphiteDataStore.class.getName());
+
+    private static final Graphite GRAPHITE = Configuration.newInstance(GraphiteBuilder.class).build();
+
+    private static final String GAUGE_PREFIX = "gauge-";
+    private static final String COUNTER_PREFIX = "counter-";
+    private static final char SEP = '-';
+
+    @Override
+    protected void pushCountersByBatch(final Repository instance) {
+        try {
+            GRAPHITE.open();
+
+            final long ts = System.currentTimeMillis();
+
+            for (final Counter counter : instance) {
+                final Counter.Key key = counter.getKey();
+                final String prefix = COUNTER_PREFIX + key.getRole().getName() + SEP + key.getName() + SEP;
+
+                for (final MetricData data : MetricData.values()) {
+                    GRAPHITE.push(
+                        prefix + data.name(),
+                        data.value(counter),
+                        ts);
+                }
+            }
+        } catch (final IOException e) {
+            LOGGER.log(Level.SEVERE, e.getMessage(), e);
+        } finally {
+            GRAPHITE.close();
+        }
+    }
+
+    @Override
+    public void addToGauge(final Gauge gauge, final long time, final double value) {
+        try {
+            GRAPHITE.simplePush(GAUGE_PREFIX + gauge.role().getName(), value, time);
+        } catch (final IOException e) {
+            // no-op
+        }
+    }
+
+    @Override
+    public Map<Long, Double> getGaugeValues(final GaugeValuesRequest gaugeValuesRequest) {
+        return Collections.emptyMap(); // when using graphite we expect the user to use Graphite to render metrics
+    }
+}

Modified: commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/lifecycle/GraphiteLifecycle.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/lifecycle/GraphiteLifecycle.java?rev=1531797&r1=1531796&r2=1531797&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/lifecycle/GraphiteLifecycle.java (original)
+++ commons/sandbox/monitoring/trunk/graphite/src/main/java/org/apache/commons/monitoring/graphite/lifecycle/GraphiteLifecycle.java Mon Oct 14 06:35:01 2013
@@ -16,21 +16,25 @@
  */
 package org.apache.commons.monitoring.graphite.lifecycle;
 
-import org.apache.commons.monitoring.graphite.Graphites;
+import org.apache.commons.monitoring.configuration.Configuration;
+import org.apache.commons.monitoring.graphite.GraphiteDataStore;
+import org.apache.commons.monitoring.store.DataStore;
 
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 
 public class GraphiteLifecycle implements ServletContextListener {
-    private Graphites.GraphiteFuture handler;
-
     @Override
     public void contextInitialized(final ServletContextEvent servletContextEvent) {
-        handler = Graphites.scheduleReport();
+        // no-op
     }
 
     @Override
     public void contextDestroyed(final ServletContextEvent servletContextEvent) {
-        handler.done();
+        final DataStore instance = Configuration.getInstance(DataStore.class);
+        if (GraphiteDataStore.class.isInstance(instance)
+            && instance.getClass().getClassLoader() == Thread.currentThread().getContextClassLoader()) {
+            GraphiteDataStore.class.cast(instance).shutdown();
+        }
     }
 }

Modified: commons/sandbox/monitoring/trunk/graphite/src/test/java/org/apache/commons/monitoring/graphite/GraphiteTestBase.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/graphite/src/test/java/org/apache/commons/monitoring/graphite/GraphiteTestBase.java?rev=1531797&r1=1531796&r2=1531797&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/graphite/src/test/java/org/apache/commons/monitoring/graphite/GraphiteTestBase.java (original)
+++ commons/sandbox/monitoring/trunk/graphite/src/test/java/org/apache/commons/monitoring/graphite/GraphiteTestBase.java Mon Oct 14 06:35:01 2013
@@ -17,6 +17,7 @@
 package org.apache.commons.monitoring.graphite;
 
 import org.apache.commons.monitoring.gauges.Gauge;
+import org.apache.commons.monitoring.graphite.lifecycle.GraphiteLifecycle;
 import org.apache.commons.monitoring.graphite.server.GraphiteMockServer;
 import org.apache.commons.monitoring.repositories.Repository;
 import org.junit.After;
@@ -29,7 +30,6 @@ import java.util.Collection;
 
 public abstract class GraphiteTestBase {
     private GraphiteMockServer server;
-    private Graphites.GraphiteFuture future;
     private Gauge.LoaderHelper gauges;
 
     @BeforeClass
@@ -41,13 +41,12 @@ public abstract class GraphiteTestBase {
     @Before
     public void startGraphite() throws IOException {
         server = new GraphiteMockServer(1234).start();
-        future = Graphites.scheduleReport();
         gauges = new Gauge.LoaderHelper(false);
     }
 
     @After
     public void shutdownGraphite() throws IOException {
-        future.done();
+        new GraphiteLifecycle().contextDestroyed(null);
         gauges.destroy();
         server.stop();
     }

Modified: commons/sandbox/monitoring/trunk/graphite/src/test/resources/commons-monitoring.properties
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/graphite/src/test/resources/commons-monitoring.properties?rev=1531797&r1=1531796&r2=1531797&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/graphite/src/test/resources/commons-monitoring.properties (original)
+++ commons/sandbox/monitoring/trunk/graphite/src/test/resources/commons-monitoring.properties Mon Oct 14 06:35:01 2013
@@ -14,9 +14,9 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-org.apache.commons.monitoring.graphite.period = 100
+org.apache.commons.monitoring.store.DataStore = org.apache.commons.monitoring.graphite.GraphiteDataStore
 
-org.apache.commons.monitoring.gauges.GaugeObserver = org.apache.commons.monitoring.graphite.GraphiteGaugeObserver
+org.apache.commons.monitoring.graphite.period = 100
 
 org.apache.commons.monitoring.graphite.GraphiteBuilder.address = localhost
 org.apache.commons.monitoring.graphite.GraphiteBuilder.port = 1234

Modified: commons/sandbox/monitoring/trunk/src/site/markdown/graphite.md
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/src/site/markdown/graphite.md?rev=1531797&r1=1531796&r2=1531797&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/src/site/markdown/graphite.md (original)
+++ commons/sandbox/monitoring/trunk/src/site/markdown/graphite.md Mon Oct 14 06:35:01 2013
@@ -32,24 +32,26 @@ For instance your `commons-monitoring.pr
 org.apache.commons.monitoring.graphite.GraphiteBuilder.address = localhost
 org.apache.commons.monitoring.graphite.GraphiteBuilder.port = 1234
 ```
+## DataStore
 
-## Counters
+To push metrics (Gauges + Counters) to Graphite you can use the dedicated `DataStore`: `org.apache.commons.monitoring.graphite.GraphiteDataStore`.
 
-To push counters just add the `ServletContextListener` dedicated
-to Graphite integration: `org.apache.commons.monitoring.graphite.lifecycle.GraphiteLifecycle`.
+Simply add to `commons-monitoring.properties` the line:
 
-The available configuration is:
+```
+org.apache.commons.monitoring.store.DataStore = org.apache.commons.monitoring.graphite.GraphiteDataStore
+```
 
-* `org.apache.commons.monitoring.graphite.period`: which period to use to push counters data to Graphite (default to 1mn).
+### Counters
 
-Note: if you are not in a web application you'll need to use `Graphites.scheduleReport` methods.
+Note: when deployed in a webapp you'll need to add the `ServletContextListener` dedicated
+to Graphite integration to release correctly resources
+when the webapp is undeployed: `org.apache.commons.monitoring.graphite.lifecycle.GraphiteLifecycle`.
 
-## Gauges
+You can also configure the period used to flush counters values:
 
-To push gauges to a Graphite instance just add the Graphite `GaugeObserver`: `org.apache.commons.monitoring.graphite.GraphiteGaugeObserver`.
+* `org.apache.commons.monitoring.graphite.period`: which period to use to push counters data to Graphite (default to 1mn).
 
-To do so just add in `commons-monitoring.properties`:
+## Limitations
 
-```
-org.apache.commons.monitoring.gauges.GaugeObserver = org.apache.commons.monitoring.graphite.GraphiteGaugeObserver
-```
+When using GraphiteDataStore you cannot retrieve locally gauges values (you are expected to use Graphite for it).