From 9daf06cd62af171cd49bd6990082fe09eded3da4 Mon Sep 17 00:00:00 2001 From: Jonathan Shook Date: Thu, 5 Oct 2023 21:19:40 -0500 Subject: [PATCH] rehome all metrics construction patterns, remove ActivityMetrics --- .../adapter/amqp/util/AmqpAdapterMetrics.java | 26 +- .../opdispensers/Cqld4BaseOpDispenser.java | 2 +- .../adapter/diag/optasks/DiagTask_gauge.java | 1 - .../adapter/http/core/HttpMetrics.java | 1 - .../kafka/util/KafkaAdapterMetrics.java | 11 +- .../pulsar/util/PulsarAdapterMetrics.java | 29 +- .../adapter/s4j/util/S4JAdapterMetrics.java | 13 +- .../api/activityimpl/BaseOpDispenser.java | 5 +- .../api/metrics/ThreadLocalNamedTimers.java | 1 - .../ratelimits/HybridRateLimiter.java | 1 - .../ratelimits/InlineTokenPool.java | 1 - .../activityapi/ratelimits/TokenFiller.java | 1 - .../api/activityimpl/SimpleActivity.java | 1 - .../api/activityimpl/input/AtomicInput.java | 2 - .../uniform/StandardActivity.java | 2 - .../api/metrics/ExceptionCountMetrics.java | 1 - .../api/metrics/ExceptionHistoMetrics.java | 1 - .../api/metrics/ExceptionMeterMetrics.java | 2 - .../api/metrics/ExceptionTimerMetrics.java | 2 - .../api/metrics/ActivityMetricsTest.java | 63 ---- .../java/io/nosqlbench/engine/cli/NBCLI.java | 76 ++--- .../lifecycle/ExecutionMetricsResult.java | 64 ++-- .../lifecycle/activity/ActivityExecutor.java | 11 +- .../context/ActivitiesController.java | 4 +- .../engine/core/metrics/MetricReporters.java | 211 ------------ .../engine/core/metrics/MetricsContext.java | 60 ---- .../histologger/HdrHistoLogPlugin.java | 4 +- .../histostatslogger/HistoStatsPlugin.java | 4 +- .../scriptingmetrics/ScriptingMetrics.java | 1 - .../api/engine/metrics/ActivityMetrics.java | 319 ------------------ .../metrics/wrappers/RelevancyMeasures.java | 1 - .../io/nosqlbench/api/labels/MapLabels.java | 19 +- .../io/nosqlbench/api/labels/NBLabels.java | 1 + .../io/nosqlbench/components/NBBuilders.java | 6 + .../core/script/MetricsIntegrationTest.java | 5 +- 35 files changed, 130 insertions(+), 822 deletions(-) delete mode 100644 engine-api/src/test/java/io/nosqlbench/engine/api/metrics/ActivityMetricsTest.java delete mode 100644 engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricReporters.java delete mode 100644 engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricsContext.java delete mode 100644 nb-api/src/main/java/io/nosqlbench/api/engine/metrics/ActivityMetrics.java diff --git a/adapter-amqp/src/main/java/io/nosqlbench/adapter/amqp/util/AmqpAdapterMetrics.java b/adapter-amqp/src/main/java/io/nosqlbench/adapter/amqp/util/AmqpAdapterMetrics.java index 2231b34ae..3bb162da5 100644 --- a/adapter-amqp/src/main/java/io/nosqlbench/adapter/amqp/util/AmqpAdapterMetrics.java +++ b/adapter-amqp/src/main/java/io/nosqlbench/adapter/amqp/util/AmqpAdapterMetrics.java @@ -22,7 +22,6 @@ import com.codahale.metrics.Timer; import io.nosqlbench.adapter.amqp.dispensers.AmqpBaseOpDispenser; import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.labels.NBLabels; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -56,28 +55,17 @@ public class AmqpAdapterMetrics { public void initS4JAdapterInstrumentation() { // Histogram metrics - messageSizeHistogram = - amqpBaseOpDispenser.create().histogram( - "message_size", ActivityMetrics.DEFAULT_HDRDIGITS); - + messageSizeHistogram = amqpBaseOpDispenser.create().histogram("message_size"); // Timer metrics - bindTimer = amqpBaseOpDispenser.create().timer( - "bind", ActivityMetrics.DEFAULT_HDRDIGITS); - executeTimer = - amqpBaseOpDispenser.create().timer( - "execute", ActivityMetrics.DEFAULT_HDRDIGITS); - + bindTimer = amqpBaseOpDispenser.create().timer("bind"); + executeTimer = amqpBaseOpDispenser.create().timer("execute"); // End-to-end metrics // Latency - e2eMsgProcLatencyHistogram = - amqpBaseOpDispenser.create().histogram("e2e_msg_latency", ActivityMetrics.DEFAULT_HDRDIGITS); + e2eMsgProcLatencyHistogram = amqpBaseOpDispenser.create().histogram("e2e_msg_latency"); // Error metrics - msgErrOutOfSeqCounter = - amqpBaseOpDispenser.create().counter("err_msg_oos"); - msgErrLossCounter = - amqpBaseOpDispenser.create().counter("err_msg_loss"); - msgErrDuplicateCounter = - amqpBaseOpDispenser.create().counter("err_msg_dup"); + msgErrOutOfSeqCounter = amqpBaseOpDispenser.create().counter("err_msg_oos"); + msgErrLossCounter = amqpBaseOpDispenser.create().counter("err_msg_loss"); + msgErrDuplicateCounter = amqpBaseOpDispenser.create().counter("err_msg_dup"); } public Timer getBindTimer() { return bindTimer; } diff --git a/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4BaseOpDispenser.java b/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4BaseOpDispenser.java index 79a7d86a4..770a0eff9 100644 --- a/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4BaseOpDispenser.java +++ b/adapter-cqld4/src/main/java/io/nosqlbench/adapter/cqld4/opdispensers/Cqld4BaseOpDispenser.java @@ -30,7 +30,7 @@ import io.nosqlbench.adapter.cqld4.optypes.Cqld4CqlOp; import io.nosqlbench.adapters.api.activityimpl.BaseOpDispenser; import io.nosqlbench.adapters.api.activityimpl.uniform.DriverAdapter; import io.nosqlbench.adapters.api.templating.ParsedOp; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/adapter-diag/src/main/java/io/nosqlbench/adapter/diag/optasks/DiagTask_gauge.java b/adapter-diag/src/main/java/io/nosqlbench/adapter/diag/optasks/DiagTask_gauge.java index fd5b009c6..d0c9ad9ce 100644 --- a/adapter-diag/src/main/java/io/nosqlbench/adapter/diag/optasks/DiagTask_gauge.java +++ b/adapter-diag/src/main/java/io/nosqlbench/adapter/diag/optasks/DiagTask_gauge.java @@ -21,7 +21,6 @@ import io.nosqlbench.api.config.standard.ConfigModel; import io.nosqlbench.api.config.standard.NBConfigModel; import io.nosqlbench.api.config.standard.NBConfiguration; import io.nosqlbench.api.config.standard.Param; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.api.labels.NBLabels; import io.nosqlbench.nb.annotations.Service; import io.nosqlbench.virtdata.api.bindings.VirtDataConversions; diff --git a/adapter-http/src/main/java/io/nosqlbench/adapter/http/core/HttpMetrics.java b/adapter-http/src/main/java/io/nosqlbench/adapter/http/core/HttpMetrics.java index 6d3508e96..8333f265a 100644 --- a/adapter-http/src/main/java/io/nosqlbench/adapter/http/core/HttpMetrics.java +++ b/adapter-http/src/main/java/io/nosqlbench/adapter/http/core/HttpMetrics.java @@ -19,7 +19,6 @@ package io.nosqlbench.adapter.http.core; import com.codahale.metrics.Histogram; import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.labels.NBLabels; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBComponent; public class HttpMetrics implements NBLabeledElement { diff --git a/adapter-kafka/src/main/java/io/nosqlbench/adapter/kafka/util/KafkaAdapterMetrics.java b/adapter-kafka/src/main/java/io/nosqlbench/adapter/kafka/util/KafkaAdapterMetrics.java index bb838aec6..0b74ac8c3 100644 --- a/adapter-kafka/src/main/java/io/nosqlbench/adapter/kafka/util/KafkaAdapterMetrics.java +++ b/adapter-kafka/src/main/java/io/nosqlbench/adapter/kafka/util/KafkaAdapterMetrics.java @@ -20,9 +20,9 @@ import com.codahale.metrics.Counter; import com.codahale.metrics.Histogram; import com.codahale.metrics.Timer; import io.nosqlbench.adapter.kafka.dispensers.KafkaBaseOpDispenser; +import io.nosqlbench.api.engine.metrics.instruments.NBMetricHistogram; import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.labels.NBLabels; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -56,21 +56,20 @@ public class KafkaAdapterMetrics { public void initS4JAdapterInstrumentation() { // Histogram metrics - messageSizeHistogram = kafkaBaseOpDispenser.create().histogram( - "message_size", ActivityMetrics.DEFAULT_HDRDIGITS); + messageSizeHistogram = kafkaBaseOpDispenser.create().histogram("message_size"); // Timer metrics bindTimer = this.kafkaBaseOpDispenser.create().timer( - "bind", ActivityMetrics.DEFAULT_HDRDIGITS); + "bind"); executeTimer = this.kafkaBaseOpDispenser.create().timer( - "execute", ActivityMetrics.DEFAULT_HDRDIGITS); + "execute"); // End-to-end metrics // Latency e2eMsgProcLatencyHistogram = - kafkaBaseOpDispenser.create().histogram("e2e_msg_latency", ActivityMetrics.DEFAULT_HDRDIGITS); + kafkaBaseOpDispenser.create().histogram("e2e_msg_latency"); // Error metrics msgErrOutOfSeqCounter = kafkaBaseOpDispenser.create().counter("err_msg_oos"); diff --git a/adapter-pulsar/src/main/java/io/nosqlbench/adapter/pulsar/util/PulsarAdapterMetrics.java b/adapter-pulsar/src/main/java/io/nosqlbench/adapter/pulsar/util/PulsarAdapterMetrics.java index 946cd153d..ae7bf6fb8 100644 --- a/adapter-pulsar/src/main/java/io/nosqlbench/adapter/pulsar/util/PulsarAdapterMetrics.java +++ b/adapter-pulsar/src/main/java/io/nosqlbench/adapter/pulsar/util/PulsarAdapterMetrics.java @@ -17,11 +17,9 @@ package io.nosqlbench.adapter.pulsar.util; import com.codahale.metrics.Counter; -import com.codahale.metrics.Gauge; import com.codahale.metrics.Histogram; import com.codahale.metrics.Timer; import io.nosqlbench.adapter.pulsar.dispensers.PulsarBaseOpDispenser; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.pulsar.client.api.Consumer; @@ -75,28 +73,15 @@ public class PulsarAdapterMetrics { pulsarBaseOpDispenser.create().counter("err_msg_dup"); // Histogram metrics - messageSizeHistogram = - pulsarBaseOpDispenser.create().histogram( - "message_size", ActivityMetrics.DEFAULT_HDRDIGITS); - e2eMsgProcLatencyHistogram = - pulsarBaseOpDispenser.create().histogram( - "e2e_msg_latency", ActivityMetrics.DEFAULT_HDRDIGITS); - payloadRttHistogram = - pulsarBaseOpDispenser.create().histogram( - "payload_rtt", ActivityMetrics.DEFAULT_HDRDIGITS); + messageSizeHistogram = pulsarBaseOpDispenser.create().histogram("message_size"); + e2eMsgProcLatencyHistogram = pulsarBaseOpDispenser.create().histogram("e2e_msg_latency"); + payloadRttHistogram = pulsarBaseOpDispenser.create().histogram("payload_rtt"); // Timer metrics - bindTimer = - pulsarBaseOpDispenser.create().timer("bind", ActivityMetrics.DEFAULT_HDRDIGITS); - executeTimer = - pulsarBaseOpDispenser.create().timer( - "execute", ActivityMetrics.DEFAULT_HDRDIGITS); - createTransactionTimer = - pulsarBaseOpDispenser.create().timer( - "create_transaction", ActivityMetrics.DEFAULT_HDRDIGITS); - commitTransactionTimer = - pulsarBaseOpDispenser.create().timer( - "commit_transaction", ActivityMetrics.DEFAULT_HDRDIGITS); + bindTimer = pulsarBaseOpDispenser.create().timer("bind"); + executeTimer = pulsarBaseOpDispenser.create().timer("execute"); + createTransactionTimer = pulsarBaseOpDispenser.create().timer("create_transaction"); + commitTransactionTimer = pulsarBaseOpDispenser.create().timer("commit_transaction"); } public Counter getMsgErrOutOfSeqCounter() { diff --git a/adapter-s4j/src/main/java/io/nosqlbench/adapter/s4j/util/S4JAdapterMetrics.java b/adapter-s4j/src/main/java/io/nosqlbench/adapter/s4j/util/S4JAdapterMetrics.java index a10d81617..cb6205be9 100644 --- a/adapter-s4j/src/main/java/io/nosqlbench/adapter/s4j/util/S4JAdapterMetrics.java +++ b/adapter-s4j/src/main/java/io/nosqlbench/adapter/s4j/util/S4JAdapterMetrics.java @@ -19,7 +19,6 @@ package io.nosqlbench.adapter.s4j.util; import com.codahale.metrics.Histogram; import com.codahale.metrics.Timer; import io.nosqlbench.adapter.s4j.dispensers.S4JBaseOpDispenser; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -39,17 +38,11 @@ public class S4JAdapterMetrics { public void initS4JAdapterInstrumentation() { // Histogram metrics - this.messageSizeHistogram = - s4jBaseOpDispenser.create().histogram( - "message_size", ActivityMetrics.DEFAULT_HDRDIGITS); + this.messageSizeHistogram = s4jBaseOpDispenser.create().histogram("message_size"); // Timer metrics - this.bindTimer = - s4jBaseOpDispenser.create().timer( - "bind", ActivityMetrics.DEFAULT_HDRDIGITS); - this.executeTimer = - s4jBaseOpDispenser.create().timer( - "execute", ActivityMetrics.DEFAULT_HDRDIGITS); + this.bindTimer = s4jBaseOpDispenser.create().timer("bind"); + this.executeTimer = s4jBaseOpDispenser.create().timer("execute"); } public Timer getBindTimer() { return bindTimer; } diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java index 0050300ea..631e4687c 100644 --- a/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java +++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/activityimpl/BaseOpDispenser.java @@ -25,7 +25,6 @@ import io.nosqlbench.adapters.api.metrics.ThreadLocalNamedTimers; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.labels.NBLabels; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.api.errors.OpConfigError; import io.nosqlbench.components.NBBaseComponent; import io.nosqlbench.components.NBComponent; @@ -183,8 +182,8 @@ public abstract class BaseOpDispenser extends NBBaseComponent i if (this.instrument) { final int hdrDigits = pop.getStaticConfigOr("hdr_digits", 4); - successTimer = create().timer(ActivityMetrics.sanitize("successfor_"+getOpName()),hdrDigits); - errorTimer = create().timer(ActivityMetrics.sanitize("errorsfor_"+getOpName()),hdrDigits); + successTimer = create().timer("successfor_"+getOpName(),hdrDigits); + errorTimer = create().timer("errorsfor_"+getOpName(),hdrDigits); } } diff --git a/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ThreadLocalNamedTimers.java b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ThreadLocalNamedTimers.java index 37edda951..af33cdb6d 100644 --- a/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ThreadLocalNamedTimers.java +++ b/adapters-api/src/main/java/io/nosqlbench/adapters/api/metrics/ThreadLocalNamedTimers.java @@ -18,7 +18,6 @@ package io.nosqlbench.adapters.api.metrics; import com.codahale.metrics.Timer; import com.codahale.metrics.Timer.Context; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.adapters.api.templating.ParsedOp; import io.nosqlbench.api.engine.metrics.instruments.NBMetricTimer; import org.apache.logging.log4j.LogManager; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/HybridRateLimiter.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/HybridRateLimiter.java index b4d8bf03c..1aa5f9e6b 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/HybridRateLimiter.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/HybridRateLimiter.java @@ -18,7 +18,6 @@ package io.nosqlbench.engine.api.activityapi.ratelimits; import com.codahale.metrics.Gauge; import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBBaseComponent; import io.nosqlbench.components.NBComponent; import io.nosqlbench.nb.annotations.Service; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/InlineTokenPool.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/InlineTokenPool.java index 57341c68f..54f1c6bd5 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/InlineTokenPool.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/InlineTokenPool.java @@ -20,7 +20,6 @@ import com.codahale.metrics.Timer; import io.nosqlbench.components.NBComponent; import io.nosqlbench.engine.api.util.Colors; import io.nosqlbench.api.engine.activityimpl.ActivityDef; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenFiller.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenFiller.java index f094b0d4f..eea9d27b8 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenFiller.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenFiller.java @@ -18,7 +18,6 @@ package io.nosqlbench.engine.api.activityapi.ratelimits; import com.codahale.metrics.Timer; import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBComponent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java index 20a344a46..b9f77ec9e 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/SimpleActivity.java @@ -33,7 +33,6 @@ import io.nosqlbench.adapters.api.activityimpl.OpMapper; import io.nosqlbench.api.labels.NBLabels; import io.nosqlbench.api.config.standard.NBConfiguration; import io.nosqlbench.api.engine.activityimpl.ActivityDef; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.api.errors.BasicError; import io.nosqlbench.api.errors.OpConfigError; import io.nosqlbench.engine.api.activityapi.cyclelog.filters.IntPredicateDispenser; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/input/AtomicInput.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/input/AtomicInput.java index 222c706c1..2aee455e3 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/input/AtomicInput.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/input/AtomicInput.java @@ -18,8 +18,6 @@ package io.nosqlbench.engine.api.activityimpl.input; import com.codahale.metrics.Gauge; import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.api.engine.activityimpl.CyclesSpec; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; -import io.nosqlbench.api.engine.metrics.instruments.NBFunctionGauge; import io.nosqlbench.components.NBBaseComponent; import io.nosqlbench.components.NBComponent; import io.nosqlbench.engine.api.activityapi.core.ActivityDefObserver; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java index 37f831a0a..33bd9881c 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityimpl/uniform/StandardActivity.java @@ -30,8 +30,6 @@ import io.nosqlbench.api.Shutdownable; import io.nosqlbench.components.NBComponent; import io.nosqlbench.api.config.standard.*; import io.nosqlbench.api.engine.activityimpl.ActivityDef; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; -import io.nosqlbench.api.engine.metrics.instruments.NBFunctionGauge; import io.nosqlbench.api.errors.BasicError; import io.nosqlbench.api.errors.OpConfigError; import io.nosqlbench.api.labels.NBLabels; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionCountMetrics.java b/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionCountMetrics.java index 106b2da94..7d3641641 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionCountMetrics.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionCountMetrics.java @@ -17,7 +17,6 @@ package io.nosqlbench.engine.api.metrics; import com.codahale.metrics.Counter; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBComponent; import java.util.ArrayList; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionHistoMetrics.java b/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionHistoMetrics.java index 40e5c1481..db62ca455 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionHistoMetrics.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionHistoMetrics.java @@ -19,7 +19,6 @@ package io.nosqlbench.engine.api.metrics; import com.codahale.metrics.Histogram; import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.engine.activityimpl.ActivityDef; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBComponent; import java.util.ArrayList; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionMeterMetrics.java b/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionMeterMetrics.java index d77c5eb98..7048712a1 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionMeterMetrics.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionMeterMetrics.java @@ -17,8 +17,6 @@ package io.nosqlbench.engine.api.metrics; import com.codahale.metrics.Meter; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBComponent; import java.util.ArrayList; diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionTimerMetrics.java b/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionTimerMetrics.java index 3672a35cf..9a9f07065 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionTimerMetrics.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/metrics/ExceptionTimerMetrics.java @@ -17,9 +17,7 @@ package io.nosqlbench.engine.api.metrics; import com.codahale.metrics.Timer; -import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.engine.activityimpl.ActivityDef; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBComponent; import java.util.ArrayList; diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/metrics/ActivityMetricsTest.java b/engine-api/src/test/java/io/nosqlbench/engine/api/metrics/ActivityMetricsTest.java deleted file mode 100644 index fae9e7b3d..000000000 --- a/engine-api/src/test/java/io/nosqlbench/engine/api/metrics/ActivityMetricsTest.java +++ /dev/null @@ -1,63 +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.api.metrics; - -import com.codahale.metrics.Metric; -import com.codahale.metrics.MetricRegistry; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -public class ActivityMetricsTest { - - @Test - public void testMountSubRegistry() throws Exception { - MetricRegistry r1 = new MetricRegistry(); - r1.counter("counter1"); - - int extant = ActivityMetrics.getMetricRegistry().getMetrics().size(); - - ActivityMetrics.mountSubRegistry("aprefixhere_",r1); - Map metrics = ActivityMetrics.getMetricRegistry().getMetrics(); - assertThat(metrics).containsKey("aprefixhere_counter1"); - assertThat(metrics).hasSize(extant+1); - - r1.counter("counter2"); - metrics = ActivityMetrics.getMetricRegistry().getMetrics(); - assertThat(metrics).hasSize(extant+2); - assertThat(metrics).containsKey("aprefixhere_counter2"); - - r1.remove("counter1"); - metrics = ActivityMetrics.getMetricRegistry().getMetrics(); - assertThat(metrics).hasSize(extant+1); - assertThat(metrics).containsKey("aprefixhere_counter2"); - - r1.remove("counter2"); - metrics = ActivityMetrics.getMetricRegistry().getMetrics(); - assertThat(metrics).hasSize(extant); - - } - - @Test - public void testSanityCheckSanitize() { - String result = ActivityMetrics.sanitize("test-dynamic-params.input_cycles_first"); - assertThat(result).isEqualTo("test_dynamic_params__input_cycles_first"); - } -} diff --git a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java index 7dd04f7fe..1c0e76f56 100644 --- a/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java +++ b/engine-cli/src/main/java/io/nosqlbench/engine/cli/NBCLI.java @@ -54,7 +54,6 @@ import io.nosqlbench.engine.core.lifecycle.process.NBCLIErrorHandler; import io.nosqlbench.engine.core.lifecycle.session.NBSession; import io.nosqlbench.engine.core.logging.LoggerConfig; import io.nosqlbench.engine.core.metadata.MarkdownFinder; -import io.nosqlbench.engine.core.metrics.MetricReporters; import io.nosqlbench.nb.annotations.Service; import io.nosqlbench.nb.annotations.ServiceSelector; import org.apache.logging.log4j.LogManager; @@ -245,8 +244,9 @@ public class NBCLI implements Function, NBLabeledElement { NBIO.addGlobalIncludes(options.wantsIncludes()); - ActivityMetrics.setHdrDigits(options.getHdrDigits()); - ActivityMetrics.setLabelValidator(options.getAnnotateLabelSpec()); + // TODO: metrics +// ActivityMetrics.setHdrDigits(options.getHdrDigits()); +// ActivityMetrics.setLabelValidator(options.getAnnotateLabelSpec()); if (options.wantsBasicHelp()) { System.out.println(this.loadHelpFile("basic.md")); @@ -368,46 +368,36 @@ public class NBCLI implements Function, NBLabeledElement { .build() ); - if ((null != reportPromPushTo) || (null != reportGraphiteTo) || (null != options.wantsReportCsvTo())) { - final MetricReporters reporters = MetricReporters.getInstance(); - reporters.addRegistry("workloads", ActivityMetrics.getMetricRegistry()); - - if (null != reportPromPushTo) - reporters.addPromPush(reportPromPushTo, options.wantsMetricsPrefix(), promPushConfig); - if (null != reportGraphiteTo) reporters.addGraphite(reportGraphiteTo, options.wantsMetricsPrefix()); - if (null != options.wantsReportCsvTo()) - reporters.addCSVReporter(options.wantsReportCsvTo(), options.wantsMetricsPrefix()); - if (options.wantsLoggedMetrics()) { - reporters.addLogger(); - } - reporters.start(10, options.getReportInterval()); - } - - if (options.wantsEnableChart()) { - NBCLI.logger.info("Charting enabled"); - if (0 == options.getHistoLoggerConfigs().size()) { - NBCLI.logger.info("Adding default histologger configs"); - final String pattern = ".*"; - final String file = options.getChartHdrFileName(); - final String interval = "1s"; - options.setHistoLoggerConfigs(pattern, file, interval); - } - } - - for ( - final LoggerConfigData histoLogger : options.getHistoLoggerConfigs()) - ActivityMetrics.addHistoLogger(sessionName, histoLogger.pattern, histoLogger.file, histoLogger.interval); - for ( - final LoggerConfigData statsLogger : options.getStatsLoggerConfigs()) - ActivityMetrics.addStatsLogger(sessionName, statsLogger.pattern, statsLogger.file, statsLogger.interval); - for ( - final LoggerConfigData classicConfigs : options.getClassicHistoConfigs()) - ActivityMetrics.addClassicHistos(sessionName, classicConfigs.pattern, classicConfigs.file, classicConfigs.interval); - - if (options.getConsoleLogLevel().isGreaterOrEqualTo(NBLogLevel.WARN)) { - options.setWantsStackTraces(true); - NBCLI.logger.debug(() -> "enabling stack traces since log level is " + options.getConsoleLogLevel()); - } + // TODO: metrics +// if ((null != reportPromPushTo) || (null != reportGraphiteTo) || (null != options.wantsReportCsvTo())) { +// final MetricReporters reporters = MetricReporters.getInstance(); +// reporters.addRegistry("workloads", ActivityMetrics.getMetricRegistry()); +// +// if (null != reportPromPushTo) +// reporters.addPromPush(reportPromPushTo, options.wantsMetricsPrefix(), promPushConfig); +// if (null != reportGraphiteTo) reporters.addGraphite(reportGraphiteTo, options.wantsMetricsPrefix()); +// if (null != options.wantsReportCsvTo()) +// reporters.addCSVReporter(options.wantsReportCsvTo(), options.wantsMetricsPrefix()); +// if (options.wantsLoggedMetrics()) { +// reporters.addLogger(); +// } +// reporters.start(10, options.getReportInterval()); +// } +// +// for ( +// final LoggerConfigData histoLogger : options.getHistoLoggerConfigs()) +// ActivityMetrics.addHistoLogger(sessionName, histoLogger.pattern, histoLogger.file, histoLogger.interval); +// for ( +// final LoggerConfigData statsLogger : options.getStatsLoggerConfigs()) +// ActivityMetrics.addStatsLogger(sessionName, statsLogger.pattern, statsLogger.file, statsLogger.interval); +// for ( +// final LoggerConfigData classicConfigs : options.getClassicHistoConfigs()) +// ActivityMetrics.addClassicHistos(sessionName, classicConfigs.pattern, classicConfigs.file, classicConfigs.interval); +// +// if (options.getConsoleLogLevel().isGreaterOrEqualTo(NBLogLevel.WARN)) { +// options.setWantsStackTraces(true); +// NBCLI.logger.debug(() -> "enabling stack traces since log level is " + options.getConsoleLogLevel()); +// } // client machine metrics; TODO: modify pollInterval this.clientMetricChecker = new ClientSystemMetricChecker(10); diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ExecutionMetricsResult.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ExecutionMetricsResult.java index ddcd5e80d..677d0dac0 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ExecutionMetricsResult.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/ExecutionMetricsResult.java @@ -18,7 +18,6 @@ package io.nosqlbench.engine.core.lifecycle; import com.codahale.metrics.*; import com.codahale.metrics.ConsoleReporter.Builder; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.api.engine.metrics.reporters.Log4JMetricsReporter; import io.nosqlbench.api.engine.metrics.reporters.Log4JMetricsReporter.LoggingLevel; import io.nosqlbench.engine.core.metrics.NBMetricsSummary; @@ -57,17 +56,18 @@ public class ExecutionMetricsResult extends ExecutionResult { public String getMetricsSummary() { final ByteArrayOutputStream os = new ByteArrayOutputStream(); try (final PrintStream ps = new PrintStream(os)) { - final Builder builder = ConsoleReporter.forRegistry(ActivityMetrics.getMetricRegistry()) - .convertDurationsTo(TimeUnit.MICROSECONDS) - .convertRatesTo(TimeUnit.SECONDS) - .filter(MetricFilter.ALL) - .outputTo(ps); - final Set disabled = new HashSet<>(ExecutionMetricsResult.INTERVAL_ONLY_METRICS); - if (60000 > this.getElapsedMillis()) disabled.addAll(ExecutionMetricsResult.OVER_ONE_MINUTE_METRICS); - builder.disabledMetricAttributes(disabled); - final ConsoleReporter consoleReporter = builder.build(); - consoleReporter.report(); - consoleReporter.close(); + // TODO: metrics +// final Builder builder = ConsoleReporter.forRegistry(ActivityMetrics.getMetricRegistry()) +// .convertDurationsTo(TimeUnit.MICROSECONDS) +// .convertRatesTo(TimeUnit.SECONDS) +// .filter(MetricFilter.ALL) +// .outputTo(ps); +// final Set disabled = new HashSet<>(ExecutionMetricsResult.INTERVAL_ONLY_METRICS); +// if (60000 > this.getElapsedMillis()) disabled.addAll(ExecutionMetricsResult.OVER_ONE_MINUTE_METRICS); +// builder.disabledMetricAttributes(disabled); +// final ConsoleReporter consoleReporter = builder.build(); +// consoleReporter.report(); +// consoleReporter.close(); } final String result = os.toString(StandardCharsets.UTF_8); return result; @@ -88,31 +88,33 @@ public class ExecutionMetricsResult extends ExecutionResult { ExecutionResult.logger.debug("-- active data on this last report. (The workload has already stopped.) Record --"); ExecutionResult.logger.debug("-- metrics to an external format to see values for each reporting interval. --"); ExecutionResult.logger.debug("-- BEGIN METRICS DETAIL --"); - final Log4JMetricsReporter reporter = Log4JMetricsReporter.forRegistry(ActivityMetrics.getMetricRegistry()) - .withLoggingLevel(LoggingLevel.DEBUG) - .convertDurationsTo(TimeUnit.MICROSECONDS) - .convertRatesTo(TimeUnit.SECONDS) - .filter(MetricFilter.ALL) - .outputTo(ExecutionResult.logger) - .build(); - reporter.report(); - reporter.close(); + // TODO: metrics +// final Log4JMetricsReporter reporter = Log4JMetricsReporter.forRegistry(ActivityMetrics.getMetricRegistry()) +// .withLoggingLevel(LoggingLevel.DEBUG) +// .convertDurationsTo(TimeUnit.MICROSECONDS) +// .convertRatesTo(TimeUnit.SECONDS) +// .filter(MetricFilter.ALL) +// .outputTo(ExecutionResult.logger) +// .build(); +// reporter.report(); +// reporter.close(); ExecutionResult.logger.debug("-- END METRICS DETAIL --"); } public void reportMetricsCountsTo(final PrintStream printStream) { final StringBuilder sb = new StringBuilder(); - ActivityMetrics.getMetricRegistry().getMetrics().forEach((k, v) -> { - if (v instanceof Counting counting) { - final long count = counting.getCount(); - if (0 < count) NBMetricsSummary.summarize(sb, k, v); - } else if (v instanceof Gauge gauge) { - final Object value = gauge.getValue(); - if (value instanceof Number n) if (0 != n.doubleValue()) NBMetricsSummary.summarize(sb, k, v); - } - }); - + // TODO: metrics +// ActivityMetrics.getMetricRegistry().getMetrics().forEach((k, v) -> { +// if (v instanceof Counting counting) { +// final long count = counting.getCount(); +// if (0 < count) NBMetricsSummary.summarize(sb, k, v); +// } else if (v instanceof Gauge gauge) { +// final Object value = gauge.getValue(); +// if (value instanceof Number n) if (0 != n.doubleValue()) NBMetricsSummary.summarize(sb, k, v); +// } +// }); +// printStream.println("-- BEGIN NON-ZERO metric counts (run longer for full report):"); printStream.print(sb); printStream.println("-- END NON-ZERO metric counts:"); diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityExecutor.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityExecutor.java index 1841afa55..f84bbf117 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityExecutor.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/activity/ActivityExecutor.java @@ -16,8 +16,6 @@ package io.nosqlbench.engine.core.lifecycle.activity; import com.codahale.metrics.Gauge; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; -import io.nosqlbench.api.engine.metrics.instruments.NBFunctionGauge; import io.nosqlbench.api.engine.metrics.instruments.NBMetricGauge; import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.labels.NBLabels; @@ -467,12 +465,15 @@ public class ActivityExecutor implements NBLabeledElement, ActivityController, P } private void unregisterMetrics() { + // TODO: metrics +// ActivityMetrics.unregister(this.threadsGauge); if (this.threadsGauge != null) { - ActivityMetrics.unregister(this.threadsGauge); - this.threadsGauge = null; - } + ActivityMetrics.unregister(this.threadsGauge); + + this.threadsGauge = null; } + private boolean shutdownExecutorService(int secondsToWait) { activitylogger.debug(() -> "Shutting down motor executor for (" + activity.getAlias() + ")"); diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/context/ActivitiesController.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/context/ActivitiesController.java index ccbd049f2..917249e9f 100644 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/context/ActivitiesController.java +++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/context/ActivitiesController.java @@ -18,7 +18,6 @@ package io.nosqlbench.engine.core.lifecycle.scenario.context; import io.nosqlbench.api.config.standard.TestComponent; import io.nosqlbench.api.engine.activityimpl.ActivityDef; import io.nosqlbench.api.engine.activityimpl.ParameterMap; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBBaseComponent; import io.nosqlbench.components.NBComponent; import io.nosqlbench.components.NBComponentErrorHandler; @@ -425,7 +424,8 @@ public class ActivitiesController extends NBBaseComponent { } public void reportMetrics() { - ActivityMetrics.reportTo(System.out); + // TODO: metrics +// ActivityMetrics.reportTo(System.out); } public List getProgressMeters() { diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricReporters.java b/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricReporters.java deleted file mode 100644 index ad2c4bc5e..000000000 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricReporters.java +++ /dev/null @@ -1,211 +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.core.metrics; - -import com.codahale.metrics.*; -import com.codahale.metrics.graphite.Graphite; -import com.codahale.metrics.graphite.GraphiteReporter; -import io.nosqlbench.api.engine.metrics.reporters.PromPushReporter; -import io.nosqlbench.api.Shutdownable; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; -import io.nosqlbench.engine.core.lifecycle.process.ShutdownManager; -import io.nosqlbench.api.engine.metrics.reporters.Log4JMetricsReporter; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; - -import java.io.File; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.TimeUnit; - -public class MetricReporters implements Shutdownable { - private static final Logger logger = LogManager.getLogger(MetricReporters.class); - private static final MetricReporters instance = new MetricReporters(); - - private final List metricRegistries = new ArrayList<>(); - private final List scheduledReporters = new ArrayList<>(); - - private MetricReporters() { - ShutdownManager.register(this); - } - - public static MetricReporters getInstance() { - return instance; - } - - public MetricReporters addRegistry(String registryPrefix, MetricRegistry metricsRegistry) { - this.metricRegistries.add(new PrefixedRegistry(registryPrefix, metricsRegistry)); - return this; - } - - public MetricReporters addGraphite(String dest, String prefix) { - logger.debug(() -> "Adding graphite reporter to " + dest + " with prefix " + prefix); - if (0 <= dest.indexOf(':')) { - String[] split = dest.split(":"); - addGraphite(split[0],Integer.valueOf(split[1]),prefix); - } else { - addGraphite(dest, 2003, prefix); - } - return this; - } - - public void addCSVReporter(String directoryName, String prefix) { - logger.debug(() -> "Adding CSV reporter to " + directoryName + " with prefix " + prefix); - - if (metricRegistries.isEmpty()) { - throw new RuntimeException("There are no metric registries."); - } - - File csvDirectory = new File(directoryName); - if (!csvDirectory.exists()) { - if (!csvDirectory.mkdirs()) { - throw new RuntimeException("Error creating CSV reporting directory:" + csvDirectory.getAbsolutePath()); - } - } - - for (PrefixedRegistry prefixedRegistry : metricRegistries) { - CsvReporter csvReporter = CsvReporter.forRegistry(prefixedRegistry.metricRegistry) - .convertDurationsTo(TimeUnit.NANOSECONDS) - .convertRatesTo(TimeUnit.SECONDS) - .filter(ActivityMetrics.METRIC_FILTER) - .formatFor(Locale.US) - .build(csvDirectory); - - scheduledReporters.add(csvReporter); - } - } - - public MetricReporters addGraphite(String host, int graphitePort, String globalPrefix) { - - logger.debug(() -> "Adding graphite reporter to " + host + " with port " + graphitePort + " and prefix " + globalPrefix); - - if (metricRegistries.isEmpty()) { - throw new RuntimeException("There are no metric registries."); - } - - for (PrefixedRegistry prefixedRegistry : metricRegistries) { - - Graphite graphite = new Graphite(new InetSocketAddress(host, graphitePort)); - String _prefix = null != prefixedRegistry.prefix ? !prefixedRegistry.prefix.isEmpty() ? globalPrefix + '.' + prefixedRegistry.prefix : globalPrefix : globalPrefix; - GraphiteReporter graphiteReporter = GraphiteReporter.forRegistry(prefixedRegistry.metricRegistry) - .prefixedWith(_prefix) - .convertRatesTo(TimeUnit.SECONDS) - .convertDurationsTo(TimeUnit.NANOSECONDS) - .filter(ActivityMetrics.METRIC_FILTER) - .build(graphite); - - scheduledReporters.add(graphiteReporter); - } - return this; - } - - public MetricReporters addPromPush(final String reportPromPushTo, final String prefix, final String config) { - - logger.debug(() -> "Adding prompush reporter to " + reportPromPushTo + " with prefix label to " + prefix); - - if (metricRegistries.isEmpty()) { - throw new RuntimeException("There are no metric registries."); - } - - for (PrefixedRegistry prefixedRegistry : metricRegistries) { - final PromPushReporter promPushReporter = - new PromPushReporter( - reportPromPushTo, - prefixedRegistry.metricRegistry, - "prompush", - MetricFilter.ALL, - TimeUnit.SECONDS, - TimeUnit.NANOSECONDS, - config - ); - scheduledReporters.add(promPushReporter); - } - return this; - } - - - public MetricReporters addLogger() { - logger.debug("Adding log4j reporter for metrics"); - - if (metricRegistries.isEmpty()) { - throw new RuntimeException("There are no metric registries."); - } - - for (PrefixedRegistry prefixedRegistry : metricRegistries) { - - Log4JMetricsReporter reporter4j = Log4JMetricsReporter.forRegistry(prefixedRegistry.metricRegistry) - .convertRatesTo(TimeUnit.SECONDS) - .convertDurationsTo(TimeUnit.NANOSECONDS) - .filter(ActivityMetrics.METRIC_FILTER) - .outputTo(logger) - .build(); - - scheduledReporters.add(reporter4j); - } - return this; - } - - public MetricReporters start(int consoleIntervalSeconds, int remoteIntervalSeconds) { - for (ScheduledReporter scheduledReporter : scheduledReporters) { - logger.info(() -> "starting reporter: " + scheduledReporter.getClass().getSimpleName()); - if (scheduledReporter instanceof ConsoleReporter) { - scheduledReporter.start(consoleIntervalSeconds, TimeUnit.SECONDS); - } else { - scheduledReporter.start(remoteIntervalSeconds, TimeUnit.SECONDS); - } - } - return this; - } - - public MetricReporters stop() { - for (ScheduledReporter scheduledReporter : scheduledReporters) { - logger.info(() -> "stopping reporter: " + scheduledReporter); - scheduledReporter.stop(); - } - return this; - } - - - public MetricReporters report() { - for (ScheduledReporter scheduledReporter : scheduledReporters) { - logger.info(() -> "flushing reporter data: " + scheduledReporter); - scheduledReporter.report(); - } - return this; - } - - @Override - public void shutdown() { - for (ScheduledReporter reporter : scheduledReporters) { - reporter.report(); - reporter.stop(); - } - } - - - private class PrefixedRegistry { - public String prefix; - public MetricRegistry metricRegistry; - - public PrefixedRegistry(String prefix, MetricRegistry metricRegistry) { - this.prefix = prefix; - this.metricRegistry = metricRegistry; - } - } -} diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricsContext.java b/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricsContext.java deleted file mode 100644 index 60053a038..000000000 --- a/engine-core/src/main/java/io/nosqlbench/engine/core/metrics/MetricsContext.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2022 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.core.metrics; - -import com.codahale.metrics.MetricRegistry; -import io.nosqlbench.api.engine.activityapi.core.MetricRegistryService; -import io.nosqlbench.nb.annotations.Service; - -@Service(value = MetricRegistryService.class, selector = "metrics-context") -public class MetricsContext implements MetricRegistryService { - - private static MetricsContext instance; - - private final MetricReporters metricReporters = MetricReporters.getInstance(); - private final MetricRegistry metrics = new NBMetricsRegistry(); - - public static MetricsContext getInstance() { - synchronized (MetricsContext.class) { - if (instance == null) { - instance = new MetricsContext(); - } - } - return instance; - } - - public MetricReporters getReporters() { - return metricReporters; - } - - public MetricRegistry getMetrics() { - return metrics; - } - - /** - * Convenience method to unclutter code. This will be used everywhere. - * @return The default metric context. - */ - public static MetricRegistry metrics() { - return getInstance().getMetrics(); - } - - @Override - public MetricRegistry getMetricRegistry() { - return getMetrics(); - } -} 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 9a3374dbd..db87d99c4 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 @@ -17,7 +17,6 @@ package io.nosqlbench.engine.extensions.histologger; import com.codahale.metrics.MetricRegistry; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import org.apache.logging.log4j.Logger; import javax.script.ScriptContext; @@ -34,6 +33,7 @@ public class HdrHistoLogPlugin { } public void logHistoIntervals(String session, String pattern, String filename, String interval) { - ActivityMetrics.addHistoLogger(session, pattern, filename, interval); + // TODO: metrics +// ActivityMetrics.addHistoLogger(session, pattern, filename, interval); } } diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histostatslogger/HistoStatsPlugin.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histostatslogger/HistoStatsPlugin.java index c874d7a8b..610f2e403 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histostatslogger/HistoStatsPlugin.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/histostatslogger/HistoStatsPlugin.java @@ -17,7 +17,6 @@ package io.nosqlbench.engine.extensions.histostatslogger; import com.codahale.metrics.MetricRegistry; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import org.apache.logging.log4j.Logger; import javax.script.ScriptContext; @@ -35,6 +34,7 @@ public class HistoStatsPlugin { } public void logHistoStats(String sessionComment, String pattern, String filename , String interval) { - ActivityMetrics.addStatsLogger(sessionComment, pattern, filename, interval); + throw new RuntimeException("replace me after merge"); +// ActivityMetrics.addStatsLogger(sessionComment, pattern, filename, interval); } } diff --git a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetrics.java b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetrics.java index d0cb7e05d..6bea8e396 100644 --- a/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetrics.java +++ b/engine-extensions/src/main/java/io/nosqlbench/engine/extensions/scriptingmetrics/ScriptingMetrics.java @@ -19,7 +19,6 @@ package io.nosqlbench.engine.extensions.scriptingmetrics; import com.codahale.metrics.MetricRegistry; import io.nosqlbench.api.config.LabeledScenarioContext; import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.api.engine.metrics.DoubleSummaryGauge; import io.nosqlbench.api.engine.metrics.wrappers.RelevancyMeasures; import org.apache.logging.log4j.Logger; diff --git a/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/ActivityMetrics.java b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/ActivityMetrics.java deleted file mode 100644 index 0143ff66d..000000000 --- a/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/ActivityMetrics.java +++ /dev/null @@ -1,319 +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.api.engine.metrics; - -import com.codahale.metrics.*; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.api.labels.NBLabels; -import io.nosqlbench.components.NBComponent; -import io.nosqlbench.components.NBNamedElement; -import io.nosqlbench.api.labels.NBLabelsFilter; -import io.nosqlbench.api.engine.activityapi.core.MetricRegistryService; -import io.nosqlbench.api.engine.metrics.instruments.*; -import io.nosqlbench.api.engine.util.Unit; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.File; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.DoubleSummaryStatistics; -import java.util.List; -import java.util.ServiceLoader; -import java.util.concurrent.TimeUnit; -import java.util.prefs.BackingStoreException; -import java.util.regex.Pattern; - -public class ActivityMetrics { - - private static final Logger logger = LogManager.getLogger(ActivityMetrics.class); - - public static final String HDRDIGITS_PARAM = "hdr_digits"; - public static final int DEFAULT_HDRDIGITS = 4; - private static int _HDRDIGITS = DEFAULT_HDRDIGITS; - - private static MetricRegistry registry; - - public static MetricFilter METRIC_FILTER = (name, metric) -> { - return true; - }; - private static final List metricsCloseables = new ArrayList<>(); - private static NBLabelsFilter labelValidator; - private static NBLabelsFilter labelFilter; - - - public static int getHdrDigits() { - return _HDRDIGITS; - } - - public static void setHdrDigits(int hdrDigits) { - ActivityMetrics._HDRDIGITS = hdrDigits; - } - - /** - * Register a named metric for an activity, synchronized on the activity - * - * @param named - * The activity def that the metric will be for - * @param metricFamilyName - * The full metric name - * @param metricProvider - * A function to actually create the metric if needed - * @return a Metric, or null if the metric for the name was already present - */ - @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter") - private static Metric register(NBLabels labels, MetricProvider metricProvider) { - - labels = labelFilter != null ? labelFilter.apply(labels) : labels; - labels = labelValidator != null ? labelValidator.apply(labels) : labels; - - final String graphiteName = labels.linearizeValues('.', "[activity]", "[space]", "[op]", "name"); - Metric metric = get().getMetrics().get(graphiteName); - - if (null == metric) { - synchronized (labels) { - metric = get().getMetrics().get(graphiteName); - if (null == metric) { - metric = metricProvider.getMetric(); - Metric registered = get().register(graphiteName, metric); - logger.debug(() -> "registered metric: " + graphiteName); - return registered; - } - } - } - return metric; - } - - /** - * Calls to this version of register must be done with a pre-built metric instrument. - * This means that it is not suitable for lazily creating metric objects directly on - * instances which are one of many. Instead, call this to register metrics at the start - * of an owning element. - * - * This version of register expects that you have fully labeled a metric, including - * addint the 'name' field, also known as the metric family name in some specifications. - * - * It is due to be replaced by a different registry format soon. - * - * @param labeledMetric - * @return the metric instance - */ - public static M register(M labeledMetric) { - NBLabels labels = labeledMetric.getLabels(); - labels = labelFilter != null ? labelFilter.apply(labels) : labels; - labels = labelValidator != null ? labelValidator.apply(labels) : labels; - - final String graphiteName = labels.linearizeValues('.', "[activity]", "[space]", "[op]", "name"); -// String sanitized = sanitize(graphiteName); -// if (!graphiteName.equals(sanitized)) { -// throw new RuntimeException("Attempted to register a metric which was not compatible with labeled metric forms. Submitted as '" + graphiteName + "', but should likely be '" + sanitized + "'"); -// } - Metric metric = get().getMetrics().get(graphiteName); - - metric = get().getMetrics().get(graphiteName); - if (metric!=null) { - logger.warn("Metric already registered for '" + graphiteName + "', probably logic error which could invalidate metric values."); - } else { - get().register(graphiteName, labeledMetric); - } - return labeledMetric; - } - - public static void unregister(NBLabeledElement element) { - final String graphiteName = element.getLabels().linearizeValues('.', "[activity]", "[space]", "[op]", "name"); - if (!get().getMetrics().containsKey(graphiteName)) { - logger.warn("Removing non-extant metric by name: '"+ graphiteName + "'"); - } - get().remove(graphiteName); - } - - - private static MetricRegistry get() { - if (null != ActivityMetrics.registry) { - return registry; - } - synchronized (ActivityMetrics.class) { - if (null == ActivityMetrics.registry) { - registry = lookupRegistry(); - } - } - return registry; - } - - - private static MetricRegistry lookupRegistry() { - ServiceLoader metricRegistryServices = - ServiceLoader.load(MetricRegistryService.class); - List mrss = new ArrayList<>(); - metricRegistryServices.iterator().forEachRemaining(mrss::add); - - if (1 == mrss.size()) { - return mrss.get(0).getMetricRegistry(); - } - final String infoMsg = "Unable to load a dynamic MetricRegistry via ServiceLoader, using the default."; - logger.info(infoMsg); - return new MetricRegistry(); - - } - - - public static MetricRegistry getMetricRegistry() { - return get(); - } - - /** - * Add a histogram interval logger to matching metrics in this JVM instance. - * - * @param sessionName - * The name for the session to be annotated in the histogram log - * @param pattern - * A regular expression pattern to filter out metric names for logging - * @param filename - * A file to log the histogram data in - * @param interval - * How many seconds to wait between writing each interval histogram - */ - public static void addHistoLogger(String sessionName, String pattern, String filename, String interval) { - if (filename.contains("_SESSION_")) { - filename = filename.replace("_SESSION_", sessionName); - } - Pattern compiledPattern = Pattern.compile(pattern); - File logfile = new File(filename); - long intervalMillis = Unit.msFor(interval).orElseThrow(() -> new RuntimeException("Unable to parse interval spec:'" + interval + '\'')); - - HistoIntervalLogger histoIntervalLogger = - new HistoIntervalLogger(sessionName, logfile, compiledPattern, intervalMillis); - logger.debug(() -> "attaching " + histoIntervalLogger + " to the metrics registry."); - get().addListener(histoIntervalLogger); - metricsCloseables.add(histoIntervalLogger); - } - - /** - * Add a histogram stats logger to matching metrics in this JVM instance. - * - * @param sessionName - * The name for the session to be annotated in the histogram log - * @param pattern - * A regular expression pattern to filter out metric names for logging - * @param filename - * A file to log the histogram data in - * @param interval - * How many seconds to wait between writing each interval histogram - */ - public static void addStatsLogger(String sessionName, String pattern, String filename, String interval) { - if (filename.contains("_SESSION_")) { - filename = filename.replace("_SESSION_", sessionName); - } - Pattern compiledPattern = Pattern.compile(pattern); - File logfile = new File(filename); - long intervalMillis = Unit.msFor(interval).orElseThrow(() -> new RuntimeException("Unable to parse interval spec:" + interval + '\'')); - - HistoStatsLogger histoStatsLogger = - new HistoStatsLogger(sessionName, logfile, compiledPattern, intervalMillis, TimeUnit.NANOSECONDS); - logger.debug(() -> "attaching " + histoStatsLogger + " to the metrics registry."); - get().addListener(histoStatsLogger); - metricsCloseables.add(histoStatsLogger); - } - - /** - * Add a classic histogram in addition to the default implementation in this runtime. This is a way to - * get a view to both the enhanced histogram implementation as well as the classic implementation in the - * same scenario. - * - * @param sessionName - * The name of the session to be annotated in the classic histogram - * @param pattern - * A regular expression pattern to filter out metric names for inclusion - * @param prefix - * The name prefix to add to the classic histograms so that they fit into the existing metrics namespace - * @param interval - * How frequently to update the histogram - */ - public static void addClassicHistos(String sessionName, String pattern, String prefix, String interval) { - Pattern compiledPattern = Pattern.compile(pattern); - long intervalMillis = Unit.msFor(interval).orElseThrow(() -> new RuntimeException("Unable to parse interval spec:" + interval + '\'')); - - ClassicHistoListener classicHistoListener = - new ClassicHistoListener(get(), sessionName, prefix, compiledPattern, interval, TimeUnit.NANOSECONDS); - logger.debug(() -> "attaching histo listener " + classicHistoListener + " to the metrics registry."); - get().addListener(classicHistoListener); - - ClassicTimerListener classicTimerListener = - new ClassicTimerListener(get(), sessionName, prefix, compiledPattern, interval, TimeUnit.NANOSECONDS); - logger.debug(() -> "attaching timer listener " + classicTimerListener + " to the metrics registry."); - get().addListener(classicTimerListener); - } - - /** - * This should be called at the end of a process, so that open intervals can be finished, logs closed properly, - * etc. - * - * @param showChart - * whether to chart metrics on console - */ - public static void closeMetrics() { - logger.trace("Closing all registered metrics closable objects."); - for (MetricsCloseable metricsCloseable : metricsCloseables) { - logger.trace(() -> "closing metrics closeable: " + metricsCloseable); - metricsCloseable.closeMetrics(); - } - } - - public static void setLabelValidator(String annotateLabelSpec) { - labelValidator = new NBLabelsFilter(annotateLabelSpec); - labelFilter = new NBLabelsFilter(annotateLabelSpec); - } - - private interface MetricProvider { - Metric getMetric(); - } - - public static void reportTo(PrintStream out) { - out.println("==================== BEGIN-METRIC-LOG ===================="); - ConsoleReporter consoleReporter = ConsoleReporter.forRegistry(ActivityMetrics.getMetricRegistry()) - .convertDurationsTo(TimeUnit.MICROSECONDS) - .convertRatesTo(TimeUnit.SECONDS) - .filter(MetricFilter.ALL) - .outputTo(out) - .build(); - consoleReporter.report(); - out.println("==================== END-METRIC-LOG ===================="); - } - - public static void mountSubRegistry(String mountPrefix, MetricRegistry subRegistry) { - new MetricsRegistryMount(getMetricRegistry(), subRegistry, mountPrefix); - } - - public static void removeActivityMetrics(NBNamedElement named) { - get().getMetrics().keySet().stream().filter(s -> s.startsWith(named.getName() + '.')) - .forEach(get()::remove); - } - - - public static String sanitize(String word) { - String sanitized = word; - sanitized = sanitized.replaceAll("\\.", "__"); - sanitized = sanitized.replaceAll("-", "_"); - sanitized = sanitized.replaceAll("[^a-zA-Z0-9_]+", ""); - - if (!word.equals(sanitized)) { - logger.warn("The identifier or value '" + word + "' was sanitized to '" + sanitized + "' to be compatible with monitoring systems. You should probably change this to make diagnostics easier."); - } - return sanitized; - } - -} diff --git a/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/wrappers/RelevancyMeasures.java b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/wrappers/RelevancyMeasures.java index bffde31ee..97db60706 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/wrappers/RelevancyMeasures.java +++ b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/wrappers/RelevancyMeasures.java @@ -18,7 +18,6 @@ package io.nosqlbench.api.engine.metrics.wrappers; import io.nosqlbench.api.labels.NBLabeledElement; import io.nosqlbench.api.labels.NBLabels; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.api.engine.metrics.DoubleSummaryGauge; import java.util.ArrayList; diff --git a/nb-api/src/main/java/io/nosqlbench/api/labels/MapLabels.java b/nb-api/src/main/java/io/nosqlbench/api/labels/MapLabels.java index 37b2d8cde..715a45d14 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/labels/MapLabels.java +++ b/nb-api/src/main/java/io/nosqlbench/api/labels/MapLabels.java @@ -16,6 +16,8 @@ package io.nosqlbench.api.labels; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -23,9 +25,11 @@ import java.util.function.Function; import java.util.regex.Pattern; public class MapLabels implements NBLabels { + + private final static Logger logger = LogManager.getLogger(MapLabels.class); private final Map labels; - public MapLabels(final Map labels, String... instanceFields) { + public MapLabels(final Map labels) { verifyValidNamesAndValues(labels); // verifyValidValues(labels); this.labels = Collections.unmodifiableMap(labels); @@ -137,6 +141,19 @@ public class MapLabels implements NBLabels { } + public static String sanitize(String word) { + String sanitized = word; + sanitized = sanitized.replaceAll("\\.", "__"); + sanitized = sanitized.replaceAll("-", "_"); + sanitized = sanitized.replaceAll("[^a-zA-Z0-9_]+", ""); + + if (!word.equals(sanitized)) { + logger.warn("The identifier or value '" + word + "' was sanitized to '" + sanitized + "' to be compatible with monitoring systems. You should probably change this to make diagnostics easier."); + } + return sanitized; + } + + @Override public MapLabels and(final Object... labelsAndValues) { final Map childLabels = getStringStringMap(labelsAndValues); diff --git a/nb-api/src/main/java/io/nosqlbench/api/labels/NBLabels.java b/nb-api/src/main/java/io/nosqlbench/api/labels/NBLabels.java index cf318e6a2..0ab7a4328 100644 --- a/nb-api/src/main/java/io/nosqlbench/api/labels/NBLabels.java +++ b/nb-api/src/main/java/io/nosqlbench/api/labels/NBLabels.java @@ -176,4 +176,5 @@ public interface NBLabels { * @return a String */ String linearizeAsMetrics(); + } 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 3026670e8..30cb570a4 100644 --- a/nb-api/src/main/java/io/nosqlbench/components/NBBuilders.java +++ b/nb-api/src/main/java/io/nosqlbench/components/NBBuilders.java @@ -40,6 +40,9 @@ public class NBBuilders { this.base = base; } + public NBMetricTimer timer(String metricFamilyName) { + return timer(metricFamilyName,4); + } public NBMetricTimer timer(String metricFamilyName, int hdrdigits) { NBLabels labels = base.getLabels().and("name", metricFamilyName); NBMetricTimer timer = new NBMetricTimer(labels, new DeltaHdrHistogramReservoir(labels, hdrdigits)); @@ -81,6 +84,9 @@ public class NBBuilders { return anyGauge; } + public NBMetricHistogram histogram(String metricFamilyName) { + return histogram(metricFamilyName,4); + } public NBMetricHistogram histogram(String metricFamilyName, int hdrdigits) { NBLabels labels = base.getLabels().and("name", metricFamilyName); NBMetricHistogram histogram = new NBMetricHistogram(labels, new DeltaHdrHistogramReservoir(labels, hdrdigits)); diff --git a/nbr/src/test/java/io/nosqlbench/engine/core/script/MetricsIntegrationTest.java b/nbr/src/test/java/io/nosqlbench/engine/core/script/MetricsIntegrationTest.java index 72584c05b..dddaeba0e 100644 --- a/nbr/src/test/java/io/nosqlbench/engine/core/script/MetricsIntegrationTest.java +++ b/nbr/src/test/java/io/nosqlbench/engine/core/script/MetricsIntegrationTest.java @@ -18,8 +18,6 @@ package io.nosqlbench.engine.core.script; import com.codahale.metrics.Histogram; import io.nosqlbench.api.config.standard.TestComponent; -import io.nosqlbench.api.labels.NBLabeledElement; -import io.nosqlbench.api.engine.metrics.ActivityMetrics; import io.nosqlbench.components.NBComponent; import org.junit.jupiter.api.Test; @@ -33,7 +31,8 @@ public class MetricsIntegrationTest { public void testHistogramLogger() { NBComponent parent = new TestComponent("metricstest","metricstest","alias","foo","driver","diag","op","noop"); final Histogram testhistogram = parent.create().histogram("testhistogram", 3); - ActivityMetrics.addHistoLogger("testsession", ".*","testhisto.log","1s"); + // TODO: metrics +// ActivityMetrics.addHistoLogger("testsession", ".*","testhisto.log","1s"); testhistogram.update(400); testhistogram.getSnapshot(); final File logfile = new File("testhisto.log");