diff --git a/modules/caddyhttp/tracing/module_test.go b/modules/caddyhttp/tracing/module_test.go
index 0fbc05bbd..2a775fc18 100644
--- a/modules/caddyhttp/tracing/module_test.go
+++ b/modules/caddyhttp/tracing/module_test.go
@@ -98,7 +98,7 @@ func TestTracing_ServeHTTP_Propagation_Without_Initial_Headers(t *testing.T) {
 		SpanName: "mySpan",
 	}
 
-	req := httptest.NewRequest("GET", "https://example.com/foo", nil)
+	req := createRequestWithContext("GET", "https://example.com/foo")
 	w := httptest.NewRecorder()
 
 	var handler caddyhttp.HandlerFunc = func(writer http.ResponseWriter, request *http.Request) error {
@@ -128,7 +128,7 @@ func TestTracing_ServeHTTP_Propagation_With_Initial_Headers(t *testing.T) {
 		SpanName: "mySpan",
 	}
 
-	req := httptest.NewRequest("GET", "https://example.com/foo", nil)
+	req := createRequestWithContext("GET", "https://example.com/foo")
 	req.Header.Set("traceparent", "00-11111111111111111111111111111111-1111111111111111-01")
 	w := httptest.NewRecorder()
 
@@ -159,7 +159,7 @@ func TestTracing_ServeHTTP_Next_Error(t *testing.T) {
 		SpanName: "mySpan",
 	}
 
-	req := httptest.NewRequest("GET", "https://example.com/foo", nil)
+	req := createRequestWithContext("GET", "https://example.com/foo")
 	w := httptest.NewRecorder()
 
 	expectErr := errors.New("test error")
@@ -180,3 +180,11 @@ func TestTracing_ServeHTTP_Next_Error(t *testing.T) {
 		t.Errorf("expected error, got: %v", err)
 	}
 }
+
+func createRequestWithContext(method string, url string) *http.Request {
+	r, _ := http.NewRequest(method, url, nil)
+	repl := caddy.NewReplacer()
+	ctx := context.WithValue(r.Context(), caddy.ReplacerCtxKey, repl)
+	r = r.WithContext(ctx)
+	return r
+}
diff --git a/modules/caddyhttp/tracing/tracer.go b/modules/caddyhttp/tracing/tracer.go
index ddb01e82f..e5c510732 100644
--- a/modules/caddyhttp/tracing/tracer.go
+++ b/modules/caddyhttp/tracing/tracer.go
@@ -69,7 +69,13 @@ func newOpenTelemetryWrapper(
 		sdktrace.WithResource(res),
 	)
 
-	ot.handler = otelhttp.NewHandler(http.HandlerFunc(ot.serveHTTP), ot.spanName, otelhttp.WithTracerProvider(tracerProvider), otelhttp.WithPropagators(ot.propagators))
+	ot.handler = otelhttp.NewHandler(http.HandlerFunc(ot.serveHTTP),
+		ot.spanName,
+		otelhttp.WithTracerProvider(tracerProvider),
+		otelhttp.WithPropagators(ot.propagators),
+		otelhttp.WithSpanNameFormatter(ot.spanNameFormatter),
+	)
+
 	return ot, nil
 }
 
@@ -106,3 +112,8 @@ func (ot *openTelemetryWrapper) newResource(
 		semconv.WebEngineVersionKey.String(webEngineVersion),
 	))
 }
+
+// spanNameFormatter performs the replacement of placeholders in the span name
+func (ot *openTelemetryWrapper) spanNameFormatter(operation string, r *http.Request) string {
+	return r.Context().Value(caddy.ReplacerCtxKey).(*caddy.Replacer).ReplaceAll(operation, "")
+}