*/
@Service(value = RateLimiter.class, selector = "hybrid")
-public class HybridRateLimiter implements RateLimiter {
+public class HybridRateLimiter extends NBBaseComponent implements RateLimiter {
private static final Logger logger = LogManager.getLogger(HybridRateLimiter.class);
private NBLabeledElement named;
@@ -100,13 +102,14 @@ public class HybridRateLimiter implements RateLimiter {
// TODO Doc rate limiter scenarios, including when you want to reset the waittime, and when you don't
private final AtomicLong cumulativeWaitTimeNanos = new AtomicLong(0L);
- protected HybridRateLimiter() {
+ protected HybridRateLimiter(NBComponent parent) {
+ super(parent);
}
- public HybridRateLimiter(final NBLabeledElement named, final String label, final RateSpec rateSpec) {
+ public HybridRateLimiter(final NBComponent parent, final String label, final RateSpec rateSpec) {
+ super(parent);
this.label = label;
this.init(named);
- this.named = named;
applyRateSpec(rateSpec);
}
@@ -142,7 +145,7 @@ public class HybridRateLimiter implements RateLimiter {
if (updatingRateSpec.equals(rateSpec) && !updatingRateSpec.isRestart()) return;
rateSpec = updatingRateSpec;
- tokens = null == this.tokens ? new ThreadDrivenTokenPool(this.rateSpec, this.named) : tokens.apply(this.named, this.rateSpec);
+ tokens = null == this.tokens ? new ThreadDrivenTokenPool(this,this.rateSpec, this.named) : tokens.apply(this.named, this.rateSpec);
// this.filler = (this.filler == null) ? new TokenFiller(rateSpec, activityDef) : filler.apply(rateSpec);
// this.tokens = this.filler.getTokenPool();
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 02dc96f7a..57341c68f 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
@@ -17,8 +17,8 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
import com.codahale.metrics.Timer;
+import io.nosqlbench.components.NBComponent;
import io.nosqlbench.engine.api.util.Colors;
-import io.nosqlbench.api.labels.NBLabeledElement;
import io.nosqlbench.api.engine.activityimpl.ActivityDef;
import io.nosqlbench.api.engine.metrics.ActivityMetrics;
import org.apache.logging.log4j.LogManager;
@@ -58,7 +58,7 @@ public class InlineTokenPool {
private static final Logger logger = LogManager.getLogger(InlineTokenPool.class);
public static final double MIN_CONCURRENT_OPS = 5;
- private final NBLabeledElement parentLabels;
+ private final NBComponent parent;
// Size limit of active pool
private long maxActivePoolSize;
@@ -104,22 +104,22 @@ public class InlineTokenPool {
*
* @param rateSpec a {@link RateSpec}
*/
- public InlineTokenPool(final RateSpec rateSpec, final ActivityDef def, final NBLabeledElement parentLabels) {
- this.parentLabels = parentLabels;
+ public InlineTokenPool(final RateSpec rateSpec, final ActivityDef def, final NBComponent parent) {
+ this.parent = parent;
final ByteBuffer logbuf = this.getBuffer();
this.apply(rateSpec);
InlineTokenPool.logger.debug("initialized token pool: {} for rate:{}", this, rateSpec);
- refillTimer = ActivityMetrics.timer(parentLabels, "tokenfiller",4);
+ refillTimer = parent.create().timer("tokenfiller",4);
}
- public InlineTokenPool(final long poolsize, final double burstRatio, final ActivityDef def, final NBLabeledElement parentLabels) {
- this.parentLabels = parentLabels;
+ public InlineTokenPool(final long poolsize, final double burstRatio, final ActivityDef def, final NBComponent parent) {
+ this.parent = parent;
final ByteBuffer logbuf = this.getBuffer();
maxActivePoolSize = poolsize;
this.burstRatio = burstRatio;
maxActiveAndBurstSize = (long) (this.maxActivePoolSize * burstRatio);
maxBurstPoolSize = this.maxActiveAndBurstSize - this.maxActivePoolSize;
- refillTimer = ActivityMetrics.timer(parentLabels, "tokenfiller",4);
+ refillTimer = parent.create().timer( "tokenfiller",4);
}
/**
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/RateLimiters.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/RateLimiters.java
index 1fb1df2d3..3912cb521 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/RateLimiters.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/RateLimiters.java
@@ -18,6 +18,7 @@ package io.nosqlbench.engine.api.activityapi.ratelimits;
import com.codahale.metrics.Gauge;
import io.nosqlbench.api.labels.NBLabeledElement;
+import io.nosqlbench.components.NBComponent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -25,10 +26,10 @@ public enum RateLimiters {
;
private static final Logger logger = LogManager.getLogger(RateLimiters.class);
- public static synchronized RateLimiter createOrUpdate(final NBLabeledElement def, final String label, final RateLimiter extant, final RateSpec spec) {
+ public static synchronized RateLimiter createOrUpdate(final NBComponent parent, final String label, final RateLimiter extant, final RateSpec spec) {
if (null == extant) {
- final RateLimiter rateLimiter= new HybridRateLimiter(def, label, spec);
+ final RateLimiter rateLimiter= new HybridRateLimiter(parent, label, spec);
RateLimiters.logger.info(() -> "Using rate limiter: " + rateLimiter);
return rateLimiter;
@@ -38,7 +39,7 @@ public enum RateLimiters {
return extant;
}
- public static synchronized RateLimiter create(final NBLabeledElement def, final String label, final String specString) {
+ public static synchronized RateLimiter create(final NBComponent def, final String label, final String specString) {
return RateLimiters.createOrUpdate(def, label, null, new RateSpec(specString));
}
diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/ThreadDrivenTokenPool.java b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/ThreadDrivenTokenPool.java
index 701d0d64d..d07246e92 100644
--- a/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/ThreadDrivenTokenPool.java
+++ b/engine-api/src/main/java/io/nosqlbench/engine/api/activityapi/ratelimits/ThreadDrivenTokenPool.java
@@ -17,6 +17,7 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
import io.nosqlbench.api.labels.NBLabeledElement;
+import io.nosqlbench.components.NBComponent;
import io.nosqlbench.nb.annotations.Service;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -49,6 +50,7 @@ public class ThreadDrivenTokenPool implements TokenPool {
private static final Logger logger = LogManager.getLogger(ThreadDrivenTokenPool.class);
public static final double MIN_CONCURRENT_OPS = 2;
+ private final NBComponent parent;
private long maxActivePool;
private long burstPoolSize;
@@ -70,7 +72,8 @@ public class ThreadDrivenTokenPool implements TokenPool {
*
* @param rateSpec a {@link RateSpec}
*/
- public ThreadDrivenTokenPool(final RateSpec rateSpec, final NBLabeledElement named) {
+ public ThreadDrivenTokenPool(NBComponent parent, final RateSpec rateSpec, final NBLabeledElement named) {
+ this.parent = parent;
this.apply(named,rateSpec);
ThreadDrivenTokenPool.logger.debug(() -> "initialized token pool: " + this + " for rate:" + rateSpec);
// filler.start();
@@ -91,7 +94,7 @@ public class ThreadDrivenTokenPool implements TokenPool {
burstPoolSize = this.maxOverActivePool - this.maxActivePool;
nanosPerOp = rateSpec.getNanosPerOp();
- filler = null == this.filler ? new TokenFiller(rateSpec, this, labeled, 3) : this.filler.apply(rateSpec);
+ filler = null == this.filler ? new TokenFiller(parent, rateSpec, this, labeled, 3) : this.filler.apply(rateSpec);
this.notifyAll();
return this;
}
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 4141cedee..f094b0d4f 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
@@ -19,6 +19,7 @@ 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;
@@ -47,10 +48,10 @@ public class TokenFiller implements Runnable {
* in the JVM.
*
*/
- public TokenFiller(final RateSpec rateSpec, final ThreadDrivenTokenPool tokenPool, final NBLabeledElement labeled, final int hdrdigits) {
+ public TokenFiller(NBComponent parent, final RateSpec rateSpec, final ThreadDrivenTokenPool tokenPool, final NBLabeledElement labeled, final int hdrdigits) {
this.rateSpec = rateSpec;
this.tokenPool = tokenPool;
- timer = ActivityMetrics.timer(labeled, "tokenfiller", hdrdigits);
+ timer = parent.create().timer("tokenfiller",3);
}
public TokenFiller apply(final RateSpec rateSpec) {
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 2dfcaca0f..20a344a46 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
@@ -275,10 +275,6 @@ public class SimpleActivity extends NBBaseComponent implements Activity {
return strideLimiter;
}
- @Override
- public Timer getResultTimer() {
- return ActivityMetrics.timer(this, "result", getParams().getOptionalInteger("hdr_digits").orElse(4));
- }
@Override
public synchronized ActivityInstrumentation getInstrumentation() {
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 7f64a4033..3672a35cf 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
@@ -20,6 +20,7 @@ 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;
import java.util.List;
@@ -33,25 +34,20 @@ public class ExceptionTimerMetrics {
private final ConcurrentHashMap timers = new ConcurrentHashMap<>();
private final Timer allerrors;
private final ActivityDef activityDef;
- private final NBLabeledElement parentLabels;
+ private final NBComponent parentLabels;
- public ExceptionTimerMetrics(final NBLabeledElement parentLabels, final ActivityDef activityDef) {
+ public ExceptionTimerMetrics(final NBComponent parent, final ActivityDef activityDef) {
this.activityDef = activityDef;
- this.parentLabels = parentLabels;
+ this.parentLabels = parent;
- this.allerrors = ActivityMetrics.timer(
- parentLabels,
- "errortimers_ALL",
- activityDef.getParams().getOptionalInteger("hdr_digits").orElse(4)
- );
+ this.allerrors=parent.create().timer("errortimers_ALL",4);
}
public void update(final String name, final long nanosDuration) {
Timer timer = this.timers.get(name);
if (null == timer) synchronized (this.timers) {
timer = this.timers.computeIfAbsent(
- name,
- k -> ActivityMetrics.timer(this.parentLabels, "errortimers_" + name, this.activityDef.getParams().getOptionalInteger("hdr_digits").orElse(4))
+ name, k -> parentLabels.create().timer("errortimers_" + name, 3)
);
}
timer.update(nanosDuration, TimeUnit.NANOSECONDS);
diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/errorhandling/modular/NBErrorHandlerTest.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/errorhandling/modular/NBErrorHandlerTest.java
index ab40b8fcf..711a433a9 100644
--- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/errorhandling/modular/NBErrorHandlerTest.java
+++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/errorhandling/modular/NBErrorHandlerTest.java
@@ -20,7 +20,9 @@ import com.codahale.metrics.Counter;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import com.codahale.metrics.Timer;
+import io.nosqlbench.api.config.standard.TestComponent;
import io.nosqlbench.api.errors.ResultMismatchError;
+import io.nosqlbench.components.NBComponent;
import io.nosqlbench.engine.api.activityapi.errorhandling.ErrorMetrics;
import io.nosqlbench.engine.api.activityapi.errorhandling.modular.handlers.CountErrorHandler;
import io.nosqlbench.engine.api.activityapi.errorhandling.modular.handlers.CounterErrorHandler;
@@ -47,10 +49,9 @@ class NBErrorHandlerTest {
private static final String ERROR_HANDLER_APPENDER_NAME = "ErrorHandler";
private final RuntimeException runtimeException = new RuntimeException("test exception");
-
@Test
void testNullConfig() {
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_stop"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_stop"));
final NBErrorHandler errhandler = new NBErrorHandler(() -> "stop", () -> errorMetrics);
assertThatExceptionOfType(RuntimeException.class)
.isThrownBy(() -> errhandler.handleError(this.runtimeException, 1, 2));
@@ -58,7 +59,7 @@ class NBErrorHandlerTest {
@Test
void testMultipleWithRetry() {
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_wr"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_wr"));
final NBErrorHandler eh = new NBErrorHandler(() -> "warn,retry", () -> errorMetrics);
final ErrorDetail detail = eh.handleError(this.runtimeException, 1, 2);
assertThat(detail.isRetryable()).isTrue();
@@ -69,7 +70,7 @@ class NBErrorHandlerTest {
final Logger logger = (Logger) LogManager.getLogger("ERRORS");
final LogAppender appender = NBMock.registerTestLogger(NBErrorHandlerTest.ERROR_HANDLER_APPENDER_NAME, logger, Level.WARN);
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_warn"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_warn"));
final NBErrorHandler eh = new NBErrorHandler(() -> "warn", () -> errorMetrics);
final ErrorDetail detail = eh.handleError(this.runtimeException, 1, 2);
@@ -84,7 +85,7 @@ class NBErrorHandlerTest {
@Test
void testHistogramErrorHandler() {
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_histos"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_histos"));
final NBErrorHandler eh = new NBErrorHandler(() -> "histogram", () -> errorMetrics);
final ErrorDetail detail = eh.handleError(this.runtimeException, 1, 2);
assertThat(detail.isRetryable()).isFalse();
@@ -94,7 +95,7 @@ class NBErrorHandlerTest {
@Test
void testTimerErrorHandler() {
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_timers"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_timers"));
final NBErrorHandler eh = new NBErrorHandler(() -> "timer", () -> errorMetrics);
final ErrorDetail detail = eh.handleError(this.runtimeException, 1, 2);
assertThat(detail.isRetryable()).isFalse();
@@ -107,7 +108,7 @@ class NBErrorHandlerTest {
final Logger logger = (Logger) LogManager.getLogger(CounterErrorHandler.class);
final LogAppender appender = NBMock.registerTestLogger(NBErrorHandlerTest.ERROR_HANDLER_APPENDER_NAME, logger, Level.INFO);
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_counters"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_counters"));
final NBErrorHandler eh = new NBErrorHandler(() -> "counter", () -> errorMetrics);
final ErrorDetail detail = eh.handleError(this.runtimeException, 1, 2);
assertThat(detail.isRetryable()).isFalse();
@@ -126,7 +127,7 @@ class NBErrorHandlerTest {
final Logger logger = (Logger) LogManager.getLogger(CountErrorHandler.class);
final LogAppender appender = NBMock.registerTestLogger(NBErrorHandlerTest.ERROR_HANDLER_APPENDER_NAME, logger, Level.WARN);
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_count"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_count"));
final NBErrorHandler eh = new NBErrorHandler(() -> "count", () -> errorMetrics);
final ErrorDetail detail = eh.handleError(this.runtimeException, 1, 2);
assertThat(detail.isRetryable()).isFalse();
@@ -143,7 +144,7 @@ class NBErrorHandlerTest {
@Test
void testMeterErrorHandler() {
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_meters"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_meters"));
final NBErrorHandler eh = new NBErrorHandler(() -> "meter", () -> errorMetrics);
final ErrorDetail detail = eh.handleError(this.runtimeException, 1, 2);
assertThat(detail.isRetryable()).isFalse();
@@ -153,7 +154,7 @@ class NBErrorHandlerTest {
@Test
void testCodeShorthand() {
- final ErrorMetrics errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_meters"));
+ final ErrorMetrics errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_meters"));
final NBErrorHandler eh = new NBErrorHandler(() -> "handler=code code=42", () -> errorMetrics);
final ErrorDetail detail = eh.handleError(this.runtimeException, 1, 2);
assertThat(detail.isRetryable()).isFalse();
@@ -184,7 +185,7 @@ class NBErrorHandlerTest {
void testExpectedResultVerificationErrorHandler(String name, Exception error, String log, long retriesCount, long errorsCount, Logger logger) {
// given
NBMock.LogAppender appender = NBMock.registerTestLogger(ERROR_HANDLER_APPENDER_NAME, logger, Level.INFO);
- var errorMetrics = new ErrorMetrics(NBLabeledElement.forKV("activity","testalias_result_verification_" + name));
+ var errorMetrics = new ErrorMetrics(new TestComponent("activity","testalias_result_verification_" + name));
var eh = new NBErrorHandler(() -> "verifyexpected", () -> errorMetrics);
var retries = errorMetrics.getExceptionExpectedResultVerificationMetrics().getVerificationRetries();
var errors = errorMetrics.getExceptionExpectedResultVerificationMetrics().getVerificationErrors();
diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestHybridRateLimiterPerf.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestHybridRateLimiterPerf.java
index 00a5469df..8c0ba0b69 100644
--- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestHybridRateLimiterPerf.java
+++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestHybridRateLimiterPerf.java
@@ -19,6 +19,7 @@ package io.nosqlbench.engine.api.activityapi.ratelimits;
import io.nosqlbench.api.labels.NBLabeledElement;
import io.nosqlbench.api.testutils.Perf;
import io.nosqlbench.api.testutils.Result;
+import io.nosqlbench.components.NBBaseComponent;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@@ -27,7 +28,7 @@ import java.util.function.Function;
public class TestHybridRateLimiterPerf {
- private final Function rlFunction = rs -> new HybridRateLimiter(NBLabeledElement.EMPTY,"hybrid", rs.withVerb(RateSpec.Verb.start));
+ private final Function rlFunction = rs -> new HybridRateLimiter(NBBaseComponent.EMPTY_COMPONENT,"hybrid", rs.withVerb(RateSpec.Verb.start));
private final RateLimiterPerfTestMethods methods = new RateLimiterPerfTestMethods();
@Test
diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E7.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E7.java
index 59004d832..71054ae8c 100644
--- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E7.java
+++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E7.java
@@ -16,6 +16,7 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
+import io.nosqlbench.api.config.standard.TestComponent;
import io.nosqlbench.api.labels.NBLabeledElement;
import io.nosqlbench.api.testutils.Perf;
import org.junit.jupiter.api.Disabled;
@@ -32,7 +33,7 @@ import java.util.function.Function;
*/
public class TestRateLimiterPerf1E7 {
- private final Function rlFunction = rs -> new HybridRateLimiter(NBLabeledElement.forKV("alias","tokenrl"),"hybrid", rs.withVerb(RateSpec.Verb.configure));
+ private final Function rlFunction = rs -> new HybridRateLimiter(new TestComponent("alias","tokenrl"),"hybrid", rs.withVerb(RateSpec.Verb.configure));
private final RateLimiterPerfTestMethods methods = new RateLimiterPerfTestMethods();
// 160 threads at 10_000_000 ops/s
diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E8.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E8.java
index 2ce9de5d5..02fdee364 100644
--- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E8.java
+++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerf1E8.java
@@ -16,6 +16,7 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
+import io.nosqlbench.api.config.standard.TestComponent;
import io.nosqlbench.api.labels.NBLabeledElement;
import io.nosqlbench.api.testutils.Perf;
import org.junit.jupiter.api.Disabled;
@@ -36,7 +37,7 @@ public class TestRateLimiterPerf1E8 {
private final Function rlFunction =
rs -> new HybridRateLimiter(
- this.def,
+ new TestComponent("test","rltest"),
"hybrid",
rs.withVerb(RateSpec.Verb.configure)
);
diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerfSingle.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerfSingle.java
index fd803d178..0c6dc4fa1 100644
--- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerfSingle.java
+++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestRateLimiterPerfSingle.java
@@ -16,6 +16,7 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
+import io.nosqlbench.api.config.standard.TestComponent;
import io.nosqlbench.api.labels.NBLabeledElement;
import io.nosqlbench.api.testutils.Result;
import org.junit.jupiter.api.Disabled;
@@ -32,7 +33,7 @@ import java.util.function.Function;
*/
public class TestRateLimiterPerfSingle {
- private final Function rlFunction = rs -> new HybridRateLimiter(NBLabeledElement.forKV("alias","tokenrl"),"hybrid", rs.withVerb(RateSpec.Verb.start));
+ private final Function rlFunction = rs -> new HybridRateLimiter(new TestComponent("alias","tokenrl"),"hybrid", rs.withVerb(RateSpec.Verb.start));
private final RateLimiterPerfTestMethods methods = new RateLimiterPerfTestMethods();
@Test
diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestableHybridRateLimiter.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestableHybridRateLimiter.java
index 6b909e67c..2310cd898 100644
--- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestableHybridRateLimiter.java
+++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TestableHybridRateLimiter.java
@@ -16,16 +16,19 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
+import io.nosqlbench.api.config.standard.TestComponent;
import io.nosqlbench.api.labels.NBLabeledElement;
+import io.nosqlbench.components.NBComponent;
import java.util.concurrent.atomic.AtomicLong;
public class TestableHybridRateLimiter extends HybridRateLimiter {
private final AtomicLong clock;
+ private final static NBComponent parent = new TestComponent("rlparent","rlparent");
public TestableHybridRateLimiter(final AtomicLong clock, final RateSpec rateSpec, final NBLabeledElement def) {
- super(def, "test", rateSpec);
+ super(parent, "test", rateSpec);
this.applyRateSpec(rateSpec);
this.setLabel("test");
this.clock = clock;
diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenPoolTest.java b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenPoolTest.java
index c13ef72b3..7e66df690 100644
--- a/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenPoolTest.java
+++ b/engine-api/src/test/java/io/nosqlbench/engine/api/activityapi/ratelimits/TokenPoolTest.java
@@ -16,6 +16,7 @@
package io.nosqlbench.engine.api.activityapi.ratelimits;
+import io.nosqlbench.api.config.standard.TestComponent;
import io.nosqlbench.api.labels.NBLabeledElement;
import io.nosqlbench.api.labels.NBLabels;
import io.nosqlbench.api.engine.activityimpl.ActivityDef;
@@ -29,10 +30,12 @@ public class TokenPoolTest {
ActivityDef adef = new ActivityDef(ParameterMap.parseOrException("alias=testing"));
NBLabeledElement def = NBLabeledElement.forMap(this.adef.getParams().getStringStringMap());
+ TestComponent component = new TestComponent("test","component");
+
@Test
public void testBackfillFullRate() {
- ThreadDrivenTokenPool p = new ThreadDrivenTokenPool(new RateSpec(10000000, 1.1), this.def);
+ ThreadDrivenTokenPool p = new ThreadDrivenTokenPool(component,new RateSpec(10000000, 1.1), this.def);
assertThat(p.refill(1000000L)).isEqualTo(1000000L);
assertThat(p.getWaitPool()).isEqualTo(0L);
assertThat(p.refill(100L)).isEqualTo(1000100);
@@ -46,7 +49,7 @@ public class TokenPoolTest {
}
@Test
public void testTakeRanges() {
- ThreadDrivenTokenPool p = new ThreadDrivenTokenPool(new RateSpec(100, 10), def);
+ ThreadDrivenTokenPool p = new ThreadDrivenTokenPool(component,new RateSpec(100, 10), def);
p.refill(100);
assertThat(p.takeUpTo(99)).isEqualTo(99L);
assertThat(p.takeUpTo(10)).isEqualTo(1L);
@@ -57,7 +60,7 @@ public class TokenPoolTest {
public void testChangedParameters() {
RateSpec s1 = new RateSpec(1000L, 1.10D);
- ThreadDrivenTokenPool p = new ThreadDrivenTokenPool(s1, def);
+ ThreadDrivenTokenPool p = new ThreadDrivenTokenPool(component,s1, def);
long r = p.refill(10000000);
assertThat(r).isEqualTo(10000000L);
assertThat(p.getWaitTime()).isEqualTo(10000000L);
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/context/NBSceneBuffer.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/context/NBSceneBuffer.java
index 92889db5c..cb0a718a7 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/context/NBSceneBuffer.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/context/NBSceneBuffer.java
@@ -94,8 +94,8 @@ public class NBSceneBuffer implements NBSceneFixtures {
return (NBSceneFixtures) this;
}
- public static NBSceneBuffer init(String name) {
- TestComponent root = new TestComponent("scene", "self");
- return new NBSceneBuffer(NBDefaultSceneFixtures.ofDefault(name));
- }
+// public static NBSceneBuffer init(String name) {
+// TestComponent root = new TestComponent("scene", "self");
+// return new NBSceneBuffer(NBDefaultSceneFixtures.ofDefault(name));
+// }
}
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/execution/ScenarioResult.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/execution/ScenarioResult.java
index aab3bafa4..8ff7038b5 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/execution/ScenarioResult.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/execution/ScenarioResult.java
@@ -18,13 +18,14 @@ package io.nosqlbench.engine.core.lifecycle.scenario.execution;
import io.nosqlbench.engine.core.lifecycle.scenario.context.NBSceneBuffer;
-public class ScenarioResult extends NBSceneBuffer {
+public class ScenarioResult {
private final long startedAt;
private final long endedAt;
private final Exception exception;
+ private final NBSceneBuffer fixtures;
public ScenarioResult(NBSceneBuffer fixtures, long start, long end, Exception exception) {
- super(fixtures);
+ this.fixtures = fixtures;
this.startedAt=start;
this.endedAt=end;
this.exception =exception;
@@ -34,10 +35,6 @@ public class ScenarioResult extends NBSceneBuffer {
return this.exception;
}
- public static ScenarioResult ofError(Exception e, long now) {
- return new ScenarioResult(NBSceneBuffer.init("error"),now,now,e);
- }
-
public void report() {
System.out.println(getIOLog());
if (exception!=null) {
@@ -53,4 +50,8 @@ public class ScenarioResult extends NBSceneBuffer {
System.exit(2);
}
}
+
+ public String getIOLog() {
+ return fixtures.getIOLog();
+ }
}
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/execution/ScenariosExecutor.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/execution/ScenariosExecutor.java
index 1643ad403..40ab8c5c0 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/execution/ScenariosExecutor.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/execution/ScenariosExecutor.java
@@ -22,10 +22,7 @@ import io.nosqlbench.components.NBBaseComponent;
import io.nosqlbench.components.NBComponent;
import io.nosqlbench.engine.core.lifecycle.ExecutionMetricsResult;
import io.nosqlbench.engine.core.lifecycle.IndexedThreadFactory;
-import io.nosqlbench.engine.core.lifecycle.scenario.context.NBDefaultSceneFixtures;
-import io.nosqlbench.engine.core.lifecycle.scenario.context.NBSceneBuffer;
-import io.nosqlbench.engine.core.lifecycle.scenario.context.NBSceneFixtures;
-import io.nosqlbench.engine.core.lifecycle.scenario.context.ScriptParams;
+import io.nosqlbench.engine.core.lifecycle.scenario.context.*;
import io.nosqlbench.engine.core.lifecycle.scenario.script.ScenarioExceptionHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -65,7 +62,7 @@ public class ScenariosExecutor extends NBBaseComponent {
NBSceneFixtures basecontext = new NBDefaultSceneFixtures(
ScriptParams.of(params),
this.getParent(),
- scenario.getActivitiesController(),
+ new ActivitiesController(this),
loadExtensions(),
new PrintWriter(System.out),
new PrintWriter(System.err),
@@ -180,7 +177,7 @@ public class ScenariosExecutor extends NBBaseComponent {
} catch (Exception e) {
long now = System.currentTimeMillis();
logger.debug("creating exceptional scenario result from getAsyncResultStatus");
- oResult = Optional.of(ScenarioResult.ofError(e, now));
+ throw new RuntimeException("replace with a proper error type");
}
}
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/BufferedScriptContext.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/BufferedScriptContext.java
index 36c15bafa..ec6e763bd 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/BufferedScriptContext.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/BufferedScriptContext.java
@@ -16,6 +16,7 @@
package io.nosqlbench.engine.core.lifecycle.scenario.script;
+import io.nosqlbench.engine.core.lifecycle.scenario.context.NBSceneBuffer;
import io.nosqlbench.engine.core.lifecycle.scenario.context.NBSceneFixtures;
import javax.script.SimpleScriptContext;
diff --git a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/NBScriptedScenario.java b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/NBScriptedScenario.java
index 464e29754..abcb55b13 100644
--- a/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/NBScriptedScenario.java
+++ b/engine-core/src/main/java/io/nosqlbench/engine/core/lifecycle/scenario/script/NBScriptedScenario.java
@@ -15,9 +15,7 @@
*/
package io.nosqlbench.engine.core.lifecycle.scenario.script;
-import com.codahale.metrics.MetricRegistry;
import com.oracle.truffle.js.scriptengine.GraalJSScriptEngine;
-import io.nosqlbench.api.engine.metrics.ActivityMetrics;
import io.nosqlbench.api.labels.NBLabeledElement;
import io.nosqlbench.components.NBComponent;
import io.nosqlbench.engine.core.lifecycle.ExecutionMetricsResult;
@@ -51,7 +49,7 @@ public class NBScriptedScenario extends NBScenario {
private Exception error;
private ExecutionMetricsResult result;
- private final NBLabeledElement parentComponent;
+ private BufferedScriptContext context;
public Optional getResultIfComplete() {
return Optional.ofNullable(result);
@@ -68,7 +66,7 @@ public class NBScriptedScenario extends NBScenario {
private ActivitiesProgressIndicator activitiesProgressIndicator;
private String progressInterval = "console:1m";
- private ScenarioScriptShell scriptEnv;
+// private ScenarioScriptShell scriptEnv;
private final String scenarioName;
private ScriptParams scenarioScriptParams;
private final Engine engine = Engine.Graalvm;
@@ -86,7 +84,6 @@ public class NBScriptedScenario extends NBScenario {
super(parentComponent, scenarioName);
this.scenarioName = scenarioName;
this.progressInterval = progressInterval;
- this.parentComponent = parentComponent;
}
public static NBScriptedScenario ofScripted(String name, Map params, NBComponent parent, Invocation invocation) {
@@ -117,17 +114,14 @@ public class NBScriptedScenario extends NBScenario {
return this;
}
- private void initializeScriptContext(NBSceneFixtures fixtures) {
+ private BufferedScriptContext initializeScriptContext(NBSceneFixtures fixtures) {
BufferedScriptContext ctx = new BufferedScriptContext(fixtures);
- this.scriptEngine.setContext(ctx);
+// this.scriptEngine.setContext(ctx);
ctx.getBindings(ScriptContext.ENGINE_SCOPE).put("scenario",new PolyglotScenarioController(fixtures.controller()));
+ return ctx;
}
private void initializeScriptingEngine() {
-
- this.logger.debug("Using engine {}", this.engine.toString());
- final MetricRegistry metricRegistry = ActivityMetrics.getMetricRegistry();
-
final Context.Builder contextSettings = Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL)
.allowNativeAccess(true)
@@ -145,30 +139,15 @@ public class NBScriptedScenario extends NBScenario {
final Builder engineBuilder = org.graalvm.polyglot.Engine.newBuilder();
engineBuilder.option("engine.WarnInterpreterOnly", "false");
final org.graalvm.polyglot.Engine polyglotEngine = engineBuilder.build();
-
- // TODO: add in, out, err for this scenario
scriptEngine = GraalJSScriptEngine.create(polyglotEngine, contextSettings);
-
-// NBScenarioPojoContext sctx = new NBScenarioPojoContext(
-// this.scenarioScriptParams,
-// (NBSession) this.getParent(),
-// scenarioController,
-// new ActivityBindings(scenarioController)
-// );
-//
-// this.scriptEngine.put("params", sctx.params());
-// this.scriptEngine.put("session", sctx.session());
-// this.scriptEngine.put("activities", sctx.activities());
-// this.scriptEngine.put("scenario", new PolyglotScenarioController(sctx.controller()));
-//
}
- protected synchronized void runScenario(NBSceneFixtures context) {
+ protected synchronized void runScenario(NBSceneFixtures shell) {
if (null == result) {
try {
this.logger.debug("Initializing scripting engine for {}.", scenarioName);
this.initializeScriptingEngine();
- this.initializeScriptContext(context);
+ this.context = this.initializeScriptContext(shell);
this.logger.debug("Running control script for {}.", scenarioName);
this.executeScenarioScripts();
} catch (final Exception e) {
@@ -190,7 +169,7 @@ public class NBScriptedScenario extends NBScenario {
this.logger.debug("Using direct script compilation");
final CompiledScript compiled = compilableEngine.compile(script);
this.logger.debug("-> invoking main scenario script (compiled)");
- result = compiled.eval();
+ result = compiled.eval(this.context);
this.logger.debug("<- scenario script completed (compiled)");
}
// else if ((null != scriptfile) && !this.scriptfile.isEmpty()) {
diff --git a/engine-core/src/test/java/io/nosqlbench/engine/core/NBScenarioTest.java b/engine-core/src/test/java/io/nosqlbench/engine/core/NBScenarioTest.java
index 01f600637..1258253ae 100644
--- a/engine-core/src/test/java/io/nosqlbench/engine/core/NBScenarioTest.java
+++ b/engine-core/src/test/java/io/nosqlbench/engine/core/NBScenarioTest.java
@@ -34,7 +34,6 @@ public class NBScenarioTest {
@Test
public void shouldLoadScriptText() {
- ScriptEnvBuffer buffer = new ScriptEnvBuffer();
NBScriptedScenario scenario = NBScriptedScenario.ofScripted("testing", Map.of(),new TestComponent(), NBScriptedScenario.Invocation.EXECUTE_SCRIPT);
scenario.addScriptText("print('loaded script environment...');\n");
try {
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
index f4c3d8477..109dc3196 100644
--- 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
@@ -141,34 +141,6 @@ public class ActivityMetrics {
get().remove(graphiteName);
}
- /**
- *
Create a timer associated with an activity.
- *
- *
If the provide ActivityDef contains a parameter "hdr_digits", then it will be used to set the number of
- * significant digits on the histogram's precision.
- *
- *
This method ensures that if multiple threads attempt to create the same-named metric on a given activity,
- * that only one of them succeeds.
- *
- * @param named
- * an associated activity def
- * @param metricFamilyName
- * a simple, descriptive name for the timer
- * @return the timer, perhaps a different one if it has already been registered
- */
- public static Timer timer(NBLabeledElement parent, String metricFamilyName, int hdrdigits) {
- final NBLabels labels = parent.getLabels().and("name", sanitize(metricFamilyName));
-
-
- Timer registeredTimer = (Timer) register(labels, () ->
- new NBMetricTimer(labels,
- new DeltaHdrHistogramReservoir(
- labels,
- hdrdigits
- )
- ));
- return registeredTimer;
- }
/**
*
Create an HDR histogram associated with an activity.
diff --git a/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/instruments/NBMetricGaugeWrapper.java b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/instruments/NBMetricGaugeWrapper.java
index 6f45b0ebb..dd4bf933f 100644
--- a/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/instruments/NBMetricGaugeWrapper.java
+++ b/nb-api/src/main/java/io/nosqlbench/api/engine/metrics/instruments/NBMetricGaugeWrapper.java
@@ -26,6 +26,10 @@ public class NBMetricGaugeWrapper implements NBMetricGauge, NBMetric {
public NBMetricGaugeWrapper(NBLabels labels, Gauge gauge) {
this.gauge = gauge;
+ if (gauge.getValue() instanceof Double d) {
+ } else {
+ throw new RuntimeException("NBMetricGauges only support Double values");
+ }
this.labels = labels;
}
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 fe8527fe6..e51b9e7aa 100644
--- a/nb-api/src/main/java/io/nosqlbench/components/NBBuilders.java
+++ b/nb-api/src/main/java/io/nosqlbench/components/NBBuilders.java
@@ -33,6 +33,8 @@ import java.util.List;
import java.util.function.Supplier;
public class NBBuilders {
+
+ // TODO: add mandatory sanitize() around all label names and label "name" values
private final Logger logger = LogManager.getLogger(NBBuilders.class);
private final NBBaseComponent base;
diff --git a/nb-api/src/main/java/io/nosqlbench/components/NBComponentLoader.java b/nb-api/src/main/java/io/nosqlbench/components/NBComponentLoader.java
new file mode 100644
index 000000000..515a4d37b
--- /dev/null
+++ b/nb-api/src/main/java/io/nosqlbench/components/NBComponentLoader.java
@@ -0,0 +1,32 @@
+package io.nosqlbench.components;
+
+import io.nosqlbench.api.spi.SimpleServiceLoader;
+import io.nosqlbench.nb.annotations.Service;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.ServiceLoader;
+import java.util.function.BiFunction;
+
+public class NBComponentLoader {
+ public static C load(NBComponent parent, String selector, Class clazz) {
+ ServiceLoader loader = ServiceLoader.load(clazz);
+ ServiceLoader.Provider cp = loader.stream().filter(p -> {
+ Service service = Arrays.stream(p.type().getAnnotationsByType(Service.class)).findFirst().orElseThrow();
+ return service.selector().equals(selector);
+ }).findFirst().orElseThrow();
+ try {
+ Constructor extends C> ctor = cp.type().getConstructor(NBComponent.class);
+ return ctor.newInstance(parent);
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException(e);
+ } catch (InstantiationException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/nb-api/src/main/java/io/nosqlbench/components/NBParentComponentInjection.java b/nb-api/src/main/java/io/nosqlbench/components/NBParentComponentInjection.java
new file mode 100644
index 000000000..40e36ca5c
--- /dev/null
+++ b/nb-api/src/main/java/io/nosqlbench/components/NBParentComponentInjection.java
@@ -0,0 +1,5 @@
+package io.nosqlbench.components;
+
+public interface NBParentComponentInjection {
+ void applyParentComponent(NBComponent component);
+}
diff --git a/nb-api/src/main/java/io/nosqlbench/engine/api/scripting/DiagWriter.java b/nb-api/src/main/java/io/nosqlbench/engine/api/scripting/DiagWriter.java
index afc7c56d7..c4f34a540 100644
--- a/nb-api/src/main/java/io/nosqlbench/engine/api/scripting/DiagWriter.java
+++ b/nb-api/src/main/java/io/nosqlbench/engine/api/scripting/DiagWriter.java
@@ -16,13 +16,17 @@
package io.nosqlbench.engine.api.scripting;
+import org.jetbrains.annotations.NotNull;
+
import java.io.CharArrayWriter;
+import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
public class DiagWriter extends PrintWriter {
@@ -31,6 +35,7 @@ public class DiagWriter extends PrintWriter {
CharArrayWriter buffer = new CharArrayWriter();
private final List timedLog = new ArrayList();
private final StringBuilder sb = new StringBuilder();
+ private int checkpoint = 0;
private final DateTimeFormatter tsformat = DateTimeFormatter.ISO_DATE_TIME;
@@ -42,40 +47,227 @@ public class DiagWriter extends PrintWriter {
@Override
public void write(char[] cbuf, int off, int len) {
- String tsprefix = LocalDateTime.now().format(tsformat);
-
buffer.write(cbuf, off, len);
String text = new String(cbuf, off, len);
sb.append(text);
-
- if (text.contains("\n")) {
- String msgs = sb.toString();
- String extra = msgs.substring(msgs.lastIndexOf("\n") + 1);
- sb.setLength(0);
- sb.append(extra);
- String[] parts = msgs.substring(0, msgs.length() - extra.length()).split("\n");
- for (String part : parts) {
- if (!part.isBlank()) {
- String tslogEntry = tsprefix + prefix + part + "\n";
- timedLog.add(tslogEntry);
- }
- }
-
- }
+ checkpointIf();
super.write(cbuf, off, len);
}
+ private void check() {
+ if (sb.substring(checkpoint,sb.length()).contains("\n")) {
+ checkpoint();
+ }
+ }
+
+ private void checkpointIf() {
+ if (checkpoint==sb.length()) {
+ return;
+ }
+ if (sb.substring(checkpoint,sb.length()).contains("\n")) {
+ checkpoint();
+ checkpointIf();
+ }
+ }
+ private void checkpoint() {
+ String tsprefix = LocalDateTime.now().format(tsformat);
+ String msgs = sb.toString();
+ String extra = msgs.substring(msgs.lastIndexOf("\n") + 1);
+ sb.setLength(0);
+ sb.append(extra);
+ String[] parts = msgs.substring(0, msgs.length() - extra.length()).split("\n");
+ for (String part : parts) {
+ if (!part.isBlank()) {
+ String tslogEntry = tsprefix + prefix + part + "\n";
+ timedLog.add(tslogEntry);
+ }
+ }
+ checkpoint = 0;
+ }
+
+ @Override
+ public void write(int c) {
+ this.buffer.write(c);
+ sb.append((char)c);
+ checkpointIf();
+ super.write(c);
+ }
+
+ @Override
+ public void write(@NotNull char[] buf) {
+ try {
+ this.buffer.write(buf);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ sb.append(buf);
+ checkpointIf();
+ super.write(buf);
+ }
+
+ @Override
+ public void write(@NotNull String s, int off, int len) {
+ this.buffer.write(s,off,len);
+ sb.append(s);
+ checkpointIf();
+ super.write(s, off, len);
+ }
+
+ @Override
+ public void write(@NotNull String s) {
+ try {
+ sb.append(s);
+ this.buffer.write(s);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ checkpointIf();
+ super.write(s);
+ }
+
+ @Override
+ public void print(boolean b) {
+ super.print(b);
+ }
+
+ @Override
+ public void print(char c) {
+ super.print(c);
+ }
+
+ @Override
+ public void print(int i) {
+ super.print(i);
+ }
+
+ @Override
+ public void print(long l) {
+ super.print(l);
+ }
+
+ @Override
+ public void print(float f) {
+ super.print(f);
+ }
+
+ @Override
+ public void print(double d) {
+ super.print(d);
+ }
+
+ @Override
+ public void print(@NotNull char[] s) {
+ super.print(s);
+ }
+
+ @Override
+ public void print(String s) {
+ super.print(s);
+ }
+
+ @Override
+ public void print(Object obj) {
+ super.print(obj);
+ }
+
+ @Override
+ public void println() {
+ super.println();
+ }
+
+ @Override
+ public void println(boolean x) {
+ super.println(x);
+ }
+
+ @Override
+ public void println(char x) {
+ super.println(x);
+ }
+
+ @Override
+ public void println(int x) {
+ super.println(x);
+ }
+
+ @Override
+ public void println(long x) {
+ super.println(x);
+ }
+
+ @Override
+ public void println(float x) {
+ super.println(x);
+ }
+
+ @Override
+ public void println(double x) {
+ super.println(x);
+ }
+
+ @Override
+ public void println(@NotNull char[] x) {
+ super.println(x);
+ }
+
+ @Override
+ public void println(String x) {
+ super.println(x);
+ }
+
+ @Override
+ public void println(Object x) {
+ super.println(x);
+ }
+
+ @Override
+ public PrintWriter printf(@NotNull String format, Object... args) {
+ return super.printf(format, args);
+ }
+
+ @Override
+ public PrintWriter printf(Locale l, @NotNull String format, Object... args) {
+ return super.printf(l, format, args);
+ }
+
+ @Override
+ public PrintWriter format(@NotNull String format, Object... args) {
+ return super.format(format, args);
+ }
+
+ @Override
+ public PrintWriter format(Locale l, @NotNull String format, Object... args) {
+ return super.format(l, format, args);
+ }
+
+ @Override
+ public PrintWriter append(CharSequence csq) {
+ return super.append(csq);
+ }
+
+ @Override
+ public PrintWriter append(CharSequence csq, int start, int end) {
+ return super.append(csq, start, end);
+ }
+
+ @Override
+ public PrintWriter append(char c) {
+ return super.append(c);
+ }
+
@Override
public void flush() {
buffer.flush();
+ checkpoint();
super.flush();
}
@Override
public void close() {
buffer.close();
+ checkpoint();
super.close();
}
diff --git a/nb-api/src/test/java/io/nosqlbench/api/engine/metrics/reporters/PromExpositionFormatTest.java b/nb-api/src/test/java/io/nosqlbench/api/engine/metrics/reporters/PromExpositionFormatTest.java
index 5823f2411..1a88b1879 100644
--- a/nb-api/src/test/java/io/nosqlbench/api/engine/metrics/reporters/PromExpositionFormatTest.java
+++ b/nb-api/src/test/java/io/nosqlbench/api/engine/metrics/reporters/PromExpositionFormatTest.java
@@ -153,7 +153,7 @@ public class PromExpositionFormatTest {
@Test
public void testGaugeFormat() {
- Gauge cosetteGauge = () -> 1500;
+ Gauge cosetteGauge = () -> 1500d;
NBMetricGauge nbMetricGauge = new NBMetricGaugeWrapper(NBLabels.forKV("name","cosette","label6", "value6"), cosetteGauge);
String formatted = PromExpositionFormat.format(nowclock, nbMetricGauge);
@@ -162,7 +162,7 @@ public class PromExpositionFormatTest {
cosette\\{label6="value6"} 1500.0
"""));
- Gauge cosetteGauge2 = () -> "2000.0";
+ Gauge cosetteGauge2 = () -> 2000.0d;
NBMetricGauge nbMetricGauge2 = new NBMetricGaugeWrapper(NBLabels.forKV("name","cosette2","label7", "value7"), cosetteGauge2);
String formatted2 = PromExpositionFormat.format(nowclock, nbMetricGauge2);
@@ -171,15 +171,5 @@ public class PromExpositionFormatTest {
cosette2\\{label7="value7"} 2000.0
"""));
- final int number = 3000;
- final CharSequence charSequence = Integer.toString(number);
- Gauge cosetteGauge3 = () -> charSequence;
- NBMetricGauge nbMetricGauge3 = new NBMetricGaugeWrapper(NBLabels.forKV("name","cosette3","label8", "value8"), cosetteGauge3);
- String formatted3 = PromExpositionFormat.format(nowclock, nbMetricGauge3);
-
- assertThat(formatted3).matches(Pattern.compile("""
- # TYPE cosette3 gauge
- cosette3\\{label8="value8"} 3000
- """));
}
}