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 17:12:50 UTC

svn commit: r1538662 [1/2] - in /incubator/sirona/trunk: collector/src/main/java/org/apache/sirona/collector/server/ collector/src/main/java/org/apache/sirona/collector/server/store/ collector/src/main/java/org/apache/sirona/collector/server/store/coun...

Author: rmannibucau
Date: Mon Nov  4 16:12:48 2013
New Revision: 1538662

URL: http://svn.apache.org/r1538662
Log:
adding node status reporter

Added:
    incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/status/
    incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/status/CollectorNodeStatusDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatus.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatusReporter.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Status.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Validation.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationFactory.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationResult.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/BatchCounterDataStore.java
      - copied, changed from r1538543, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchCounterDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CollectorCounterStore.java
      - copied, changed from r1538552, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorCounterStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CounterDataStore.java
      - copied, changed from r1538515, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CounterDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/InMemoryCounterDataStore.java
      - copied, changed from r1538515, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryCounterDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/AggregatedGaugeDataStore.java
      - copied, changed from r1538552, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/AggregatedGaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CollectorGaugeDataStore.java
      - copied, changed from r1538609, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorGaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CommonGaugeDataStore.java
      - copied, changed from r1538609, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CommonGaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeDataStore.java
      - copied, changed from r1538609, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeValuesRequest.java
      - copied, changed from r1538515, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeValuesRequest.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/InMemoryGaugeDataStore.java
      - copied, changed from r1538609, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryGaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/Value.java
      - copied, changed from r1538515, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/Value.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/EmptyStatuses.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/NodeStatusDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/PeriodicNodeStatusDataStore.java
    incubator/sirona/trunk/core/src/test/java/org/apache/sirona/spi/
    incubator/sirona/trunk/core/src/test/java/org/apache/sirona/spi/SpiTestImpl.java
    incubator/sirona/trunk/core/src/test/java/org/apache/sirona/status/
    incubator/sirona/trunk/core/src/test/java/org/apache/sirona/status/ValidationTest.java
    incubator/sirona/trunk/core/src/test/resources/
    incubator/sirona/trunk/core/src/test/resources/sirona.properties
    incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeNodeStatusDataStore.java
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/status/
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/status/StatusEndpoints.java
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/plugin/status/StatusPlugin.java
    incubator/sirona/trunk/reporting/src/main/resources/templates/status/
    incubator/sirona/trunk/reporting/src/main/resources/templates/status/detail.vm
    incubator/sirona/trunk/reporting/src/main/resources/templates/status/home.vm
      - copied, changed from r1538543, incubator/sirona/trunk/reporting/src/main/resources/templates/gauge/home.vm
    incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/StatusTest.java
      - copied, changed from r1538515, incubator/sirona/trunk/reporting/src/test/java/org/apache/sirona/reporting/template/ThreadsTest.java
    incubator/sirona/trunk/reporting/src/test/resources/sirona.properties
Removed:
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/AggregatedGaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchCounterDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorCounterStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorGaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CommonGaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CounterDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeValuesRequest.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryCounterDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryGaugeDataStore.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/Value.java
Modified:
    incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/Collector.java
    incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/CollectorDataStoreFactory.java
    incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/counter/InMemoryCollectorCounterStore.java
    incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/gauge/DelegatedCollectorGaugeDataStore.java
    incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/CubeDataStoreCompatibilityTest.java
    incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/HttpCollectorTest.java
    incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/counter/AggregatorTest.java
    incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/gauge/CollectorGaugeTest.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/counters/DefaultCounter.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/RemoteGaugeDataStore.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/BatchFuture.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DataStoreFactory.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DefaultDataStoreFactory.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DelegateDataStoreFactory.java
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/util/Environment.java
    incubator/sirona/trunk/core/src/test/java/org/apache/sirona/counters/CounterBench.java
    incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java
    incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeCounterDataStore.java
    incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeDataStoreFactory.java
    incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteBuilder.java
    incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteCounterDataStore.java
    incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteDataStoreFactory.java
    incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteGaugeDataStore.java
    incubator/sirona/trunk/reporting/src/main/java/org/apache/sirona/reporting/web/graph/Line.java
    incubator/sirona/trunk/reporting/src/main/resources/META-INF/services/org.apache.sirona.reporting.web.plugin.Plugin
    incubator/sirona/trunk/src/site/markdown/collector.md

Modified: incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/Collector.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/Collector.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/Collector.java (original)
+++ incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/Collector.java Mon Nov  4 16:12:48 2013
@@ -20,13 +20,18 @@ import com.fasterxml.jackson.core.JsonPa
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.sirona.Role;
+import org.apache.sirona.collector.server.store.status.CollectorNodeStatusDataStore;
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.counters.Unit;
 import org.apache.sirona.math.M2AwareStatisticalSummary;
 import org.apache.sirona.repositories.Repository;
-import org.apache.sirona.store.CollectorCounterStore;
-import org.apache.sirona.store.CollectorGaugeDataStore;
+import org.apache.sirona.status.NodeStatus;
+import org.apache.sirona.status.Status;
+import org.apache.sirona.status.ValidationResult;
+import org.apache.sirona.store.counter.CollectorCounterStore;
+import org.apache.sirona.store.gauge.CollectorGaugeDataStore;
+import org.apache.sirona.store.status.NodeStatusDataStore;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -34,6 +39,8 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.HttpURLConnection;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Logger;
@@ -46,11 +53,13 @@ public class Collector extends HttpServl
     private static final String OK = "{}";
     private static final String GAUGE = "gauge";
     private static final String COUNTER = "counter";
+    private static final String VALIDATION = "validation";
 
     private final Map<String, Role> roles = new ConcurrentHashMap<String, Role>();
 
     private CollectorCounterStore counterDataStore = null;
     private CollectorGaugeDataStore gaugeDataStore = null;
