mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2025-02-25 18:55:28 -06:00
add csvoutput scripting plugin for response curve capture
This commit is contained in:
parent
aaa41053a7
commit
b76bfd8dc9
@ -0,0 +1,4 @@
|
|||||||
|
package io.nosqlbench.engine.extensions.csvoutput;
|
||||||
|
|
||||||
|
public class CsvOutput {
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package io.nosqlbench.engine.extensions.csvoutput;
|
||||||
|
|
||||||
|
import com.codahale.metrics.MetricRegistry;
|
||||||
|
import io.nosqlbench.engine.api.extensions.ScriptingPluginInfo;
|
||||||
|
import io.nosqlbench.nb.annotations.Service;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import javax.script.ScriptContext;
|
||||||
|
|
||||||
|
@Service(value = ScriptingPluginInfo.class,selector = "csvoutput")
|
||||||
|
public class CsvOutputPluginData implements ScriptingPluginInfo<CsvOutputPluginInstance> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return "Write CSV output to a named file";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CsvOutputPluginInstance getExtensionObject(Logger logger, MetricRegistry metricRegistry, ScriptContext scriptContext) {
|
||||||
|
return new CsvOutputPluginInstance();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package io.nosqlbench.engine.extensions.csvoutput;
|
||||||
|
|
||||||
|
public class CsvOutputPluginInstance {
|
||||||
|
|
||||||
|
public CsvOutput open(String filename, String... headers) {
|
||||||
|
return new CsvOutputWriter(filename, headers);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
package io.nosqlbench.engine.extensions.csvoutput;
|
||||||
|
|
||||||
|
import org.apache.commons.csv.CSVFormat;
|
||||||
|
import org.apache.commons.csv.CSVPrinter;
|
||||||
|
import org.graalvm.polyglot.Value;
|
||||||
|
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class CsvOutputWriter extends CsvOutput {
|
||||||
|
|
||||||
|
private final CSVPrinter printer;
|
||||||
|
private final FileWriter filewriter;
|
||||||
|
private final LinkedHashSet<String> headerKeys;
|
||||||
|
private final String filename;
|
||||||
|
|
||||||
|
public CsvOutputWriter(String filename, String... headers) {
|
||||||
|
this.filename = filename;
|
||||||
|
CSVFormat fmt = CSVFormat.DEFAULT;
|
||||||
|
this.headerKeys = new LinkedHashSet<>(Arrays.asList(headers));
|
||||||
|
try {
|
||||||
|
this.filewriter = new FileWriter(filename);
|
||||||
|
this.printer = new CSVPrinter(filewriter,fmt);
|
||||||
|
if (Files.size(Path.of(filename))==0) {
|
||||||
|
printer.printRecord(headerKeys);
|
||||||
|
printer.flush();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CsvOutputWriter write(Value value) {
|
||||||
|
List<String> lineout = new ArrayList<>();
|
||||||
|
Map<String,String> provided = new HashMap<>();
|
||||||
|
if (value.isHostObject()) {
|
||||||
|
Object o = value.asHostObject();
|
||||||
|
if (o instanceof Map) {
|
||||||
|
((Map<?, ?>) o).forEach((k,v) -> {
|
||||||
|
provided.put(k.toString(),v.toString());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("host object provided as '" + o.getClass().getCanonicalName()+ ", but only Maps are supported.");
|
||||||
|
}
|
||||||
|
} else if (value.hasMembers()) {
|
||||||
|
for (String vkey : value.getMemberKeys()) {
|
||||||
|
provided.put(vkey,value.getMember(vkey).toString());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("Value was not a Map host object nor a type with members.");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String headerKey : headerKeys) {
|
||||||
|
if (provided.containsKey(headerKey)) {
|
||||||
|
lineout.add(provided.remove(headerKey));
|
||||||
|
} else {
|
||||||
|
lineout.add("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (provided.size()>0) {
|
||||||
|
throw new RuntimeException("Unqualified column was emitted for file '" + filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
printer.printRecord(lineout);
|
||||||
|
printer.flush();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
csvoutput extension
|
||||||
|
===================
|
||||||
|
|
||||||
|
This extension makes it easy to start writing CSV data to a file,
|
||||||
|
using a defined set of headers.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
Open a writer and write a row:
|
||||||
|
|
||||||
|
var out=csvoutput.open('output.csv','time','value');
|
||||||
|
out.write({'time':23,'value':23});
|
||||||
|
|
@ -0,0 +1,22 @@
|
|||||||
|
package io.nosqlbench.engine.extensions.csvoutput;
|
||||||
|
|
||||||
|
import org.assertj.core.util.Files;
|
||||||
|
import org.graalvm.polyglot.Value;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class CsvOutputWriterTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCsvOutputWriter() {
|
||||||
|
File tmpfile = Files.newTemporaryFile();
|
||||||
|
tmpfile.deleteOnExit();
|
||||||
|
System.out.println("tmpfile="+ tmpfile.getPath());
|
||||||
|
CsvOutputWriter out = new CsvOutputWriter(tmpfile.getPath(), "one", "two");
|
||||||
|
out.write(Value.asValue(Map.of("one","one_","two","two_")));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -178,6 +178,16 @@ public class AsyncScriptIntegrationTests {
|
|||||||
assertThat(logdata.split("Tag=testhistostatslogger.cycles.servicetime,").length).isGreaterThanOrEqualTo(2);
|
assertThat(logdata.split("Tag=testhistostatslogger.cycles.servicetime,").length).isGreaterThanOrEqualTo(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExtensionCsvOutput() throws IOException {
|
||||||
|
ScenarioResult scenarioResult = runScenario("extension_csvoutput");
|
||||||
|
List<String> strings = Files.readAllLines(Paths.get(
|
||||||
|
"logs/csvoutputtestfile.csv"));
|
||||||
|
String logdata = strings.stream().collect(Collectors.joining("\n"));
|
||||||
|
assertThat(logdata).contains("header1,header2");
|
||||||
|
assertThat(logdata).contains("value1,value2");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExtensionHistogramLogger() throws IOException {
|
public void testExtensionHistogramLogger() throws IOException {
|
||||||
ScenarioResult scenarioResult = runScenario("extension_histologger");
|
ScenarioResult scenarioResult = runScenario("extension_histologger");
|
||||||
|
20
nb/src/test/resources/scripts/async/extension_csvoutput.js
Normal file
20
nb/src/test/resources/scripts/async/extension_csvoutput.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2016 jshook
|
||||||
|
* 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.
|
||||||
|
* /
|
||||||
|
*/
|
||||||
|
|
||||||
|
var csvlogger = csvoutput.open("logs/csvoutputtestfile.csv","header1","header2");
|
||||||
|
|
||||||
|
csvlogger.write({"header1": "value1","header2":"value2"});
|
Loading…
Reference in New Issue
Block a user