From 3d92cd2337898ea208c554947d064ae0e2f476b6 Mon Sep 17 00:00:00 2001 From: Nikita Salnikov-Tarnovski Date: Mon, 25 Oct 2021 23:44:02 +0300 Subject: [PATCH] Add javadoc to ServletContextPath method (#4484) * Add javadoc to ServletContextPath method * Normalise span name and add test * Update instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPathTest.java Co-authored-by: Lauri Tulmin Co-authored-by: Lauri Tulmin --- .../api/servlet/ServletContextPath.java | 11 ++++- .../api/servlet/ServletContextPathTest.java | 47 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPathTest.java diff --git a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPath.java b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPath.java index 188ed1a89e..749db03284 100644 --- a/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPath.java +++ b/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPath.java @@ -50,12 +50,21 @@ public final class ServletContextPath { this.contextPath = contextPath; } + /** + * Returns a concatenation of a servlet context path stored in the given {@code context} and a + * given {@code spanName}. If there is no servlet path stored in the context, returns {@code + * spanName}. + */ public static String prepend(Context context, String spanName) { ServletContextPath servletContextPath = context.get(CONTEXT_KEY); if (servletContextPath != null) { String value = servletContextPath.contextPath; if (value != null) { - return value + spanName; + if (spanName == null || spanName.isEmpty()) { + return value; + } else { + return value + (spanName.startsWith("/") ? spanName : ("/" + spanName)); + } } } diff --git a/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPathTest.java b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPathTest.java new file mode 100644 index 0000000000..01641c4e57 --- /dev/null +++ b/instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/servlet/ServletContextPathTest.java @@ -0,0 +1,47 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.api.servlet; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.context.Context; +import org.junit.jupiter.api.Test; + +public class ServletContextPathTest { + + @Test + public void shouldAddSlashBetweenContextAndSpanName() { + Context contextWithEmptyPath = ServletContextPath.init(Context.root(), p -> p, ""); + Context contextWithPath = ServletContextPath.init(Context.root(), p -> p, "/context"); + + assertThat(ServletContextPath.prepend(contextWithEmptyPath, "spanName")).isEqualTo("spanName"); + assertThat(ServletContextPath.prepend(contextWithPath, "spanName")) + .isEqualTo("/context/spanName"); + } + + @Test + public void shouldNotResultInDuplicateSlash() { + Context contextWithEmptyPath = ServletContextPath.init(Context.root(), p -> p, ""); + Context contextWithPath = ServletContextPath.init(Context.root(), p -> p, "/context"); + + assertThat(ServletContextPath.prepend(contextWithEmptyPath, "/spanName")) + .isEqualTo("/spanName"); + assertThat(ServletContextPath.prepend(contextWithPath, "/spanName")) + .isEqualTo("/context/spanName"); + } + + @Test + public void shouldIgnoreEmptySpanName() { + Context contextWithEmptyPath = ServletContextPath.init(Context.root(), p -> p, ""); + Context contextWithPath = ServletContextPath.init(Context.root(), p -> p, "/context"); + + assertThat(ServletContextPath.prepend(contextWithEmptyPath, "")).isEqualTo(""); + assertThat(ServletContextPath.prepend(contextWithPath, "")).isEqualTo("/context"); + + assertThat(ServletContextPath.prepend(contextWithEmptyPath, null)).isEqualTo(null); + assertThat(ServletContextPath.prepend(contextWithPath, null)).isEqualTo("/context"); + } +}