+    private CollectorNodeStatusDataStore statusDataStore;
     private ObjectMapper mapper;
 
     @Override
@@ -58,17 +67,29 @@ public class Collector extends HttpServl
         // force init to ensure we have stores
         Configuration.findOrCreateInstance(Repository.class);
 
-        final CollectorGaugeDataStore gds = Configuration.findOrCreateInstance(CollectorGaugeDataStore.class);
-        if (gds == null) {
-            throw new IllegalStateException("Collector only works with " + CollectorGaugeDataStore.class.getName());
+        {
+            final CollectorGaugeDataStore gds = Configuration.findOrCreateInstance(CollectorGaugeDataStore.class);
+            if (gds == null) {
+                throw new IllegalStateException("Collector only works with " + CollectorGaugeDataStore.class.getName());
+            }
+            this.gaugeDataStore = CollectorGaugeDataStore.class.cast(gds);
         }
-        this.gaugeDataStore = CollectorGaugeDataStore.class.cast(gds);
 
-        final CollectorCounterStore cds = Configuration.findOrCreateInstance(CollectorCounterStore.class);
-        if (cds == null) {
-            throw new IllegalStateException("Collector only works with " + CollectorCounterStore.class.getName());
+        {
+            final CollectorCounterStore cds = Configuration.findOrCreateInstance(CollectorCounterStore.class);
+            if (cds == null) {
+                throw new IllegalStateException("Collector only works with " + CollectorCounterStore.class.getName());
+            }
+            this.counterDataStore = CollectorCounterStore.class.cast(cds);
+        }
+
+        {
+            final NodeStatusDataStore nds = Configuration.findOrCreateInstance(NodeStatusDataStore.class);
+            if (!CollectorNodeStatusDataStore.class.isInstance(nds)) {
+                throw new IllegalStateException("Collector only works with " + CollectorNodeStatusDataStore.class.getName());
+            }
+            this.statusDataStore = CollectorNodeStatusDataStore.class.cast(nds);
         }
-        this.counterDataStore = CollectorCounterStore.class.cast(cds);
 
         this.mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).configure(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS, true);
     }
