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/17 18:40:59 UTC

svn commit: r1533145 - in /commons/sandbox/monitoring/trunk/cube/src: main/java/org/apache/commons/monitoring/cube/ test/java/org/apache/commons/monitoring/cube/ test/resources/

Author: rmannibucau
Date: Thu Oct 17 16:40:58 2013
New Revision: 1533145

URL: http://svn.apache.org/r1533145
Log:
moving some more cube related logic to Cube + adding marker to be able to know the origin of the event

Modified:
    commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/Cube.java
    commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeBuilder.java
    commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeDataStore.java
    commons/sandbox/monitoring/trunk/cube/src/test/java/org/apache/commons/monitoring/cube/CubeDataStoreTest.java
    commons/sandbox/monitoring/trunk/cube/src/test/resources/commons-monitoring.properties

Modified: commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/Cube.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/Cube.java?rev=1533145&r1=1533144&r2=1533145&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/Cube.java (original)
+++ commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/Cube.java Thu Oct 17 16:40:58 2013
@@ -21,20 +21,39 @@ import java.net.HttpURLConnection;
 import java.net.InetSocketAddress;
 import java.net.Proxy;
 import java.net.URL;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 public class Cube {
     private static final Logger LOGGER = Logger.getLogger(Cube.class.getName());
 
+    private static final String JSON_BASE = "{" +
+        "\"type\": \"%s\"," +
+        "\"time\": \"%s\"," +
+        "\"data\": %s" +
+        "}";
+
     private static final String POST = "POST";
     private static final String CONTENT_TYPE = "Content-Type";
     private static final String CONTENT_LENGTH = "Content-Length";
     private static final String APPLICATION_JSON = "application/json";
 
+    private static final String JS_ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+    private static final String UTC = "UTC";
+
     private final CubeBuilder config;
     private final Proxy proxy;
 
+    private final BlockingQueue<DateFormat> isoDateFormatters;
+
     public Cube(final CubeBuilder cubeBuilder) {
         config = cubeBuilder;
         if (config.getProxyHost() != null) {
@@ -42,9 +61,25 @@ public class Cube {
         } else {
             proxy = Proxy.NO_PROXY;
         }
+
+        final int maxConcurrency = 2 * Runtime.getRuntime().availableProcessors();
+        isoDateFormatters = new ArrayBlockingQueue<DateFormat>(maxConcurrency);
+        for (int i = 0; i < maxConcurrency; i++) {
+            isoDateFormatters.add(newIsoDateFormatter());
+        }
+    }
+
+    public StringBuilder newEventStream() {
+        return new StringBuilder();
+    }
+
+    public void post(final StringBuilder payload) {
+        if (payload.length() > 0) {
+            doPost(finalPayload(payload.substring(0, payload.length() - 1)));
+        }
     }
 
-    public void post(final String payload) {
+    private void doPost(final String payload) {
         try {
             final URL url = new URL(config.getCollector());
 
@@ -80,4 +115,54 @@ public class Cube {
             LOGGER.log(Level.WARNING, "Can't post data to collector", e);
         }
     }
+
+    public static String finalPayload(final String events) {
+        return '[' + events.toString() + ']';
+    }
+
+    public StringBuilder buildEvent(final StringBuilder builder, final String type, final long time, final Map<String, Object> data) {
+        data.put("marker", config.getMarker());
+        return builder.append(String.format(JSON_BASE, type, isoDate(time), buildData(data))).append(',');
+    }
+
+    private String isoDate(final long time) {
+        final Date date = new Date(time);
+
+        DateFormat formatter = null;
+        try {
+            formatter = isoDateFormatters.take();
+            return formatter.format(date);
+        } catch (final InterruptedException e) {
+            return newIsoDateFormatter().format(date);
+        } finally {
+            if (formatter != null) {
+                isoDateFormatters.add(formatter);
+            }
+        }
+    }
+
+    private static String buildData(final Map<String, Object> data) {
+        final StringBuilder builder = new StringBuilder().append("{");
+        for (final Map.Entry<String, Object> entry : data.entrySet()) {
+            builder.append('\"').append(entry.getKey()).append('\"').append(':');
+
+            final Object value = entry.getValue();
+            if (String.class.isInstance(value)) {
+                builder.append('\"').append(value).append('\"');
+            } else {
+                builder.append(value);
+            }
+
+            builder.append(',');
+        }
+        builder.setLength(builder.length() - 1);
+        return builder.append("}").toString();
+    }
+
+    private static DateFormat newIsoDateFormatter() {
+        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(JS_ISO_FORMAT, Locale.ENGLISH);
+        simpleDateFormat.setTimeZone(TimeZone.getTimeZone(UTC));
+        return simpleDateFormat;
+    }
+
 }

Modified: commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeBuilder.java?rev=1533145&r1=1533144&r2=1533145&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeBuilder.java (original)
+++ commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeBuilder.java Thu Oct 17 16:40:58 2013
@@ -18,13 +18,27 @@ package org.apache.commons.monitoring.cu
 
 import org.apache.commons.monitoring.configuration.Configuration;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
 @Configuration.AutoSet
 public class CubeBuilder {
+    private static final String DEFAULT_MARKER = "sirona";
+
     private String proxyHost;
     private int proxyPort;
     private String collector;
+    private String marker;
 
     public Cube build() {
+        if (marker == null) {
+            try {
+                marker = InetAddress.getLocalHost().getHostName();
+            } catch (final UnknownHostException e) {
+                marker = DEFAULT_MARKER;
+            }
+        }
+
         return new Cube(this);
     }
 
@@ -40,6 +54,10 @@ public class CubeBuilder {
         return collector;
     }
 
+    public String getMarker() {
+        return marker;
+    }
+
     @Override
     public String toString() {
         return "CubeBuilder{" + collector + '}';

Modified: commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeDataStore.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeDataStore.java?rev=1533145&r1=1533144&r2=1533145&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeDataStore.java (original)
+++ commons/sandbox/monitoring/trunk/cube/src/main/java/org/apache/commons/monitoring/cube/CubeDataStore.java Thu Oct 17 16:40:58 2013
@@ -25,45 +25,20 @@ import org.apache.commons.monitoring.rep
 import org.apache.commons.monitoring.store.BatchCounterDataStore;
 import org.apache.commons.monitoring.store.GaugeValuesRequest;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.Collections;
-import java.util.Date;
 import java.util.HashMap;
-import java.util.Locale;
 import java.util.Map;
-import java.util.TimeZone;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
 
 public class CubeDataStore extends BatchCounterDataStore {
-    private static final String JSON_BASE = "{" +
-        "\"type\": \"%s\"," +
-        "\"time\": \"%s\"," +
-        "\"data\": %s" +
-        "}";
-
     private static final String GAUGE_TYPE = "gauge";
     private static final String COUNTER_TYPE = "counter";
-    private static final String JS_ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
-    private static final String UTC = "UTC";
 
     private final Cube cube = Configuration.findOrCreateInstance(CubeBuilder.class).build();
 
-    private final BlockingQueue<DateFormat> isoDateFormatters;
-
-    public CubeDataStore() {
-        final int maxConcurrency = 2 * Runtime.getRuntime().availableProcessors();
-        isoDateFormatters = new ArrayBlockingQueue<DateFormat>(maxConcurrency);
-        for (int i = 0; i < maxConcurrency; i++) {
-            isoDateFormatters.add(newIsoDateFormatter());
-        }
-    }
-
     @Override
     protected synchronized void pushCountersByBatch(final Repository instance) {
         final long ts = System.currentTimeMillis();
-        final StringBuilder events = new StringBuilder();
+        final StringBuilder events = cube.newEventStream();
         for (final Counter counter : instance) {
             final MapBuilder data = new MapBuilder()
                 .add("name", counter.getKey().getName())
@@ -76,25 +51,22 @@ public class CubeDataStore extends Batch
                 }
             }
 
-            buildEvent(events, COUNTER_TYPE, ts, data.map()).append(',');
-        }
-        if (events.length() > 0) {
-            events.setLength(events.length() - 1);
-            cube.post(finalPayload(events));
+            cube.buildEvent(events, COUNTER_TYPE, ts, data.map());
         }
+        cube.post(events);
     }
 
     @Override
     public void addToGauge(final Gauge gauge, final long time, final double value) {
         final Role role = gauge.role();
 
-        cube.post(finalPayload(
-            buildEvent(new StringBuilder(), GAUGE_TYPE, time,
+        cube.post(
+            cube.buildEvent(new StringBuilder(), GAUGE_TYPE, time,
                 new MapBuilder()
                     .add("value", value)
                     .add("role", role.getName())
                     .add("unit", role.getUnit().getName())
-                    .map())));
+                    .map()));
     }
 
     @Override
@@ -102,54 +74,6 @@ public class CubeDataStore extends Batch
         return Collections.emptyMap(); // TODO: maybe query cube?
     }
 
-    private static String finalPayload(final StringBuilder events) {
-        return '[' + events.toString() + ']';
-    }
-
-    private StringBuilder buildEvent(final StringBuilder builder, final String type, final long time, final Map<String, Object> data) {
-        return builder.append(String.format(JSON_BASE, type, isoDate(time), buildData(data)));
-    }
-
-    private String isoDate(final long time) {
-        final Date date = new Date(time);
-
-        DateFormat formatter = null;
-        try {
-            formatter = isoDateFormatters.take();
-            return formatter.format(date);
-        } catch (final InterruptedException e) {
-            return newIsoDateFormatter().format(date);
-        } finally {
-            if (formatter != null) {
-                isoDateFormatters.add(formatter);
-            }
-        }
-    }
-
-    private static String buildData(final Map<String, Object> data) {
-        final StringBuilder builder = new StringBuilder().append("{");
-        for (final Map.Entry<String, Object> entry : data.entrySet()) {
-            builder.append('\"').append(entry.getKey()).append('\"').append(':');
-
-            final Object value = entry.getValue();
-            if (String.class.isInstance(value)) {
-                builder.append('\"').append(value).append('\"');
-            } else {
-                builder.append(value);
-            }
-
-            builder.append(',');
-        }
-        builder.setLength(builder.length() - 1);
-        return builder.append("}").toString();
-    }
-
-    private static DateFormat newIsoDateFormatter() {
-        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(JS_ISO_FORMAT, Locale.ENGLISH);
-        simpleDateFormat.setTimeZone(TimeZone.getTimeZone(UTC));
-        return simpleDateFormat;
-    }
-
     private static class MapBuilder {
         private final Map<String, Object> map = new HashMap<String, Object>();
 

Modified: commons/sandbox/monitoring/trunk/cube/src/test/java/org/apache/commons/monitoring/cube/CubeDataStoreTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cube/src/test/java/org/apache/commons/monitoring/cube/CubeDataStoreTest.java?rev=1533145&r1=1533144&r2=1533145&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/cube/src/test/java/org/apache/commons/monitoring/cube/CubeDataStoreTest.java (original)
+++ commons/sandbox/monitoring/trunk/cube/src/test/java/org/apache/commons/monitoring/cube/CubeDataStoreTest.java Thu Oct 17 16:40:58 2013
@@ -25,6 +25,8 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
 
@@ -39,7 +41,7 @@ public class CubeDataStoreTest {
 
     @Before
     public void startCube() throws IOException {
-        server = new CubeServer("localhost", 1080).start();
+        server = new CubeServer("localhost", 1234).start();
         Repository.INSTANCE.clear();
         gauges = new Gauge.LoaderHelper(false);
     }
@@ -52,7 +54,7 @@ public class CubeDataStoreTest {
     }
 
     @Test
-    public void store() throws InterruptedException {
+    public void store() throws InterruptedException, UnknownHostException {
         { // force some counter data
             final Counter counter = Repository.INSTANCE.getCounter(new Counter.Key(Role.PERFORMANCES, "test"));
             counter.add(1.4);
@@ -76,10 +78,11 @@ public class CubeDataStoreTest {
             }
         }
 
-        assertTrue(gauges.contains("[{\"type\": \"gauge\",\"time\": \"-\",\"data\": {\"unit\":\"u\",\"value\":0.0,\"role\":\"mock\"}}]"));
-        assertTrue(gauges.contains("[{\"type\": \"gauge\",\"time\": \"-\",\"data\": {\"unit\":\"u\",\"value\":1.0,\"role\":\"mock\"}}]"));
-        assertTrue(gauges.contains("[{\"type\": \"gauge\",\"time\": \"-\",\"data\": {\"unit\":\"u\",\"value\":2.0,\"role\":\"mock\"}}]"));
-        assertTrue(gauges.contains("[{\"type\": \"gauge\",\"time\": \"-\",\"data\": {\"unit\":\"u\",\"value\":3.0,\"role\":\"mock\"}}]"));
+        final String host = InetAddress.getLocalHost().getHostName();
+        assertTrue(gauges.contains("[{\"type\": \"gauge\",\"time\": \"-\",\"data\": {\"unit\":\"u\",\"marker\":\"" + host + "\",\"value\":0.0,\"role\":\"mock\"}}]"));
+        assertTrue(gauges.contains("[{\"type\": \"gauge\",\"time\": \"-\",\"data\": {\"unit\":\"u\",\"marker\":\"" + host + "\",\"value\":1.0,\"role\":\"mock\"}}]"));
+        assertTrue(gauges.contains("[{\"type\": \"gauge\",\"time\": \"-\",\"data\": {\"unit\":\"u\",\"marker\":\"" + host + "\",\"value\":2.0,\"role\":\"mock\"}}]"));
+        assertTrue(gauges.contains("[{\"type\": \"gauge\",\"time\": \"-\",\"data\": {\"unit\":\"u\",\"marker\":\"" + host + "\",\"value\":3.0,\"role\":\"mock\"}}]"));
 
         assertTrue(counters >= 3);
         assertNotNull(aCounterMessage);
@@ -87,5 +90,6 @@ public class CubeDataStoreTest {
         assertThat(aCounterMessage, containsString("Value"));
         assertThat(aCounterMessage, containsString("Hits"));
         assertThat(aCounterMessage, containsString("Sum"));
+        assertThat(aCounterMessage, containsString("marker"));
     }
 }

Modified: commons/sandbox/monitoring/trunk/cube/src/test/resources/commons-monitoring.properties
URL: http://svn.apache.org/viewvc/commons/sandbox/monitoring/trunk/cube/src/test/resources/commons-monitoring.properties?rev=1533145&r1=1533144&r2=1533145&view=diff
==============================================================================
--- commons/sandbox/monitoring/trunk/cube/src/test/resources/commons-monitoring.properties (original)
+++ commons/sandbox/monitoring/trunk/cube/src/test/resources/commons-monitoring.properties Thu Oct 17 16:40:58 2013
@@ -16,4 +16,4 @@
 # under the License.
 org.apache.commons.monitoring.store.DataStore = org.apache.commons.monitoring.cube.CubeDataStore
 org.apache.commons.monitoring.cube.period = 100
-org.apache.commons.monitoring.cube.CubeBuilder.collector = http://localhost:1080/1.0/event/put
+org.apache.commons.monitoring.cube.CubeBuilder.collector = http://localhost:1234/1.0/event/put