diff --git a/servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpMessageDiscardWatchdogClientFilterTest.java b/servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpMessageDiscardWatchdogClientFilterTest.java index baeaf34152..7666e66313 100644 --- a/servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpMessageDiscardWatchdogClientFilterTest.java +++ b/servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpMessageDiscardWatchdogClientFilterTest.java @@ -57,6 +57,8 @@ final class HttpMessageDiscardWatchdogClientFilterTest { private static final Logger LOGGER = LoggerFactory.getLogger(HttpMessageDiscardWatchdogClientFilterTest.class); + private final LoggerStringWriter loggerStringWriter = new LoggerStringWriter(); + @RegisterExtension static final ExecutionContextExtension SERVER_CTX = ExecutionContextExtension.cached("server-io", "server-executor") @@ -68,12 +70,12 @@ final class HttpMessageDiscardWatchdogClientFilterTest { @BeforeEach public void setup() { - LoggerStringWriter.reset(); + loggerStringWriter.reset(); } @AfterEach public void tearDown() { - LoggerStringWriter.remove(); + loggerStringWriter.remove(); } /** @@ -132,7 +134,7 @@ protected Single request(final StreamingHttpRequester del } } - String output = LoggerStringWriter.stableAccumulated(1000); + String output = loggerStringWriter.stableAccumulated(1000); LOGGER.info("Logger output: {}", output); } } diff --git a/servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpMessageDiscardWatchdogServiceFilterTest.java b/servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpMessageDiscardWatchdogServiceFilterTest.java index 094ba1d38b..71c45eaf67 100644 --- a/servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpMessageDiscardWatchdogServiceFilterTest.java +++ b/servicetalk-http-netty/src/test/java/io/servicetalk/http/netty/HttpMessageDiscardWatchdogServiceFilterTest.java @@ -57,14 +57,16 @@ final class HttpMessageDiscardWatchdogServiceFilterTest { ExecutionContextExtension.cached("client-io", "client-executor") .setClassLevel(true); + private final LoggerStringWriter loggerStringWriter = new LoggerStringWriter(); + @BeforeEach public void setup() { - LoggerStringWriter.reset(); + loggerStringWriter.reset(); } @AfterEach public void tearDown() { - LoggerStringWriter.remove(); + loggerStringWriter.remove(); } @ParameterizedTest(name = "{displayName} [{index}] transformer={0}") @@ -91,7 +93,7 @@ public Single handle(final HttpServiceContext ctx, assertEquals(0, response.payloadBody().readableBytes()); } - String output = LoggerStringWriter.stableAccumulated(CI ? 5000 : 1000); + String output = loggerStringWriter.stableAccumulated(CI ? 5000 : 1000); if (!output.contains("Discovered un-drained HTTP response message body which " + "has been dropped by user code")) { throw new AssertionError("Logs didn't contain the expected output:\n" + output); diff --git a/servicetalk-log4j2-mdc-utils/src/testFixtures/java/io/servicetalk/log4j2/mdc/utils/LoggerStringWriter.java b/servicetalk-log4j2-mdc-utils/src/testFixtures/java/io/servicetalk/log4j2/mdc/utils/LoggerStringWriter.java index 7bad602250..0dab64ca97 100644 --- a/servicetalk-log4j2-mdc-utils/src/testFixtures/java/io/servicetalk/log4j2/mdc/utils/LoggerStringWriter.java +++ b/servicetalk-log4j2-mdc-utils/src/testFixtures/java/io/servicetalk/log4j2/mdc/utils/LoggerStringWriter.java @@ -25,11 +25,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; import java.io.StringWriter; +import java.io.Writer; import java.util.Map; +import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeoutException; -import javax.annotation.Nullable; import static java.lang.System.nanoTime; import static java.lang.Thread.currentThread; @@ -42,25 +44,24 @@ public final class LoggerStringWriter { private static final Logger LOGGER = LoggerFactory.getLogger(LoggerStringWriter.class); - private static final String APPENDER_NAME = "writer"; - @Nullable - private static StringWriter logStringWriter; - private LoggerStringWriter() { - // no instances. - } + // protected by synchronization on `this`. + private ConcurrentStringWriter writer; /** * Clear the content of the {@link #accumulated()}. + *

+ * Note that the underlying logger may be initialized by this method and it must always be + * followed up with a {@link #remove()} call at the end of tests to clean up logger state. */ - public static void reset() { - getStringWriter().getBuffer().setLength(0); + public void reset() { + getStringWriter().reset(); } /** * Remove the underlying in-memory log appender. */ - public static void remove() { + public void remove() { removeStringWriter(); } @@ -69,7 +70,7 @@ public static void remove() { * * @return the accumulated content that has been logged. */ - public static String accumulated() { + public String accumulated() { return getStringWriter().toString(); } @@ -83,7 +84,7 @@ public static String accumulated() { * @throws TimeoutException If the {@code totalWaitTimeMillis} duration has been exceeded and the * {@link #accumulated()} has not yet stabilize. */ - public static String stableAccumulated(int totalWaitTimeMillis) throws InterruptedException, TimeoutException { + public String stableAccumulated(int totalWaitTimeMillis) throws InterruptedException, TimeoutException { return stableAccumulated(totalWaitTimeMillis, 10); } @@ -98,7 +99,7 @@ public static String stableAccumulated(int totalWaitTimeMillis) throws Interrupt * @throws TimeoutException If the {@code totalWaitTimeMillis} duration has been exceeded and the * {@link #accumulated()} has not yet stabilize. */ - public static String stableAccumulated(int totalWaitTimeMillis, final long sleepDurationMs) + public String stableAccumulated(int totalWaitTimeMillis, final long sleepDurationMs) throws InterruptedException, TimeoutException { // We force a unique log entry, and wait for it to ensure the content from the local thread has been flushed. String forcedLogEntry = "forced log entry to help for flush on current thread " + @@ -157,29 +158,28 @@ public static void assertContainsMdcPair(String value, String expectedLabel, Str assertThat(value.substring(beginIndex, beginIndex + expectedValue.length()), is(expectedValue)); } - private static synchronized StringWriter getStringWriter() { - if (logStringWriter == null) { + private synchronized ConcurrentStringWriter getStringWriter() { + if (writer == null) { final LoggerContext context = (LoggerContext) LogManager.getContext(false); - logStringWriter = addWriterAppender(context, DEBUG); + writer = addWriterAppender(context, DEBUG); } - return logStringWriter; + return writer; } - private static synchronized void removeStringWriter() { - if (logStringWriter == null) { + private synchronized void removeStringWriter() { + if (writer == null) { return; } - removeWriterAppender((LoggerContext) LogManager.getContext(false)); - logStringWriter = null; + removeWriterAppender(writer, (LoggerContext) LogManager.getContext(false)); + writer = null; } - private static StringWriter addWriterAppender(final LoggerContext context, Level level) { + private static ConcurrentStringWriter addWriterAppender(final LoggerContext context, Level level) { final Configuration config = context.getConfiguration(); - final StringWriter writer = new StringWriter(); - + final ConcurrentStringWriter writer = new ConcurrentStringWriter(); final Map.Entry existing = config.getAppenders().entrySet().iterator().next(); final WriterAppender writerAppender = WriterAppender.newBuilder() - .setName(APPENDER_NAME) + .setName(writer.name) .setLayout(existing.getValue().getLayout()) .setTarget(writer) .build(); @@ -190,16 +190,58 @@ private static StringWriter addWriterAppender(final LoggerContext context, Level return writer; } - private static void removeWriterAppender(final LoggerContext context) { + private static void removeWriterAppender(ConcurrentStringWriter writer, final LoggerContext context) { final Configuration config = context.getConfiguration(); LoggerConfig rootConfig = config.getRootLogger(); // Stopping the logger is subject to race conditions where logging during cleanup on global executor // may still try to log and raise an error. - WriterAppender writerAppender = (WriterAppender) rootConfig.getAppenders().get(APPENDER_NAME); + WriterAppender writerAppender = (WriterAppender) rootConfig.getAppenders().get(writer.name); if (writerAppender != null) { writerAppender.stop(0, NANOSECONDS); } // Don't remove directly from map, because the root logger also cleans up filters. - rootConfig.removeAppender(APPENDER_NAME); + rootConfig.removeAppender(writer.name); + } + + // This is essentially just a thread safe `StringAppender` with a unique `String name` field to use + // as a map key. + private static final class ConcurrentStringWriter extends Writer { + + private static final String APPENDER_NAME_PREFIX = "writer"; + + private final StringWriter stringWriter = new StringWriter(); + + // We use uuid as a way to give the appender a unique name. We could try and do it with the current + // thread name but it's hard to say if that will be unique but it is certain to be ugly. + final String name = APPENDER_NAME_PREFIX + '_' + UUID.randomUUID(); + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + synchronized (stringWriter) { + stringWriter.write(cbuf, off, len); + } + } + + @Override + public void flush() { + // this is a no-op for `StringWriter` + } + + @Override + public void close() { + // this is a no-op for `StringWriter` + } + + @Override + public String toString() { + synchronized (stringWriter) { + return stringWriter.toString(); + } + } + + void reset() { + synchronized (stringWriter) { + stringWriter.getBuffer().setLength(0); + } + } } } diff --git a/servicetalk-opentelemetry-http/src/test/java/io/servicetalk/opentelemetry/http/OpenTelemetryHttpRequestFilterTest.java b/servicetalk-opentelemetry-http/src/test/java/io/servicetalk/opentelemetry/http/OpenTelemetryHttpRequestFilterTest.java index 48199f0c22..cd332e0b88 100755 --- a/servicetalk-opentelemetry-http/src/test/java/io/servicetalk/opentelemetry/http/OpenTelemetryHttpRequestFilterTest.java +++ b/servicetalk-opentelemetry-http/src/test/java/io/servicetalk/opentelemetry/http/OpenTelemetryHttpRequestFilterTest.java @@ -47,7 +47,6 @@ import static io.servicetalk.concurrent.api.Single.succeeded; import static io.servicetalk.http.netty.HttpClients.forSingleAddress; import static io.servicetalk.log4j2.mdc.utils.LoggerStringWriter.assertContainsMdcPair; -import static io.servicetalk.log4j2.mdc.utils.LoggerStringWriter.stableAccumulated; import static io.servicetalk.opentelemetry.http.TestUtils.SPAN_STATE_SERIALIZER; import static io.servicetalk.opentelemetry.http.TestUtils.TRACING_TEST_LOG_LINE_PREFIX; import static io.servicetalk.opentelemetry.http.TestUtils.TestTracingClientLoggerFilter; @@ -62,17 +61,19 @@ class OpenTelemetryHttpRequestFilterTest { private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + private final LoggerStringWriter loggerStringWriter = new LoggerStringWriter(); + @RegisterExtension static final OpenTelemetryExtension otelTesting = OpenTelemetryExtension.create(); @BeforeEach public void setup() { - LoggerStringWriter.reset(); + loggerStringWriter.reset(); } @AfterEach public void tearDown() { - LoggerStringWriter.remove(); + loggerStringWriter.remove(); } @Test @@ -86,7 +87,7 @@ void testInjectWithNoParent() throws Exception { HttpResponse response = client.request(client.get(requestUrl)).toFuture().get(); TestSpanState serverSpanState = response.payloadBody(SPAN_STATE_SERIALIZER); - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, serverSpanState.getTraceId(), serverSpanState.getSpanId(), TRACING_TEST_LOG_LINE_PREFIX); assertThat(otelTesting.getSpans()).hasSize(1); @@ -116,7 +117,7 @@ void testInjectWithAParent() throws Exception { HttpResponse response = client.request(client.get(requestUrl)).toFuture().get(); TestSpanState serverSpanState = response.payloadBody(SPAN_STATE_SERIALIZER); - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, serverSpanState.getTraceId(), serverSpanState.getSpanId(), TRACING_TEST_LOG_LINE_PREFIX); assertThat(otelTesting.getSpans()).hasSize(2); @@ -173,7 +174,7 @@ void testInjectWithAParentCreated() throws Exception { } finally { span.end(); } - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, serverSpanState.getTraceId(), serverSpanState.getSpanId(), TRACING_TEST_LOG_LINE_PREFIX); assertThat(otelTesting.getSpans()).hasSize(3); @@ -219,7 +220,7 @@ void testCaptureHeader() throws Exception { .addHeader("some-request-header", "request-header-value")).toFuture().get(); TestSpanState serverSpanState = response.payloadBody(SPAN_STATE_SERIALIZER); - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, serverSpanState.getTraceId(), serverSpanState.getSpanId(), TRACING_TEST_LOG_LINE_PREFIX); assertThat(otelTesting.getSpans()).hasSize(1); diff --git a/servicetalk-opentelemetry-http/src/test/java/io/servicetalk/opentelemetry/http/OpenTelemetryHttpServerFilterTest.java b/servicetalk-opentelemetry-http/src/test/java/io/servicetalk/opentelemetry/http/OpenTelemetryHttpServerFilterTest.java index 50eeff4f0f..39c8583a75 100644 --- a/servicetalk-opentelemetry-http/src/test/java/io/servicetalk/opentelemetry/http/OpenTelemetryHttpServerFilterTest.java +++ b/servicetalk-opentelemetry-http/src/test/java/io/servicetalk/opentelemetry/http/OpenTelemetryHttpServerFilterTest.java @@ -46,7 +46,6 @@ import static io.servicetalk.concurrent.api.Single.succeeded; import static io.servicetalk.http.netty.HttpClients.forSingleAddress; -import static io.servicetalk.log4j2.mdc.utils.LoggerStringWriter.stableAccumulated; import static io.servicetalk.opentelemetry.http.OpenTelemetryHttpRequestFilterTest.verifyTraceIdPresentInLogs; import static io.servicetalk.opentelemetry.http.TestUtils.SPAN_STATE_SERIALIZER; import static io.servicetalk.opentelemetry.http.TestUtils.TRACING_TEST_LOG_LINE_PREFIX; @@ -60,14 +59,16 @@ class OpenTelemetryHttpServerFilterTest { @RegisterExtension static final OpenTelemetryExtension otelTesting = OpenTelemetryExtension.create(); + private final LoggerStringWriter loggerStringWriter = new LoggerStringWriter(); + @BeforeEach public void setup() { - LoggerStringWriter.reset(); + loggerStringWriter.reset(); } @AfterEach public void tearDown() { - LoggerStringWriter.remove(); + loggerStringWriter.remove(); } @Test @@ -78,7 +79,7 @@ void testInjectWithNoParent() throws Exception { HttpResponse response = client.request(client.get(requestUrl)).toFuture().get(); TestSpanState serverSpanState = response.payloadBody(SPAN_STATE_SERIALIZER); - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, serverSpanState.getTraceId(), serverSpanState.getSpanId(), TRACING_TEST_LOG_LINE_PREFIX); assertThat(otelTesting.getSpans()).hasSize(1); @@ -125,7 +126,7 @@ void testInjectWithAParent() throws Exception { HttpResponse response = client.request(client.get(requestUrl)).toFuture().get(); TestSpanState serverSpanState = response.payloadBody(SPAN_STATE_SERIALIZER); - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, serverSpanState.getTraceId(), serverSpanState.getSpanId(), TRACING_TEST_LOG_LINE_PREFIX); assertThat(otelTesting.getSpans()).hasSize(2); @@ -176,7 +177,7 @@ void testInjectWithNewTrace() throws Exception { } finally { span.end(); } - verifyTraceIdPresentInLogs(stableAccumulated(1000), "/", + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), "/", serverSpanState.getTraceId(), serverSpanState.getSpanId(), TRACING_TEST_LOG_LINE_PREFIX); assertThat(otelTesting.getSpans()).hasSize(2); @@ -209,7 +210,7 @@ void testCaptureHeaders() throws Exception { .toFuture().get(); TestSpanState serverSpanState = response.payloadBody(SPAN_STATE_SERIALIZER); - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, serverSpanState.getTraceId(), serverSpanState.getSpanId(), TRACING_TEST_LOG_LINE_PREFIX); assertThat(otelTesting.getSpans()).hasSize(1); diff --git a/servicetalk-opentracing-http/src/test/java/io/servicetalk/opentracing/http/TracingHttpRequesterFilterTest.java b/servicetalk-opentracing-http/src/test/java/io/servicetalk/opentracing/http/TracingHttpRequesterFilterTest.java index a2fc46767e..883b95382f 100644 --- a/servicetalk-opentracing-http/src/test/java/io/servicetalk/opentracing/http/TracingHttpRequesterFilterTest.java +++ b/servicetalk-opentracing-http/src/test/java/io/servicetalk/opentracing/http/TracingHttpRequesterFilterTest.java @@ -58,7 +58,6 @@ import static io.servicetalk.http.api.HttpRequestMethod.GET; import static io.servicetalk.http.api.HttpResponseStatus.OK; import static io.servicetalk.http.netty.HttpClients.forSingleAddress; -import static io.servicetalk.log4j2.mdc.utils.LoggerStringWriter.stableAccumulated; import static io.servicetalk.opentracing.asynccontext.AsyncContextInMemoryScopeManager.SCOPE_MANAGER; import static io.servicetalk.opentracing.http.TestUtils.SPAN_STATE_SERIALIZER; import static io.servicetalk.opentracing.http.TestUtils.TRACING_TEST_LOG_LINE_PREFIX; @@ -87,18 +86,20 @@ class TracingHttpRequesterFilterTest { private static final Logger LOGGER = LoggerFactory.getLogger(TracingHttpRequesterFilterTest.class); + private final LoggerStringWriter loggerStringWriter = new LoggerStringWriter(); + @Mock private Tracer mockTracer; @BeforeEach public void setup() { initMocks(this); - LoggerStringWriter.reset(); + loggerStringWriter.reset(); } @AfterEach public void tearDown() { - LoggerStringWriter.remove(); + loggerStringWriter.remove(); } @Test @@ -130,8 +131,8 @@ void testInjectWithNoParent() throws Exception { assertEquals(OK.code(), lastFinishedSpan.tags().get(HTTP_STATUS.getKey())); assertFalse(lastFinishedSpan.tags().containsKey(ERROR.getKey())); - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, serverSpanState.traceId, - serverSpanState.spanId, null, TRACING_TEST_LOG_LINE_PREFIX); + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, + serverSpanState.traceId, serverSpanState.spanId, null, TRACING_TEST_LOG_LINE_PREFIX); } } } @@ -171,9 +172,9 @@ void testInjectWithParent() throws Exception { assertEquals(requestUrl, lastFinishedSpan.tags().get(HTTP_URL.getKey())); assertEquals(OK.code(), lastFinishedSpan.tags().get(HTTP_STATUS.getKey())); assertFalse(lastFinishedSpan.tags().containsKey(ERROR.getKey())); - - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, serverSpanState.traceId, - serverSpanState.spanId, serverSpanState.parentSpanId, TRACING_TEST_LOG_LINE_PREFIX); + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, + serverSpanState.traceId, serverSpanState.spanId, serverSpanState.parentSpanId, + TRACING_TEST_LOG_LINE_PREFIX); } finally { clientSpan.finish(); } diff --git a/servicetalk-opentracing-http/src/test/java/io/servicetalk/opentracing/http/TracingHttpServiceFilterTest.java b/servicetalk-opentracing-http/src/test/java/io/servicetalk/opentracing/http/TracingHttpServiceFilterTest.java index b1e03eb8f1..94deaa2f7a 100644 --- a/servicetalk-opentracing-http/src/test/java/io/servicetalk/opentracing/http/TracingHttpServiceFilterTest.java +++ b/servicetalk-opentracing-http/src/test/java/io/servicetalk/opentracing/http/TracingHttpServiceFilterTest.java @@ -56,7 +56,6 @@ import static io.servicetalk.http.api.HttpSerializers.textSerializerUtf8; import static io.servicetalk.http.netty.AsyncContextHttpFilterVerifier.verifyServerFilterAsyncContextVisibility; import static io.servicetalk.http.netty.HttpClients.forSingleAddress; -import static io.servicetalk.log4j2.mdc.utils.LoggerStringWriter.stableAccumulated; import static io.servicetalk.opentracing.asynccontext.AsyncContextInMemoryScopeManager.SCOPE_MANAGER; import static io.servicetalk.opentracing.http.TestUtils.SPAN_STATE_SERIALIZER; import static io.servicetalk.opentracing.http.TestUtils.TRACING_TEST_LOG_LINE_PREFIX; @@ -85,18 +84,20 @@ class TracingHttpServiceFilterTest { private static final Logger LOGGER = LoggerFactory.getLogger(TracingHttpServiceFilterTest.class); + private final LoggerStringWriter loggerStringWriter = new LoggerStringWriter(); + @Mock private Tracer mockTracer; @BeforeEach public void setup() { initMocks(this); - LoggerStringWriter.reset(); + loggerStringWriter.reset(); } @AfterEach public void tearDown() { - LoggerStringWriter.remove(); + loggerStringWriter.remove(); } private static ServerContext buildServer(CountingInMemorySpanEventListener spanListener) throws Exception { @@ -204,7 +205,7 @@ private void assertSpan(final CountingInMemorySpanEventListener spanListener, fi assertNull(lastFinishedSpan); } - verifyTraceIdPresentInLogs(stableAccumulated(1000), requestUrl, serverSpanState.traceId, + verifyTraceIdPresentInLogs(loggerStringWriter.stableAccumulated(1000), requestUrl, serverSpanState.traceId, serverSpanState.spanId, serverSpanState.parentSpanId, TRACING_TEST_LOG_LINE_PREFIX); } diff --git a/servicetalk-opentracing-log4j2/src/test/java/io/servicetalk/opentracing/log4j2/ServiceTalkTracingThreadContextMapTest.java b/servicetalk-opentracing-log4j2/src/test/java/io/servicetalk/opentracing/log4j2/ServiceTalkTracingThreadContextMapTest.java index d7d57eead3..0b1df80bb3 100644 --- a/servicetalk-opentracing-log4j2/src/test/java/io/servicetalk/opentracing/log4j2/ServiceTalkTracingThreadContextMapTest.java +++ b/servicetalk-opentracing-log4j2/src/test/java/io/servicetalk/opentracing/log4j2/ServiceTalkTracingThreadContextMapTest.java @@ -27,7 +27,6 @@ import org.slf4j.MDC; import static io.servicetalk.log4j2.mdc.utils.LoggerStringWriter.assertContainsMdcPair; -import static io.servicetalk.log4j2.mdc.utils.LoggerStringWriter.stableAccumulated; import static io.servicetalk.opentracing.asynccontext.AsyncContextInMemoryScopeManager.SCOPE_MANAGER; import static io.servicetalk.opentracing.internal.TracingIdUtils.idOrNullAsValue; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -36,14 +35,16 @@ class ServiceTalkTracingThreadContextMapTest { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceTalkTracingThreadContextMapTest.class); + private final LoggerStringWriter loggerStringWriter = new LoggerStringWriter(); + @BeforeEach public void setup() { - LoggerStringWriter.reset(); + loggerStringWriter.reset(); } @AfterEach public void tearDown() { - LoggerStringWriter.remove(); + loggerStringWriter.remove(); } @Test @@ -60,7 +61,7 @@ void tracingInfoDisplayedPresentInLogsViaMDC() throws Exception { tracer.activateSpan(span); LOGGER.debug("testing logging and MDC"); - String v = stableAccumulated(1000); + String v = loggerStringWriter.stableAccumulated(1000); assertContainsMdcPair(v, "traceId=", span.context().toTraceId()); assertContainsMdcPair(v, "spanId=", span.context().toSpanId()); assertContainsMdcPair(v, "parentSpanId=", idOrNullAsValue(span.context().parentSpanId()));