@@ -78,15 +99,28 @@ public class Collector extends HttpServl
         final Event[] events = mapper.readValue(req.getInputStream(), Event[].class);
         if (events != null && events.length > 0) {
             try {
-                for (final Event event : events) {
-                    final String type = event.getType();
-
-                    if (COUNTER.equals(type)) {
-                        updateCounter(event);
-                    } else if (GAUGE.equals(type)) {
-                        updateGauge(event);
-                    } else {
-                        LOGGER.info("Unexpected type '" + type + "', skipping");
+                if (VALIDATION.equals(events[0].getType())) {
+                    final Collection<ValidationResult> results = new ArrayList<ValidationResult>(events.length);
+                    for (final Event event : events) {
+                        final Map<String, Object> data = event.getData();
+                        results.add(new ValidationResult(
+                            (String) data.get("name"),
+                            Status.valueOf((String) data.get("status")),
+                            (String) data.get("message")));
+                    }
+                    final NodeStatus status = new NodeStatus(results.toArray(new ValidationResult[results.size()]));
+                    statusDataStore.store((String) events[0].getData().get("marker"), status);
+                } else {
+                    for (final Event event : events) {
+                        final String type = event.getType();
+
+                        if (COUNTER.equals(type)) {
+                            updateCounter(event);
+                        } else if (GAUGE.equals(type)) {
+                            updateGauge(event);
+                        } else {
+                            LOGGER.info("Unexpected type '" + type + "', skipping");
+                        }
                     }
                 }
             } catch (final Exception e) {

Modified: incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/CollectorDataStoreFactory.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/CollectorDataStoreFactory.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/CollectorDataStoreFactory.java (original)
+++ incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/CollectorDataStoreFactory.java Mon Nov  4 16:12:48 2013
@@ -18,10 +18,11 @@ package org.apache.sirona.collector.serv
 
 import org.apache.sirona.collector.server.store.counter.InMemoryCollectorCounterStore;
 import org.apache.sirona.collector.server.store.gauge.DelegatedCollectorGaugeDataStore;
+import org.apache.sirona.collector.server.store.status.CollectorNodeStatusDataStore;
 import org.apache.sirona.store.DelegateDataStoreFactory;
 
 public class CollectorDataStoreFactory extends DelegateDataStoreFactory {
     public CollectorDataStoreFactory() {
-        super(new InMemoryCollectorCounterStore(), new DelegatedCollectorGaugeDataStore());
+        super(new InMemoryCollectorCounterStore(), new DelegatedCollectorGaugeDataStore(), new CollectorNodeStatusDataStore());
     }
 }

Modified: incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/counter/InMemoryCollectorCounterStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/counter/InMemoryCollectorCounterStore.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/counter/InMemoryCollectorCounterStore.java (original)
+++ incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/counter/InMemoryCollectorCounterStore.java Mon Nov  4 16:12:48 2013
@@ -16,10 +16,10 @@
  */
 package org.apache.sirona.collector.server.store.counter;
 
-import org.apache.sirona.store.CollectorCounterStore;
+import org.apache.sirona.store.counter.CollectorCounterStore;
 import org.apache.sirona.math.M2AwareStatisticalSummary;
 import org.apache.sirona.counters.Counter;
-import org.apache.sirona.store.InMemoryCounterDataStore;
+import org.apache.sirona.store.counter.InMemoryCounterDataStore;
 
 import java.util.Collection;
 import java.util.Map;

Modified: incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/gauge/DelegatedCollectorGaugeDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/gauge/DelegatedCollectorGaugeDataStore.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/gauge/DelegatedCollectorGaugeDataStore.java (original)
+++ incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/gauge/DelegatedCollectorGaugeDataStore.java Mon Nov  4 16:12:48 2013
@@ -19,10 +19,10 @@ package org.apache.sirona.collector.serv
 import org.apache.sirona.MonitoringException;
 import org.apache.sirona.Role;
 import org.apache.sirona.configuration.Configuration;
-import org.apache.sirona.store.CollectorGaugeDataStore;
-import org.apache.sirona.store.GaugeDataStore;
-import org.apache.sirona.store.GaugeValuesRequest;
-import org.apache.sirona.store.InMemoryGaugeDataStore;
+import org.apache.sirona.store.gauge.CollectorGaugeDataStore;
+import org.apache.sirona.store.gauge.GaugeDataStore;
+import org.apache.sirona.store.gauge.GaugeValuesRequest;
+import org.apache.sirona.store.gauge.InMemoryGaugeDataStore;
 
 import java.lang.reflect.Constructor;
 import java.util.Collection;

Added: incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/status/CollectorNodeStatusDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/status/CollectorNodeStatusDataStore.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/status/CollectorNodeStatusDataStore.java (added)
+++ incubator/sirona/trunk/collector/src/main/java/org/apache/sirona/collector/server/store/status/CollectorNodeStatusDataStore.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,37 @@
+/*
+ * 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.collector.server.store.status;
+
+import org.apache.sirona.status.NodeStatus;
+import org.apache.sirona.store.status.NodeStatusDataStore;
+
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class CollectorNodeStatusDataStore implements NodeStatusDataStore {
+    private final Map<String, NodeStatus> statuses = new ConcurrentHashMap<String, NodeStatus>();
+
+    @Override
+    public Map<String, NodeStatus> statuses() {
+        return new TreeMap<String, NodeStatus>(statuses);
+    }
+
+    public void store(final String node, final NodeStatus status) {
+        statuses.put(node, status);
+    }
+}

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=1538662&r1=1538661&r2=1538662&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 16:12:48 2013
@@ -23,7 +23,7 @@ import org.apache.sirona.counters.Defaul
 import org.apache.sirona.counters.Unit;
 import org.apache.sirona.cube.CubeCounterDataStore;
 import org.apache.sirona.repositories.Repository;
-import org.apache.sirona.store.CollectorCounterStore;
+import org.apache.sirona.store.counter.CollectorCounterStore;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;

Modified: incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/HttpCollectorTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/HttpCollectorTest.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/HttpCollectorTest.java (original)
+++ incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/HttpCollectorTest.java Mon Nov  4 16:12:48 2013
@@ -18,14 +18,18 @@ package org.apache.sirona.collector.serv
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.sirona.Role;
+import org.apache.sirona.collector.server.store.status.CollectorNodeStatusDataStore;
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.counters.Unit;
 import org.apache.sirona.reporting.web.template.MapBuilder;
 import org.apache.sirona.repositories.Repository;
-import org.apache.sirona.store.CollectorCounterStore;
-import org.apache.sirona.store.CollectorGaugeDataStore;
-import org.apache.sirona.store.GaugeValuesRequest;
+import org.apache.sirona.status.NodeStatus;
+import org.apache.sirona.status.Status;
+import org.apache.sirona.store.counter.CollectorCounterStore;
+import org.apache.sirona.store.gauge.CollectorGaugeDataStore;
+import org.apache.sirona.store.gauge.GaugeValuesRequest;
+import org.apache.sirona.store.status.NodeStatusDataStore;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -157,6 +161,50 @@ public class HttpCollectorTest {
         assertTrue(node2.containsValue(15.));
     }
 
+    @Test
+    public void collectStatus() throws Exception {
+        final Date pushDate = new Date(); // we aggregated only if push was done on the exactly same date so ensuring it
+        {
+            final Event[] events1 = new Event[1];
+            {
+                events1[0] = new Event();
+                events1[0].setTime(pushDate);
+                events1[0].setType("validation");
+                events1[0].setData(new MapBuilder<String, Object>()
+                    .set("message", "good")
+                    .set("status", Status.OK)
+                    .set("name", "validation1")
+                    .set("marker", "node1")
+                    .build());
+            }
+            doPost(events1);
+        }
+
+        {
+            final Event[] events2 = new Event[1];
+            {
+                events2[0] = new Event();
+                events2[0].setTime(pushDate);
+                events2[0].setType("validation");
+                events2[0].setData(new MapBuilder<String, Object>()
+                    .set("message", "bad")
+                    .set("status", Status.KO)
+                    .set("name", "validation3")
+                    .set("marker", "node2")
+                    .build());
+            }
+            doPost(events2);
+        }
+
+        final NodeStatusDataStore store = Configuration.getInstance(NodeStatusDataStore.class);
+        final Map<String,NodeStatus> statuses = store.statuses();
+        assertEquals(2, statuses.size());
+        assertEquals(Status.OK, statuses.get("node1").getStatus());
+        assertEquals(1, statuses.get("node1").getResults().length);
+        assertEquals(Status.KO, statuses.get("node2").getStatus());
+        assertEquals(1, statuses.get("node2").getResults().length);
+    }
+
     private void doPost(final Event[] events) throws Exception {
         final URL url = new URL("http://localhost:" + server.getPort());
 

Modified: incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/counter/AggregatorTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/counter/AggregatorTest.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/counter/AggregatorTest.java (original)
+++ incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/counter/AggregatorTest.java Mon Nov  4 16:12:48 2013
@@ -17,7 +17,7 @@
 package org.apache.sirona.collector.server.store.counter;
 
 import org.apache.sirona.Role;
-import org.apache.sirona.store.CollectorCounterStore;
+import org.apache.sirona.store.counter.CollectorCounterStore;
 import org.apache.sirona.math.M2AwareStatisticalSummary;
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.counters.Unit;

Modified: incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/gauge/CollectorGaugeTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/gauge/CollectorGaugeTest.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/gauge/CollectorGaugeTest.java (original)
+++ incubator/sirona/trunk/collector/src/test/java/org/apache/sirona/collector/server/store/gauge/CollectorGaugeTest.java Mon Nov  4 16:12:48 2013
@@ -18,9 +18,9 @@ package org.apache.sirona.collector.serv
 
 import org.apache.sirona.Role;
 import org.apache.sirona.counters.Unit;
-import org.apache.sirona.store.CollectorGaugeDataStore;
+import org.apache.sirona.store.gauge.CollectorGaugeDataStore;
 import org.apache.sirona.repositories.Repository;
-import org.apache.sirona.store.GaugeValuesRequest;
+import org.apache.sirona.store.gauge.GaugeValuesRequest;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/counters/DefaultCounter.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/counters/DefaultCounter.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/counters/DefaultCounter.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/counters/DefaultCounter.java Mon Nov  4 16:12:48 2013
@@ -17,7 +17,7 @@
 package org.apache.sirona.counters;
 
 import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
-import org.apache.sirona.store.CounterDataStore;
+import org.apache.sirona.store.counter.CounterDataStore;
 
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.Lock;

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=1538662&r1=1538661&r2=1538662&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 16:12:48 2013
@@ -20,7 +20,7 @@ import org.apache.sirona.Role;
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.gauges.jvm.CPUGauge;
 import org.apache.sirona.gauges.jvm.UsedMemoryGauge;
-import org.apache.sirona.store.GaugeDataStore;
+import org.apache.sirona.store.gauge.GaugeDataStore;
 
 import java.util.Map;
 import java.util.Timer;

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/RemoteGaugeDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/RemoteGaugeDataStore.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/RemoteGaugeDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/RemoteGaugeDataStore.java Mon Nov  4 16:12:48 2013
@@ -17,8 +17,8 @@
 package org.apache.sirona.gauges;
 
 import org.apache.sirona.Role;
-import org.apache.sirona.store.GaugeDataStore;
-import org.apache.sirona.store.GaugeValuesRequest;
+import org.apache.sirona.store.gauge.GaugeDataStore;
+import org.apache.sirona.store.gauge.GaugeValuesRequest;
 
 import java.util.Collection;
 import java.util.Collections;

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=1538662&r1=1538661&r2=1538662&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 16:12:48 2013
@@ -19,24 +19,27 @@ package org.apache.sirona.repositories;
 import org.apache.sirona.MonitoringException;
 import org.apache.sirona.Role;
 import org.apache.sirona.configuration.Configuration;
-import org.apache.sirona.store.CollectorCounterStore;
 import org.apache.sirona.counters.Counter;
-import org.apache.sirona.store.CollectorGaugeDataStore;
 import org.apache.sirona.gauges.DefaultGaugeManager;
 import org.apache.sirona.gauges.Gauge;
+import org.apache.sirona.status.NodeStatus;
 import org.apache.sirona.stopwatches.CounterStopWatch;
 import org.apache.sirona.stopwatches.StopWatch;
-import org.apache.sirona.store.CommonGaugeDataStore;
-import org.apache.sirona.store.CounterDataStore;
+import org.apache.sirona.store.counter.CollectorCounterStore;
+import org.apache.sirona.store.gauge.CollectorGaugeDataStore;
+import org.apache.sirona.store.gauge.CommonGaugeDataStore;
+import org.apache.sirona.store.counter.CounterDataStore;
 import org.apache.sirona.store.DataStoreFactory;
-import org.apache.sirona.store.GaugeDataStore;
-import org.apache.sirona.store.GaugeValuesRequest;
+import org.apache.sirona.store.gauge.GaugeDataStore;
+import org.apache.sirona.store.gauge.GaugeValuesRequest;
+import org.apache.sirona.store.status.NodeStatusDataStore;
 
 import java.util.Collection;
 import java.util.Map;
 
 public class DefaultRepository implements Repository {
     private final CounterDataStore counterDataStore;
+    private final NodeStatusDataStore nodeStatusDataStore;
     private final CommonGaugeDataStore gaugeDataStore;
     private final DefaultGaugeManager gaugeManager;
 
@@ -69,6 +72,13 @@ public class DefaultRepository implement
             }
         }
 
+        NodeStatusDataStore status = null;
+        try {
+            status = Configuration.findOrCreateInstance(NodeStatusDataStore.class);
+        } catch (final MonitoringException e) {
+            // no-op
+        }
+
         if (counter == null) {
             counter = Configuration.findOrCreateInstance(DataStoreFactory.class).getCounterDataStore();
             if (CollectorCounterStore.class.isInstance(counter)) {
@@ -87,8 +97,14 @@ public class DefaultRepository implement
             }
         }
 
+        if (status == null) {
+            status = Configuration.findOrCreateInstance(DataStoreFactory.class).getNodeStatusDataStore();
+            Configuration.setSingletonInstance(NodeStatusDataStore.class, status);
+        }
+
         this.counterDataStore = counter;
         this.gaugeDataStore = gauge;
+        this.nodeStatusDataStore = status;
 
         if (GaugeDataStore.class.isInstance(this.gaugeDataStore)) {
             this.gaugeManager = new DefaultGaugeManager(GaugeDataStore.class.cast(this.gaugeDataStore));
@@ -152,4 +168,9 @@ public class DefaultRepository implement
             gaugeManager.stopGauge(role);
         }
     }
+
+    @Override
+    public Map<String, NodeStatus> statuses() {
+        return nodeStatusDataStore.statuses();
+    }
 }

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=1538662&r1=1538661&r2=1538662&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 16:12:48 2013
@@ -21,6 +21,7 @@ import org.apache.sirona.Role;
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.gauges.Gauge;
+import org.apache.sirona.status.NodeStatus;
 import org.apache.sirona.stopwatches.StopWatch;
 
 import java.util.Collection;
@@ -46,4 +47,6 @@ public interface Repository {
     Collection<Role> gauges();
 
     Role findGaugeRole(String name);
+
+    Map<String, NodeStatus> statuses();
 }

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatus.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatus.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatus.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatus.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,41 @@
+/*
+ * 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.status;
+
+public class NodeStatus {
+    private final ValidationResult[] results;
+
+    public NodeStatus(final ValidationResult[] results) {
+        this.results = results;
+    }
+
+    public ValidationResult[] getResults() {
+        return results;
+    }
+
+    public Status getStatus() {
+        Status lowest = Status.OK;
+        for (final ValidationResult result : results) {
+            if (Status.KO.equals(result.getStatus())) {
+                return Status.KO;
+            } else if (Status.DEGRADED.equals(result.getStatus())) {
+                lowest = Status.DEGRADED;
+            }
+        }
+        return lowest;
+    }
+}

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatusReporter.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatusReporter.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatusReporter.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/NodeStatusReporter.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,54 @@
+/*
+ * 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.status;
+
+import org.apache.sirona.spi.SPI;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedList;
+
+public class NodeStatusReporter {
+    private final Validation[] validations;
+
+    public NodeStatusReporter() {
+        final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+
+        final Collection<Validation> val = new LinkedList<Validation>();
+        for (final Validation v : SPI.INSTANCE.find(Validation.class, classLoader)) {
+            val.add(v);
+        }
+        for (final ValidationFactory f : SPI.INSTANCE.find(ValidationFactory.class, classLoader)) {
+            val.addAll(Arrays.asList(f.validations()));
+        }
+
+        validations = val.toArray(new Validation[val.size()]);
+    }
+
+    public NodeStatus computeStatus() {
+        final Collection<ValidationResult> results = new ArrayList<ValidationResult>(validations.length);
+        for (final Validation v : validations) {
+            results.add(v.validate());
+        }
+        return new NodeStatus(results.toArray(new ValidationResult[results.size()]));
+    }
+
+    public boolean hasValidations() {
+        return validations.length > 0;
+    }
+}

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Status.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Status.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Status.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Status.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,21 @@
+/*
+ * 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.status;
+
+public enum  Status {
+    OK, DEGRADED, KO
+}

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Validation.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Validation.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Validation.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/Validation.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,21 @@
+/*
+ * 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.status;
+
+public interface Validation {
+    ValidationResult validate();
+}

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationFactory.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationFactory.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationFactory.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationFactory.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,21 @@
+/*
+ * 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.status;
+
+public interface ValidationFactory {
+    Validation[] validations();
+}

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationResult.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationResult.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationResult.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/status/ValidationResult.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,41 @@
+/*
+ * 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.status;
+
+public class ValidationResult {
+    private Status status;
+    private String message;
+    private String name;
+
+    public ValidationResult(final String name, final Status status, final String message) {
+        this.name = name;
+        this.status = status;
+        this.message = message;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Status getStatus() {
+        return status;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchFuture.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchFuture.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchFuture.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchFuture.java Mon Nov  4 16:12:48 2013
@@ -20,7 +20,7 @@ import java.util.concurrent.ScheduledExe
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
-class BatchFuture {
+public class BatchFuture {
     private final ScheduledExecutorService executor;
     private final ScheduledFuture<?> task;
 

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DataStoreFactory.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DataStoreFactory.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DataStoreFactory.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DataStoreFactory.java Mon Nov  4 16:12:48 2013
@@ -16,8 +16,14 @@
  */
 package org.apache.sirona.store;
 
+import org.apache.sirona.store.counter.CounterDataStore;
+import org.apache.sirona.store.gauge.CommonGaugeDataStore;
+import org.apache.sirona.store.status.NodeStatusDataStore;
+
 public interface DataStoreFactory {
     CounterDataStore getCounterDataStore();
 
     CommonGaugeDataStore getGaugeDataStore();
+
+    NodeStatusDataStore getNodeStatusDataStore();
 }

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DefaultDataStoreFactory.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DefaultDataStoreFactory.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DefaultDataStoreFactory.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DefaultDataStoreFactory.java Mon Nov  4 16:12:48 2013
@@ -16,10 +16,12 @@
  */
 package org.apache.sirona.store;
 
-public class DefaultDataStoreFactory extends DelegateDataStoreFactory {
+import org.apache.sirona.store.counter.InMemoryCounterDataStore;
+import org.apache.sirona.store.gauge.InMemoryGaugeDataStore;
+import org.apache.sirona.store.status.PeriodicNodeStatusDataStore;
 
+public class DefaultDataStoreFactory extends DelegateDataStoreFactory {
     public DefaultDataStoreFactory() {
-        super(new InMemoryCounterDataStore(), new InMemoryGaugeDataStore());
+        super(new InMemoryCounterDataStore(), new InMemoryGaugeDataStore(), new PeriodicNodeStatusDataStore());
     }
-
 }

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DelegateDataStoreFactory.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DelegateDataStoreFactory.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DelegateDataStoreFactory.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/DelegateDataStoreFactory.java Mon Nov  4 16:12:48 2013
@@ -16,14 +16,21 @@
  */
 package org.apache.sirona.store;
 
-public class DelegateDataStoreFactory implements DataStoreFactory {
+import org.apache.sirona.store.counter.CounterDataStore;
+import org.apache.sirona.store.gauge.CommonGaugeDataStore;
+import org.apache.sirona.store.status.NodeStatusDataStore;
 
+public class DelegateDataStoreFactory implements DataStoreFactory {
     private final CounterDataStore counterDataStore;
     private final CommonGaugeDataStore gaugeDataStore;
+    private final NodeStatusDataStore nodeStatusDataStore;
 
-    public DelegateDataStoreFactory(CounterDataStore counterDataStore, CommonGaugeDataStore gaugeDataStore) {
+    public DelegateDataStoreFactory(final CounterDataStore counterDataStore,
+                                    final CommonGaugeDataStore gaugeDataStore,
+                                    final NodeStatusDataStore nodeStatusDataStore) {
         this.counterDataStore = counterDataStore;
         this.gaugeDataStore = gaugeDataStore;
+        this.nodeStatusDataStore = nodeStatusDataStore;
     }
 
     @Override
@@ -35,4 +42,9 @@ public class DelegateDataStoreFactory im
     public CommonGaugeDataStore getGaugeDataStore() {
         return gaugeDataStore;
     }
+
+    @Override
+    public NodeStatusDataStore getNodeStatusDataStore() {
+        return nodeStatusDataStore;
+    }
 }

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/BatchCounterDataStore.java (from r1538543, 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/counter/BatchCounterDataStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/BatchCounterDataStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/BatchCounterDataStore.java&r1=1538543&r2=1538662&rev=1538662&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/counter/BatchCounterDataStore.java Mon Nov  4 16:12:48 2013
@@ -14,11 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.counter;
 
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.repositories.Repository;
+import org.apache.sirona.store.BatchFuture;
 import org.apache.sirona.util.DaemonThreadFactory;
 
 import java.util.Collection;

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CollectorCounterStore.java (from r1538552, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorCounterStore.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CollectorCounterStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CollectorCounterStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorCounterStore.java&r1=1538552&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorCounterStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CollectorCounterStore.java Mon Nov  4 16:12:48 2013
@@ -14,11 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.counter;
 
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.math.M2AwareStatisticalSummary;
-import org.apache.sirona.store.CounterDataStore;
 
 import java.util.Collection;
 

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CounterDataStore.java (from r1538515, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CounterDataStore.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CounterDataStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CounterDataStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CounterDataStore.java&r1=1538515&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CounterDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/CounterDataStore.java Mon Nov  4 16:12:48 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.counter;
 
 import org.apache.sirona.counters.Counter;
 

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/InMemoryCounterDataStore.java (from r1538515, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryCounterDataStore.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/InMemoryCounterDataStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/InMemoryCounterDataStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryCounterDataStore.java&r1=1538515&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryCounterDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/counter/InMemoryCounterDataStore.java Mon Nov  4 16:12:48 2013
@@ -14,10 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.counter;
 
 import org.apache.sirona.counters.Counter;
 import org.apache.sirona.counters.DefaultCounter;
+import org.apache.sirona.store.counter.CounterDataStore;
 
 import java.util.Collection;
 import java.util.concurrent.ConcurrentHashMap;

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/AggregatedGaugeDataStore.java (from r1538552, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/AggregatedGaugeDataStore.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/AggregatedGaugeDataStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/AggregatedGaugeDataStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/AggregatedGaugeDataStore.java&r1=1538552&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/AggregatedGaugeDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/AggregatedGaugeDataStore.java Mon Nov  4 16:12:48 2013
@@ -14,12 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.gauge;
 
 import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
 import org.apache.sirona.Role;
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.gauges.RemoteGaugeDataStore;
+import org.apache.sirona.store.BatchFuture;
 import org.apache.sirona.util.DaemonThreadFactory;
 
 import java.util.Locale;

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CollectorGaugeDataStore.java (from r1538609, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorGaugeDataStore.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CollectorGaugeDataStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CollectorGaugeDataStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorGaugeDataStore.java&r1=1538609&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CollectorGaugeDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CollectorGaugeDataStore.java Mon Nov  4 16:12:48 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.gauge;
 
 import org.apache.sirona.Role;
 

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CommonGaugeDataStore.java (from r1538609, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CommonGaugeDataStore.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CommonGaugeDataStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CommonGaugeDataStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CommonGaugeDataStore.java&r1=1538609&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/CommonGaugeDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/CommonGaugeDataStore.java Mon Nov  4 16:12:48 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.gauge;
 
 import org.apache.sirona.Role;
 

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeDataStore.java (from r1538609, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeDataStore.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeDataStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeDataStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeDataStore.java&r1=1538609&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeDataStore.java Mon Nov  4 16:12:48 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.gauge;
 
 import org.apache.sirona.Role;
 

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeValuesRequest.java (from r1538515, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeValuesRequest.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeValuesRequest.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeValuesRequest.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeValuesRequest.java&r1=1538515&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/GaugeValuesRequest.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/GaugeValuesRequest.java Mon Nov  4 16:12:48 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.gauge;
 
 import org.apache.sirona.Role;
 

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/InMemoryGaugeDataStore.java (from r1538609, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryGaugeDataStore.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/InMemoryGaugeDataStore.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/InMemoryGaugeDataStore.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryGaugeDataStore.java&r1=1538609&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/InMemoryGaugeDataStore.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/InMemoryGaugeDataStore.java Mon Nov  4 16:12:48 2013
@@ -14,11 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.gauge;
 
 import org.apache.sirona.Role;
 import org.apache.sirona.configuration.Configuration;
-import org.apache.sirona.gauges.Gauge;
 
 import java.util.Collection;
 import java.util.Collections;

Copied: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/Value.java (from r1538515, incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/Value.java)
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/Value.java?p2=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/Value.java&p1=incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/Value.java&r1=1538515&r2=1538662&rev=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/Value.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/gauge/Value.java Mon Nov  4 16:12:48 2013
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sirona.store;
+package org.apache.sirona.store.gauge;
 
 public interface Value {
     double getMean();

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/EmptyStatuses.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/EmptyStatuses.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/EmptyStatuses.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/EmptyStatuses.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,32 @@
+/*
+ * 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.store.status;
+
+import org.apache.sirona.status.NodeStatus;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+// this is empty but updatable
+public class EmptyStatuses implements NodeStatusDataStore {
+    private Map<String, NodeStatus> statuses = new ConcurrentHashMap<String, NodeStatus>();
+
+    @Override
+    public Map<String, NodeStatus> statuses() {
+        return statuses;
+    }
+}

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/NodeStatusDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/NodeStatusDataStore.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/NodeStatusDataStore.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/NodeStatusDataStore.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,25 @@
+/*
+ * 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.store.status;
+
+import org.apache.sirona.status.NodeStatus;
+
+import java.util.Map;
+
+public interface NodeStatusDataStore {
+    Map<String, NodeStatus> statuses();
+}

Added: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/PeriodicNodeStatusDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/PeriodicNodeStatusDataStore.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/PeriodicNodeStatusDataStore.java (added)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/store/status/PeriodicNodeStatusDataStore.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,101 @@
+/*
+ * 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.store.status;
+
+import org.apache.sirona.configuration.Configuration;
+import org.apache.sirona.status.NodeStatus;
+import org.apache.sirona.status.NodeStatusReporter;
+import org.apache.sirona.store.BatchFuture;
+import org.apache.sirona.util.DaemonThreadFactory;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class PeriodicNodeStatusDataStore implements NodeStatusDataStore {
+    private static final Logger LOGGER = Logger.getLogger(PeriodicNodeStatusDataStore.class.getName());
+
+    private final BatchFuture scheduledTask;
+    private final AtomicReference<NodeStatus> status = new AtomicReference<NodeStatus>();
+    private final HashMap<String, NodeStatus> statusAsMap = new HashMap<String, NodeStatus>();
+
+    public PeriodicNodeStatusDataStore() {
+        final NodeStatusReporter nodeStatusReporter = new NodeStatusReporter();
+        if (nodeStatusReporter.hasValidations()) {
+            final String name = getClass().getSimpleName().toLowerCase(Locale.ENGLISH).replace("nodestatusdatastore", "");
+            final long period = getPeriod(name);
+
+            final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(new DaemonThreadFactory(name + "-status-schedule-"));
+            final ScheduledFuture<?> future = ses.scheduleAtFixedRate(new ReportStatusTask(nodeStatusReporter), period, period, TimeUnit.MILLISECONDS);
+            scheduledTask = new BatchFuture(ses, future);
+        } else {
+            scheduledTask = null;
+        }
+    }
+
+    @Configuration.Destroying
+    public void shutdown() {
+        if (scheduledTask != null) {
+            scheduledTask.done();
+        }
+    }
+
+    protected int getPeriod(final String name) {
+        return Configuration.getInteger(Configuration.CONFIG_PROPERTY_PREFIX + name + ".status.period",
+            Configuration.getInteger(Configuration.CONFIG_PROPERTY_PREFIX + name + ".period", 60000));
+    }
+
+    protected void reportStatus(final NodeStatus nodeStatus) {
+        // no-op
+    }
+
+    @Override
+    public Map<String, NodeStatus> statuses() {
+        if (status.get() != null) {
+            statusAsMap.put("local", status.get());
+        } else {
+            statusAsMap.clear();
+        }
+        return statusAsMap;
+    }
+
+    private class ReportStatusTask implements Runnable {
+        private final NodeStatusReporter reporter;
+
+        public ReportStatusTask(final NodeStatusReporter nodeStatusReporter) {
+            reporter = nodeStatusReporter;
+        }
+
+        @Override
+        public void run() {
+            final NodeStatus nodeStatus = reporter.computeStatus();
+            try {
+                status.set(nodeStatus);
+                reportStatus(nodeStatus);
+            } catch (final Exception e) {
+                LOGGER.log(Level.SEVERE, e.getMessage(), e);
+            }
+        }
+    }
+}

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/util/Environment.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/util/Environment.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/util/Environment.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/util/Environment.java Mon Nov  4 16:12:48 2013
@@ -17,9 +17,8 @@
 package org.apache.sirona.util;
 
 import org.apache.sirona.configuration.Configuration;
-import org.apache.sirona.store.CollectorCounterStore;
+import org.apache.sirona.store.counter.CollectorCounterStore;
 import org.apache.sirona.repositories.Repository;
-import org.apache.sirona.store.CounterDataStore;
 
 public final class Environment {
     private Environment() {

Modified: incubator/sirona/trunk/core/src/test/java/org/apache/sirona/counters/CounterBench.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/test/java/org/apache/sirona/counters/CounterBench.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/test/java/org/apache/sirona/counters/CounterBench.java (original)
+++ incubator/sirona/trunk/core/src/test/java/org/apache/sirona/counters/CounterBench.java Mon Nov  4 16:12:48 2013
@@ -17,7 +17,7 @@
 package org.apache.sirona.counters;
 
 import org.apache.sirona.Role;
-import org.apache.sirona.store.InMemoryCounterDataStore;
+import org.apache.sirona.store.counter.InMemoryCounterDataStore;
 import org.junit.Test;
 
 import java.util.concurrent.ExecutorService;

Added: incubator/sirona/trunk/core/src/test/java/org/apache/sirona/spi/SpiTestImpl.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/test/java/org/apache/sirona/spi/SpiTestImpl.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/test/java/org/apache/sirona/spi/SpiTestImpl.java (added)
+++ incubator/sirona/trunk/core/src/test/java/org/apache/sirona/spi/SpiTestImpl.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,40 @@
+/*
+ * 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.spi;
+
+import org.apache.sirona.status.Status;
+import org.apache.sirona.status.Validation;
+import org.apache.sirona.status.ValidationResult;
+
+import java.util.Arrays;
+
+public class SpiTestImpl extends DefaultSPI {
+    public static ValidationResult status = new ValidationResult("n", Status.OK, "m");
+
+    @Override
+    public <T> Iterable<T> find(final Class<T> api, final ClassLoader loader) {
+        if (Validation.class.equals(api)) {
+            return (Iterable<T>) Arrays.asList(new Validation() {
+                @Override
+                public ValidationResult validate() {
+                    return status;
+                }
+            });
+        }
+        return super.find(api, loader);
+    }
+}

Added: incubator/sirona/trunk/core/src/test/java/org/apache/sirona/status/ValidationTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/test/java/org/apache/sirona/status/ValidationTest.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/test/java/org/apache/sirona/status/ValidationTest.java (added)
+++ incubator/sirona/trunk/core/src/test/java/org/apache/sirona/status/ValidationTest.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sirona.status;
+
+import org.apache.sirona.spi.SpiTestImpl;
+import org.apache.sirona.store.status.PeriodicNodeStatusDataStore;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class ValidationTest {
+    @Test
+    public void globalStatus() {
+        assertEquals(Status.OK, new NodeStatus(new ValidationResult[]{new ValidationResult(null, Status.OK, null)}).getStatus());
+        assertEquals(Status.KO, new NodeStatus(new ValidationResult[]{new ValidationResult(null, Status.KO, null)}).getStatus());
+        assertEquals(Status.DEGRADED, new NodeStatus(new ValidationResult[]{new ValidationResult(null, Status.DEGRADED, null)}).getStatus());
+        assertEquals(Status.KO, new NodeStatus(new ValidationResult[]{new ValidationResult(null, Status.DEGRADED, null), new ValidationResult(null, Status.KO, null)}).getStatus());
+        assertEquals(Status.DEGRADED, new NodeStatus(new ValidationResult[]{new ValidationResult(null, Status.DEGRADED, null), new ValidationResult(null, Status.OK, null)}).getStatus());
+    }
+
+    @Test
+    public void periodicNodeReporter() throws InterruptedException {
+        final PeriodicNodeStatusDataStore store = new PeriodicNodeStatusDataStore() {
+            @Override
+            protected int getPeriod(final String name) {
+                return 100;
+            }
+        };
+        Thread.sleep(200);
+        assertEquals(Status.OK, store.statuses().values().iterator().next().getStatus());
+
+        SpiTestImpl.status = new ValidationResult("", Status.KO, "");
+        Thread.sleep(200);
+        assertEquals(Status.KO, store.statuses().values().iterator().next().getStatus());
+        store.shutdown();
+    }
+}

Added: incubator/sirona/trunk/core/src/test/resources/sirona.properties
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/test/resources/sirona.properties?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/core/src/test/resources/sirona.properties (added)
+++ incubator/sirona/trunk/core/src/test/resources/sirona.properties Mon Nov  4 16:12:48 2013
@@ -0,0 +1,17 @@
+# 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.
+org.apache.sirona.spi.SPI = org.apache.sirona.spi.SpiTestImpl

Modified: incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java (original)
+++ incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java Mon Nov  4 16:12:48 2013
@@ -30,7 +30,7 @@ public class CubeBuilder {
     private String collector;
     private String marker;
 
-    public Cube build() {
+    public synchronized Cube build() {
         if (marker == null) {
             try {
                 marker = InetAddress.getLocalHost().getHostName();

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=1538662&r1=1538661&r2=1538662&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 16:12:48 2013
@@ -18,7 +18,7 @@ package org.apache.sirona.cube;
 
 import org.apache.sirona.configuration.Configuration;
 import org.apache.sirona.counters.Counter;
-import org.apache.sirona.store.BatchCounterDataStore;
+import org.apache.sirona.store.counter.BatchCounterDataStore;
 
 import java.util.Collection;
 

Modified: incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeDataStoreFactory.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeDataStoreFactory.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeDataStoreFactory.java (original)
+++ incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeDataStoreFactory.java Mon Nov  4 16:12:48 2013
@@ -20,6 +20,6 @@ import org.apache.sirona.store.DelegateD
 
 public class CubeDataStoreFactory extends DelegateDataStoreFactory {
     public CubeDataStoreFactory() {
-        super(new CubeCounterDataStore(), new CubeGaugeDataStore());
+        super(new CubeCounterDataStore(), new CubeGaugeDataStore(), new CubeNodeStatusDataStore());
     }
 }

Added: incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeNodeStatusDataStore.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeNodeStatusDataStore.java?rev=1538662&view=auto
==============================================================================
--- incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeNodeStatusDataStore.java (added)
+++ incubator/sirona/trunk/cube/src/main/java/org/apache/sirona/cube/CubeNodeStatusDataStore.java Mon Nov  4 16:12:48 2013
@@ -0,0 +1,42 @@
+/*
+ * 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.cube;
+
+import org.apache.sirona.configuration.Configuration;
+import org.apache.sirona.status.NodeStatus;
+import org.apache.sirona.status.ValidationResult;
+import org.apache.sirona.store.status.PeriodicNodeStatusDataStore;
+
+public class CubeNodeStatusDataStore extends PeriodicNodeStatusDataStore {
+    private static final String VALIDATION_TYPE = "validation";
+
+    private final Cube cube = Configuration.findOrCreateInstance(CubeBuilder.class).build();
+
+    @Override
+    protected void reportStatus(final NodeStatus nodeStatus) {
+        final long ts = System.currentTimeMillis();
+        final StringBuilder events = cube.newEventStream();
+        for (final ValidationResult result : nodeStatus.getResults()) {
+            cube.buildEvent(events, VALIDATION_TYPE, ts, new MapBuilder()
+                .add("message", result.getMessage())
+                .add("status", result.getStatus().name())
+                .add("name", result.getName())
+                .map());
+        }
+        cube.post(events);
+    }
+}

Modified: incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteBuilder.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteBuilder.java?rev=1538662&r1=1538661&r2=1538662&view=diff
==============================================================================
--- incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteBuilder.java (original)
+++ incubator/sirona/trunk/graphite/src/main/java/org/apache/sirona/graphite/GraphiteBuilder.java Mon Nov  4 16:12:48 2013
@@ -29,7 +29,7 @@ public class GraphiteBuilder {
     private int port;
     private String charset;
 
-    public Graphite build() {
+    public synchronized Graphite build() {
         if (charset == null) {
             charset = "UTF-8";
         }