diff --git a/pom.xml b/pom.xml index 9468a4d..eef429e 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ UTF-8 + 5.13.2 1.8 1.8 @@ -107,6 +108,15 @@ micrometer-registry-jmx 1.0.6 + + io.zipkin.brave + brave-instrumentation-okhttp3 + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + 2.16.2 + @@ -139,4 +149,16 @@ https://oss.jfrog.org/artifactory/oss-snapshot-local + + + + + io.zipkin.brave + brave-bom + ${brave.version} + pom + import + + + diff --git a/src/main/java/brave/RealSpan.java b/src/main/java/brave/RealSpan.java new file mode 100644 index 0000000..21f4070 --- /dev/null +++ b/src/main/java/brave/RealSpan.java @@ -0,0 +1,195 @@ +/* + * Copyright 2013-2020 The OpenZipkin Authors + * + * 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 brave; + +import brave.handler.MutableSpan; +import brave.internal.recorder.PendingSpans; +import brave.propagation.TraceContext; + +/** This wraps the public api and guards access to a mutable span. */ +public final class RealSpan extends Span { + final TraceContext context; + final PendingSpans pendingSpans; + final MutableSpan state; + final Clock clock; + + RealSpan(TraceContext context, + PendingSpans pendingSpans, + MutableSpan state, + Clock clock + ) { + this.context = context; + this.pendingSpans = pendingSpans; + this.state = state; + this.clock = clock; + } + + @Override public boolean isNoop() { + return false; + } + + @Override public TraceContext context() { + return context; + } + + @Override public SpanCustomizer customizer() { + return new SpanCustomizerShield(this); + } + + @Override public Span start() { + return start(clock.currentTimeMicroseconds()); + } + + @Override public Span start(long timestamp) { + synchronized (state) { + state.startTimestamp(timestamp); + } + return this; + } + + @Override public Span name(String name) { + synchronized (state) { + state.name(name); + } + return this; + } + + @Override public Span kind(Kind kind) { + synchronized (state) { + state.kind(kind); + } + return this; + } + + @Override public Span annotate(String value) { + return annotate(clock.currentTimeMicroseconds(), value); + } + + @Override public Span annotate(long timestamp, String value) { + // Modern instrumentation should not send annotations such as this, but we leniently + // accept them rather than fail. This for example allows old bridges like to Brave v3 to work + if ("cs".equals(value)) { + synchronized (state) { + state.kind(Span.Kind.CLIENT); + state.startTimestamp(timestamp); + } + } else if ("sr".equals(value)) { + synchronized (state) { + state.kind(Span.Kind.SERVER); + state.startTimestamp(timestamp); + } + } else if ("cr".equals(value)) { + synchronized (state) { + state.kind(Span.Kind.CLIENT); + } + finish(timestamp); + } else if ("ss".equals(value)) { + synchronized (state) { + state.kind(Span.Kind.SERVER); + } + finish(timestamp); + } else { + synchronized (state) { + state.annotate(timestamp, value); + } + } + return this; + } + + @Override public Span tag(String key, String value) { + synchronized (state) { + state.tag(key, value); + } + return this; + } + + @Override public Span error(Throwable throwable) { + synchronized (state) { + state.error(throwable); + } + return this; + } + + public Span localServiceName(String localServiceName) { + synchronized (state) { + state.localServiceName(localServiceName); + } + return this; + } + + public String remoteServiceName() { + synchronized (state) { + return state.remoteServiceName(); + } + } + + @Override public Span remoteServiceName(String remoteServiceName) { + synchronized (state) { + state.remoteServiceName(remoteServiceName); + } + return this; + } + + @Override public boolean remoteIpAndPort(String remoteIp, int remotePort) { + synchronized (state) { + return state.remoteIpAndPort(remoteIp, remotePort); + } + } + + @Override public void finish() { + finish(0L); + } + + @Override public void finish(long timestamp) { + synchronized (state) { + pendingSpans.finish(context, timestamp); + } + } + + @Override public void abandon() { + pendingSpans.abandon(context); + } + + @Override public void flush() { + pendingSpans.flush(context); + } + + @Override public String toString() { + return "RealSpan(" + context + ")"; + } + + /** + * This also matches equals against a lazy span. The rationale is least surprise to the user, as + * code should not act differently given an instance of lazy or {@link RealSpan}. + */ + @Override public boolean equals(Object o) { + if (o == this) return true; + return isEqualToRealOrLazySpan(context, o); + } + + // We don't compare a RealSpan vs a NoopSpan as they can never equal each other. + // RealSpan's are always locally sampled and Noop ones are always not. + static boolean isEqualToRealOrLazySpan(TraceContext context, Object o) { + if (o instanceof LazySpan) { + return context.equals(((LazySpan) o).context); + } else if (o instanceof RealSpan) { + return context.equals(((RealSpan) o).context); + } + return false; + } + + @Override public int hashCode() { + return context.hashCode(); + } +} diff --git a/src/main/java/com/github/Test.java b/src/main/java/com/github/Test.java new file mode 100644 index 0000000..112750b --- /dev/null +++ b/src/main/java/com/github/Test.java @@ -0,0 +1,58 @@ +package com.github; + +import io.vlingo.actors.Actor; +import io.vlingo.actors.Definition; +import io.vlingo.actors.World; + +public class Test { + public interface Ping { + void ping(); + } + + public static class PingActor extends Actor implements Ping { + @Override + public void ping() { + System.out.println("Ping!"); + + stage().actorOf(Pong.class, stage().addressFactory().from("100")) + .andFinallyConsume(Pong::pong); + } + } + + public interface Pong { + void pong(); + } + + public static class PongActor extends Actor implements Pong { + @Override + public void pong() { + System.out.println("Pong!"); + + stage().actorOf(Foo.class, stage().addressFactory().from("200")) + .andFinallyConsume(Foo::foo); + } + } + + public interface Foo { + void foo(); + } + + public static class FooActor extends Actor implements Foo { + @Override + public void foo() { + System.out.println("Foo!"); + } + } + + + public static void main(String[] args) { + World world = World.start("test"); + + Ping ping = world.actorFor(Ping.class, PingActor.class); + + world.stage().actorFor(Pong.class, Definition.has(PongActor.class, Definition.NoParameters), world.addressFactory().from("100")); + world.stage().actorFor(Foo.class, Definition.has(FooActor.class, Definition.NoParameters), world.addressFactory().from("200")); + + ping.ping(); + } +} diff --git a/src/main/java/io/vlingo/telemetry/plugin/mailbox/MailboxTelemetryPlugin.java b/src/main/java/io/vlingo/telemetry/plugin/mailbox/MailboxTelemetryPlugin.java index d5e70cb..713254b 100644 --- a/src/main/java/io/vlingo/telemetry/plugin/mailbox/MailboxTelemetryPlugin.java +++ b/src/main/java/io/vlingo/telemetry/plugin/mailbox/MailboxTelemetryPlugin.java @@ -9,6 +9,8 @@ import java.util.Properties; +import brave.Tracer; +import brave.Tracing; import io.vlingo.actors.Configuration; import io.vlingo.actors.Registrar; import io.vlingo.actors.plugin.Plugin; @@ -16,6 +18,10 @@ import io.vlingo.actors.plugin.PluginProperties; import io.vlingo.actors.plugin.mailbox.DefaultMailboxProviderKeeper; import io.vlingo.telemetry.Telemetry; +import io.vlingo.telemetry.tracing.TracingBaggage; +import zipkin2.reporter.brave.AsyncZipkinSpanHandler; +import zipkin2.reporter.brave.ZipkinSpanHandler; +import zipkin2.reporter.okhttp3.OkHttpSender; public class MailboxTelemetryPlugin implements Plugin { public static class MailboxTelemetryPluginConfiguration implements PluginConfiguration { @@ -65,7 +71,21 @@ public int pass() { @Override public void start(final Registrar registrar) { Telemetry telemetry = Telemetry.from(registrar.world()); - registrar.registerMailboxProviderKeeper(new TelemetryMailboxProviderKeeper(new DefaultMailboxProviderKeeper(), new DefaultMailboxTelemetry(telemetry))); + OkHttpSender sender = OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); +// (this dependency is io.zipkin.reporter2:zipkin-reporter-brave) + ZipkinSpanHandler zipkinSpanHandler = AsyncZipkinSpanHandler.create(sender); + +// Create a tracing component with the service name you want to see in Zipkin. + Tracing tracing = Tracing.newBuilder() + .traceId128Bit(true) + .addSpanHandler(zipkinSpanHandler) + .build(); + +// Tracing exposes objects you might need, most importantly the tracer + Tracer tracer = tracing.tracer(); + TracingBaggage baggage = TracingBaggage.withTracer(tracer); + + registrar.registerMailboxProviderKeeper(new TelemetryMailboxProviderKeeper(new DefaultMailboxProviderKeeper(), new DefaultMailboxTelemetry(telemetry), baggage)); } @Override diff --git a/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailbox.java b/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailbox.java index 6b4de6f..f989dd2 100644 --- a/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailbox.java +++ b/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailbox.java @@ -12,14 +12,17 @@ import io.vlingo.actors.Message; import io.vlingo.actors.Returns; import io.vlingo.common.SerializableConsumer; +import io.vlingo.telemetry.tracing.TracingBaggage; public class TelemetryMailbox implements Mailbox { private final MailboxTelemetry telemetry; private final Mailbox delegate; + private final TracingBaggage baggage; - public TelemetryMailbox(final MailboxTelemetry telemetry, final Mailbox delegate) { + public TelemetryMailbox(final MailboxTelemetry telemetry, final Mailbox delegate, final TracingBaggage baggage) { this.telemetry = telemetry; this.delegate = delegate; + this.baggage = baggage; } @Override @@ -50,7 +53,7 @@ public void resume(final String name) { @Override public void send(final Message message) { try { - delegate.send(new TelemetryMessage(message, telemetry)); + delegate.send(new TelemetryMessage(message, telemetry, baggage)); telemetry.onSendMessage(message.actor()); } catch (Exception e) { telemetry.onSendMessageFailed(message.actor(), e); diff --git a/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProvider.java b/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProvider.java index 880c197..50446f9 100644 --- a/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProvider.java +++ b/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProvider.java @@ -10,14 +10,17 @@ import io.vlingo.actors.Dispatcher; import io.vlingo.actors.Mailbox; import io.vlingo.actors.MailboxProvider; +import io.vlingo.telemetry.tracing.TracingBaggage; public class TelemetryMailboxProvider implements MailboxProvider { private final MailboxTelemetry telemetry; private final MailboxProvider delegate; + private final TracingBaggage baggage; - public TelemetryMailboxProvider(final MailboxTelemetry telemetry, final MailboxProvider delegate) { + public TelemetryMailboxProvider(final MailboxTelemetry telemetry, final MailboxProvider delegate, final TracingBaggage baggage) { this.telemetry = telemetry; this.delegate = delegate; + this.baggage = baggage; } @Override @@ -27,11 +30,11 @@ public void close() { @Override public Mailbox provideMailboxFor(final int hashCode) { - return new TelemetryMailbox(telemetry, delegate.provideMailboxFor(hashCode)); + return new TelemetryMailbox(telemetry, delegate.provideMailboxFor(hashCode), baggage); } @Override public Mailbox provideMailboxFor(final int hashCode, final Dispatcher dispatcher) { - return new TelemetryMailbox(telemetry, delegate.provideMailboxFor(hashCode, dispatcher)); + return new TelemetryMailbox(telemetry, delegate.provideMailboxFor(hashCode, dispatcher), baggage); } } diff --git a/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderKeeper.java b/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderKeeper.java index d539258..a073932 100644 --- a/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderKeeper.java +++ b/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderKeeper.java @@ -10,14 +10,17 @@ import io.vlingo.actors.Mailbox; import io.vlingo.actors.MailboxProvider; import io.vlingo.actors.MailboxProviderKeeper; +import io.vlingo.telemetry.tracing.TracingBaggage; public class TelemetryMailboxProviderKeeper implements MailboxProviderKeeper { private final MailboxProviderKeeper delegate; private final MailboxTelemetry telemetry; + private final TracingBaggage baggage; - public TelemetryMailboxProviderKeeper(final MailboxProviderKeeper delegate, final MailboxTelemetry telemetry) { + public TelemetryMailboxProviderKeeper(final MailboxProviderKeeper delegate, final MailboxTelemetry telemetry, final TracingBaggage baggage) { this.delegate = delegate; this.telemetry = telemetry; + this.baggage = baggage; } @Override @@ -37,7 +40,7 @@ public String findDefault() { @Override public void keep(final String name, final boolean isDefault, final MailboxProvider mailboxProvider) { - delegate.keep(name, isDefault, new TelemetryMailboxProvider(telemetry, mailboxProvider)); + delegate.keep(name, isDefault, new TelemetryMailboxProvider(telemetry, mailboxProvider, baggage)); } @Override diff --git a/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMessage.java b/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMessage.java index ac974bb..564ddcf 100644 --- a/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMessage.java +++ b/src/main/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMessage.java @@ -11,14 +11,20 @@ import io.vlingo.actors.Message; import io.vlingo.actors.Returns; import io.vlingo.common.SerializableConsumer; +import io.vlingo.telemetry.tracing.TracingBaggage; +import io.vlingo.telemetry.tracing.TracingContext; public class TelemetryMessage implements Message { private final Message delegate; private final MailboxTelemetry telemetry; + private final TracingBaggage tracingBaggage; + private final TracingContext tracingContext; - public TelemetryMessage(final Message delegate, final MailboxTelemetry telemetry) { + public TelemetryMessage(final Message delegate, final MailboxTelemetry telemetry, final TracingBaggage tracingBaggage) { this.delegate = delegate; this.telemetry = telemetry; + this.tracingBaggage = tracingBaggage; + this.tracingContext = tracingBaggage != null ? tracingBaggage.baggageState() : null; } @Override @@ -26,13 +32,21 @@ public Actor actor() { return delegate.actor(); } + public TracingContext tracingContext() { + return tracingContext; + } + @Override public void deliver() { + TracingContext nextTracingContext = tracingBaggage.storeInBaggage(this); try { delegate.deliver(); telemetry.onReceiveMessage(delegate.actor()); } catch (RuntimeException ex) { telemetry.onDeliverMessageFailed(delegate.actor(), ex); + nextTracingContext.failed(ex); + } finally { + nextTracingContext.flush(); } } diff --git a/src/main/java/io/vlingo/telemetry/tracing/TracingBaggage.java b/src/main/java/io/vlingo/telemetry/tracing/TracingBaggage.java new file mode 100644 index 0000000..6e91aca --- /dev/null +++ b/src/main/java/io/vlingo/telemetry/tracing/TracingBaggage.java @@ -0,0 +1,37 @@ +package io.vlingo.telemetry.tracing; + +import brave.Tracer; +import io.vlingo.telemetry.plugin.mailbox.TelemetryMessage; + +public final class TracingBaggage { + private final ThreadLocal currentContext; + private final ThreadLocal previousMessage; + private final Tracer tracer; + + private TracingBaggage(final Tracer tracer) { + this.tracer = tracer; + this.currentContext = ThreadLocal.withInitial(TracingContext::empty); + this.previousMessage = ThreadLocal.withInitial(() -> new TelemetryMessage(null, null, null)); + } + + public static TracingBaggage withTracer(final Tracer tracer) { + return new TracingBaggage(tracer); + } + + public TracingContext baggageState() { + return currentContext.get(); + } + + public TracingContext storeInBaggage(final TelemetryMessage message) { + if (message.tracingContext() == null || message.tracingContext().isEmpty()) { + final TracingContext tracingContext = TracingContext.newContext(tracer, message); + currentContext.set(tracingContext); + previousMessage.set(message); + return tracingContext; + } + + final TracingContext tracingContext = TracingContext.nextOf(tracer, message.tracingContext(), message); + currentContext.set(tracingContext); + return tracingContext; + } +} diff --git a/src/main/java/io/vlingo/telemetry/tracing/TracingContext.java b/src/main/java/io/vlingo/telemetry/tracing/TracingContext.java new file mode 100644 index 0000000..e1a09f5 --- /dev/null +++ b/src/main/java/io/vlingo/telemetry/tracing/TracingContext.java @@ -0,0 +1,80 @@ +package io.vlingo.telemetry.tracing; + +import brave.RealSpan; +import brave.Span; +import brave.Tracer; +import brave.propagation.TraceContextOrSamplingFlags; +import io.vlingo.actors.Actor; +import io.vlingo.telemetry.plugin.mailbox.TelemetryMessage; + +public final class TracingContext { + private final RealSpan span; + + private TracingContext(final RealSpan span, final TelemetryMessage message, final Span.Kind spanKind, final RealSpan previousSpan) { + this.span = span; + if (span != null) { + span.kind(spanKind); + span.name(message.representation()); + span.tag("ActorAddress", message.actor().address().name()); + span.remoteServiceName(message.actor().getClass().getSimpleName()); + if (previousSpan != null) { + span.localServiceName(previousSpan.remoteServiceName()); + } else { + span.localServiceName(message.actor().getClass().getSimpleName()); + } + span.start(); + } + } + + public static TracingContext empty() { + return new TracingContext(null, null, Span.Kind.SERVER, null); + } + + public void flush() { + if (span == null) { + return; + } + + span.finish(); + span.flush(); + } + + public void failed(Throwable ex) { + if (span == null) { + return; + } + + span.error(ex); + span.finish(); + span.flush(); + } + + public static TracingContext newContext(final Tracer tracer, final TelemetryMessage message) { + if (message.actor().getClass().getCanonicalName().startsWith("io.vlingo") || message.representation().startsWith("start")) { + return TracingContext.empty(); + } + + final Span span = tracer.newTrace(); + return new TracingContext((RealSpan) span, message, Span.Kind.SERVER, null); + } + + public static TracingContext nextOf(final Tracer tracer, final TracingContext context, final TelemetryMessage message) { + if (message.actor().getClass().getCanonicalName().startsWith("io.vlingo") || message.representation().startsWith("start")) { + return TracingContext.empty(); + } + + context.flush(); + final Span nextSpan = tracer.nextSpan(TraceContextOrSamplingFlags.newBuilder(context.span.context()).build()); + return new TracingContext((RealSpan) nextSpan, message, Span.Kind.CLIENT, context.span); + } + + public boolean isEmpty() { + return span == null; + } + + @Override + public String toString() { + return span == null ? "" : span.toString(); + } + +} diff --git a/src/main/resources/vlingo-actors.properties b/src/main/resources/vlingo-actors.properties new file mode 100644 index 0000000..a6de37a --- /dev/null +++ b/src/main/resources/vlingo-actors.properties @@ -0,0 +1,56 @@ +# Copyright 2012-2018 Vaughn Vernon +# +# This Source Code Form is subject to the terms of the +# Mozilla Public License, v. 2.0. If a copy of the MPL +# was not distributed with this file, You can obtain +# one at https://mozilla.org/MPL/2.0/. + +# vlingo/actors startup properties + +plugin.name.pooledCompletes = true +plugin.pooledCompletes.classname = io.vlingo.actors.plugin.completes.PooledCompletesPlugin +plugin.pooledCompletes.pool = 10 +plugin.pooledCompletes.mailbox = queueMailbox + +plugin.name.ringMailbox = true +plugin.ringMailbox.classname = io.vlingo.actors.plugin.mailbox.sharedringbuffer.SharedRingBufferMailboxPlugin +plugin.ringMailbox.defaultMailbox = false +plugin.ringMailbox.size = 65535 +plugin.ringMailbox.fixedBackoff = 2 +plugin.ringMailbox.dispatcherThrottlingCount = 1 + +plugin.name.arrayQueueMailbox = true +plugin.arrayQueueMailbox.classname = io.vlingo.actors.plugin.mailbox.agronampscarrayqueue.ManyToOneConcurrentArrayQueuePlugin +plugin.arrayQueueMailbox.defaultMailbox = false +plugin.arrayQueueMailbox.size = 65535 +plugin.arrayQueueMailbox.fixedBackoff = 2 +plugin.arrayQueueMailbox.dispatcherThrottlingCount = 1 +plugin.arrayQueueMailbox.sendRetires = 10 + +plugin.name.queueMailbox = true +plugin.queueMailbox.classname = io.vlingo.actors.plugin.mailbox.concurrentqueue.ConcurrentQueueMailboxPlugin +plugin.queueMailbox.defaultMailbox = true +plugin.queueMailbox.numberOfDispatchersFactor = 1.5 +plugin.queueMailbox.dispatcherThrottlingCount = 1 + +plugin.name.slf4jLogger = true +plugin.slf4jLogger.classname = io.vlingo.actors.plugin.logging.slf4j.Slf4jLoggerPlugin +plugin.slf4jLogger.name = vlingo/actors(test) +plugin.slf4jLogger.defaultLogger = true + +plugin.name.telemetry = true +plugin.telemetry.classname = io.vlingo.telemetry.TelemetryPlugin +plugin.telemetry.providerClass = io.vlingo.telemetry.TelemetryPlugin + +plugin.name.mailboxTelemetry = true +plugin.mailboxTelemetry.classname = io.vlingo.telemetry.plugin.mailbox.MailboxTelemetryPlugin + +plugin.name.override_supervisor = true +plugin.override_supervisor.classname = io.vlingo.actors.plugin.supervision.DefaultSupervisorOverridePlugin +plugin.override_supervisor.types =\ + [stage=default name=overrideSupervisor supervisor=io.vlingo.actors.plugin.supervision.DefaultSupervisorOverride] + +proxy.generated.classes.main = target/classes/ +proxy.generated.sources.main = target/generated-sources/ +proxy.generated.classes.test = target/test-classes/ +proxy.generated.sources.test = target/generated-test-sources/ diff --git a/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderKeeperTest.java b/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderKeeperTest.java index 4907208..a7b9749 100644 --- a/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderKeeperTest.java +++ b/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderKeeperTest.java @@ -36,7 +36,7 @@ public void setUp() throws Exception { telemetry = mock(MailboxTelemetry.class); provider = mock(MailboxProvider.class); - telemetryMailboxProviderKeeper = new TelemetryMailboxProviderKeeper(delegate, telemetry); + telemetryMailboxProviderKeeper = new TelemetryMailboxProviderKeeper(delegate, telemetry, null); } @Test diff --git a/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderTest.java b/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderTest.java index b7c331e..3061c6d 100644 --- a/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderTest.java +++ b/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxProviderTest.java @@ -34,7 +34,7 @@ public void setUp() { telemetry = mock(MailboxTelemetry.class); dispatcher = mock(Dispatcher.class); - telemetryMailboxProvider = new TelemetryMailboxProvider(telemetry, delegate); + telemetryMailboxProvider = new TelemetryMailboxProvider(telemetry, delegate, null); doReturn(delegateMailbox).when(delegate).provideMailboxFor(anyInt()); doReturn(delegateMailbox).when(delegate).provideMailboxFor(anyInt(), any()); diff --git a/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxTest.java b/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxTest.java index 5e9e799..8ee28f7 100644 --- a/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxTest.java +++ b/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMailboxTest.java @@ -30,7 +30,7 @@ public void setUp() { delegate = mock(Mailbox.class); message = mock(Message.class); - telemetryMailbox = new TelemetryMailbox(telemetry, delegate); + telemetryMailbox = new TelemetryMailbox(telemetry, delegate, null); } @Test diff --git a/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMessageTest.java b/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMessageTest.java index b0d3b0b..2168c02 100644 --- a/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMessageTest.java +++ b/src/test/java/io/vlingo/telemetry/plugin/mailbox/TelemetryMessageTest.java @@ -28,7 +28,7 @@ public void setUp() throws Exception { delegate = mock(Message.class); telemetry = mock(MailboxTelemetry.class); - telemetryMessage = new TelemetryMessage(delegate, telemetry); + telemetryMessage = new TelemetryMessage(delegate, telemetry, null); } @Test