From 298641203631f5c8243d033a577eec9b93cf5d18 Mon Sep 17 00:00:00 2001 From: Mark Wolters Date: Wed, 4 Oct 2023 17:31:42 -0400 Subject: [PATCH] fixup of csv reporter, removed script context parameter --- .../vectormath/CqlUtilsPluginInfo.java | 5 +- .../PineconeScriptingUtilsPluginInfo.java | 5 +- .../api/evalcontext/GroovyCycleFunction.java | 1 - .../core/lifecycle/scenario/NBScenario.java | 3 +- .../ComputeFunctionPluginInfo.java | 5 +- .../ConversionUtilsPluginInfo.java | 5 +- .../extensions/csvmetrics/CSVMetrics.java | 111 ----------- .../csvmetrics/CSVMetricsPlugin.java | 76 -------- .../csvmetrics/CSVMetricsPluginData.java | 41 ---- .../extensions/csvmetrics/csvmetrics.md | 29 --- .../csvoutput/CsvOutputPluginData.java | 5 +- .../extensions/example/ExamplePluginData.java | 5 +- .../files/FileAccessPluginData.java | 5 +- ...lobalVarsScriptingExtensionPluginData.java | 5 +- .../histologger/HdrHistoLogPlugin.java | 7 +- .../histologger/HdrHistoLogPluginData.java | 7 +- .../histostatslogger/HistoStatsPlugin.java | 8 +- .../HistoStatsPluginData.java | 6 +- .../extensions/http/HttpPluginData.java | 5 +- .../optimizers/BobyqaOptimizerInstance.java | 8 +- .../optimizers/BobyqaOptimizerPlugin.java | 11 +- .../optimizers/BobyqaOptimizerPluginData.java | 6 +- .../extensions/s3uploader/S3Uploader.java | 10 +- .../s3uploader/S3UploaderPluginData.java | 10 +- .../scriptingmetrics/ScriptingMetrics.java | 70 ------- .../ScriptingMetricsPluginData.java | 38 ---- .../scriptingmetrics/scriptingmetrics.md | 15 -- .../engine/shutdown/ShutdownHookPlugin.java | 9 +- .../shutdown/ShutdownHookPluginMetadata.java | 7 +- .../engine/metrics/reporters/CsvReporter.java | 179 +++++++++++++++++- .../reporters}/MetricInstanceFilter.java | 5 +- .../ScriptingExtensionPluginInfo.java | 3 +- .../io/nosqlbench/components/NBBuilders.java | 38 +++- 33 files changed, 267 insertions(+), 476 deletions(-) delete mode 100644 engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/CSVMetrics.java delete mode 100644 engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/CSVMetricsPlugin.java delete mode 100644 engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/CSVMetricsPluginData.java delete mode 100644 engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/csvmetrics.md delete mode 100644 engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetricsPluginData.java delete mode 100644 engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/scriptingmetrics.md rename {engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics => nb-api/src/main/java/io/nosqlbench/api/engine/metrics/reporters}/MetricInstanceFilter.java (94%) diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtilsPluginInfo.java b/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtilsPluginInfo.java index e91b3b11e..4953b9f4a 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtilsPluginInfo.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/engine/extensions/vectormath/CqlUtilsPluginInfo.java @@ -16,10 +16,9 @@ package io.nosqlbench.engine.extensions.vectormath; -import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; -import io.nosqlbench.components.NBBaseComponent; +import io.nosqlbench.components.NBComponent; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; @@ -31,7 +30,7 @@ public class CqlUtilsPluginInfo implements ScriptingExtensionPluginInfo implements CycleFunction { LogManager.getLogger("extensions." + extensionDescriptor.getBaseVariableName()); final Object extensionObject = extensionDescriptor.getExtensionObject( extensionLogger, - null, null ); logger.trace(() -> "Adding extension object: name=" + extensionDescriptor.getBaseVariableName() + diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/NBScenario.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/NBScenario.java index 2b4df0c10..988ab5db4 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/NBScenario.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/NBScenario.java @@ -221,8 +221,7 @@ public class NBScenario extends NBBaseComponent implements Callable "Adding extension object: name=" + extensionDescriptor.getBaseVariableName() + diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctionPluginInfo.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctionPluginInfo.java index 3e2937f86..d70bf4cd8 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctionPluginInfo.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/computefunctions/ComputeFunctionPluginInfo.java @@ -16,10 +16,9 @@ package io.nosqlbench.engine.extensions.computefunctions; -import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; -import io.nosqlbench.components.NBBaseComponent; +import io.nosqlbench.components.NBComponent; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; @@ -33,7 +32,7 @@ public class ComputeFunctionPluginInfo implements ScriptingExtensionPluginInfo { - - @Override - public String getDescription() { - return "Allows a script to log some or all metrics to CSV files"; - } - - /* - * metricComponent should be the Scenario as this is loaded out of NBScenario - */ - @Override - public CSVMetricsPlugin getExtensionObject(final Logger logger, final NBBaseComponent scenario, final LabeledScenarioContext scriptContext) { - return new CSVMetricsPlugin(logger, scenario, scriptContext); - } - -} diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/csvmetrics.md b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/csvmetrics.md deleted file mode 100644 index da95905f3..000000000 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/csvmetrics.md +++ /dev/null @@ -1,29 +0,0 @@ -csvmetrics extension -==================== - -This extension makes it easy to configure csv metrics to be logged to a path with a metrics reporter. - -### Examples -Explicitly control the timing of logging: -~~~ -var csvlogger=csvmetrics.log("metrics.csv"); -csvlogger.report(); -~~~ -This example creates a csv logger but does not start it with automatic reporting. Also, since no metrics were explicitly added, all metrics are included by default. - -Automate the reporting at some interval: -~~~ -var csvlogger=csvmetrics.log("metrics.csv",30,"SECONDS"); -csvlogger.add(metrics.myactivity.cycles) -~~~ -In this form, a logging thread is started at the interval specified -by the second and third option. It also has exactly one metric, as adding a metric to it directly overrides the *match all metrics* default behavior. - -It is also possible to start a csv logger without scheduled reporting, then to start it at some interval determined later: -~~~ -var csvlogger=csvmetrics.log("metrics.csv"); -csvlogger.add(metrics.myactivity.cycles) -csvlogger.start(30,"SECONDS"); -~~~ - -The third column must be the name of a TimeUnit from java.util.concurrent.TimeUnit, namely one of "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS", although effective values lower than 5 seconds should be avoided in most cases. diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvoutput/CsvOutputPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvoutput/CsvOutputPluginData.java index 80de41121..b5339a749 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvoutput/CsvOutputPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvoutput/CsvOutputPluginData.java @@ -16,10 +16,9 @@ package io.nosqlbench.engine.extensions.csvoutput; -import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; -import io.nosqlbench.components.NBBaseComponent; +import io.nosqlbench.components.NBComponent; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; @@ -32,7 +31,7 @@ public class CsvOutputPluginData implements ScriptingExtensionPluginInfo getExtensionObject(final Logger logger, final NBBaseComponent baseComponent, final LabeledScenarioContext scriptContext) { + public ConcurrentHashMap getExtensionObject(final Logger logger, final NBComponent baseComponent) { final ConcurrentHashMap map = SharedState.gl_ObjectMap; return map; } diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPlugin.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPlugin.java index abeb0c7b0..c9f7d1118 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPlugin.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPlugin.java @@ -19,19 +19,18 @@ package io.nosqlbench.engine.extensions.histologger; import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBBaseComponent; import com.codahale.metrics.MetricRegistry; +import io.nosqlbench.components.NBComponent; import org.apache.logging.log4j.Logger; import javax.script.ScriptContext; public class HdrHistoLogPlugin { private final Logger logger; - private final NBBaseComponent baseComponent; - private final ScriptContext scriptContext; + private final NBComponent baseComponent; - public HdrHistoLogPlugin(Logger logger, NBBaseComponent baseComponent, ScriptContext scriptContext) { + public HdrHistoLogPlugin(Logger logger, NBComponent baseComponent) { this.logger = logger; this.baseComponent = baseComponent; - this.scriptContext = scriptContext; } public void logHistoIntervals(String session, String pattern, String filename, String interval) { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java index c4f8ac066..65fa22e00 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histologger/HdrHistoLogPluginData.java @@ -16,10 +16,9 @@ package io.nosqlbench.engine.extensions.histologger; -import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; -import io.nosqlbench.components.NBBaseComponent; +import io.nosqlbench.components.NBComponent; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; @@ -33,7 +32,7 @@ public class HdrHistoLogPluginData implements ScriptingExtensionPluginInfo } @Override - public HttpPlugin getExtensionObject(final Logger logger, final NBBaseComponent baseComponent, final LabeledScenarioContext scriptContext) { + public HttpPlugin getExtensionObject(final Logger logger, final NBComponent baseComponent) { return new HttpPlugin(); } } diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerInstance.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerInstance.java index 9be9a5f9a..1a7968f75 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerInstance.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerInstance.java @@ -16,8 +16,8 @@ package io.nosqlbench.engine.extensions.optimizers; -import com.codahale.metrics.MetricRegistry; import io.nosqlbench.components.NBBaseComponent; +import io.nosqlbench.components.NBComponent; import org.apache.commons.math3.analysis.MultivariateFunction; import org.apache.commons.math3.optim.*; import org.apache.commons.math3.optim.nonlinear.scalar.GoalType; @@ -33,8 +33,7 @@ import java.util.function.Function; public class BobyqaOptimizerInstance { private final Logger logger; - private final NBBaseComponent baseComponent; - private final ScriptContext scriptContext; + private final NBComponent baseComponent; private int interpolations = 0; private double initialTrustRegionRadius = Double.MAX_VALUE; @@ -50,10 +49,9 @@ public class BobyqaOptimizerInstance { private MVLogger mvLogger; private double guessSlew = 0.25d; - public BobyqaOptimizerInstance(Logger logger, NBBaseComponent baseComponent, ScriptContext scriptContext) { + public BobyqaOptimizerInstance(Logger logger, NBComponent baseComponent) { this.logger = logger; this.baseComponent = baseComponent; - this.scriptContext = scriptContext; } public BobyqaOptimizerInstance setPoints(int numberOfInterpolationPoints) { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPlugin.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPlugin.java index 6ef46ef14..3bc042f43 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPlugin.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPlugin.java @@ -16,9 +16,8 @@ package io.nosqlbench.engine.extensions.optimizers; -import com.codahale.metrics.MetricRegistry; import io.nosqlbench.components.NBBaseComponent; -import io.nosqlbench.components.NBBuilders; +import io.nosqlbench.components.NBComponent; import org.apache.logging.log4j.Logger; import javax.script.ScriptContext; @@ -26,17 +25,15 @@ import javax.script.ScriptContext; public class BobyqaOptimizerPlugin { private final Logger logger; - private final NBBaseComponent baseComponent; - private final ScriptContext scriptContext; + private final NBComponent baseComponent; - public BobyqaOptimizerPlugin(Logger logger, NBBaseComponent baseComponent, ScriptContext scriptContext) { + public BobyqaOptimizerPlugin(Logger logger, NBComponent baseComponent) { this.logger = logger; this.baseComponent = baseComponent; - this.scriptContext = scriptContext; } public BobyqaOptimizerInstance init() { - return new BobyqaOptimizerInstance(logger,baseComponent,scriptContext); + return new BobyqaOptimizerInstance(logger,baseComponent); } diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPluginData.java index 359a11bdd..067d1beb4 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPluginData.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/optimizers/BobyqaOptimizerPluginData.java @@ -16,10 +16,10 @@ package io.nosqlbench.engine.extensions.optimizers; -import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; import io.nosqlbench.components.NBBaseComponent; +import io.nosqlbench.components.NBComponent; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; @@ -32,8 +32,8 @@ public class BobyqaOptimizerPluginData implements ScriptingExtensionPluginInfo "registered summmary gauge:" + name); -// return summaryGauge; - } - - public DoubleSummaryGauge newSummaryGauge(NBLabeledElement context, final String name) { - throw new RuntimeException("replace me after merge"); -// final DoubleSummaryGauge summaryGauge = ActivityMetrics.summaryGauge(context,name); -// this.logger.info(() -> "registered summmary gauge:" + name); -// return summaryGauge; - } - -// public RelevancyMeasures newRelevancyMeasures(NBLabeledElement parent, Map labels) { -// return new RelevancyMeasures(parent,labels); -// } - public RelevancyMeasures newRelevancyMeasures(NBLabeledElement parent) { - return new RelevancyMeasures(parent); - } -// public RelevancyMeasures newRelevancyMeasures(NBLabeledElement parent, Object... labels) { -// return new RelevancyMeasures(parent,labels); -// } - - - -} diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetricsPluginData.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetricsPluginData.java deleted file mode 100644 index 70c31e107..000000000 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetricsPluginData.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2022-2023 nosqlbench - * - * 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. - */ - -package io.nosqlbench.engine.extensions.scriptingmetrics; - -import com.codahale.metrics.MetricRegistry; -import io.nosqlbench.api.config.LabeledScenarioContext; -import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; -import io.nosqlbench.components.NBBaseComponent; -import io.nosqlbench.nb.annotations.Service; -import org.apache.logging.log4j.Logger; - -@Service(value= ScriptingExtensionPluginInfo.class, selector="scriptingmetrics") -public class ScriptingMetricsPluginData implements ScriptingExtensionPluginInfo { - - @Override - public String getDescription() { - return "Allows you to create and append metrics within your scenario scripts"; - } - - @Override - public ScriptingMetrics getExtensionObject(final Logger logger, final NBBaseComponent baseComponent, final LabeledScenarioContext scriptContext) { - return new ScriptingMetrics(logger,baseComponent,scriptContext); - } -} diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/scriptingmetrics.md b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/scriptingmetrics.md deleted file mode 100644 index 619cbe8bb..000000000 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/scriptingmetrics.md +++ /dev/null @@ -1,15 +0,0 @@ -scriptingmetrics extension -========================== - -This extensions allows you to create and update metrics -that are visible to nosqlbench from your scripting environment. - -### Example -~~~ -var mygauge= scriptingmetrics.newGauge("mygaugename", 1.0); -... -mygauge.update(5.3); -... -~~~ - -Any such metric will be available in the runtime as a standard metric. For now, only gauges are supported, but others may be added as needed. \ No newline at end of file diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPlugin.java b/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPlugin.java index 8d689c548..9ccdfbe01 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPlugin.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPlugin.java @@ -16,8 +16,7 @@ package io.nosqlbench.engine.shutdown; -import com.codahale.metrics.MetricRegistry; -import io.nosqlbench.components.NBBaseComponent; +import io.nosqlbench.components.NBComponent; import org.apache.logging.log4j.Logger; import javax.script.ScriptContext; @@ -25,14 +24,12 @@ import java.util.function.Function; public class ShutdownHookPlugin { private final Logger logger; - private final NBBaseComponent baseComponent; - private final ScriptContext scriptContext; + private final NBComponent baseComponent; - public ShutdownHookPlugin(Logger logger, NBBaseComponent baseComponent, ScriptContext scriptContext) { + public ShutdownHookPlugin(Logger logger, NBComponent baseComponent) { this.logger = logger; this.baseComponent = baseComponent; - this.scriptContext = scriptContext; } public void addShutdownHook(String name, Object f) { diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPluginMetadata.java b/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPluginMetadata.java index 95e93b2be..89de40b22 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPluginMetadata.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/shutdown/ShutdownHookPluginMetadata.java @@ -16,10 +16,9 @@ package io.nosqlbench.engine.shutdown; -import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; import io.nosqlbench.api.extensions.ScriptingExtensionPluginInfo; -import io.nosqlbench.components.NBBaseComponent; +import io.nosqlbench.components.NBComponent; import io.nosqlbench.nb.annotations.Service; import org.apache.logging.log4j.Logger; @@ -32,7 +31,7 @@ public class ShutdownHookPluginMetadata implements ScriptingExtensionPluginInfo< } @Override - public ShutdownHookPlugin getExtensionObject(final Logger logger, final NBBaseComponent baseComponent, final LabeledScenarioContext scriptContext) { - return new ShutdownHookPlugin(logger,baseComponent,scriptContext); + public ShutdownHookPlugin getExtensionObject(final Logger logger, final NBComponent baseComponent) { + return new ShutdownHookPlugin(logger,baseComponent); } } diff --git a/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/reporters/CsvReporter.java b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/reporters/CsvReporter.java index 199ce7424..ee677f0dc 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/reporters/CsvReporter.java +++ b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/reporters/CsvReporter.java @@ -17,21 +17,186 @@ package io.nosqlbench.api.engine.metrics.reporters; -import io.nosqlbench.components.NBBaseComponent; +import com.codahale.metrics.*; +import io.nosqlbench.api.engine.metrics.instruments.NBMetric; +import io.nosqlbench.api.labels.NBLabels; +import io.nosqlbench.components.NBComponent; import io.nosqlbench.components.PeriodicTaskComponent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; -import java.io.File; +import java.io.*; +import java.nio.file.Path; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +import static java.nio.charset.StandardCharsets.UTF_8; public class CsvReporter extends PeriodicTaskComponent { - public CsvReporter(NBBaseComponent node, File reportTo, int interval) { - super(node, null, interval, false); + private static final Logger logger = LogManager.getLogger(CsvReporter.class); + private final Path reportTo; + private final String separator = ","; + private final MetricInstanceFilter filter; + private final Locale locale = Locale.US; + private final Clock clock = Clock.defaultClock(); + private final String histogramFormat; + private final String meterFormat; + private final String timerFormat; + + private final String timerHeader; + private final String meterHeader; + private final String histogramHeader; + private final TimeUnit rateUnit = TimeUnit.SECONDS; + private final TimeUnit durationUnit = TimeUnit.NANOSECONDS; + private final long durationFactor; + private final long rateFactor; + private final NBComponent component; + + public CsvReporter(NBComponent node, Path reportTo, int interval, MetricInstanceFilter filter, + NBLabels extraLabels) { + super(node, extraLabels, interval, false); + this.component = node; + this.reportTo = reportTo; + this.filter = filter; + this.durationFactor = durationUnit.toNanos(1); + this.rateFactor = rateUnit.toSeconds(1); + this.histogramFormat = String.join(separator, "%d", "%d", "%f", "%d", "%f", "%f", "%f", "%f", "%f", "%f", "%f"); + this.meterFormat = String.join(separator, "%d", "%f", "%f", "%f", "%f", "events/%s"); + this.timerFormat = String.join(separator, "%d", "%f", "%f", "%f", "%f", "%f", "%f", "%f", "%f", "%f", "%f", "%f", "%f", "%f", "%f", "calls/%s", "%s"); + + this.timerHeader = String.join(separator, "count", "max", "mean", "min", "stddev", "p50", "p75", "p95", "p98", "p99", "p999", "mean_rate", "m1_rate", "m5_rate", "m15_rate", "rate_unit", "duration_unit"); + this.meterHeader = String.join(separator, "count", "mean_rate", "m1_rate", "m5_rate", "m15_rate", "rate_unit"); + this.histogramHeader = String.join(separator, "count", "max", "mean", "min", "stddev", "p50", "p75", "p95", "p98", "p99", "p999"); + } + + public CsvReporter(NBComponent node, Path reportTo, int interval, MetricInstanceFilter filter) { + this(node, reportTo, interval, filter, null); + } + + public void start() { + List metrics = component.findMetricsInTree(""); + final long timestamp = TimeUnit.MILLISECONDS.toSeconds(clock.getTime()); + for (NBMetric metric : metrics) { + if (metric instanceof Gauge) { + reportGauge(timestamp, metric.getLabels().linearizeAsMetrics(), (Gauge) metric); + } else if (metric instanceof Counter) { + reportCounter(timestamp, metric.getLabels().linearizeAsMetrics(), (Counter) metric); + } else if (metric instanceof Histogram) { + reportHistogram(timestamp, metric.getLabels().linearizeAsMetrics(), (Histogram) metric); + } else if (metric instanceof Meter) { + reportMeter(timestamp, metric.getLabels().linearizeAsMetrics(), (Meter) metric); + } else if (metric instanceof Timer) { + reportTimer(timestamp, metric.getLabels().linearizeAsMetrics(), (Timer) metric); + } + } + } + + protected double convertDuration(double duration) { + return duration / durationFactor; + } + + protected double convertRate(double rate) { + return rate * rateFactor; + } + + private void reportTimer(long timestamp, String name, Timer timer) { + final Snapshot snapshot = timer.getSnapshot(); + + report(timestamp, + name, + timerHeader, + timerFormat, + timer.getCount(), + convertDuration(snapshot.getMax()), + convertDuration(snapshot.getMean()), + convertDuration(snapshot.getMin()), + convertDuration(snapshot.getStdDev()), + convertDuration(snapshot.getMedian()), + convertDuration(snapshot.get75thPercentile()), + convertDuration(snapshot.get95thPercentile()), + convertDuration(snapshot.get98thPercentile()), + convertDuration(snapshot.get99thPercentile()), + convertDuration(snapshot.get999thPercentile()), + convertRate(timer.getMeanRate()), + convertRate(timer.getOneMinuteRate()), + convertRate(timer.getFiveMinuteRate()), + convertRate(timer.getFifteenMinuteRate()), + this.rateUnit, + this.durationUnit); + } + + private void reportMeter(long timestamp, String name, Meter meter) { + report(timestamp, + name, + meterHeader, + meterFormat, + meter.getCount(), + convertRate(meter.getMeanRate()), + convertRate(meter.getOneMinuteRate()), + convertRate(meter.getFiveMinuteRate()), + convertRate(meter.getFifteenMinuteRate()), + this.rateUnit); + } + + private void reportHistogram(long timestamp, String name, Histogram histogram) { + final Snapshot snapshot = histogram.getSnapshot(); + + report(timestamp, + name, + histogramHeader, + histogramFormat, + histogram.getCount(), + snapshot.getMax(), + snapshot.getMean(), + snapshot.getMin(), + snapshot.getStdDev(), + snapshot.getMedian(), + snapshot.get75thPercentile(), + snapshot.get95thPercentile(), + snapshot.get98thPercentile(), + snapshot.get99thPercentile(), + snapshot.get999thPercentile()); + } + + private void reportCounter(long timestamp, String name, Counter counter) { + report(timestamp, name, "count", "%d", counter.getCount()); + } + + private void reportGauge(long timestamp, String name, Gauge gauge) { + report(timestamp, name, "value", "%s", gauge.getValue()); + } + + private void report(long timestamp, String name, String header, String line, Object... values) { + try { + final File file = new File(reportTo + ".csv"); + final boolean fileAlreadyExists = file.exists(); + if (fileAlreadyExists || file.createNewFile()) { + try (PrintWriter out = new PrintWriter(new OutputStreamWriter( + new FileOutputStream(file, true), UTF_8))) { + if (!fileAlreadyExists) { + out.println("t" + separator + header); + } + out.printf(locale, String.format(locale, "%d" + separator + "%s%n", timestamp, line), values); + } + } + } catch (IOException e) { + logger.warn("Error writing to {}", name, e); + } + } + + protected String sanitize(String fileName) { + //TODO: sanitize file name + return fileName; + } + + public void teardown() { + super.teardown(); } @Override public void task() { - + this.start(); } - public void report() { - } } diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/MetricInstanceFilter.java b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/reporters/MetricInstanceFilter.java similarity index 94% rename from engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/MetricInstanceFilter.java rename to nb-api/src/main/java/io/nosqlbench/api/engine/metrics/reporters/MetricInstanceFilter.java index eccc2f3aa..39e4e519d 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/csvmetrics/MetricInstanceFilter.java +++ b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/reporters/MetricInstanceFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 nosqlbench + * Copyright (c) 2022-2023 nosqlbench * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,8 +12,9 @@ * 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 io.nosqlbench.engine.extensions.csvmetrics; +package io.nosqlbench.api.engine.metrics.reporters; import com.codahale.metrics.Metric; import com.codahale.metrics.MetricFilter; diff --git a/nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingExtensionPluginInfo.java b/nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingExtensionPluginInfo.java index b7e79f98f..aa1c9048f 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingExtensionPluginInfo.java +++ b/nb-api/src/main/java/io/nosqlbench/api/extensions/ScriptingExtensionPluginInfo.java @@ -43,10 +43,9 @@ public interface ScriptingExtensionPluginInfo { /** * @param logger A logger named for the extension, in case the extension wants to log internally * @param component The main metrics component, in case the extension wants to track metrics internally - * @param scriptContext The scripting context object, useful for interacting with the sandbox directly * @return a new instance of an extension. The extension is given a logger if it desires. */ - T getExtensionObject(Logger logger, NBBaseComponent component, LabeledScenarioContext scriptContext); + T getExtensionObject(Logger logger, NBComponent component); /** * @return a simple name at the root of the variable namespace to anchor this extension. diff --git a/nb-api/src/main/java/io/nosqlbench/components/NBBuilders.java b/nb-api/src/main/java/io/nosqlbench/components/NBBuilders.java index 839f9741a..4361e2121 100644 --- a/nb-api/src/main/java/io/nosqlbench/components/NBBuilders.java +++ b/nb-api/src/main/java/io/nosqlbench/components/NBBuilders.java @@ -25,12 +25,14 @@ import io.nosqlbench.api.engine.metrics.instruments.NBMetricHistogram; import io.nosqlbench.api.engine.metrics.instruments.NBMetricTimer; import io.nosqlbench.api.engine.metrics.reporters.CsvReporter; import io.nosqlbench.api.engine.metrics.instruments.*; +import io.nosqlbench.api.engine.metrics.reporters.MetricInstanceFilter; import io.nosqlbench.api.engine.metrics.reporters.PromPushReporterComponent; import io.nosqlbench.api.labels.NBLabels; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.File; +import java.nio.file.Path; import java.util.Arrays; import java.util.DoubleSummaryStatistics; import java.util.List; @@ -118,9 +120,39 @@ public class NBBuilders { return reporter; } - public CsvReporter csvReporter(File reportTo, int interval) { - CsvReporter reporter = new CsvReporter(base, reportTo, interval); - return reporter; + public static class csvReporterBuilder { + private final NBComponent component; + private Path reportTo = Path.of("metrics.csv"); + private int interval = 1; + private MetricInstanceFilter filter = new MetricInstanceFilter(); + private NBLabels labels = null; + + public csvReporterBuilder(NBComponent component) { + this.component = component; + } + public csvReporterBuilder labels(NBLabels labels) { + this.labels = labels; + return this; + } + public csvReporterBuilder path(Path reportTo) { + this.reportTo = reportTo; + return this; + } + public csvReporterBuilder path(String reportTo) { + this.reportTo = Path.of(reportTo); + return this; + } + public csvReporterBuilder interval(int interval) { + this.interval = interval; + return this; + } + public csvReporterBuilder filter(MetricInstanceFilter filter) { + this.filter = filter; + return this; + } + public CsvReporter build() { + return new CsvReporter(component, reportTo, interval, filter); + } } }