From 2e5172e3caec2d0dbe84ca9dba8b0d10671d8e33 Mon Sep 17 00:00:00 2001 From: "Michael A. Neilson" Date: Mon, 22 Jun 2026 17:59:31 +0000 Subject: [PATCH 1/6] Move to structured logging, with logback, for docker image, testing, and compose files. --- cwms-data-api/src/docker/logback-juli.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cwms-data-api/src/docker/logback-juli.xml b/cwms-data-api/src/docker/logback-juli.xml index fa337a1af..bcb9dfde6 100644 --- a/cwms-data-api/src/docker/logback-juli.xml +++ b/cwms-data-api/src/docker/logback-juli.xml @@ -21,9 +21,8 @@ - - + From b422ab4f4f4da73f3784d7feef6ee0b2704183a6 Mon Sep 17 00:00:00 2001 From: "Michael A. Neilson" Date: Mon, 22 Jun 2026 21:36:27 +0000 Subject: [PATCH 2/6] Initial OTEL span setup. --- cwms-data-api/build.gradle | 5 +++ cwms-data-api/logback.xml | 13 ++++++- .../src/main/java/cwms/cda/ApiServlet.java | 21 +++++++++- .../java/cwms/cda/OpenTelemetrySetup.java | 39 +++++++++++++++++++ gradle/libs.versions.toml | 9 +++++ 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java diff --git a/cwms-data-api/build.gradle b/cwms-data-api/build.gradle index 2b896e1cf..a6c642b78 100644 --- a/cwms-data-api/build.gradle +++ b/cwms-data-api/build.gradle @@ -147,6 +147,10 @@ dependencies { implementation project(":access-manager-api") implementation(libs.bundles.metrics) + implementation(libs.io.opentelemetry.api) + implementation(libs.io.opentelemetry.sdk) + implementation(libs.io.opentelemetry.exporter.logging) + implementation(libs.io.opentelemetry.instrumentation.java) implementation(libs.bundles.jackson) @@ -176,6 +180,7 @@ dependencies { } baseLibs(libs.ch.qos.logback) + baseLibs(libs.io.opentelemetry.instrumentation.logback.mdc) testImplementation(libs.bundles.testcontainers) diff --git a/cwms-data-api/logback.xml b/cwms-data-api/logback.xml index ea197d5a4..08f66f607 100644 --- a/cwms-data-api/logback.xml +++ b/cwms-data-api/logback.xml @@ -14,6 +14,11 @@ + + + + + false @@ -21,6 +26,10 @@ build/cda.jsonl + + + + @@ -36,8 +45,8 @@ - - + + diff --git a/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java b/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java index ab5e22faa..0998d8356 100644 --- a/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java +++ b/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java @@ -218,6 +218,18 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.exporter.logging.LoggingSpanExporter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; + import org.apache.http.entity.ContentType; import org.jetbrains.annotations.NotNull; import org.jooq.exception.DataAccessException; @@ -295,7 +307,7 @@ public class ApiServlet extends HttpServlet { public static final String DEFAULT_PROVIDER = "MultipleAccessManager"; - + private MetricRegistry metrics; private Meter totalRequests; @@ -322,6 +334,7 @@ public void destroy() { @Override public void init(ServletConfig config) throws ServletException { + OpenTelemetrySetup.initTelemetry(); if (VERSION == null) { ApiServlet.VERSION = obtainFullVersion(config); } @@ -982,6 +995,10 @@ private static void setSecurity(Operation op,List reqs) { protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { totalRequests.mark(); + Span span = GlobalOpenTelemetry.getTracer("cda") + .spanBuilder("Request") + .setSpanKind(SpanKind.SERVER) + .startSpan(); try { String office = officeFromContext(req.getContextPath()); req.setAttribute(OFFICE_ID, office); @@ -998,6 +1015,8 @@ protected void service(HttpServletRequest req, HttpServletResponse resp) ObjectMapper om = new ObjectMapper(); out.println(om.writeValueAsString(re)); } + } finally { + span.end(); } } diff --git a/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java b/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java new file mode 100644 index 000000000..bd636a4c9 --- /dev/null +++ b/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java @@ -0,0 +1,39 @@ +package cwms.cda; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.exporter.logging.LoggingSpanExporter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; + +public final class OpenTelemetrySetup { + private OpenTelemetrySetup() { + /* This utility class should not be instantiated */ + } + + /** + * Initializes the OpenTelemetry SDK with a logging span exporter and the W3C Trace Context + * propagator. + * + * @return A ready-to-use {@link OpenTelemetry} instance. + */ + static void initTelemetry() { + SdkTracerProvider sdkTracerProvider = + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter())) + .build(); + + OpenTelemetrySdk sdk = + OpenTelemetrySdk.builder() + .setTracerProvider(sdkTracerProvider) + .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) + .build(); + GlobalOpenTelemetry.set(sdk); + Runtime.getRuntime().addShutdownHook(new Thread(sdkTracerProvider::close)); + //return sdk; + } + +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 310a50feb..2b0214623 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,6 +39,9 @@ openapi-validation = "2.44.9" javaparser = "3.26.2" togglz = "3.3.3" minio = "8.6.0" +opentelemetry = "1.63.0" +opentelemetry-java = "2.29.0" +opentelemetry-java-logging = "2.29.0-alpha" #Overrides classgraph = { strictly = '4.8.176' } @@ -63,6 +66,12 @@ google-flogger-api = { module = "com.google.flogger:flogger", version.ref = "flo google-flogger-system-backend = { module = "com.google.flogger:flogger-system-backend", version.ref = "flogger" } google-flogger-slf4j-backend = { module = "com.google.flogger:flogger-slf4j-backend", version.ref = "flogger" } ch-qos-logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } +io-opentelemetry-instrumentation-logback-mdc = { module = "io.opentelemetry.instrumentation:opentelemetry-logback-mdc-1.0", version.ref = "opentelemetry-java-logging" } +io-opentelemetry-api = { module="io.opentelemetry:opentelemetry-api", version.ref = "opentelemetry" } +io-opentelemetry-sdk = { module="io.opentelemetry:opentelemetry-sdk", version.ref = "opentelemetry" } +io-opentelemetry-exporter-logging = { module="io.opentelemetry:opentelemetry-exporter-logging", version.ref="opentelemetry" } +io-opentelemetry-instrumentation-java = { module="io.opentelemetry.instrumentation:opentelemetry-instrumentation-api", version.ref = "opentelemetry-java" } + google-findbugs = { module = "com.google.code.findbugs:jsr305", version.ref = "google-findbugs" } google-errorProne = { module = "com.google.errorprone:error_prone_annotations", version.ref = "error_prone_annotations"} nucleus-data = { module = "mil.army.usace.hec:hec-nucleus-data", version.ref = "hec-nucleus" } From 81fd7a4ff65b343b804c00a5c6b216149c5363d6 Mon Sep 17 00:00:00 2001 From: "Michael A. Neilson" Date: Tue, 23 Jun 2026 17:36:58 +0000 Subject: [PATCH 3/6] Additional attempts to see the trace id. --- cwms-data-api/build.gradle | 1 + cwms-data-api/logback.xml | 2 +- cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cwms-data-api/build.gradle b/cwms-data-api/build.gradle index a6c642b78..32fb21049 100644 --- a/cwms-data-api/build.gradle +++ b/cwms-data-api/build.gradle @@ -332,6 +332,7 @@ task integrationTests(type: Test) { jvmArgs += "-Dcwms.dataapi.access.provider=MultipleAccessManager" jvmArgs += "-Dcwms.dataapi.access.providers=KeyAccessManager,CwmsAccessManager" jvmArgs += "-Dcatalina.base=$buildDir/tomcat" + //jvmArgs += "-Dflogger.backend_factory=com.google.common.flogger.backend.slf4j.Slf4jBackendFactory#getInstance" } task timeseriesReadBenchmark(type: JavaExec) { diff --git a/cwms-data-api/logback.xml b/cwms-data-api/logback.xml index 08f66f607..3771148fb 100644 --- a/cwms-data-api/logback.xml +++ b/cwms-data-api/logback.xml @@ -14,7 +14,7 @@ - + diff --git a/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java b/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java index bd636a4c9..68d30281f 100644 --- a/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java +++ b/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java @@ -23,7 +23,7 @@ private OpenTelemetrySetup() { static void initTelemetry() { SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() - .addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter())) + // .addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter())) .build(); OpenTelemetrySdk sdk = @@ -33,7 +33,7 @@ static void initTelemetry() { .build(); GlobalOpenTelemetry.set(sdk); Runtime.getRuntime().addShutdownHook(new Thread(sdkTracerProvider::close)); - //return sdk; + } } From fa277da2ebb367107b4e3ee3e2b2a39ced8d95ba Mon Sep 17 00:00:00 2001 From: "Michael A. Neilson" Date: Tue, 23 Jun 2026 22:07:48 +0000 Subject: [PATCH 4/6] client provided trace id propagates. --- .../src/main/java/cwms/cda/ApiServlet.java | 8 +- .../java/cwms/cda/OpenTelemetrySetup.java | 19 ++--- .../java/cwms/cda/servlet/TraceFilter.java | 73 +++++++++++++++++++ 3 files changed, 81 insertions(+), 19 deletions(-) create mode 100644 cwms-data-api/src/main/java/cwms/cda/servlet/TraceFilter.java diff --git a/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java b/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java index 0998d8356..e9e6a0915 100644 --- a/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java +++ b/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java @@ -223,6 +223,7 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.exporter.logging.LoggingSpanExporter; @@ -334,7 +335,6 @@ public void destroy() { @Override public void init(ServletConfig config) throws ServletException { - OpenTelemetrySetup.initTelemetry(); if (VERSION == null) { ApiServlet.VERSION = obtainFullVersion(config); } @@ -995,10 +995,6 @@ private static void setSecurity(Operation op,List reqs) { protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { totalRequests.mark(); - Span span = GlobalOpenTelemetry.getTracer("cda") - .spanBuilder("Request") - .setSpanKind(SpanKind.SERVER) - .startSpan(); try { String office = officeFromContext(req.getContextPath()); req.setAttribute(OFFICE_ID, office); @@ -1015,8 +1011,6 @@ protected void service(HttpServletRequest req, HttpServletResponse resp) ObjectMapper om = new ObjectMapper(); out.println(om.writeValueAsString(re)); } - } finally { - span.end(); } } diff --git a/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java b/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java index 68d30281f..000ec4373 100644 --- a/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java +++ b/cwms-data-api/src/main/java/cwms/cda/OpenTelemetrySetup.java @@ -1,13 +1,10 @@ package cwms.cda; -import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.trace.SdkTracerProvider; -import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; public final class OpenTelemetrySetup { private OpenTelemetrySetup() { @@ -20,18 +17,16 @@ private OpenTelemetrySetup() { * * @return A ready-to-use {@link OpenTelemetry} instance. */ - static void initTelemetry() { + @SuppressWarnings("null") // nothing here can be null without other exceptions getting thrown. + public static void initTelemetry() { SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() - // .addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter())) .build(); - - OpenTelemetrySdk sdk = - OpenTelemetrySdk.builder() - .setTracerProvider(sdkTracerProvider) - .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) - .build(); - GlobalOpenTelemetry.set(sdk); + + OpenTelemetrySdk.builder() + .setTracerProvider(sdkTracerProvider) + .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) + .buildAndRegisterGlobal(); Runtime.getRuntime().addShutdownHook(new Thread(sdkTracerProvider::close)); } diff --git a/cwms-data-api/src/main/java/cwms/cda/servlet/TraceFilter.java b/cwms-data-api/src/main/java/cwms/cda/servlet/TraceFilter.java new file mode 100644 index 000000000..7a53c93d2 --- /dev/null +++ b/cwms-data-api/src/main/java/cwms/cda/servlet/TraceFilter.java @@ -0,0 +1,73 @@ +package cwms.cda.servlet; + +import java.io.IOException; +import java.util.List; + +import javax.annotation.Nullable; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; + +import cwms.cda.OpenTelemetrySetup; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.ContextKey; +import io.opentelemetry.context.propagation.TextMapGetter; + +@WebFilter(urlPatterns = {"*"}) +public final class TraceFilter implements Filter { + + private static final ContextKey TRACE_PARENT = ContextKey.named("traceparent"); + + public TraceFilter() { + OpenTelemetrySetup.initTelemetry(); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + var spanBuilder = GlobalOpenTelemetry.getTracer("cda") + .spanBuilder("Request") + .setSpanKind(SpanKind.SERVER); + var provided = ((HttpServletRequest)request).getHeader(TRACE_PARENT.toString()); + if (provided != null && !provided.isEmpty()) { + var propagator = GlobalOpenTelemetry.getPropagators().getTextMapPropagator(); + var ctx = propagator.extract(Context.current(), provided, new TraceGetter()); + spanBuilder.setParent(ctx); + } + + var span = spanBuilder.startSpan(); + try (var scope = span.makeCurrent()) { + + chain.doFilter(request, response); + } finally { + span.end(); + } + + } + + private static class TraceGetter implements TextMapGetter + { + + @Override + public Iterable keys(String carrier) + { + return List.of(TRACE_PARENT.toString()); + } + + @Override + @Nullable + public String get(@Nullable String carrier, String key) { + if (TRACE_PARENT.toString().equalsIgnoreCase(key)) { + return carrier; + } else { + return null; + } + } + } +} From ecb40c44c6b7ec98eb3b8ba2cc377b1d759c974a Mon Sep 17 00:00:00 2001 From: "Michael A. Neilson" Date: Wed, 24 Jun 2026 13:27:09 +0000 Subject: [PATCH 5/6] Rename filter, validate use input. --- .../{TraceFilter.java => W3CTraceFilter.java} | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) rename cwms-data-api/src/main/java/cwms/cda/servlet/{TraceFilter.java => W3CTraceFilter.java} (76%) diff --git a/cwms-data-api/src/main/java/cwms/cda/servlet/TraceFilter.java b/cwms-data-api/src/main/java/cwms/cda/servlet/W3CTraceFilter.java similarity index 76% rename from cwms-data-api/src/main/java/cwms/cda/servlet/TraceFilter.java rename to cwms-data-api/src/main/java/cwms/cda/servlet/W3CTraceFilter.java index 7a53c93d2..3187da5d8 100644 --- a/cwms-data-api/src/main/java/cwms/cda/servlet/TraceFilter.java +++ b/cwms-data-api/src/main/java/cwms/cda/servlet/W3CTraceFilter.java @@ -2,7 +2,9 @@ import java.io.IOException; import java.util.List; +import java.util.regex.Pattern; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -19,12 +21,17 @@ import io.opentelemetry.context.ContextKey; import io.opentelemetry.context.propagation.TextMapGetter; +/** + * + */ @WebFilter(urlPatterns = {"*"}) -public final class TraceFilter implements Filter { +public final class W3CTraceFilter implements Filter { private static final ContextKey TRACE_PARENT = ContextKey.named("traceparent"); + public static final Pattern TRACE_PARENT_MATCHER = + Pattern.compile("[a-z0-9]{2}-[a-z0-9]{32}-[a-z0-9]{16}-[a-z0-9]{2}"); - public TraceFilter() { + public W3CTraceFilter() { OpenTelemetrySetup.initTelemetry(); } @@ -35,7 +42,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha .spanBuilder("Request") .setSpanKind(SpanKind.SERVER); var provided = ((HttpServletRequest)request).getHeader(TRACE_PARENT.toString()); - if (provided != null && !provided.isEmpty()) { + if (provided != null && !provided.isEmpty() && TRACE_PARENT_MATCHER.matcher(provided).matches()) { var propagator = GlobalOpenTelemetry.getPropagators().getTextMapPropagator(); var ctx = propagator.extract(Context.current(), provided, new TraceGetter()); spanBuilder.setParent(ctx); @@ -43,26 +50,26 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha var span = spanBuilder.startSpan(); try (var scope = span.makeCurrent()) { - chain.doFilter(request, response); } finally { span.end(); } - } + /** + * A simple wrapper to just get the value in the required way. + */ private static class TraceGetter implements TextMapGetter { - @Override - public Iterable keys(String carrier) + public Iterable keys(@Nonnull String carrier) { return List.of(TRACE_PARENT.toString()); } @Override @Nullable - public String get(@Nullable String carrier, String key) { + public String get(@Nullable String carrier, @Nonnull String key) { if (TRACE_PARENT.toString().equalsIgnoreCase(key)) { return carrier; } else { From d50a9839068d5122d5f8ea3a877087ec4df55742 Mon Sep 17 00:00:00 2001 From: "Michael A. Neilson" Date: Wed, 24 Jun 2026 13:47:27 +0000 Subject: [PATCH 6/6] add client usage to at least one test. --- .../src/main/java/cwms/cda/servlet/W3CTraceFilter.java | 2 +- .../cwms/cda/api/rating/RatingSpecControllerTestIT.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cwms-data-api/src/main/java/cwms/cda/servlet/W3CTraceFilter.java b/cwms-data-api/src/main/java/cwms/cda/servlet/W3CTraceFilter.java index 3187da5d8..1dc0b9c50 100644 --- a/cwms-data-api/src/main/java/cwms/cda/servlet/W3CTraceFilter.java +++ b/cwms-data-api/src/main/java/cwms/cda/servlet/W3CTraceFilter.java @@ -27,7 +27,7 @@ @WebFilter(urlPatterns = {"*"}) public final class W3CTraceFilter implements Filter { - private static final ContextKey TRACE_PARENT = ContextKey.named("traceparent"); + public static final ContextKey TRACE_PARENT = ContextKey.named("traceparent"); public static final Pattern TRACE_PARENT_MATCHER = Pattern.compile("[a-z0-9]{2}-[a-z0-9]{32}-[a-z0-9]{16}-[a-z0-9]{2}"); diff --git a/cwms-data-api/src/test/java/cwms/cda/api/rating/RatingSpecControllerTestIT.java b/cwms-data-api/src/test/java/cwms/cda/api/rating/RatingSpecControllerTestIT.java index 4e41a849e..6393fb4d6 100644 --- a/cwms-data-api/src/test/java/cwms/cda/api/rating/RatingSpecControllerTestIT.java +++ b/cwms-data-api/src/test/java/cwms/cda/api/rating/RatingSpecControllerTestIT.java @@ -39,6 +39,7 @@ import cwms.cda.data.dto.rating.RatingSpec; import cwms.cda.formatters.ContentType; import cwms.cda.formatters.Formats; +import cwms.cda.servlet.W3CTraceFilter; import javax.servlet.http.HttpServletResponse; import java.util.stream.IntStream; @@ -58,6 +59,7 @@ class RatingSpecControllerTestIT extends DataApiTestIT { @Test void test_empty_rating_spec() throws Exception { + final String TRACE_PARENT_VALUE = "00-f64a0407859e1a735c1a89c5c5b4f47f-09d07b8aaba94e49-01"; String locationId = "RatingSpecTestEmpty"; String officeId = "SPK"; createLocation(locationId, true, officeId); @@ -77,6 +79,7 @@ void test_empty_rating_spec() throws Exception { .contentType(Formats.XMLV2) .body(templateXml) .header("Authorization", user.toHeaderValue()) + .header(W3CTraceFilter.TRACE_PARENT.toString(), TRACE_PARENT_VALUE) .queryParam(OFFICE, officeId) .when() .redirects().follow(true) @@ -93,6 +96,7 @@ void test_empty_rating_spec() throws Exception { .contentType(Formats.XMLV2) .body(specXml) .header("Authorization", user.toHeaderValue()) + .header(W3CTraceFilter.TRACE_PARENT.toString(), TRACE_PARENT_VALUE) .queryParam(OFFICE, officeId) .when() .redirects().follow(true) @@ -110,6 +114,7 @@ void test_empty_rating_spec() throws Exception { .log().ifValidationFails(LogDetail.ALL,true) .accept(Formats.JSONV2) .queryParam(PAGE_SIZE, 500) + .header(W3CTraceFilter.TRACE_PARENT.toString(), TRACE_PARENT_VALUE) .when() .redirects().follow(true) .redirects().max(3) @@ -129,6 +134,7 @@ void test_empty_rating_spec() throws Exception { .contentType(Formats.JSONV2) .queryParam(OFFICE, officeId) .queryParam(RATING_ID_MASK, specContainer.specId) + .header(W3CTraceFilter.TRACE_PARENT.toString(), TRACE_PARENT_VALUE) .when() .redirects().follow(true) .redirects().max(3) @@ -148,6 +154,7 @@ void test_empty_rating_spec() throws Exception { .header("Authorization", user.toHeaderValue()) .queryParam(OFFICE, officeId) .queryParam(METHOD, JooqDao.DeleteMethod.DELETE_ALL) + .header(W3CTraceFilter.TRACE_PARENT.toString(), TRACE_PARENT_VALUE) .when() .redirects().follow(true) .redirects().max(3)