diff --git a/pkg/export/otel/traces_test.go b/pkg/export/otel/traces_test.go index ab4b53b0a..6d9cc7706 100644 --- a/pkg/export/otel/traces_test.go +++ b/pkg/export/otel/traces_test.go @@ -796,12 +796,12 @@ func TestTracesInstrumentations(t *testing.T) { { name: "all instrumentations", instr: []string{instrumentations.InstrumentationALL}, - expected: []string{"GET /foo", "PUT", "/grpcFoo", "/grpcGoo", "SELECT credentials", "SET", "GET", "important-topic publish", "important-topic process"}, + expected: []string{"GET /foo", "PUT /bar", "/grpcFoo", "/grpcGoo", "SELECT credentials", "SET", "GET", "important-topic publish", "important-topic process"}, }, { name: "http only", instr: []string{instrumentations.InstrumentationHTTP}, - expected: []string{"GET /foo", "PUT"}, + expected: []string{"GET /foo", "PUT /bar"}, }, { name: "grpc only", diff --git a/pkg/internal/request/span.go b/pkg/internal/request/span.go index 1b39df211..de548e56c 100644 --- a/pkg/internal/request/span.go +++ b/pkg/internal/request/span.go @@ -416,7 +416,7 @@ func (s *Span) ServiceGraphKind() string { func (s *Span) TraceName() string { switch s.Type { - case EventTypeHTTP: + case EventTypeHTTP, EventTypeHTTPClient: name := s.Method if s.Route != "" { name += " " + s.Route @@ -424,8 +424,6 @@ func (s *Span) TraceName() string { return name case EventTypeGRPC, EventTypeGRPCClient: return s.Path - case EventTypeHTTPClient: - return s.Method case EventTypeSQLClient: operation := s.Method if operation == "" { diff --git a/test/integration/components/jaeger/jaeger.go b/test/integration/components/jaeger/jaeger.go index c3dfa19a1..9169d117c 100644 --- a/test/integration/components/jaeger/jaeger.go +++ b/test/integration/components/jaeger/jaeger.go @@ -60,11 +60,14 @@ func (tq *TracesQuery) FindBySpan(tags ...Tag) []Trace { return matches } -func (t *Trace) FindByOperationName(operationName string) []Span { +func (t *Trace) FindByOperationName(operationName string, spanType string) []Span { var matches []Span for _, s := range t.Spans { if s.OperationName == operationName { - matches = append(matches, s) + tag, _ := FindIn(s.Tags, "span.kind") + if tag.Value == spanType { + matches = append(matches, s) + } } } return matches diff --git a/test/integration/components/jaeger/jaeger_test.go b/test/integration/components/jaeger/jaeger_test.go index 2991da747..1df94048a 100644 --- a/test/integration/components/jaeger/jaeger_test.go +++ b/test/integration/components/jaeger/jaeger_test.go @@ -17,8 +17,8 @@ func TestFind(t *testing.T) { Tag{Key: "http.target", Type: "string", Value: "/holanena"}) require.Len(t, traces, 1) trace := &traces[0] - assert.Empty(t, trace.FindByOperationName("hola")) - sp := trace.FindByOperationName("processing") + assert.Empty(t, trace.FindByOperationName("hola", "server")) + sp := trace.FindByOperationName("processing", "internal") require.Len(t, sp, 1) assert.Equal(t, "processing", sp[0].OperationName) parent, ok := trace.ParentOf(&sp[0]) diff --git a/test/integration/http2go_test.go b/test/integration/http2go_test.go index 669e735b0..45884c7e4 100644 --- a/test/integration/http2go_test.go +++ b/test/integration/http2go_test.go @@ -111,7 +111,7 @@ func testNestedHTTP2Traces(t *testing.T, url string) { }, test.Interval(100*time.Millisecond)) // Check the information of the python parent span - res := trace.FindByOperationName("GET /" + url) + res := trace.FindByOperationName("GET /"+url, "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -131,7 +131,7 @@ func testNestedHTTP2Traces(t *testing.T, url string) { assert.Empty(t, sd, sd.String()) // Check the information of the rails parent span - res = trace.FindByOperationName("GET") + res = trace.FindByOperationName("GET /"+url, "client") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) diff --git a/test/integration/http_go_otel_test.go b/test/integration/http_go_otel_test.go index 83641f9f5..ba15f930c 100644 --- a/test/integration/http_go_otel_test.go +++ b/test/integration/http_go_otel_test.go @@ -87,7 +87,7 @@ func testForHTTPGoOTelLibrary(t *testing.T, route, svcNs string) { }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res := trace.FindByOperationName("GET /" + slug) + res := trace.FindByOperationName("GET /"+slug, "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) diff --git a/test/integration/k8s/daemonset/k8s_daemonset_traces_test.go b/test/integration/k8s/daemonset/k8s_daemonset_traces_test.go index 81803c185..128084f86 100644 --- a/test/integration/k8s/daemonset/k8s_daemonset_traces_test.go +++ b/test/integration/k8s/daemonset/k8s_daemonset_traces_test.go @@ -62,7 +62,7 @@ func TestBasicTracing(t *testing.T) { } // Check the information of the parent span - res := trace.FindByOperationName("GET /pingpong") + res := trace.FindByOperationName("GET /pingpong", "server") require.Len(t, res, 1) parent := res[0] sd := jaeger.DiffAsRegexp([]jaeger.Tag{ @@ -136,7 +136,7 @@ func TestBasicTracing(t *testing.T) { } // Check the information of the parent span - res := trace.FindByOperationName("GET /pingpongtoo") + res := trace.FindByOperationName("GET /pingpongtoo", "server") require.Len(t, res, 1) parent := res[0] sd := jaeger.DiffAsRegexp([]jaeger.Tag{ diff --git a/test/integration/k8s/daemonset_multi_node/k8s_daemonset_multi_node_traces_test.go b/test/integration/k8s/daemonset_multi_node/k8s_daemonset_multi_node_traces_test.go index 365d750b4..caa7a89cd 100644 --- a/test/integration/k8s/daemonset_multi_node/k8s_daemonset_multi_node_traces_test.go +++ b/test/integration/k8s/daemonset_multi_node/k8s_daemonset_multi_node_traces_test.go @@ -56,7 +56,7 @@ func TestMultiNodeTracing(t *testing.T) { require.NotEmpty(t, trace.Spans) // Check the information of the parent span (Go app) - res := trace.FindByOperationName("GET /gotracemetoo") + res := trace.FindByOperationName("GET /gotracemetoo", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -68,14 +68,14 @@ func TestMultiNodeTracing(t *testing.T) { require.Empty(t, sd, sd.String()) // Check the information of the Python span - res = trace.FindByOperationName("GET /tracemetoo") + res = trace.FindByOperationName("GET /tracemetoo", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) require.Equal(t, traceID, parent.TraceID) // Check the information of the Ruby span - res = trace.FindByOperationName("GET /users") + res = trace.FindByOperationName("GET /users", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) diff --git a/test/integration/k8s/daemonset_multi_node_l7/k8s_daemonset_multi_node_traces_test.go b/test/integration/k8s/daemonset_multi_node_l7/k8s_daemonset_multi_node_traces_test.go index 757f1775c..2b06c94c4 100644 --- a/test/integration/k8s/daemonset_multi_node_l7/k8s_daemonset_multi_node_traces_test.go +++ b/test/integration/k8s/daemonset_multi_node_l7/k8s_daemonset_multi_node_traces_test.go @@ -56,7 +56,7 @@ func TestMultiNodeTracingL7(t *testing.T) { require.NotEmpty(t, trace.Spans) // Check the information of the parent span (Go app) - res := trace.FindByOperationName("GET /gotracemetoo") + res := trace.FindByOperationName("GET /gotracemetoo", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -68,14 +68,14 @@ func TestMultiNodeTracingL7(t *testing.T) { require.Empty(t, sd, sd.String()) // Check the information of the Python span - res = trace.FindByOperationName("GET /tracemetoo") + res = trace.FindByOperationName("GET /tracemetoo", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) require.Equal(t, traceID, parent.TraceID) // Check the information of the Ruby span - res = trace.FindByOperationName("GET /users") + res = trace.FindByOperationName("GET /users", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) diff --git a/test/integration/k8s/daemonset_python/k8s_daemonset_traces_test.go b/test/integration/k8s/daemonset_python/k8s_daemonset_traces_test.go index 325b9c48d..f2e97a710 100644 --- a/test/integration/k8s/daemonset_python/k8s_daemonset_traces_test.go +++ b/test/integration/k8s/daemonset_python/k8s_daemonset_traces_test.go @@ -48,7 +48,7 @@ func TestPythonBasicTracing(t *testing.T) { require.NotEmpty(t, trace.Spans) // Check the information of the parent span - res := trace.FindByOperationName("GET /greeting") + res := trace.FindByOperationName("GET /greeting", "server") require.Len(t, res, 1) parent := res[0] sd := jaeger.Diff([]jaeger.Tag{ @@ -103,7 +103,7 @@ func TestPythonBasicTracing(t *testing.T) { require.NotEmpty(t, trace.Spans) // Check the information of the parent span - res := trace.FindByOperationName("GET /smoke") + res := trace.FindByOperationName("GET /smoke", "server") require.Len(t, res, 1) parent := res[0] sd := jaeger.Diff([]jaeger.Tag{ diff --git a/test/integration/k8s/otel/k8s_otel_traces_test.go b/test/integration/k8s/otel/k8s_otel_traces_test.go index 0356b016a..def2d4c57 100644 --- a/test/integration/k8s/otel/k8s_otel_traces_test.go +++ b/test/integration/k8s/otel/k8s_otel_traces_test.go @@ -50,7 +50,7 @@ func TestTracesDecoration(t *testing.T) { // Check the K8s metadata information of the parent span's process trace = traces[0] - res := trace.FindByOperationName("GET /traced-ping") + res := trace.FindByOperationName("GET /traced-ping", "server") require.Len(t, res, 1) parent = res[0] diff --git a/test/integration/k8s/owners/k8s_daemonset_metadata_test.go b/test/integration/k8s/owners/k8s_daemonset_metadata_test.go index a5c8a2336..6b0e5fbf2 100644 --- a/test/integration/k8s/owners/k8s_daemonset_metadata_test.go +++ b/test/integration/k8s/owners/k8s_daemonset_metadata_test.go @@ -56,7 +56,7 @@ func TestDaemonSetMetadata(t *testing.T) { } // Check the information of the parent span - res := trace.FindByOperationName("GET /pingpong") + res := trace.FindByOperationName("GET /pingpong", "server") require.Len(t, res, 1) parent := res[0] sd := jaeger.DiffAsRegexp([]jaeger.Tag{ diff --git a/test/integration/k8s/owners/k8s_statefulset_metadata_test.go b/test/integration/k8s/owners/k8s_statefulset_metadata_test.go index 047ea1800..a1f1ad1cd 100644 --- a/test/integration/k8s/owners/k8s_statefulset_metadata_test.go +++ b/test/integration/k8s/owners/k8s_statefulset_metadata_test.go @@ -56,7 +56,7 @@ func TestStatefulSetMetadata(t *testing.T) { } // Check the information of the parent span - res := trace.FindByOperationName("GET /pingpong") + res := trace.FindByOperationName("GET /pingpong", "server") require.Len(t, res, 1) parent := res[0] sd := jaeger.DiffAsRegexp([]jaeger.Tag{ diff --git a/test/integration/old_grpc_test.go b/test/integration/old_grpc_test.go index 9c2c9c673..e654120b6 100644 --- a/test/integration/old_grpc_test.go +++ b/test/integration/old_grpc_test.go @@ -86,7 +86,7 @@ func testREDMetricsTracesForOldGRPCLibrary(t *testing.T, svcNs string) { }, test.Interval(100*time.Millisecond)) // Check the information of the python parent span - res := trace.FindByOperationName("GET /factorial/:rnd") + res := trace.FindByOperationName("GET /factorial/:rnd", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) diff --git a/test/integration/red_test_client.go b/test/integration/red_test_client.go index 926e40276..97e1087fd 100644 --- a/test/integration/red_test_client.go +++ b/test/integration/red_test_client.go @@ -69,7 +69,7 @@ func testClientWithMethodAndStatusCode(t *testing.T, method string, statusCode i trace = traces[0] }, test.Interval(100*time.Millisecond)) - spans := trace.FindByOperationName(method) + spans := trace.FindByOperationName(method, "server") require.Len(t, spans, 1) span := spans[0] diff --git a/test/integration/red_test_nodeclient.go b/test/integration/red_test_nodeclient.go index 51c261056..a85327f83 100644 --- a/test/integration/red_test_nodeclient.go +++ b/test/integration/red_test_nodeclient.go @@ -75,7 +75,7 @@ func testNodeClientWithMethodAndStatusCode(t *testing.T, method string, statusCo trace = traces[0] }, test.Interval(100*time.Millisecond)) - spans := trace.FindByOperationName(method) + spans := trace.FindByOperationName(method, "client") require.Len(t, spans, 1) span := spans[0] diff --git a/test/integration/red_test_rust.go b/test/integration/red_test_rust.go index 67101396e..6bbe8bf37 100644 --- a/test/integration/red_test_rust.go +++ b/test/integration/red_test_rust.go @@ -80,7 +80,7 @@ func testREDMetricsForRustHTTPLibrary(t *testing.T, url, comm, namespace string, }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res := trace.FindByOperationName("GET /trace") + res := trace.FindByOperationName("GET /trace", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) diff --git a/test/integration/traces_test.go b/test/integration/traces_test.go index e4986bfe2..5071275c4 100644 --- a/test/integration/traces_test.go +++ b/test/integration/traces_test.go @@ -62,7 +62,7 @@ func testHTTPTracesCommon(t *testing.T, doTraceID bool, httpCode int) { }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res := trace.FindByOperationName("GET /" + slug) + res := trace.FindByOperationName("GET /"+slug, "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -94,7 +94,7 @@ func testHTTPTracesCommon(t *testing.T, doTraceID bool, httpCode int) { } // Check the information of the "in queue" span - res = trace.FindByOperationName("in queue") + res = trace.FindByOperationName("in queue", "server") require.Len(t, res, 1) queue := res[0] // Check parenthood @@ -115,7 +115,7 @@ func testHTTPTracesCommon(t *testing.T, doTraceID bool, httpCode int) { assert.Empty(t, sd, sd.String()) // Check the information of the "processing" span - res = trace.FindByOperationName("processing") + res = trace.FindByOperationName("processing", "server") require.Len(t, res, 1) processing := res[0] // Check parenthood @@ -187,7 +187,7 @@ func testGRPCTracesForServiceName(t *testing.T, svcName string) { }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res := trace.FindByOperationName("/routeguide.RouteGuide/Debug") + res := trace.FindByOperationName("/routeguide.RouteGuide/Debug", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -205,7 +205,7 @@ func testGRPCTracesForServiceName(t *testing.T, svcName string) { assert.Empty(t, sd, sd.String()) // Check the information of the "in queue" span - res = trace.FindByOperationName("in queue") + res = trace.FindByOperationName("in queue", "server") require.Len(t, res, 1) queue := res[0] // Check parenthood @@ -225,7 +225,7 @@ func testGRPCTracesForServiceName(t *testing.T, svcName string) { assert.Empty(t, sd, sd.String()) // Check the information of the "processing" span - res = trace.FindByOperationName("processing") + res = trace.FindByOperationName("processing", "internal") require.Len(t, res, 1) processing := res[0] // Check parenthood @@ -276,7 +276,7 @@ func testGRPCTracesForServiceName(t *testing.T, svcName string) { }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res = trace.FindByOperationName("/routeguide.RouteGuide/ListFeatures") + res = trace.FindByOperationName("/routeguide.RouteGuide/ListFeatures", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) @@ -322,7 +322,7 @@ func testGRPCKProbeTraces(t *testing.T) { }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res := trace.FindByOperationName("/routeguide.RouteGuide/Debug") + res := trace.FindByOperationName("/routeguide.RouteGuide/Debug", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -366,7 +366,7 @@ func testHTTPTracesKProbes(t *testing.T) { }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res := trace.FindByOperationName("GET /bye") + res := trace.FindByOperationName("GET /bye", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -439,7 +439,7 @@ func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res := trace.FindByOperationName("GET /echo") + res := trace.FindByOperationName("GET /echo", "server") require.Len(t, res, 1) server := res[0] require.NotEmpty(t, server.TraceID) @@ -467,7 +467,7 @@ func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { } // Check the information of the "in queue" span - res = trace.FindByOperationName("in queue") + res = trace.FindByOperationName("in queue", "server") require.Equal(t, len(res), numNested) var queue *jaeger.Span @@ -492,7 +492,7 @@ func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { assert.Empty(t, sd, sd.String()) // Check the information of the "processing" span - res = trace.FindByOperationName("processing") + res = trace.FindByOperationName("processing", "internal") require.Equal(t, len(res), numNested) var processing *jaeger.Span @@ -516,8 +516,7 @@ func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { ) assert.Empty(t, sd, sd.String()) - // Check the information of the "processing" span - res = trace.FindByOperationName("GET") + res = trace.FindByOperationName("GET /echoBack", "client") require.Len(t, res, 1) client := res[0] // Check parenthood @@ -576,7 +575,7 @@ func testHTTP2GRPCTracesNestedCalls(t *testing.T, contextPropagation bool) { }, test.Interval(100*time.Millisecond)) // Check the information of the parent span - res := trace.FindByOperationName("GET /echoCall") + res := trace.FindByOperationName("GET /echoCall", "server") require.Len(t, res, 1) server := res[0] require.NotEmpty(t, server.TraceID) @@ -604,7 +603,7 @@ func testHTTP2GRPCTracesNestedCalls(t *testing.T, contextPropagation bool) { } // Check the information of the "in queue" span - res = trace.FindByOperationName("in queue") + res = trace.FindByOperationName("in queue", "internal") require.Equal(t, len(res), numNested) var queue *jaeger.Span @@ -629,7 +628,7 @@ func testHTTP2GRPCTracesNestedCalls(t *testing.T, contextPropagation bool) { assert.Empty(t, sd, sd.String()) // Check the information of the "processing" span - res = trace.FindByOperationName("processing") + res = trace.FindByOperationName("processing", "internal") require.Equal(t, len(res), numNested) var processing *jaeger.Span @@ -653,8 +652,7 @@ func testHTTP2GRPCTracesNestedCalls(t *testing.T, contextPropagation bool) { ) assert.Empty(t, sd, sd.String()) - // Check the information of the "processing" span - res = trace.FindByOperationName("/routeguide.RouteGuide/GetFeature") + res = trace.FindByOperationName("/routeguide.RouteGuide/GetFeature", "client") require.Len(t, res, numNested) for index := range res { grpc := res[index] @@ -731,7 +729,7 @@ func testNestedHTTPTracesKProbes(t *testing.T) { // Ensure all 5 traces have proper full chain for _, trace := range multipleTraces { // Check the information of the rust parent span - res := trace.FindByOperationName("GET /dist") + res := trace.FindByOperationName("GET /dist", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -751,7 +749,7 @@ func testNestedHTTPTracesKProbes(t *testing.T) { assert.Empty(t, sd, sd.String()) // Check the information of the java parent span - res = trace.FindByOperationName("GET /jtrace") + res = trace.FindByOperationName("GET /jtrace", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) @@ -771,7 +769,7 @@ func testNestedHTTPTracesKProbes(t *testing.T) { assert.Empty(t, sd, sd.String()) // Check the information of the nodejs parent span - res = trace.FindByOperationName("GET /traceme") + res = trace.FindByOperationName("GET /traceme", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) @@ -791,7 +789,7 @@ func testNestedHTTPTracesKProbes(t *testing.T) { assert.Empty(t, sd, sd.String()) // Check the information of the go parent span - res = trace.FindByOperationName("GET /gotracemetoo") + res = trace.FindByOperationName("GET /gotracemetoo", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) @@ -811,7 +809,7 @@ func testNestedHTTPTracesKProbes(t *testing.T) { assert.Empty(t, sd, sd.String()) // Check the information of the python parent span - res = trace.FindByOperationName("GET /tracemetoo") + res = trace.FindByOperationName("GET /tracemetoo", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) @@ -831,7 +829,7 @@ func testNestedHTTPTracesKProbes(t *testing.T) { assert.Empty(t, sd, sd.String()) // Check the information of the rails parent span - res = trace.FindByOperationName("GET /users") + res = trace.FindByOperationName("GET /users", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) @@ -880,7 +878,7 @@ func ensureTracesMatch(t *testing.T, urlPath string) { // Ensure all 5 traces have proper full chain Java -> Node for _, trace := range multipleTraces { // Check the information of the java parent span - res := trace.FindByOperationName("GET /" + urlPath) + res := trace.FindByOperationName("GET /"+urlPath, "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -900,7 +898,7 @@ func ensureTracesMatch(t *testing.T, urlPath string) { assert.Empty(t, sd, sd.String()) // Check the information of the nodejs parent span - res = trace.FindByOperationName("GET /traceme") + res = trace.FindByOperationName("GET /traceme", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID) @@ -946,7 +944,7 @@ func testNestedHTTPSTracesKProbes(t *testing.T) { }, test.Interval(100*time.Millisecond)) // Check the information of the python parent span - res := trace.FindByOperationName("GET /tracemetoo") + res := trace.FindByOperationName("GET /tracemetoo", "server") require.Len(t, res, 1) parent := res[0] require.NotEmpty(t, parent.TraceID) @@ -966,7 +964,7 @@ func testNestedHTTPSTracesKProbes(t *testing.T) { assert.Empty(t, sd, sd.String()) // Check the information of the rails parent span - res = trace.FindByOperationName("GET /users") + res = trace.FindByOperationName("GET /users", "server") require.Len(t, res, 1) parent = res[0] require.NotEmpty(t, parent.TraceID)