From cbaf24e4e4fc1b985c3c5e74d6937be5a92d0562 Mon Sep 17 00:00:00 2001 From: Steffen Friedrich 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. + *

+ * 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 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"); + } +}