From cbaf24e4e4fc1b985c3c5e74d6937be5a92d0562 Mon Sep 17 00:00:00 2001
From: Steffen Friedrich <friedrich@informatik.uni-hamburg.de>
Date: Tue, 9 Jun 2015 15:01:15 +0200
Subject: [PATCH]  [exporter] added JSONArrayMeasurementsExporter which
 generates one JSON array of measurement objects.

---
 .../JSONArrayMeasurementsExporter.java        | 73 +++++++++++++++++++
 .../exporter/JSONMeasurementsExporter.java    |  2 +-
 .../exporter/TestMeasurementsExporter.java    | 56 ++++++++++++++
 3 files changed, 130 insertions(+), 1 deletion(-)
 create mode 100644 core/src/main/java/com/yahoo/ycsb/measurements/exporter/JSONArrayMeasurementsExporter.java
 create mode 100644 core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java

diff --git a/core/src/main/java/com/yahoo/ycsb/measurements/exporter/JSONArrayMeasurementsExporter.java b/core/src/main/java/com/yahoo/ycsb/measurements/exporter/JSONArrayMeasurementsExporter.java
new file mode 100644
index 00000000..b8466cfc
--- /dev/null
+++ b/core/src/main/java/com/yahoo/ycsb/measurements/exporter/JSONArrayMeasurementsExporter.java
@@ -0,0 +1,73 @@
+/**                                                                                                                                                                                
+ * Copyright (c) 2015 Yahoo! Inc. All rights reserved.
+ *                                                                                                                                                                                 
+ * Licensed 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. See accompanying                                                                                                                 
+ * LICENSE file.                                                                                                                                                                   
+ */
+package com.yahoo.ycsb.measurements.exporter;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+
+import org.codehaus.jackson.JsonFactory;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.util.DefaultPrettyPrinter;
+
+/**
+ * Export measurements into a machine readable JSON Array of measurement objects.
+ */
+public class JSONArrayMeasurementsExporter implements MeasurementsExporter
+{
+
+  private JsonFactory factory = new JsonFactory();
+  private JsonGenerator g;
+
+  public JSONArrayMeasurementsExporter(OutputStream os) throws IOException
+  {
+
+    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
+    g = factory.createJsonGenerator(bw);
+    g.setPrettyPrinter(new DefaultPrettyPrinter());
+    g.writeStartArray();
+  }
+
+  public void write(String metric, String measurement, int i) throws IOException
+  {
+    g.writeStartObject();
+    g.writeStringField("metric", metric);
+    g.writeStringField("measurement", measurement);
+    g.writeNumberField("value", i);
+    g.writeEndObject();
+  }
+
+  public void write(String metric, String measurement, double d) throws IOException
+  {
+    g.writeStartObject();
+    g.writeStringField("metric", metric);
+    g.writeStringField("measurement", measurement);
+    g.writeNumberField("value", d);
+    g.writeEndObject();
+  }
+
+  public void close() throws IOException
+  {
+    if (g != null)
+    {
+      g.writeEndArray();
+      g.close();
+    }
+  }
+
+}
diff --git a/core/src/main/java/com/yahoo/ycsb/measurements/exporter/JSONMeasurementsExporter.java b/core/src/main/java/com/yahoo/ycsb/measurements/exporter/JSONMeasurementsExporter.java
index 0d59dcba..1d8d6523 100644
--- a/core/src/main/java/com/yahoo/ycsb/measurements/exporter/JSONMeasurementsExporter.java
+++ b/core/src/main/java/com/yahoo/ycsb/measurements/exporter/JSONMeasurementsExporter.java
@@ -23,7 +23,7 @@ import java.io.OutputStreamWriter;
 
 import org.codehaus.jackson.JsonFactory;
 import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.impl.DefaultPrettyPrinter;
+import org.codehaus.jackson.util.DefaultPrettyPrinter;
 
 /**
  * Export measurements into a machine readable JSON file.
diff --git a/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java b/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java
new file mode 100644
index 00000000..2b33aec3
--- /dev/null
+++ b/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2015 Yahoo! Inc. All rights reserved.
+ * <p>
+ * Licensed 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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. See accompanying
+ * LICENSE file.
+ */
+package com.yahoo.ycsb.measurements.exporter;
+
+import com.yahoo.ycsb.generator.ZipfianGenerator;
+import com.yahoo.ycsb.measurements.Measurements;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.testng.annotations.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertTrue;
+
+public class TestMeasurementsExporter {
+    @Test
+    public void testJSONArrayMeasurementsExporter() throws IOException {
+        Measurements mm = new Measurements(new Properties());
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        JSONArrayMeasurementsExporter export = new JSONArrayMeasurementsExporter(out);
+
+        long min = 5000;
+        long max = 100000;
+        ZipfianGenerator zipfian = new ZipfianGenerator(min, max);
+        for (int i = 0; i < 1000; i++) {
+            int rnd = zipfian.nextInt();
+            mm.measure("UPDATE", rnd);
+        }
+        mm.exportMeasurements(export);
+        export.close();
+
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode  json = mapper.readTree(out.toString("UTF-8"));
+        assertTrue(json.isArray());
+        assertEquals(json.get(0).get("measurement").asText(), "Operations");
+        assertEquals(json.get(3).get("measurement").asText(), "MaxLatency(us)");
+        assertEquals(json.get(11).get("measurement").asText(), "5");
+    }
+}
-- 
GitLab