From cbae177707e609436dd331e36135de5cd1279c37 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 26 May 2026 11:22:06 -0400 Subject: [PATCH 01/33] debug logs --- contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go | 1 + contrib/cloud.google.com/go/pubsubtrace/tracing.go | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go index b73ece2e05e..dc36398b4b0 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go @@ -64,6 +64,7 @@ func TestPropagation(t *testing.T) { assert.NoError(err) spans := mt.FinishedSpans() + fmt.Printf("spans: %+v", spans) assert.Len(spans, 3, "wrong number of spans") assert.Equal("pubsub.publish", spans[0].OperationName()) assert.Equal("propagation-test", spans[1].OperationName()) diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index c640d0b1264..ba8ef2bc5b1 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -14,6 +14,7 @@ package pubsubtrace import ( "context" + "log" "sync" "time" @@ -79,6 +80,7 @@ func (tr *Tracer) TracePublish(ctx context.Context, topic Topic, msg *Message, o if msg.Attributes == nil { msg.Attributes = make(map[string]string) } + log.Printf("inject publish context: %+v\n\nusing span ID: %v", span.Context(), span.Context().SpanID()) if err := tracer.Inject(span.Context(), tracer.TextMapCarrier(msg.Attributes)); err != nil { tr.instr.Logger().Debug("contrib/cloud.google.com/go/pubsubtrace: failed injecting tracing attributes: %s", err.Error()) } @@ -101,7 +103,11 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont } tr.instr.Logger().Debug("contrib/cloud.google.com/go/pubsubtrace: Wrapping Receive Handler: %#v", cfg) return func(ctx context.Context, msg *Message) (context.Context, func()) { - parentSpanCtx, _ := tracer.Extract(tracer.TextMapCarrier(msg.Attributes)) + log.Printf("extracting parent context") + parentSpanCtx, err := tracer.Extract(tracer.TextMapCarrier(msg.Attributes)) + if err != nil { + log.Printf("error extracting parent ctx: %s", err.Error()) + } opts := []tracer.StartSpanOption{ tracer.ResourceName(s.String()), tracer.SpanType(ext.SpanTypeMessageConsumer), From 33560e9a1cfd86a852316f45df0b67c3097c976f Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Fri, 29 May 2026 15:21:51 -0400 Subject: [PATCH 02/33] push subscriptions w hardcoded values --- instrumentation/httptrace/httptrace.go | 22 +++++++ instrumentation/httptrace/inferred_proxy.go | 68 +++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/instrumentation/httptrace/httptrace.go b/instrumentation/httptrace/httptrace.go index e13bb7443ae..760f8375bc7 100644 --- a/instrumentation/httptrace/httptrace.go +++ b/instrumentation/httptrace/httptrace.go @@ -74,8 +74,12 @@ func StartRequestSpan(r *http.Request, opts ...tracer.StartSpanOption) (*tracer. requestProxyContext, err := extractInferredProxyContext(r.Header) if err != nil { log.Debug("%s\n", err.Error()) + + // try to do pubsub infered span here } else { // TODO: Baggage? + + // TODO refactor into a function spanParentCtx, spanParentErr := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) if spanParentErr == nil { if spanParentCtx != nil && spanParentCtx.SpanLinks() != nil { @@ -83,8 +87,26 @@ func StartRequestSpan(r *http.Request, opts ...tracer.StartSpanOption) (*tracer. } } inferredProxySpan = startInferredProxySpan(requestProxyContext, spanParentCtx, inferredStartSpanOpts...) + inferredProxySpanCreated = true } } + + if !inferredProxySpanCreated { + var inferredStartSpanOpts []tracer.StartSpanOption + pubsubSpanContext, err := extractInferredPubsubSpan(r.Header) + if err != nil { + log.Debug("%s\n", err.Error()) + } else { + spanParentCtx, spanParentErr := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) + if spanParentErr == nil { + if spanParentCtx != nil && spanParentCtx.SpanLinks() != nil { + inferredStartSpanOpts = append(inferredStartSpanOpts, tracer.WithSpanLinks(spanParentCtx.SpanLinks())) + } + } + inferredProxySpan = startInferredPubsubSpan(pubsubSpanContext, spanParentCtx, inferredStartSpanOpts...) + } + + } } parentCtx, extractErr := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index ab39ef532af..a46f9aaa060 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -55,6 +55,9 @@ const ( // AWS API Gateway, and provides the stage (e.g., dev, prod, etc.) // in which the request is being processed. ProxyHeaderStage = "X-Dd-Proxy-Stage" + + PubsubHeaderSubscriptionName = "X-Goog-Pubsub-Subscription-Name" + PubsubHeaderMessageId = "X-Goog-Pubsub-Message-Id" ) type proxyDetails struct { @@ -71,12 +74,21 @@ type proxyContext struct { proxySystemName string } +type pubsubContext struct { + subscriptionName string + messageId string +} + var ( supportedProxies = map[string]proxyDetails{ "aws-apigateway": { spanName: "aws.apigateway", component: "aws-apigateway", }, + "gcp-pubsub": { + spanName: "gcp.pubsub", + component: "gcp-pubsub", + }, } ) @@ -151,3 +163,59 @@ func startInferredProxySpan(requestProxyContext *proxyContext, parent *tracer.Sp return span } + +func extractInferredPubsubSpan(headers http.Header) (*pubsubContext, error) { + _, ok := headers[PubsubHeaderSubscriptionName] + if _, ok := headers[PubsubHeaderSubscriptionName]; !ok { + return nil, errors.New("pubsub header subscription name does not exist") + } + + if _, ok = headers[PubsubHeaderMessageId]; !ok { + return nil, errors.New("pubsub header message Id does not exist") + } + + return &pubsubContext{ + subscriptionName: headers.Get(PubsubHeaderSubscriptionName), + messageId: headers.Get(PubsubHeaderMessageId), + }, nil +} + +func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanContext, opts ...tracer.StartSpanOption) *tracer.Span { + proxySpanInfo := supportedProxies["gcp-pubsub"] + log.Debug(`Successfully extracted inferred span info ${proxyContext} for proxy: ${proxyContext.proxySystemName}`) + + // startTime := requestProxyContext.startTime + + configService := "domainName" + if configService == "" { + configService = globalconfig.ServiceName() + } + + optsLocal := make([]tracer.StartSpanOption, len(opts), len(opts)+1) + copy(optsLocal, opts) + + optsLocal = append(optsLocal, + func(cfg *tracer.StartSpanConfig) { + if cfg.Tags == nil { + cfg.Tags = make(map[string]any) + } + + cfg.Parent = parent + // cfg.StartTime = startTime + + cfg.Tags[ext.SpanType] = ext.SpanTypeWeb + cfg.Tags[ext.ServiceName] = configService + cfg.Tags[ext.Component] = proxySpanInfo.component + cfg.Tags[ext.HTTPMethod] = "GET" + cfg.Tags[ext.HTTPURL] = "httpUrl" + cfg.Tags[ext.HTTPRoute] = "httpRoute" + cfg.Tags[ext.ResourceName] = "resourceName" + cfg.Tags["_dd.inferred_span"] = 1 + cfg.Tags["stage"] = "stage" + }, + ) + + span := tracer.StartSpan(proxySpanInfo.spanName, optsLocal...) + + return span +} From eb5b0f54f48ad98c622e45b7c590d03cdbde6119 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 1 Jun 2026 15:05:04 -0400 Subject: [PATCH 03/33] update push subscriptions tags --- .../go/pubsub.v2/pubsub_test.go | 1 - .../go/pubsubtrace/tracing.go | 8 +-- instrumentation/httptrace/httptrace.go | 38 +------------ instrumentation/httptrace/inferred_proxy.go | 54 ++++++++++++++----- 4 files changed, 42 insertions(+), 59 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go index dc36398b4b0..b73ece2e05e 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go @@ -64,7 +64,6 @@ func TestPropagation(t *testing.T) { assert.NoError(err) spans := mt.FinishedSpans() - fmt.Printf("spans: %+v", spans) assert.Len(spans, 3, "wrong number of spans") assert.Equal("pubsub.publish", spans[0].OperationName()) assert.Equal("propagation-test", spans[1].OperationName()) diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index ba8ef2bc5b1..c640d0b1264 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -14,7 +14,6 @@ package pubsubtrace import ( "context" - "log" "sync" "time" @@ -80,7 +79,6 @@ func (tr *Tracer) TracePublish(ctx context.Context, topic Topic, msg *Message, o if msg.Attributes == nil { msg.Attributes = make(map[string]string) } - log.Printf("inject publish context: %+v\n\nusing span ID: %v", span.Context(), span.Context().SpanID()) if err := tracer.Inject(span.Context(), tracer.TextMapCarrier(msg.Attributes)); err != nil { tr.instr.Logger().Debug("contrib/cloud.google.com/go/pubsubtrace: failed injecting tracing attributes: %s", err.Error()) } @@ -103,11 +101,7 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont } tr.instr.Logger().Debug("contrib/cloud.google.com/go/pubsubtrace: Wrapping Receive Handler: %#v", cfg) return func(ctx context.Context, msg *Message) (context.Context, func()) { - log.Printf("extracting parent context") - parentSpanCtx, err := tracer.Extract(tracer.TextMapCarrier(msg.Attributes)) - if err != nil { - log.Printf("error extracting parent ctx: %s", err.Error()) - } + parentSpanCtx, _ := tracer.Extract(tracer.TextMapCarrier(msg.Attributes)) opts := []tracer.StartSpanOption{ tracer.ResourceName(s.String()), tracer.SpanType(ext.SpanTypeMessageConsumer), diff --git a/instrumentation/httptrace/httptrace.go b/instrumentation/httptrace/httptrace.go index 760f8375bc7..46425eb0b9d 100644 --- a/instrumentation/httptrace/httptrace.go +++ b/instrumentation/httptrace/httptrace.go @@ -69,43 +69,7 @@ func StartRequestSpan(r *http.Request, opts ...tracer.StartSpanOption) (*tracer. } if !inferredProxySpanCreated { - var inferredStartSpanOpts []tracer.StartSpanOption - - requestProxyContext, err := extractInferredProxyContext(r.Header) - if err != nil { - log.Debug("%s\n", err.Error()) - - // try to do pubsub infered span here - } else { - // TODO: Baggage? - - // TODO refactor into a function - spanParentCtx, spanParentErr := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) - if spanParentErr == nil { - if spanParentCtx != nil && spanParentCtx.SpanLinks() != nil { - inferredStartSpanOpts = append(inferredStartSpanOpts, tracer.WithSpanLinks(spanParentCtx.SpanLinks())) - } - } - inferredProxySpan = startInferredProxySpan(requestProxyContext, spanParentCtx, inferredStartSpanOpts...) - inferredProxySpanCreated = true - } - } - - if !inferredProxySpanCreated { - var inferredStartSpanOpts []tracer.StartSpanOption - pubsubSpanContext, err := extractInferredPubsubSpan(r.Header) - if err != nil { - log.Debug("%s\n", err.Error()) - } else { - spanParentCtx, spanParentErr := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) - if spanParentErr == nil { - if spanParentCtx != nil && spanParentCtx.SpanLinks() != nil { - inferredStartSpanOpts = append(inferredStartSpanOpts, tracer.WithSpanLinks(spanParentCtx.SpanLinks())) - } - } - inferredProxySpan = startInferredPubsubSpan(pubsubSpanContext, spanParentCtx, inferredStartSpanOpts...) - } - + inferredProxySpan = startInferredSpanFromHeaders(r.Header) } } diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index a46f9aaa060..eb6ebdf9123 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -10,6 +10,7 @@ import ( "fmt" "net/http" "strconv" + "strings" "time" "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" @@ -164,13 +165,34 @@ func startInferredProxySpan(requestProxyContext *proxyContext, parent *tracer.Sp return span } +func startInferredSpanFromHeaders(headers http.Header) *tracer.Span { + spanParentCtx, _ := tracer.Extract(tracer.HTTPHeadersCarrier(headers)) + var inferredStartSpanOpts []tracer.StartSpanOption + if spanParentCtx != nil && spanParentCtx.SpanLinks() != nil { + inferredStartSpanOpts = append(inferredStartSpanOpts, tracer.WithSpanLinks(spanParentCtx.SpanLinks())) + } + + requestProxyContext, err := extractInferredProxyContext(headers) + if err == nil { + return startInferredProxySpan(requestProxyContext, spanParentCtx, inferredStartSpanOpts...) + } + log.Debug("%s\n", err.Error()) + + pubsubSpanContext, pubsubErr := extractInferredPubsubSpan(headers) + if pubsubErr == nil { + return startInferredPubsubSpan(pubsubSpanContext, spanParentCtx, inferredStartSpanOpts...) + } + log.Debug("%s\n", pubsubErr.Error()) + + return nil +} + func extractInferredPubsubSpan(headers http.Header) (*pubsubContext, error) { - _, ok := headers[PubsubHeaderSubscriptionName] if _, ok := headers[PubsubHeaderSubscriptionName]; !ok { return nil, errors.New("pubsub header subscription name does not exist") } - if _, ok = headers[PubsubHeaderMessageId]; !ok { + if _, ok := headers[PubsubHeaderMessageId]; !ok { return nil, errors.New("pubsub header message Id does not exist") } @@ -179,13 +201,10 @@ func extractInferredPubsubSpan(headers http.Header) (*pubsubContext, error) { messageId: headers.Get(PubsubHeaderMessageId), }, nil } - func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanContext, opts ...tracer.StartSpanOption) *tracer.Span { proxySpanInfo := supportedProxies["gcp-pubsub"] log.Debug(`Successfully extracted inferred span info ${proxyContext} for proxy: ${proxyContext.proxySystemName}`) - // startTime := requestProxyContext.startTime - configService := "domainName" if configService == "" { configService = globalconfig.ServiceName() @@ -200,18 +219,25 @@ func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanCon cfg.Tags = make(map[string]any) } - cfg.Parent = parent - // cfg.StartTime = startTime + // subscription name is formatted as projects/{project_id}/subscriptions/{sub_id} + parts := strings.Split(pubsubContex.subscriptionName, "/") + projectId := parts[1] + subId := parts[3] - cfg.Tags[ext.SpanType] = ext.SpanTypeWeb + cfg.Parent = parent + cfg.Tags[ext.SpanType] = ext.SpanTypeMessageConsumer + cfg.Tags[ext.SpanName] = "pubsub.receive" cfg.Tags[ext.ServiceName] = configService - cfg.Tags[ext.Component] = proxySpanInfo.component - cfg.Tags[ext.HTTPMethod] = "GET" - cfg.Tags[ext.HTTPURL] = "httpUrl" - cfg.Tags[ext.HTTPRoute] = "httpRoute" - cfg.Tags[ext.ResourceName] = "resourceName" + cfg.Tags[ext.Component] = "cloud.google.com/go/pubsub" + cfg.Tags[ext.ResourceName] = pubsubContex.subscriptionName + cfg.Tags[ext.SpanKind] = ext.SpanKindConsumer + cfg.Tags[ext.MessagingDestinationName] = subId + cfg.Tags["messaging.operation"] = "receive" + cfg.Tags["messaging.message_id"] = pubsubContex.messageId + cfg.Tags["message_id"] = pubsubContex.messageId // duplicate to align with existing pubsub tags for pull subscriptions + cfg.Tags["gcloud.project_id"] = projectId + cfg.Tags[ext.MessagingSystem] = "googlepubsub" cfg.Tags["_dd.inferred_span"] = 1 - cfg.Tags["stage"] = "stage" }, ) From 0b936faf98c05bf172360bbc75a5ac88e8e72455 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 1 Jun 2026 15:17:49 -0400 Subject: [PATCH 04/33] remove pubsub as proxy --- instrumentation/httptrace/inferred_proxy.go | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index eb6ebdf9123..67c1765f9fc 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -86,10 +86,6 @@ var ( spanName: "aws.apigateway", component: "aws-apigateway", }, - "gcp-pubsub": { - spanName: "gcp.pubsub", - component: "gcp-pubsub", - }, } ) @@ -202,14 +198,10 @@ func extractInferredPubsubSpan(headers http.Header) (*pubsubContext, error) { }, nil } func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanContext, opts ...tracer.StartSpanOption) *tracer.Span { - proxySpanInfo := supportedProxies["gcp-pubsub"] - log.Debug(`Successfully extracted inferred span info ${proxyContext} for proxy: ${proxyContext.proxySystemName}`) - - configService := "domainName" - if configService == "" { - configService = globalconfig.ServiceName() - } + configService := globalconfig.ServiceName() + spanName := "pubsub.receive" + component := "cloud.google.com/go/pubsub" optsLocal := make([]tracer.StartSpanOption, len(opts), len(opts)+1) copy(optsLocal, opts) @@ -226,9 +218,9 @@ func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanCon cfg.Parent = parent cfg.Tags[ext.SpanType] = ext.SpanTypeMessageConsumer - cfg.Tags[ext.SpanName] = "pubsub.receive" + cfg.Tags[ext.SpanName] = spanName cfg.Tags[ext.ServiceName] = configService - cfg.Tags[ext.Component] = "cloud.google.com/go/pubsub" + cfg.Tags[ext.Component] = component cfg.Tags[ext.ResourceName] = pubsubContex.subscriptionName cfg.Tags[ext.SpanKind] = ext.SpanKindConsumer cfg.Tags[ext.MessagingDestinationName] = subId @@ -241,7 +233,7 @@ func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanCon }, ) - span := tracer.StartSpan(proxySpanInfo.spanName, optsLocal...) + span := tracer.StartSpan(spanName, optsLocal...) return span } From 7c8025cfff5165d6bf9260913227032f7352728e Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 1 Jun 2026 15:21:00 -0400 Subject: [PATCH 05/33] update var naming --- instrumentation/httptrace/inferred_proxy.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index 67c1765f9fc..1291fcd4ee3 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -58,7 +58,7 @@ const ( ProxyHeaderStage = "X-Dd-Proxy-Stage" PubsubHeaderSubscriptionName = "X-Goog-Pubsub-Subscription-Name" - PubsubHeaderMessageId = "X-Goog-Pubsub-Message-Id" + PubsubHeaderMessageID = "X-Goog-Pubsub-Message-Id" ) type proxyDetails struct { @@ -77,7 +77,7 @@ type proxyContext struct { type pubsubContext struct { subscriptionName string - messageId string + messageID string } var ( @@ -188,13 +188,13 @@ func extractInferredPubsubSpan(headers http.Header) (*pubsubContext, error) { return nil, errors.New("pubsub header subscription name does not exist") } - if _, ok := headers[PubsubHeaderMessageId]; !ok { + if _, ok := headers[PubsubHeaderMessageID]; !ok { return nil, errors.New("pubsub header message Id does not exist") } return &pubsubContext{ subscriptionName: headers.Get(PubsubHeaderSubscriptionName), - messageId: headers.Get(PubsubHeaderMessageId), + messageID: headers.Get(PubsubHeaderMessageID), }, nil } func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanContext, opts ...tracer.StartSpanOption) *tracer.Span { @@ -213,8 +213,8 @@ func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanCon // subscription name is formatted as projects/{project_id}/subscriptions/{sub_id} parts := strings.Split(pubsubContex.subscriptionName, "/") - projectId := parts[1] - subId := parts[3] + projectID := parts[1] + subID := parts[3] cfg.Parent = parent cfg.Tags[ext.SpanType] = ext.SpanTypeMessageConsumer @@ -223,11 +223,11 @@ func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanCon cfg.Tags[ext.Component] = component cfg.Tags[ext.ResourceName] = pubsubContex.subscriptionName cfg.Tags[ext.SpanKind] = ext.SpanKindConsumer - cfg.Tags[ext.MessagingDestinationName] = subId + cfg.Tags[ext.MessagingDestinationName] = subID cfg.Tags["messaging.operation"] = "receive" - cfg.Tags["messaging.message_id"] = pubsubContex.messageId - cfg.Tags["message_id"] = pubsubContex.messageId // duplicate to align with existing pubsub tags for pull subscriptions - cfg.Tags["gcloud.project_id"] = projectId + cfg.Tags["messaging.message_id"] = pubsubContex.messageID + cfg.Tags["message_id"] = pubsubContex.messageID // duplicate to align with existing pubsub tags for pull subscriptions + cfg.Tags["gcloud.project_id"] = projectID cfg.Tags[ext.MessagingSystem] = "googlepubsub" cfg.Tags["_dd.inferred_span"] = 1 }, From d9582aef145b34ce7c398d225a3eba541e066ab8 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 1 Jun 2026 15:49:58 -0400 Subject: [PATCH 06/33] comments --- instrumentation/httptrace/inferred_proxy.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index 1291fcd4ee3..ec6ef6df1f6 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -57,8 +57,14 @@ const ( // in which the request is being processed. ProxyHeaderStage = "X-Dd-Proxy-Stage" + // PubsubHeaderSubscriptionName is the header gcp Pub/Sub sets on push deliveries when + // write metadata is enabled. The value is the full subscription resource name + // (projects/{project_id}/subscriptions/{subscription_id}). PubsubHeaderSubscriptionName = "X-Goog-Pubsub-Subscription-Name" - PubsubHeaderMessageID = "X-Goog-Pubsub-Message-Id" + + // PubsubHeaderMessageID is the header gcp Pub/Sub sets on push deliveries when write + // metadata is enabled. The value is the unique ID of the delivered message. + PubsubHeaderMessageID = "X-Goog-Pubsub-Message-Id" ) type proxyDetails struct { From 72bd3955a9cadec33d818c3cdaa2df0a89c61436 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 1 Jun 2026 15:55:20 -0400 Subject: [PATCH 07/33] tests --- .../httptrace/httptrace_pubsub_push_test.go | 245 ++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 instrumentation/httptrace/httptrace_pubsub_push_test.go diff --git a/instrumentation/httptrace/httptrace_pubsub_push_test.go b/instrumentation/httptrace/httptrace_pubsub_push_test.go new file mode 100644 index 00000000000..101bfdc340b --- /dev/null +++ b/instrumentation/httptrace/httptrace_pubsub_push_test.go @@ -0,0 +1,245 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package httptrace + +import ( + "fmt" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" +) + +const ( + testProjectID = "my-project" + testSubscriptionID = "my-subscription" + testSubscriptionName = "projects/my-project/subscriptions/my-subscription" + testMessageID = "msg-abc-123" +) + +func pubsubPushHeaders() map[string]string { + return map[string]string{ + "X-Goog-Pubsub-Subscription-Name": testSubscriptionName, + "X-Goog-Pubsub-Message-Id": testMessageID, + } +} + +func TestInferredPubsubPushSpans(t *testing.T) { + t.Setenv("DD_SERVICE", "pubsub-push-server") + t.Setenv("DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED", "true") + ResetCfg() + + srvURL := "https://my-service.example.com/push-endpoint" + + t.Run("should create inferred pubsub.receive parent span and http.request child span", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srvURL, nil) + require.NoError(t, err) + + for k, v := range pubsubPushHeaders() { + req.Header.Set(k, v) + } + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 2, len(spans)) + + httpSpan := spans[0] + pubsubSpan := spans[1] + + assert.Equal(t, "pubsub.receive", pubsubSpan.OperationName()) + assert.Equal(t, "http.request", httpSpan.OperationName()) + assert.True(t, httpSpan.ParentID() == pubsubSpan.SpanID()) + }) + + t.Run("should set expected tags on the inferred pubsub.receive span", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srvURL, nil) + require.NoError(t, err) + + for k, v := range pubsubPushHeaders() { + req.Header.Set(k, v) + } + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 2, len(spans)) + + pubsubSpan := spans[1] + + assert.Equal(t, ext.SpanTypeMessageConsumer, pubsubSpan.Tag(ext.SpanType)) + assert.Equal(t, "pubsub.receive", pubsubSpan.Tag(ext.SpanName)) + assert.Equal(t, "cloud.google.com/go/pubsub", pubsubSpan.Tag(ext.Component)) + assert.Equal(t, testSubscriptionName, pubsubSpan.Tag(ext.ResourceName)) + assert.Equal(t, ext.SpanKindConsumer, pubsubSpan.Tag(ext.SpanKind)) + assert.Equal(t, testSubscriptionID, pubsubSpan.Tag(ext.MessagingDestinationName)) + assert.Equal(t, "receive", pubsubSpan.Tag("messaging.operation")) + assert.Equal(t, testMessageID, pubsubSpan.Tag("messaging.message_id")) + assert.Equal(t, testMessageID, pubsubSpan.Tag("message_id")) + assert.Equal(t, testProjectID, pubsubSpan.Tag("gcloud.project_id")) + assert.Equal(t, "googlepubsub", pubsubSpan.Tag(ext.MessagingSystem)) + assert.Equal(t, float64(1), pubsubSpan.Tag("_dd.inferred_span")) + }) + + t.Run("should propagate error status to both spans", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", fmt.Sprintf("%s/error", srvURL), nil) + require.NoError(t, err) + + for k, v := range pubsubPushHeaders() { + req.Header.Set(k, v) + } + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(500, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 2, len(spans)) + + httpSpan := spans[0] + pubsubSpan := spans[1] + + assert.Equal(t, "pubsub.receive", pubsubSpan.OperationName()) + assert.Equal(t, "http.request", httpSpan.OperationName()) + assert.True(t, httpSpan.ParentID() == pubsubSpan.SpanID()) + assert.Equal(t, httpSpan.Tag(ext.HTTPCode), pubsubSpan.Tag(ext.HTTPCode)) + assert.Equal(t, "500: Internal Server Error", pubsubSpan.Tag(ext.ErrorMsg)) + assert.Equal(t, "500: Internal Server Error", httpSpan.Tag(ext.ErrorMsg)) + }) + + t.Run("should not create inferred span when push headers are absent", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srvURL, nil) + require.NoError(t, err) + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 1, len(spans)) + assert.Equal(t, "http.request", spans[0].OperationName()) + }) + + t.Run("should not create inferred span when subscription name header is missing", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srvURL, nil) + require.NoError(t, err) + + req.Header.Set("X-Goog-Pubsub-Message-Id", testMessageID) + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 1, len(spans)) + assert.Equal(t, "http.request", spans[0].OperationName()) + }) + + t.Run("should not create inferred span when message ID header is missing", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srvURL, nil) + require.NoError(t, err) + + req.Header.Set("X-Goog-Pubsub-Subscription-Name", testSubscriptionName) + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 1, len(spans)) + assert.Equal(t, "http.request", spans[0].OperationName()) + }) + + t.Run("should not create more than one pubsub inferred span for a local trace", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srvURL, nil) + require.NoError(t, err) + + for k, v := range pubsubPushHeaders() { + req.Header.Set(k, v) + } + + _, ctx, finishSpans1 := StartRequestSpan(req) + finishSpans1(200, nil) + + req2 := req.WithContext(ctx) + _, _, finishSpans2 := StartRequestSpan(req2) + finishSpans2(200, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 3, len(spans)) + + httpSpan := spans[0] + pubsubSpan := spans[1] + + assert.Equal(t, "pubsub.receive", pubsubSpan.OperationName()) + assert.Equal(t, "http.request", httpSpan.OperationName()) + assert.Equal(t, float64(1), pubsubSpan.Tag("_dd.inferred_span")) + assert.True(t, httpSpan.ParentID() == pubsubSpan.SpanID()) + }) +} + +func TestExtractInferredPubsubContext(t *testing.T) { + t.Run("returns context when both headers are present", func(t *testing.T) { + headers := http.Header{} + headers.Set(PubsubHeaderSubscriptionName, testSubscriptionName) + headers.Set(PubsubHeaderMessageID, testMessageID) + + ctx, err := extractInferredPubsubSpan(headers) + + require.NoError(t, err) + assert.Equal(t, testSubscriptionName, ctx.subscriptionName) + assert.Equal(t, testMessageID, ctx.messageID) + }) + + t.Run("returns error when subscription name header is absent", func(t *testing.T) { + headers := http.Header{} + headers.Set(PubsubHeaderMessageID, testMessageID) + + _, err := extractInferredPubsubSpan(headers) + + require.Error(t, err) + }) + + t.Run("returns error when message ID header is absent", func(t *testing.T) { + headers := http.Header{} + headers.Set(PubsubHeaderSubscriptionName, testSubscriptionName) + + _, err := extractInferredPubsubSpan(headers) + + require.Error(t, err) + }) + + t.Run("returns error when both headers are absent", func(t *testing.T) { + headers := http.Header{} + + _, err := extractInferredPubsubSpan(headers) + + require.Error(t, err) + }) +} From c2b2ea6bfdfc31da1eca1528450352aa35fd3e5d Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 2 Jun 2026 15:17:57 -0400 Subject: [PATCH 08/33] add span link option --- .../cloud.google.com/go/pubsub.v1/option.go | 6 ++ .../go/pubsub.v1/pubsub_test.go | 77 +++++++++++++++++++ .../cloud.google.com/go/pubsub.v2/option.go | 6 ++ .../cloud.google.com/go/pubsubtrace/config.go | 42 +++++++--- .../go/pubsubtrace/tracing.go | 22 ++++-- 5 files changed, 137 insertions(+), 16 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v1/option.go b/contrib/cloud.google.com/go/pubsub.v1/option.go index 262ca5173f3..36ac00067eb 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/option.go +++ b/contrib/cloud.google.com/go/pubsub.v1/option.go @@ -22,3 +22,9 @@ func WithService(serviceName string) Option { func WithMeasured() Option { return pubsubtrace.WithMeasured() } + +// WithPropagationAsSpanLinks configures the receive handler to record the producer span as a span +// link rather than as a parent span. +func WithPropagationAsSpanLinks() Option { + return pubsubtrace.WithPropagationAsSpanLinks() +} diff --git a/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go b/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go index af25dd53505..4688c965fe1 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go +++ b/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go @@ -256,6 +256,83 @@ func TestPropagationNoPublisherSpan(t *testing.T) { assert.Equal("cloud.google.com/go/pubsub.v1", spans[0].Integration()) } +func TestPropagationAsSpanLinksOption(t *testing.T) { + assert := assert.New(t) + ctx, cancel, mt, topic, sub := setup(t) + + // Publisher + span, pctx := tracer.StartSpanFromContext(ctx, "propagation-test") + _, err := Publish(pctx, topic, &pubsub.Message{Data: []byte("hello")}).Get(pctx) + assert.NoError(err) + span.Finish() + + // Subscriber with WithPropagationAsSpanLinks option + var called bool + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + assert.False(called, "callback called twice") + msg.Ack() + called = true + cancel() + }, WithPropagationAsSpanLinks())) + assert.True(called, "callback not called") + assert.NoError(err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 3, "wrong number of spans") + + publishSpan := spans[0] + assert.Equal("pubsub.publish", publishSpan.OperationName()) + + receiveSpan := spans[2] + assert.Equal("pubsub.receive", receiveSpan.OperationName()) + + // Receive span must NOT share the producer trace — traces stay separate. + assert.NotEqual(publishSpan.TraceID(), receiveSpan.TraceID(), "receive span should start a new trace") + assert.Equal(uint64(0), receiveSpan.ParentID(), "receive span should have no parent") + + // The pubsub.publish span must appear as a span link on the receive span. + links := receiveSpan.Links() + require.Len(t, links, 1, "expected exactly one span link") + assert.Equal(publishSpan.SpanID(), links[0].SpanID, "span link should point to publish span") +} + +func TestPropagationAsSpanLinksEnvVar(t *testing.T) { + t.Setenv("DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS", "true") + + assert := assert.New(t) + ctx, cancel, mt, topic, sub := setup(t) + + // Publisher + span, pctx := tracer.StartSpanFromContext(ctx, "propagation-test") + _, err := Publish(pctx, topic, &pubsub.Message{Data: []byte("hello")}).Get(pctx) + assert.NoError(err) + span.Finish() + + // Subscriber — no explicit option, env var drives behavior. + var called bool + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + assert.False(called, "callback called twice") + msg.Ack() + called = true + cancel() + })) + assert.True(called, "callback not called") + assert.NoError(err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 3, "wrong number of spans") + + publishSpan := spans[0] + receiveSpan := spans[2] + assert.Equal("pubsub.receive", receiveSpan.OperationName()) + assert.NotEqual(publishSpan.TraceID(), receiveSpan.TraceID(), "receive span should start a new trace") + assert.Equal(uint64(0), receiveSpan.ParentID(), "receive span should have no parent") + + links := receiveSpan.Links() + require.Len(t, links, 1, "expected exactly one span link") + assert.Equal(publishSpan.SpanID(), links[0].SpanID, "span link should point to publish span") +} + func filterTags(m map[string]interface{}) map[string]interface{} { delete(m, "_dd.p.tid") delete(m, "_dd.profiling.enabled") diff --git a/contrib/cloud.google.com/go/pubsub.v2/option.go b/contrib/cloud.google.com/go/pubsub.v2/option.go index 5bb04983a5f..23e39bd7a5d 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/option.go +++ b/contrib/cloud.google.com/go/pubsub.v2/option.go @@ -22,3 +22,9 @@ func WithService(serviceName string) Option { func WithMeasured() Option { return pubsubtrace.WithMeasured() } + +// WithPropagationAsSpanLinks configures the receive handler to record the producer span as a span +// link rather than as a parent span. +func WithPropagationAsSpanLinks() Option { + return pubsubtrace.WithPropagationAsSpanLinks() +} diff --git a/contrib/cloud.google.com/go/pubsubtrace/config.go b/contrib/cloud.google.com/go/pubsubtrace/config.go index 194667b61ba..4ae7e8edcdf 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/config.go +++ b/contrib/cloud.google.com/go/pubsubtrace/config.go @@ -5,14 +5,22 @@ package pubsubtrace -import "github.com/DataDog/dd-trace-go/v2/instrumentation" +import ( + "os" + "strconv" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +const envPropagationAsSpanLinks = "DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS" type config struct { - serviceName string - serviceSource string - publishSpanName string - receiveSpanName string - measured bool + serviceName string + serviceSource string + publishSpanName string + receiveSpanName string + measured bool + propagationAsSpanLinks bool } // Option describes options for the Pub/Sub integration. @@ -21,12 +29,14 @@ type Option interface { } func (tr *Tracer) defaultConfig() *config { + propagationAsSpanLinks, _ := strconv.ParseBool(os.Getenv(envPropagationAsSpanLinks)) return &config{ - serviceName: tr.instr.ServiceName(instrumentation.ComponentConsumer, nil), - serviceSource: string(tr.component), - publishSpanName: tr.instr.OperationName(instrumentation.ComponentProducer, nil), - receiveSpanName: tr.instr.OperationName(instrumentation.ComponentConsumer, nil), - measured: false, + serviceName: tr.instr.ServiceName(instrumentation.ComponentConsumer, nil), + serviceSource: string(tr.component), + publishSpanName: tr.instr.OperationName(instrumentation.ComponentProducer, nil), + receiveSpanName: tr.instr.OperationName(instrumentation.ComponentConsumer, nil), + measured: false, + propagationAsSpanLinks: propagationAsSpanLinks, } } @@ -51,3 +61,13 @@ func WithMeasured() OptionFn { cfg.measured = true } } + +// WithPropagationAsSpanLinks configures the receive handler to record the producer span as a span +// link rather than as a parent span. This keeps producer and consumer traces separate while +// preserving their causal relationship. The same behavior can be enabled globally via the +// DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS environment variable. +func WithPropagationAsSpanLinks() OptionFn { + return func(cfg *config) { + cfg.propagationAsSpanLinks = true + } +} diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index c640d0b1264..aa01836803d 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -113,7 +113,23 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont tracer.Tag(ext.Component, tr.component), tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemGCPPubsub), - tracer.ChildOf(parentSpanCtx), + } + if cfg.propagationAsSpanLinks { + if parentSpanCtx != nil { + // Record the producer span as a span link + link := tracer.SpanLink{ + TraceID: parentSpanCtx.TraceIDLower(), + TraceIDHigh: parentSpanCtx.TraceIDUpper(), + SpanID: parentSpanCtx.SpanID(), + } + opts = append(opts, tracer.WithSpanLinks([]tracer.SpanLink{link})) + } + } else { + opts = append(opts, tracer.ChildOf(parentSpanCtx)) + // If there are span links as a result of context extraction, add them as a StartSpanOption + if parentSpanCtx != nil && parentSpanCtx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(parentSpanCtx.SpanLinks())) + } } if cfg.serviceName != "" { opts = append(opts, instrumentation.ServiceNameWithSource(cfg.serviceName, cfg.serviceSource)) @@ -121,10 +137,6 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont if cfg.measured { opts = append(opts, tracer.Measured()) } - // If there are span links as a result of context extraction, add them as a StartSpanOption - if parentSpanCtx != nil && parentSpanCtx.SpanLinks() != nil { - opts = append(opts, tracer.WithSpanLinks(parentSpanCtx.SpanLinks())) - } span, ctx := tracer.StartSpanFromContext(ctx, cfg.receiveSpanName, opts...) if msg.DeliveryAttempt != nil { span.SetTag("delivery_attempt", *msg.DeliveryAttempt) From 3083cf070e9c0a1c522ecc42d3dfabb899a96c6c Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 2 Jun 2026 15:33:08 -0400 Subject: [PATCH 09/33] add span links for push subscriptions --- instrumentation/httptrace/config.go | 4 + .../httptrace/httptrace_pubsub_push_test.go | 86 +++++++++++++++++++ instrumentation/httptrace/inferred_proxy.go | 10 +++ internal/env/supported_configurations.gen.go | 1 + internal/env/supported_configurations.json | 7 ++ 5 files changed, 108 insertions(+) diff --git a/instrumentation/httptrace/config.go b/instrumentation/httptrace/config.go index 8d886681585..91766727fd2 100644 --- a/instrumentation/httptrace/config.go +++ b/instrumentation/httptrace/config.go @@ -33,6 +33,8 @@ const ( envServerErrorStatuses = "DD_TRACE_HTTP_SERVER_ERROR_STATUSES" // envInferredProxyServicesEnabled is the name of the env var used for enabling inferred span tracing envInferredProxyServicesEnabled = "DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED" + // envPubsubPropagationAsSpanLinks determines if pubsub context is propogated by span link rather than by reparenting + envPubsubPropagationAsSpanLinks = "DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS" // envQueryStringAllowlist is the name of the env var used to specify which query string parameter keys // to keep in the http.url span tag. When set, only these keys are retained and the expensive default // obfuscation regex is bypassed. Comma-separated list of parameter names. @@ -54,6 +56,7 @@ type config struct { traceClientIP bool isStatusError func(statusCode int) bool inferredProxyServicesEnabled bool + pubsubPropagationAsSpanLinks bool allowAllBaggage bool // tag all baggage items when true (DD_TRACE_BAGGAGE_TAG_KEYS="*"). baggageTagKeys map[string]struct{} // when allowAllBaggage is false, only tag baggage items whose keys are listed here. resourceRenamingEnabled *bool @@ -77,6 +80,7 @@ func newConfig() config { traceClientIP: internal.BoolEnv(envTraceClientIPEnabled, false), isStatusError: isServerError, inferredProxyServicesEnabled: internal.BoolEnv(envInferredProxyServicesEnabled, false), + pubsubPropagationAsSpanLinks: internal.BoolEnv(envPubsubPropagationAsSpanLinks, false), baggageTagKeys: make(map[string]struct{}), resourceRenamingAlwaysSimplifiedEndpoint: internal.BoolEnv("DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT", false), appsecEnabledMode: sync.OnceValue(appsecEnabledAtStartup), diff --git a/instrumentation/httptrace/httptrace_pubsub_push_test.go b/instrumentation/httptrace/httptrace_pubsub_push_test.go index 101bfdc340b..f956ec0d8ec 100644 --- a/instrumentation/httptrace/httptrace_pubsub_push_test.go +++ b/instrumentation/httptrace/httptrace_pubsub_push_test.go @@ -15,6 +15,7 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) const ( @@ -204,6 +205,91 @@ func TestInferredPubsubPushSpans(t *testing.T) { }) } +func TestInferredPubsubPushSpansWithPropagationAsSpanLinks(t *testing.T) { + t.Setenv("DD_SERVICE", "pubsub-push-server") + t.Setenv("DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED", "true") + t.Setenv("DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS", "true") + ResetCfg() + defer ResetCfg() + + srvURL := "https://my-service.example.com/push-endpoint" + + t.Run("inferred span should carry a span link to the producer, not reparent", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + // Simulate a producer that injected its trace context into the push request. + producerSpan, _ := tracer.StartSpanFromContext(t.Context(), "producer") + req, err := http.NewRequest("POST", srvURL, nil) + require.NoError(t, err) + for k, v := range pubsubPushHeaders() { + req.Header.Set(k, v) + } + require.NoError(t, tracer.Inject(producerSpan.Context(), tracer.HTTPHeadersCarrier(req.Header))) + producerSpan.Finish() + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + require.Len(t, spans, 3) // producer, http.request, pubsub.receive + + // Locate spans by operation name + var producerFinished, httpSpan, pubsubSpan *mocktracer.Span + for _, s := range spans { + switch s.OperationName() { + case "producer": + producerFinished = s + case "http.request": + httpSpan = s + case "pubsub.receive": + pubsubSpan = s + } + } + require.NotNil(t, producerFinished) + require.NotNil(t, httpSpan) + require.NotNil(t, pubsubSpan) + + // pubsub.receive must NOT inherit the producer trace. + assert.NotEqual(t, producerFinished.TraceID(), pubsubSpan.TraceID(), "pubsub.receive should start a new trace") + assert.Equal(t, uint64(0), pubsubSpan.ParentID(), "pubsub.receive should have no parent") + + // The producer span must be recorded as a span link on pubsub.receive. + links := pubsubSpan.Links() + require.Len(t, links, 1, "expected exactly one span link on pubsub.receive") + assert.Equal(t, producerFinished.SpanID(), links[0].SpanID) + + // http.request must still be a child of pubsub.receive (not of the producer). + assert.Equal(t, pubsubSpan.SpanID(), httpSpan.ParentID()) + }) + + t.Run("inferred span has no span link when no producer trace context is present", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srvURL, nil) + require.NoError(t, err) + for k, v := range pubsubPushHeaders() { + req.Header.Set(k, v) + } + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + + var pubsubSpan *mocktracer.Span + for _, s := range spans { + if s.OperationName() == "pubsub.receive" { + pubsubSpan = s + } + } + require.NotNil(t, pubsubSpan) + assert.Nil(t, pubsubSpan.Links(), "no span links expected when there is no producer trace context") + }) +} + func TestExtractInferredPubsubContext(t *testing.T) { t.Run("returns context when both headers are present", func(t *testing.T) { headers := http.Header{} diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index ec6ef6df1f6..b37b4dd6dd9 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -182,6 +182,16 @@ func startInferredSpanFromHeaders(headers http.Header) *tracer.Span { pubsubSpanContext, pubsubErr := extractInferredPubsubSpan(headers) if pubsubErr == nil { + if cfg.pubsubPropagationAsSpanLinks && spanParentCtx != nil { + // Record the producer span as a span link, keeping producer and consumer traces separate. + link := tracer.SpanLink{ + TraceID: spanParentCtx.TraceIDLower(), + TraceIDHigh: spanParentCtx.TraceIDUpper(), + SpanID: spanParentCtx.SpanID(), + } + inferredStartSpanOpts = append(inferredStartSpanOpts, tracer.WithSpanLinks([]tracer.SpanLink{link})) + return startInferredPubsubSpan(pubsubSpanContext, nil, inferredStartSpanOpts...) + } return startInferredPubsubSpan(pubsubSpanContext, spanParentCtx, inferredStartSpanOpts...) } log.Debug("%s\n", pubsubErr.Error()) diff --git a/internal/env/supported_configurations.gen.go b/internal/env/supported_configurations.gen.go index 26616ad117f..7f94530ddbb 100644 --- a/internal/env/supported_configurations.gen.go +++ b/internal/env/supported_configurations.gen.go @@ -79,6 +79,7 @@ var SupportedConfigurations = map[string]struct{}{ "DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA": {}, "DD_GIT_REPOSITORY_URL": {}, "DD_GIT_TAG": {}, + "DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS": {}, "DD_HAPROXY_SPOA_HEALTHCHECK_PORT": {}, "DD_HAPROXY_SPOA_HOST": {}, "DD_HAPROXY_SPOA_PORT": {}, diff --git a/internal/env/supported_configurations.json b/internal/env/supported_configurations.json index 84dfc328f9a..8dda699beeb 100644 --- a/internal/env/supported_configurations.json +++ b/internal/env/supported_configurations.json @@ -497,6 +497,13 @@ "default": null } ], + "DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS": [ + { + "implementation": "A", + "type": "boolean", + "default": "false" + } + ], "DD_HAPROXY_SPOA_HEALTHCHECK_PORT": [ { "implementation": "A", From ba0859ba5b6da1d0dc5766ba2a22082816da87d2 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 3 Jun 2026 11:21:28 -0400 Subject: [PATCH 10/33] pr feedback --- .../cloud.google.com/go/pubsubtrace/config.go | 8 +++----- .../cloud.google.com/go/pubsubtrace/tracing.go | 16 +++++++--------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsubtrace/config.go b/contrib/cloud.google.com/go/pubsubtrace/config.go index 4ae7e8edcdf..be79564b194 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/config.go +++ b/contrib/cloud.google.com/go/pubsubtrace/config.go @@ -6,10 +6,10 @@ package pubsubtrace import ( - "os" "strconv" "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/internal/env" ) const envPropagationAsSpanLinks = "DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS" @@ -29,7 +29,7 @@ type Option interface { } func (tr *Tracer) defaultConfig() *config { - propagationAsSpanLinks, _ := strconv.ParseBool(os.Getenv(envPropagationAsSpanLinks)) + propagationAsSpanLinks, _ := strconv.ParseBool(env.Get(envPropagationAsSpanLinks)) return &config{ serviceName: tr.instr.ServiceName(instrumentation.ComponentConsumer, nil), serviceSource: string(tr.component), @@ -63,9 +63,7 @@ func WithMeasured() OptionFn { } // WithPropagationAsSpanLinks configures the receive handler to record the producer span as a span -// link rather than as a parent span. This keeps producer and consumer traces separate while -// preserving their causal relationship. The same behavior can be enabled globally via the -// DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS environment variable. +// link rather than as a parent span func WithPropagationAsSpanLinks() OptionFn { return func(cfg *config) { cfg.propagationAsSpanLinks = true diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index aa01836803d..1d5a5f6043c 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -114,16 +114,14 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemGCPPubsub), } - if cfg.propagationAsSpanLinks { - if parentSpanCtx != nil { - // Record the producer span as a span link - link := tracer.SpanLink{ - TraceID: parentSpanCtx.TraceIDLower(), - TraceIDHigh: parentSpanCtx.TraceIDUpper(), - SpanID: parentSpanCtx.SpanID(), - } - opts = append(opts, tracer.WithSpanLinks([]tracer.SpanLink{link})) + if cfg.propagationAsSpanLinks && parentSpanCtx != nil { + // Record the producer span as a span link + link := tracer.SpanLink{ + TraceID: parentSpanCtx.TraceIDLower(), + TraceIDHigh: parentSpanCtx.TraceIDUpper(), + SpanID: parentSpanCtx.SpanID(), } + opts = append(opts, tracer.WithSpanLinks([]tracer.SpanLink{link})) } else { opts = append(opts, tracer.ChildOf(parentSpanCtx)) // If there are span links as a result of context extraction, add them as a StartSpanOption From 188c769f9e2ea884a78ff07c9b81877f4f9e47d3 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 3 Jun 2026 15:48:16 -0400 Subject: [PATCH 11/33] add pubsub header name validation --- .../httptrace/httptrace_pubsub_push_test.go | 23 +++++++++++++ instrumentation/httptrace/inferred_proxy.go | 34 ++++++++++++++++--- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/instrumentation/httptrace/httptrace_pubsub_push_test.go b/instrumentation/httptrace/httptrace_pubsub_push_test.go index 101bfdc340b..7bbcc2d6387 100644 --- a/instrumentation/httptrace/httptrace_pubsub_push_test.go +++ b/instrumentation/httptrace/httptrace_pubsub_push_test.go @@ -242,4 +242,27 @@ func TestExtractInferredPubsubContext(t *testing.T) { require.Error(t, err) }) + + t.Run("returns error when subscription name has wrong format", func(t *testing.T) { + for _, bad := range []string{ + "", + "my-subscription", + "projects/my-project", + "projects/my-project/topics/my-topic", + "projects/my-project/subscriptions", + "orgs/my-project/subscriptions/my-subscription", + "projects//subscriptions/my-subscription", + "projects/my-project/subscriptions/my-subscription/extra", + } { + t.Run(fmt.Sprintf("%q", bad), func(t *testing.T) { + headers := http.Header{} + headers.Set(PubsubHeaderSubscriptionName, bad) + headers.Set(PubsubHeaderMessageID, testMessageID) + + _, err := extractInferredPubsubSpan(headers) + + require.Error(t, err) + }) + } + }) } diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index ec6ef6df1f6..db6c6188360 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -168,8 +168,8 @@ func startInferredProxySpan(requestProxyContext *proxyContext, parent *tracer.Sp } func startInferredSpanFromHeaders(headers http.Header) *tracer.Span { - spanParentCtx, _ := tracer.Extract(tracer.HTTPHeadersCarrier(headers)) var inferredStartSpanOpts []tracer.StartSpanOption + spanParentCtx, _ := tracer.Extract(tracer.HTTPHeadersCarrier(headers)) if spanParentCtx != nil && spanParentCtx.SpanLinks() != nil { inferredStartSpanOpts = append(inferredStartSpanOpts, tracer.WithSpanLinks(spanParentCtx.SpanLinks())) } @@ -177,29 +177,55 @@ func startInferredSpanFromHeaders(headers http.Header) *tracer.Span { requestProxyContext, err := extractInferredProxyContext(headers) if err == nil { return startInferredProxySpan(requestProxyContext, spanParentCtx, inferredStartSpanOpts...) + } else { + log.Debug("%s\n", err.Error()) } - log.Debug("%s\n", err.Error()) pubsubSpanContext, pubsubErr := extractInferredPubsubSpan(headers) if pubsubErr == nil { return startInferredPubsubSpan(pubsubSpanContext, spanParentCtx, inferredStartSpanOpts...) + } else { + log.Debug("%s\n", pubsubErr.Error()) } - log.Debug("%s\n", pubsubErr.Error()) return nil } +// validatePubsubSubscriptionResourceName checks that name matches the full +// the expected format projects/{project_id}/subscriptions/{subscription_id} +func validatePubsubSubscriptionResourceName(name string) error { + if name == "" { + return errors.New("pubsub subscription name is empty") + } + parts := strings.Split(name, "/") + if len(parts) != 4 { + return fmt.Errorf("pubsub subscription name must have 4 path segments, got %d", len(parts)) + } + if parts[0] != "projects" || parts[2] != "subscriptions" { + return errors.New("pubsub subscription name must be projects/{project_id}/subscriptions/{subscription_id}") + } + if parts[1] == "" || parts[3] == "" { + return errors.New("pubsub subscription name has empty project_id or subscription_id") + } + return nil +} + func extractInferredPubsubSpan(headers http.Header) (*pubsubContext, error) { if _, ok := headers[PubsubHeaderSubscriptionName]; !ok { return nil, errors.New("pubsub header subscription name does not exist") } + subscriptionName := headers.Get(PubsubHeaderSubscriptionName) + if err := validatePubsubSubscriptionResourceName(subscriptionName); err != nil { + return nil, err + } + if _, ok := headers[PubsubHeaderMessageID]; !ok { return nil, errors.New("pubsub header message Id does not exist") } return &pubsubContext{ - subscriptionName: headers.Get(PubsubHeaderSubscriptionName), + subscriptionName: subscriptionName, messageID: headers.Get(PubsubHeaderMessageID), }, nil } From 7c77890251ba82a4e69072683e301dc363095e87 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Fri, 12 Jun 2026 13:42:02 -0400 Subject: [PATCH 12/33] Pr changes --- .../go/pubsub.v1/pubsub_test.go | 131 ++++++++++-------- .../go/pubsub.v2/pubsub_test.go | 131 ++++++++++-------- .../go/pubsubtrace/tracing.go | 25 ++++ ddtrace/ext/messaging.go | 4 + .../httptrace/httptrace_pubsub_push_test.go | 33 ++--- instrumentation/httptrace/inferred_proxy.go | 84 +++++------ 6 files changed, 234 insertions(+), 174 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go b/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go index af25dd53505..5fe94b4ca17 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go +++ b/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go @@ -69,17 +69,20 @@ func TestPropagation(t *testing.T) { assert.Equal(spans[1].SpanID(), spans[0].ParentID()) assert.Equal(uint64(42), spans[0].TraceID()) assert.Subset(filterTags(spans[0].Tags()), map[string]interface{}{ - "message_size": float64(5), - "num_attributes": float64(5), - "ordering_key": "xxx", - ext.ResourceName: "projects/project/topics/topic", - ext.SpanType: ext.SpanTypeMessageProducer, - "server_id": srvID, - ext.ServiceName: "", - ext.Component: "cloud.google.com/go/pubsub.v1", - ext.SpanKind: ext.SpanKindProducer, - ext.MessagingSystem: "googlepubsub", - ext.SpanName: "pubsub.publish", + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/topics/topic", + ext.SpanType: ext.SpanTypeMessageProducer, + "server_id": srvID, + ext.ServiceName: "", + ext.Component: "cloud.google.com/go/pubsub.v1", + ext.SpanKind: ext.SpanKindProducer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "send", + ext.MessagingMessageID: srvID, + "gcloud.project_id": "project", + ext.SpanName: "pubsub.publish", }, spans[0].Tags()) assert.Equal("cloud.google.com/go/pubsub.v1", spans[0].Integration()) @@ -87,18 +90,21 @@ func TestPropagation(t *testing.T) { assert.Equal(uint64(42), spans[2].TraceID()) assert.Equal(spanID, spans[2].SpanID()) assert.Subset(filterTags(spans[2].Tags()), map[string]interface{}{ - "message_size": float64(5), - "num_attributes": float64(5), - "ordering_key": "xxx", - ext.ResourceName: "projects/project/subscriptions/subscription", - ext.SpanType: ext.SpanTypeMessageConsumer, - "message_id": msgID, - "publish_time": pubTime, - ext.Component: "cloud.google.com/go/pubsub.v1", - ext.SpanKind: ext.SpanKindConsumer, - ext.MessagingSystem: "googlepubsub", - ext.ServiceName: "", - ext.SpanName: "pubsub.receive", + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v1", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "receive", + ext.MessagingMessageID: msgID, + "gcloud.project_id": "project", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[2].Tags()) assert.Equal("cloud.google.com/go/pubsub.v1", spans[2].Integration()) } @@ -166,17 +172,20 @@ func TestPropagationNoParentSpan(t *testing.T) { assert.Equal(spans[0].TraceID(), spans[0].SpanID()) assert.Equal(traceID, spans[0].Context().TraceID()) assert.Subset(filterTags(spans[0].Tags()), map[string]interface{}{ - "message_size": float64(5), - "num_attributes": float64(5), - "ordering_key": "xxx", - ext.ResourceName: "projects/project/topics/topic", - ext.SpanType: ext.SpanTypeMessageProducer, - "server_id": srvID, - ext.Component: "cloud.google.com/go/pubsub.v1", - ext.SpanKind: ext.SpanKindProducer, - ext.MessagingSystem: "googlepubsub", - ext.ServiceName: "", - ext.SpanName: "pubsub.publish", + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/topics/topic", + ext.SpanType: ext.SpanTypeMessageProducer, + "server_id": srvID, + ext.Component: "cloud.google.com/go/pubsub.v1", + ext.SpanKind: ext.SpanKindProducer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "send", + ext.MessagingMessageID: srvID, + "gcloud.project_id": "project", + ext.ServiceName: "", + ext.SpanName: "pubsub.publish", }, spans[0].Tags()) assert.Equal("cloud.google.com/go/pubsub.v1", spans[0].Integration()) @@ -184,18 +193,21 @@ func TestPropagationNoParentSpan(t *testing.T) { assert.Equal(traceID, spans[1].Context().TraceID()) assert.Equal(spanID, spans[1].SpanID()) assert.Subset(filterTags(spans[1].Tags()), map[string]interface{}{ - "message_size": float64(5), - "num_attributes": float64(5), - "ordering_key": "xxx", - ext.ResourceName: "projects/project/subscriptions/subscription", - ext.SpanType: ext.SpanTypeMessageConsumer, - "message_id": msgID, - "publish_time": pubTime, - ext.Component: "cloud.google.com/go/pubsub.v1", - ext.SpanKind: ext.SpanKindConsumer, - ext.MessagingSystem: "googlepubsub", - ext.ServiceName: "", - ext.SpanName: "pubsub.receive", + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v1", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "receive", + ext.MessagingMessageID: msgID, + "gcloud.project_id": "project", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[1].Tags()) assert.Equal("cloud.google.com/go/pubsub.v1", spans[1].Integration()) } @@ -240,18 +252,21 @@ func TestPropagationNoPublisherSpan(t *testing.T) { assert.Equal(traceID, spans[0].Context().TraceID()) assert.Equal(spanID, spans[0].SpanID()) assert.Subset(filterTags(spans[0].Tags()), map[string]interface{}{ - "message_size": float64(5), - "num_attributes": float64(0), // no attributes, since no publish middleware sent them - "ordering_key": "xxx", - ext.ResourceName: "projects/project/subscriptions/subscription", - ext.SpanType: ext.SpanTypeMessageConsumer, - "message_id": msgID, - "publish_time": pubTime, - ext.Component: "cloud.google.com/go/pubsub.v1", - ext.SpanKind: ext.SpanKindConsumer, - ext.MessagingSystem: "googlepubsub", - ext.ServiceName: "", - ext.SpanName: "pubsub.receive", + "message_size": float64(5), + "num_attributes": float64(0), // no attributes, since no publish middleware sent them + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v1", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "receive", + ext.MessagingMessageID: msgID, + "gcloud.project_id": "project", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[0].Tags()) assert.Equal("cloud.google.com/go/pubsub.v1", spans[0].Integration()) } diff --git a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go index b73ece2e05e..7afa24bd98a 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go @@ -72,17 +72,20 @@ func TestPropagation(t *testing.T) { assert.Equal(spans[1].SpanID(), spans[0].ParentID()) assert.Equal(uint64(42), spans[0].TraceID()) assert.Subset(filterTags(spans[0].Tags()), map[string]any{ - "message_size": float64(5), - "num_attributes": float64(5), - "ordering_key": "xxx", - ext.ResourceName: "projects/project/topics/topic", - ext.SpanType: ext.SpanTypeMessageProducer, - "server_id": srvID, - ext.ServiceName: "", - ext.Component: "cloud.google.com/go/pubsub.v2", - ext.SpanKind: ext.SpanKindProducer, - ext.MessagingSystem: "googlepubsub", - ext.SpanName: "pubsub.publish", + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/topics/topic", + ext.SpanType: ext.SpanTypeMessageProducer, + "server_id": srvID, + ext.ServiceName: "", + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindProducer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "send", + ext.MessagingMessageID: srvID, + "gcloud.project_id": "project", + ext.SpanName: "pubsub.publish", }, spans[0].Tags()) assert.Equal("cloud.google.com/go/pubsub.v2", spans[0].Integration()) @@ -90,18 +93,21 @@ func TestPropagation(t *testing.T) { assert.Equal(uint64(42), spans[2].TraceID()) assert.Equal(spanID, spans[2].SpanID()) assert.Subset(filterTags(spans[2].Tags()), map[string]any{ - "message_size": float64(5), - "num_attributes": float64(5), - "ordering_key": "xxx", - ext.ResourceName: "projects/project/subscriptions/subscription", - ext.SpanType: ext.SpanTypeMessageConsumer, - "message_id": msgID, - "publish_time": pubTime, - ext.Component: "cloud.google.com/go/pubsub.v2", - ext.SpanKind: ext.SpanKindConsumer, - ext.MessagingSystem: "googlepubsub", - ext.ServiceName: "", - ext.SpanName: "pubsub.receive", + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "receive", + ext.MessagingMessageID: msgID, + "gcloud.project_id": "project", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[2].Tags()) assert.Equal("cloud.google.com/go/pubsub.v2", spans[2].Integration()) } @@ -169,17 +175,20 @@ func TestPropagationNoParentSpan(t *testing.T) { assert.Equal(spans[0].TraceID(), spans[0].SpanID()) assert.Equal(traceID, spans[0].Context().TraceID()) assert.Subset(filterTags(spans[0].Tags()), map[string]any{ - "message_size": float64(5), - "num_attributes": float64(5), - "ordering_key": "xxx", - ext.ResourceName: "projects/project/topics/topic", - ext.SpanType: ext.SpanTypeMessageProducer, - "server_id": srvID, - ext.Component: "cloud.google.com/go/pubsub.v2", - ext.SpanKind: ext.SpanKindProducer, - ext.MessagingSystem: "googlepubsub", - ext.ServiceName: "", - ext.SpanName: "pubsub.publish", + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/topics/topic", + ext.SpanType: ext.SpanTypeMessageProducer, + "server_id": srvID, + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindProducer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "send", + ext.MessagingMessageID: srvID, + "gcloud.project_id": "project", + ext.ServiceName: "", + ext.SpanName: "pubsub.publish", }, spans[0].Tags()) assert.Equal("cloud.google.com/go/pubsub.v2", spans[0].Integration()) @@ -187,18 +196,21 @@ func TestPropagationNoParentSpan(t *testing.T) { assert.Equal(traceID, spans[1].Context().TraceID()) assert.Equal(spanID, spans[1].SpanID()) assert.Subset(filterTags(spans[1].Tags()), map[string]any{ - "message_size": float64(5), - "num_attributes": float64(5), - "ordering_key": "xxx", - ext.ResourceName: "projects/project/subscriptions/subscription", - ext.SpanType: ext.SpanTypeMessageConsumer, - "message_id": msgID, - "publish_time": pubTime, - ext.Component: "cloud.google.com/go/pubsub.v2", - ext.SpanKind: ext.SpanKindConsumer, - ext.MessagingSystem: "googlepubsub", - ext.ServiceName: "", - ext.SpanName: "pubsub.receive", + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "receive", + ext.MessagingMessageID: msgID, + "gcloud.project_id": "project", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[1].Tags()) assert.Equal("cloud.google.com/go/pubsub.v2", spans[1].Integration()) } @@ -243,18 +255,21 @@ func TestPropagationNoPublisherSpan(t *testing.T) { assert.Equal(traceID, spans[0].Context().TraceID()) assert.Equal(spanID, spans[0].SpanID()) assert.Subset(filterTags(spans[0].Tags()), map[string]any{ - "message_size": float64(5), - "num_attributes": float64(0), // no attributes, since no publish middleware sent them - "ordering_key": "xxx", - ext.ResourceName: "projects/project/subscriptions/subscription", - ext.SpanType: ext.SpanTypeMessageConsumer, - "message_id": msgID, - "publish_time": pubTime, - ext.Component: "cloud.google.com/go/pubsub.v2", - ext.SpanKind: ext.SpanKindConsumer, - ext.MessagingSystem: "googlepubsub", - ext.ServiceName: "", - ext.SpanName: "pubsub.receive", + "message_size": float64(5), + "num_attributes": float64(0), // no attributes, since no publish middleware sent them + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.MessagingOperationName: "receive", + ext.MessagingMessageID: msgID, + "gcloud.project_id": "project", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[0].Tags()) assert.Equal("cloud.google.com/go/pubsub.v2", spans[0].Integration()) } diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index c640d0b1264..ebe6783da64 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -14,6 +14,7 @@ package pubsubtrace import ( "context" + "strings" "sync" "time" @@ -64,6 +65,11 @@ func (tr *Tracer) TracePublish(ctx context.Context, topic Topic, msg *Message, o tracer.Tag(ext.Component, tr.component), tracer.Tag(ext.SpanKind, ext.SpanKindProducer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemGCPPubsub), + tracer.Tag(ext.MessagingOperationName, "send"), + tracer.Tag(ext.MessagingDestinationName, topic.String()), + } + if projectID := projectIDFromResourceName(topic.String()); projectID != "" { + spanOpts = append(spanOpts, tracer.Tag("gcloud.project_id", projectID)) } if cfg.serviceName != "" { spanOpts = append(spanOpts, instrumentation.ServiceNameWithSource(cfg.serviceName, cfg.serviceSource)) @@ -88,6 +94,7 @@ func (tr *Tracer) TracePublish(ctx context.Context, topic Topic, msg *Message, o closeSpan := func(serverID string, err error) { once.Do(func() { span.SetTag("server_id", serverID) + span.SetTag(ext.MessagingMessageID, serverID) span.Finish(tracer.WithError(err)) }) } @@ -109,12 +116,18 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont tracer.Tag("num_attributes", len(msg.Attributes)), tracer.Tag("ordering_key", msg.OrderingKey), tracer.Tag("message_id", msg.ID), + tracer.Tag(ext.MessagingMessageID, msg.ID), tracer.Tag("publish_time", msg.PublishTime.String()), tracer.Tag(ext.Component, tr.component), tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemGCPPubsub), + tracer.Tag(ext.MessagingOperationName, "receive"), + tracer.Tag(ext.MessagingDestinationName, s.String()), tracer.ChildOf(parentSpanCtx), } + if projectID := projectIDFromResourceName(s.String()); projectID != "" { + opts = append(opts, tracer.Tag("gcloud.project_id", projectID)) + } if cfg.serviceName != "" { opts = append(opts, instrumentation.ServiceNameWithSource(cfg.serviceName, cfg.serviceSource)) } @@ -132,3 +145,15 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont return ctx, func() { span.Finish() } } } + +// extracts the GCP project ID from a Pubsub resource name of the form +// "projects/{project}/topics/{topic}" or "projects/{project}/subscriptions/{subscription}" +func projectIDFromResourceName(name string) string { + const prefix = "projects/" + if !strings.HasPrefix(name, prefix) { + return "" + } + rest := name[len(prefix):] + project, _, _ := strings.Cut(rest, "/") + return project +} diff --git a/ddtrace/ext/messaging.go b/ddtrace/ext/messaging.go index c65729416c7..d2bdd3f53b9 100644 --- a/ddtrace/ext/messaging.go +++ b/ddtrace/ext/messaging.go @@ -10,6 +10,10 @@ const ( MessagingSystem = "messaging.system" // MessagingDestinationName identifies message destination name MessagingDestinationName = "messaging.destination.name" + // MessagingOperationName identifies the messaging operation performed (e.g. send, receive). + MessagingOperationName = "messaging.operation.name" + // MessagingMessageID identifies the message ID assigned by the messaging system. + MessagingMessageID = "messaging.message.id" ) // Available values for messaging.system. diff --git a/instrumentation/httptrace/httptrace_pubsub_push_test.go b/instrumentation/httptrace/httptrace_pubsub_push_test.go index 7bbcc2d6387..ce8c364ee55 100644 --- a/instrumentation/httptrace/httptrace_pubsub_push_test.go +++ b/instrumentation/httptrace/httptrace_pubsub_push_test.go @@ -88,8 +88,8 @@ func TestInferredPubsubPushSpans(t *testing.T) { assert.Equal(t, testSubscriptionName, pubsubSpan.Tag(ext.ResourceName)) assert.Equal(t, ext.SpanKindConsumer, pubsubSpan.Tag(ext.SpanKind)) assert.Equal(t, testSubscriptionID, pubsubSpan.Tag(ext.MessagingDestinationName)) - assert.Equal(t, "receive", pubsubSpan.Tag("messaging.operation")) - assert.Equal(t, testMessageID, pubsubSpan.Tag("messaging.message_id")) + assert.Equal(t, "receive", pubsubSpan.Tag(ext.MessagingOperationName)) + assert.Equal(t, testMessageID, pubsubSpan.Tag(ext.MessagingMessageID)) assert.Equal(t, testMessageID, pubsubSpan.Tag("message_id")) assert.Equal(t, testProjectID, pubsubSpan.Tag("gcloud.project_id")) assert.Equal(t, "googlepubsub", pubsubSpan.Tag(ext.MessagingSystem)) @@ -210,40 +210,41 @@ func TestExtractInferredPubsubContext(t *testing.T) { headers.Set(PubsubHeaderSubscriptionName, testSubscriptionName) headers.Set(PubsubHeaderMessageID, testMessageID) - ctx, err := extractInferredPubsubSpan(headers) + ctx := extractInferredPubsubContext(headers) - require.NoError(t, err) assert.Equal(t, testSubscriptionName, ctx.subscriptionName) + assert.Equal(t, testProjectID, ctx.projectID) + assert.Equal(t, testSubscriptionID, ctx.subscriptionID) assert.Equal(t, testMessageID, ctx.messageID) }) - t.Run("returns error when subscription name header is absent", func(t *testing.T) { + t.Run("returns nil when subscription name header is absent", func(t *testing.T) { headers := http.Header{} headers.Set(PubsubHeaderMessageID, testMessageID) - _, err := extractInferredPubsubSpan(headers) + ctx := extractInferredPubsubContext(headers) - require.Error(t, err) + require.Nil(t, ctx) }) - t.Run("returns error when message ID header is absent", func(t *testing.T) { + t.Run("returns nil when message ID header is absent", func(t *testing.T) { headers := http.Header{} headers.Set(PubsubHeaderSubscriptionName, testSubscriptionName) - _, err := extractInferredPubsubSpan(headers) + ctx := extractInferredPubsubContext(headers) - require.Error(t, err) + require.Nil(t, ctx) }) - t.Run("returns error when both headers are absent", func(t *testing.T) { + t.Run("returns nil when both headers are absent", func(t *testing.T) { headers := http.Header{} - _, err := extractInferredPubsubSpan(headers) + ctx := extractInferredPubsubContext(headers) - require.Error(t, err) + require.Nil(t, ctx) }) - t.Run("returns error when subscription name has wrong format", func(t *testing.T) { + t.Run("returns nil when subscription name has wrong format", func(t *testing.T) { for _, bad := range []string{ "", "my-subscription", @@ -259,9 +260,9 @@ func TestExtractInferredPubsubContext(t *testing.T) { headers.Set(PubsubHeaderSubscriptionName, bad) headers.Set(PubsubHeaderMessageID, testMessageID) - _, err := extractInferredPubsubSpan(headers) + ctx := extractInferredPubsubContext(headers) - require.Error(t, err) + require.Nil(t, ctx) }) } }) diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index db6c6188360..f31ff51aa62 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -83,6 +83,8 @@ type proxyContext struct { type pubsubContext struct { subscriptionName string + projectID string + subscriptionID string messageID string } @@ -181,56 +183,59 @@ func startInferredSpanFromHeaders(headers http.Header) *tracer.Span { log.Debug("%s\n", err.Error()) } - pubsubSpanContext, pubsubErr := extractInferredPubsubSpan(headers) - if pubsubErr == nil { - return startInferredPubsubSpan(pubsubSpanContext, spanParentCtx, inferredStartSpanOpts...) + pubsubCtx := extractInferredPubsubContext(headers) + if pubsubCtx != nil { + return startInferredPubsubPushSubscriptionSpan(pubsubCtx, spanParentCtx, inferredStartSpanOpts...) } else { - log.Debug("%s\n", pubsubErr.Error()) + log.Debug("Unable to create inferred pubsub span. Skipping") } return nil } -// validatePubsubSubscriptionResourceName checks that name matches the full -// the expected format projects/{project_id}/subscriptions/{subscription_id} -func validatePubsubSubscriptionResourceName(name string) error { - if name == "" { - return errors.New("pubsub subscription name is empty") - } - parts := strings.Split(name, "/") - if len(parts) != 4 { - return fmt.Errorf("pubsub subscription name must have 4 path segments, got %d", len(parts)) - } - if parts[0] != "projects" || parts[2] != "subscriptions" { - return errors.New("pubsub subscription name must be projects/{project_id}/subscriptions/{subscription_id}") - } - if parts[1] == "" || parts[3] == "" { - return errors.New("pubsub subscription name has empty project_id or subscription_id") +// extractInferredPubsubContext reads Pub/Sub push metadata headers and returns a +// fully populated pubsubContext, or an error if headers are missing or invalid. +func extractInferredPubsubContext(headers http.Header) *pubsubContext { + subscriptionName := headers.Get(PubsubHeaderSubscriptionName) + if subscriptionName == "" { + return nil } - return nil -} -func extractInferredPubsubSpan(headers http.Header) (*pubsubContext, error) { - if _, ok := headers[PubsubHeaderSubscriptionName]; !ok { - return nil, errors.New("pubsub header subscription name does not exist") - } + parts := strings.Split(subscriptionName, "/") - subscriptionName := headers.Get(PubsubHeaderSubscriptionName) - if err := validatePubsubSubscriptionResourceName(subscriptionName); err != nil { - return nil, err + // check that subscriptionName matches format projects/{project_id}/subscriptions/{subscription_id}. + if len(parts) != 4 || // must have 4 segments + parts[0] != "projects" || parts[2] != "subscriptions" || // must match 'projects' and 'subscriptions' + parts[1] == "" || parts[3] == "" { // project and subscription IDs can't be empty + return nil } - if _, ok := headers[PubsubHeaderMessageID]; !ok { - return nil, errors.New("pubsub header message Id does not exist") + projectID := parts[1] + subscriptionID := parts[3] + + if projectID == "" || subscriptionID == "" { + return nil } + messageID := headers.Get(PubsubHeaderMessageID) + if messageID == "" { + return nil + } return &pubsubContext{ subscriptionName: subscriptionName, - messageID: headers.Get(PubsubHeaderMessageID), - }, nil + projectID: projectID, + subscriptionID: subscriptionID, + messageID: messageID, + } } -func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanContext, opts ...tracer.StartSpanOption) *tracer.Span { +// startInferredPubsubPushSubscriptionSpan starts an inferred pubsub.receive consumer span +// for HTTP handlers that process Google Cloud Pub/Sub push deliveries. The span is tagged like +// library-instrumented subscribe/receive paths so push-based workloads show the same +// messaging layer in the trace as pull/subscribe flows. +// +// See: https://cloud.google.com/pubsub/docs/push +func startInferredPubsubPushSubscriptionSpan(pubsubContex *pubsubContext, parent *tracer.SpanContext, opts ...tracer.StartSpanOption) *tracer.Span { configService := globalconfig.ServiceName() spanName := "pubsub.receive" component := "cloud.google.com/go/pubsub" @@ -243,11 +248,6 @@ func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanCon cfg.Tags = make(map[string]any) } - // subscription name is formatted as projects/{project_id}/subscriptions/{sub_id} - parts := strings.Split(pubsubContex.subscriptionName, "/") - projectID := parts[1] - subID := parts[3] - cfg.Parent = parent cfg.Tags[ext.SpanType] = ext.SpanTypeMessageConsumer cfg.Tags[ext.SpanName] = spanName @@ -255,11 +255,11 @@ func startInferredPubsubSpan(pubsubContex *pubsubContext, parent *tracer.SpanCon cfg.Tags[ext.Component] = component cfg.Tags[ext.ResourceName] = pubsubContex.subscriptionName cfg.Tags[ext.SpanKind] = ext.SpanKindConsumer - cfg.Tags[ext.MessagingDestinationName] = subID - cfg.Tags["messaging.operation"] = "receive" - cfg.Tags["messaging.message_id"] = pubsubContex.messageID + cfg.Tags[ext.MessagingDestinationName] = pubsubContex.subscriptionID + cfg.Tags[ext.MessagingOperationName] = "receive" + cfg.Tags[ext.MessagingMessageID] = pubsubContex.messageID cfg.Tags["message_id"] = pubsubContex.messageID // duplicate to align with existing pubsub tags for pull subscriptions - cfg.Tags["gcloud.project_id"] = projectID + cfg.Tags["gcloud.project_id"] = pubsubContex.projectID cfg.Tags[ext.MessagingSystem] = "googlepubsub" cfg.Tags["_dd.inferred_span"] = 1 }, From 8365cfb76bceef15c4d4e1f14edf90c482b0a5b5 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 17 Jun 2026 09:45:02 -0400 Subject: [PATCH 13/33] add log details --- instrumentation/httptrace/inferred_proxy.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index f31ff51aa62..f35bf0b728d 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -180,7 +180,7 @@ func startInferredSpanFromHeaders(headers http.Header) *tracer.Span { if err == nil { return startInferredProxySpan(requestProxyContext, spanParentCtx, inferredStartSpanOpts...) } else { - log.Debug("%s\n", err.Error()) + log.Debug("unable to start inferred proxy span: %s\n", err.Error()) } pubsubCtx := extractInferredPubsubContext(headers) @@ -230,7 +230,7 @@ func extractInferredPubsubContext(headers http.Header) *pubsubContext { } // startInferredPubsubPushSubscriptionSpan starts an inferred pubsub.receive consumer span -// for HTTP handlers that process Google Cloud Pub/Sub push deliveries. The span is tagged like +// for HTTP handlers that process gcp Pub/Sub push deliveries. The span is tagged like // library-instrumented subscribe/receive paths so push-based workloads show the same // messaging layer in the trace as pull/subscribe flows. // From 9f655ad7b3104455fb7cd0ff08063abb2f2a5497 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 17 Jun 2026 11:36:52 -0400 Subject: [PATCH 14/33] instrument admin endpoints --- .../cloud.google.com/go/pubsub.v2/admin.go | 296 +++++++++ .../go/pubsub.v2/admin_test.go | 167 +++++ .../go/pubsub.v2/example_test.go | 18 + contrib/cloud.google.com/go/pubsub.v2/go.mod | 2 +- .../go/pubsub.v2/orchestrion.yml | 619 ++++++++++++++++++ .../cloud.google.com/go/pubsubtrace/config.go | 2 + .../go/pubsubtrace/tracing.go | 54 ++ ddtrace/ext/app_types.go | 4 + instrumentation/packages.go | 6 + 9 files changed, 1167 insertions(+), 1 deletion(-) create mode 100644 contrib/cloud.google.com/go/pubsub.v2/admin.go create mode 100644 contrib/cloud.google.com/go/pubsub.v2/admin_test.go diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin.go b/contrib/cloud.google.com/go/pubsub.v2/admin.go new file mode 100644 index 00000000000..4e2ade8ec03 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/admin.go @@ -0,0 +1,296 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pubsub + +import ( + "context" + + vkit "cloud.google.com/go/pubsub/v2/apiv1" + "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" + gax "github.com/googleapis/gax-go/v2" +) + +// TopicAdminClient wraps a *apiv1.TopicAdminClient, tracing its topic and snapshot +// management operations. It embeds the wrapped client, so any method that is not traced +// (e.g. Publish, IAM helpers, Close) is forwarded to the underlying client unchanged. +type TopicAdminClient struct { + *vkit.TopicAdminClient + opts []Option +} + +// WrapTopicAdminClient wraps a *apiv1.TopicAdminClient (commonly obtained from +// (*pubsub.Client).TopicAdminClient) so that its admin operations are traced. +func WrapTopicAdminClient(c *vkit.TopicAdminClient, opts ...Option) *TopicAdminClient { + return &TopicAdminClient{TopicAdminClient: c, opts: opts} +} + +// CreateTopic traces a call to the wrapped client's CreateTopic. +func (c *TopicAdminClient) CreateTopic(ctx context.Context, req *pubsubpb.Topic, opts ...gax.CallOption) (*pubsubpb.Topic, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "createTopic", req.GetName(), c.opts...) + resp, err := c.TopicAdminClient.CreateTopic(ctx, req, opts...) + finish(err) + return resp, err +} + +// UpdateTopic traces a call to the wrapped client's UpdateTopic. +func (c *TopicAdminClient) UpdateTopic(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "updateTopic", req.GetTopic().GetName(), c.opts...) + resp, err := c.TopicAdminClient.UpdateTopic(ctx, req, opts...) + finish(err) + return resp, err +} + +// GetTopic traces a call to the wrapped client's GetTopic. +func (c *TopicAdminClient) GetTopic(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "getTopic", req.GetTopic(), c.opts...) + resp, err := c.TopicAdminClient.GetTopic(ctx, req, opts...) + finish(err) + return resp, err +} + +// ListTopics traces a call to the wrapped client's ListTopics. The span wraps the +// (synchronous) call that returns the iterator, mirroring the underlying lazy RPC behaviour. +func (c *TopicAdminClient) ListTopics(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...gax.CallOption) *vkit.TopicIterator { + ctx, finish := pstrace.TraceAdmin(ctx, "listTopics", req.GetProject(), c.opts...) + it := c.TopicAdminClient.ListTopics(ctx, req, opts...) + finish(nil) + return it +} + +// ListTopicSubscriptions traces a call to the wrapped client's ListTopicSubscriptions. +func (c *TopicAdminClient) ListTopicSubscriptions(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...gax.CallOption) *vkit.StringIterator { + ctx, finish := pstrace.TraceAdmin(ctx, "listTopicSubscriptions", req.GetTopic(), c.opts...) + it := c.TopicAdminClient.ListTopicSubscriptions(ctx, req, opts...) + finish(nil) + return it +} + +// ListTopicSnapshots traces a call to the wrapped client's ListTopicSnapshots. +func (c *TopicAdminClient) ListTopicSnapshots(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...gax.CallOption) *vkit.StringIterator { + ctx, finish := pstrace.TraceAdmin(ctx, "listTopicSnapshots", req.GetTopic(), c.opts...) + it := c.TopicAdminClient.ListTopicSnapshots(ctx, req, opts...) + finish(nil) + return it +} + +// DeleteTopic traces a call to the wrapped client's DeleteTopic. +func (c *TopicAdminClient) DeleteTopic(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceAdmin(ctx, "deleteTopic", req.GetTopic(), c.opts...) + err := c.TopicAdminClient.DeleteTopic(ctx, req, opts...) + finish(err) + return err +} + +// DetachSubscription traces a call to the wrapped client's DetachSubscription. +func (c *TopicAdminClient) DetachSubscription(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.DetachSubscriptionResponse, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "detachSubscription", req.GetSubscription(), c.opts...) + resp, err := c.TopicAdminClient.DetachSubscription(ctx, req, opts...) + finish(err) + return resp, err +} + +// SubscriptionAdminClient wraps a *apiv1.SubscriptionAdminClient, tracing its subscription +// and snapshot management operations. It embeds the wrapped client, so any method that is not +// traced (e.g. Pull, Acknowledge, ModifyAckDeadline, Close) is forwarded unchanged. +type SubscriptionAdminClient struct { + *vkit.SubscriptionAdminClient + opts []Option +} + +// WrapSubscriptionAdminClient wraps a *apiv1.SubscriptionAdminClient (commonly obtained from +// (*pubsub.Client).SubscriptionAdminClient) so that its admin operations are traced. +func WrapSubscriptionAdminClient(c *vkit.SubscriptionAdminClient, opts ...Option) *SubscriptionAdminClient { + return &SubscriptionAdminClient{SubscriptionAdminClient: c, opts: opts} +} + +// CreateSubscription traces a call to the wrapped client's CreateSubscription. +func (c *SubscriptionAdminClient) CreateSubscription(ctx context.Context, req *pubsubpb.Subscription, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "createSubscription", req.GetName(), c.opts...) + resp, err := c.SubscriptionAdminClient.CreateSubscription(ctx, req, opts...) + finish(err) + return resp, err +} + +// GetSubscription traces a call to the wrapped client's GetSubscription. +func (c *SubscriptionAdminClient) GetSubscription(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "getSubscription", req.GetSubscription(), c.opts...) + resp, err := c.SubscriptionAdminClient.GetSubscription(ctx, req, opts...) + finish(err) + return resp, err +} + +// UpdateSubscription traces a call to the wrapped client's UpdateSubscription. +func (c *SubscriptionAdminClient) UpdateSubscription(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "updateSubscription", req.GetSubscription().GetName(), c.opts...) + resp, err := c.SubscriptionAdminClient.UpdateSubscription(ctx, req, opts...) + finish(err) + return resp, err +} + +// ListSubscriptions traces a call to the wrapped client's ListSubscriptions. +func (c *SubscriptionAdminClient) ListSubscriptions(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...gax.CallOption) *vkit.SubscriptionIterator { + ctx, finish := pstrace.TraceAdmin(ctx, "listSubscriptions", req.GetProject(), c.opts...) + it := c.SubscriptionAdminClient.ListSubscriptions(ctx, req, opts...) + finish(nil) + return it +} + +// DeleteSubscription traces a call to the wrapped client's DeleteSubscription. +func (c *SubscriptionAdminClient) DeleteSubscription(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceAdmin(ctx, "deleteSubscription", req.GetSubscription(), c.opts...) + err := c.SubscriptionAdminClient.DeleteSubscription(ctx, req, opts...) + finish(err) + return err +} + +// ModifyPushConfig traces a call to the wrapped client's ModifyPushConfig. +func (c *SubscriptionAdminClient) ModifyPushConfig(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceAdmin(ctx, "modifyPushConfig", req.GetSubscription(), c.opts...) + err := c.SubscriptionAdminClient.ModifyPushConfig(ctx, req, opts...) + finish(err) + return err +} + +// GetSnapshot traces a call to the wrapped client's GetSnapshot. +func (c *SubscriptionAdminClient) GetSnapshot(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "getSnapshot", req.GetSnapshot(), c.opts...) + resp, err := c.SubscriptionAdminClient.GetSnapshot(ctx, req, opts...) + finish(err) + return resp, err +} + +// ListSnapshots traces a call to the wrapped client's ListSnapshots. +func (c *SubscriptionAdminClient) ListSnapshots(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...gax.CallOption) *vkit.SnapshotIterator { + ctx, finish := pstrace.TraceAdmin(ctx, "listSnapshots", req.GetProject(), c.opts...) + it := c.SubscriptionAdminClient.ListSnapshots(ctx, req, opts...) + finish(nil) + return it +} + +// CreateSnapshot traces a call to the wrapped client's CreateSnapshot. +func (c *SubscriptionAdminClient) CreateSnapshot(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "createSnapshot", req.GetName(), c.opts...) + resp, err := c.SubscriptionAdminClient.CreateSnapshot(ctx, req, opts...) + finish(err) + return resp, err +} + +// UpdateSnapshot traces a call to the wrapped client's UpdateSnapshot. +func (c *SubscriptionAdminClient) UpdateSnapshot(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "updateSnapshot", req.GetSnapshot().GetName(), c.opts...) + resp, err := c.SubscriptionAdminClient.UpdateSnapshot(ctx, req, opts...) + finish(err) + return resp, err +} + +// DeleteSnapshot traces a call to the wrapped client's DeleteSnapshot. +func (c *SubscriptionAdminClient) DeleteSnapshot(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceAdmin(ctx, "deleteSnapshot", req.GetSnapshot(), c.opts...) + err := c.SubscriptionAdminClient.DeleteSnapshot(ctx, req, opts...) + finish(err) + return err +} + +// Seek traces a call to the wrapped client's Seek. +func (c *SubscriptionAdminClient) Seek(ctx context.Context, req *pubsubpb.SeekRequest, opts ...gax.CallOption) (*pubsubpb.SeekResponse, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "seek", req.GetSubscription(), c.opts...) + resp, err := c.SubscriptionAdminClient.Seek(ctx, req, opts...) + finish(err) + return resp, err +} + +// SchemaClient wraps a *apiv1.SchemaClient, tracing its schema management operations. +// It embeds the wrapped client, so any method that is not traced (e.g. IAM helpers, Close) +// is forwarded to the underlying client unchanged. +type SchemaClient struct { + *vkit.SchemaClient + opts []Option +} + +// WrapSchemaClient wraps a *apiv1.SchemaClient so that its operations are traced. +func WrapSchemaClient(c *vkit.SchemaClient, opts ...Option) *SchemaClient { + return &SchemaClient{SchemaClient: c, opts: opts} +} + +// CreateSchema traces a call to the wrapped client's CreateSchema. +func (c *SchemaClient) CreateSchema(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "createSchema", req.GetParent(), c.opts...) + resp, err := c.SchemaClient.CreateSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +// GetSchema traces a call to the wrapped client's GetSchema. +func (c *SchemaClient) GetSchema(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "getSchema", req.GetName(), c.opts...) + resp, err := c.SchemaClient.GetSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +// ListSchemas traces a call to the wrapped client's ListSchemas. +func (c *SchemaClient) ListSchemas(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...gax.CallOption) *vkit.SchemaIterator { + ctx, finish := pstrace.TraceAdmin(ctx, "listSchemas", req.GetParent(), c.opts...) + it := c.SchemaClient.ListSchemas(ctx, req, opts...) + finish(nil) + return it +} + +// ListSchemaRevisions traces a call to the wrapped client's ListSchemaRevisions. +func (c *SchemaClient) ListSchemaRevisions(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...gax.CallOption) *vkit.SchemaIterator { + ctx, finish := pstrace.TraceAdmin(ctx, "listSchemaRevisions", req.GetName(), c.opts...) + it := c.SchemaClient.ListSchemaRevisions(ctx, req, opts...) + finish(nil) + return it +} + +// CommitSchema traces a call to the wrapped client's CommitSchema. +func (c *SchemaClient) CommitSchema(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "commitSchema", req.GetName(), c.opts...) + resp, err := c.SchemaClient.CommitSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +// RollbackSchema traces a call to the wrapped client's RollbackSchema. +func (c *SchemaClient) RollbackSchema(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "rollbackSchema", req.GetName(), c.opts...) + resp, err := c.SchemaClient.RollbackSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +// DeleteSchemaRevision traces a call to the wrapped client's DeleteSchemaRevision. +func (c *SchemaClient) DeleteSchemaRevision(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "deleteSchemaRevision", req.GetName(), c.opts...) + resp, err := c.SchemaClient.DeleteSchemaRevision(ctx, req, opts...) + finish(err) + return resp, err +} + +// DeleteSchema traces a call to the wrapped client's DeleteSchema. +func (c *SchemaClient) DeleteSchema(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceAdmin(ctx, "deleteSchema", req.GetName(), c.opts...) + err := c.SchemaClient.DeleteSchema(ctx, req, opts...) + finish(err) + return err +} + +// ValidateSchema traces a call to the wrapped client's ValidateSchema. +func (c *SchemaClient) ValidateSchema(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.ValidateSchemaResponse, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "validateSchema", req.GetParent(), c.opts...) + resp, err := c.SchemaClient.ValidateSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +// ValidateMessage traces a call to the wrapped client's ValidateMessage. +func (c *SchemaClient) ValidateMessage(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...gax.CallOption) (*pubsubpb.ValidateMessageResponse, error) { + ctx, finish := pstrace.TraceAdmin(ctx, "validateMessage", req.GetParent(), c.opts...) + resp, err := c.SchemaClient.ValidateMessage(ctx, req, opts...) + finish(err) + return resp, err +} diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go new file mode 100644 index 00000000000..4197285c97b --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go @@ -0,0 +1,167 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pubsub + +import ( + "context" + "fmt" + "testing" + "time" + + vkit "cloud.google.com/go/pubsub/v2/apiv1" + "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" + "cloud.google.com/go/pubsub/v2/pstest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/api/iterator" + "google.golang.org/api/option" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" +) + +const adminProjectID = "project" + +func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *TopicAdminClient, *SubscriptionAdminClient) { + mt := mocktracer.Start() + t.Cleanup(mt.Stop) + + srv := pstest.NewServer() + t.Cleanup(func() { assert.NoError(t, srv.Close()) }) + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + t.Cleanup(cancel) + + conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, conn.Close()) }) + + tac, err := vkit.NewTopicAdminClient(ctx, option.WithGRPCConn(conn)) + require.NoError(t, err) + sac, err := vkit.NewSubscriptionAdminClient(ctx, option.WithGRPCConn(conn)) + require.NoError(t, err) + + return ctx, mt, WrapTopicAdminClient(tac), WrapSubscriptionAdminClient(sac) +} + +func topicName(id string) string { + return fmt.Sprintf("projects/%s/topics/%s", adminProjectID, id) +} + +func subName(id string) string { + return fmt.Sprintf("projects/%s/subscriptions/%s", adminProjectID, id) +} + +func TestTraceAdminTopicOperations(t *testing.T) { + ctx, mt, tac, _ := setupAdmin(t) + + _, err := tac.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + + _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("topic")}) + require.NoError(t, err) + + it := tac.ListTopics(ctx, &pubsubpb.ListTopicsRequest{Project: fmt.Sprintf("projects/%s", adminProjectID)}) + for { + if _, err := it.Next(); err == iterator.Done { + break + } else { + require.NoError(t, err) + } + } + + err = tac.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: topicName("topic")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 4) + + assertAdminSpan(t, spans[0], "createTopic", "createTopic "+topicName("topic")) + assertAdminSpan(t, spans[1], "getTopic", "getTopic "+topicName("topic")) + assertAdminSpan(t, spans[2], "listTopics", fmt.Sprintf("listTopics projects/%s", adminProjectID)) + assertAdminSpan(t, spans[3], "deleteTopic", "deleteTopic "+topicName("topic")) +} + +func TestTraceAdminSubscriptionOperations(t *testing.T) { + ctx, mt, tac, sac := setupAdmin(t) + + _, err := tac.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + + _, err = sac.CreateSubscription(ctx, &pubsubpb.Subscription{ + Name: subName("sub"), + Topic: topicName("topic"), + }) + require.NoError(t, err) + + _, err = sac.GetSubscription(ctx, &pubsubpb.GetSubscriptionRequest{Subscription: subName("sub")}) + require.NoError(t, err) + + err = sac.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: subName("sub")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 4) + + assertAdminSpan(t, spans[0], "createTopic", "createTopic "+topicName("topic")) + assertAdminSpan(t, spans[1], "createSubscription", "createSubscription "+subName("sub")) + assertAdminSpan(t, spans[2], "getSubscription", "getSubscription "+subName("sub")) + assertAdminSpan(t, spans[3], "deleteSubscription", "deleteSubscription "+subName("sub")) +} + +func TestTraceAdminError(t *testing.T) { + ctx, mt, tac, _ := setupAdmin(t) + + // Getting a topic that does not exist returns an error, which must be recorded on the span. + _, err := tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("missing")}) + require.Error(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.Equal(t, err.Error(), spans[0].Tag(ext.ErrorMsg)) + assertAdminSpan(t, spans[0], "getTopic", "getTopic "+topicName("missing")) +} + +func TestTraceAdminWithService(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + srv := pstest.NewServer() + defer func() { assert.NoError(t, srv.Close()) }() + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + defer func() { assert.NoError(t, conn.Close()) }() + + tac, err := vkit.NewTopicAdminClient(ctx, option.WithGRPCConn(conn)) + require.NoError(t, err) + + wrapped := WrapTopicAdminClient(tac, WithService("my-admin-service")) + _, err = wrapped.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.Equal(t, "my-admin-service", spans[0].Tag(ext.ServiceName)) +} + +func assertAdminSpan(t *testing.T, span *mocktracer.Span, method, resource string) { + t.Helper() + assert.Equal(t, "gcp.pubsub.request", span.OperationName()) + assert.Equal(t, resource, span.Tag(ext.ResourceName)) + assert.Equal(t, ext.SpanTypeWorker, span.Tag(ext.SpanType)) + assert.Equal(t, ext.SpanKindClient, span.Tag(ext.SpanKind)) + assert.Equal(t, "cloud.google.com/go/pubsub.v2", span.Tag(ext.Component)) + assert.Equal(t, ext.MessagingSystemGCPPubsub, span.Tag(ext.MessagingSystem)) + assert.Equal(t, method, span.Tag("pubsub.method")) + assert.Equal(t, adminProjectID, span.Tag("gcloud.project_id")) + assert.Equal(t, "cloud.google.com/go/pubsub.v2", span.Integration()) +} diff --git a/contrib/cloud.google.com/go/pubsub.v2/example_test.go b/contrib/cloud.google.com/go/pubsub.v2/example_test.go index d13a2fad9bc..fe99db4922c 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/example_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/example_test.go @@ -10,6 +10,7 @@ import ( "log" "cloud.google.com/go/pubsub/v2" + "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" pubsubtrace "github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2" ) @@ -41,3 +42,20 @@ func ExampleSubscriber_Receive() { log.Fatal(err) } } + +func ExampleWrapTopicAdminClient() { + client, err := pubsub.NewClient(context.Background(), "project-id") + if err != nil { + log.Fatal(err) + } + + // Wrap the admin client to trace topic, subscription, snapshot and schema + // management operations as gcp.pubsub.request spans. + topicAdmin := pubsubtrace.WrapTopicAdminClient(client.TopicAdminClient) + _, err = topicAdmin.CreateTopic(context.Background(), &pubsubpb.Topic{ + Name: "projects/project-id/topics/topic", + }) + if err != nil { + log.Fatal(err) + } +} diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod index 8b4e2e948d7..d1b0eacbf0b 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -5,6 +5,7 @@ go 1.25.0 require ( cloud.google.com/go/pubsub/v2 v2.0.0 github.com/DataDog/dd-trace-go/v2 v2.10.0-dev + github.com/googleapis/gax-go/v2 v2.20.0 github.com/stretchr/testify v1.11.1 google.golang.org/api v0.273.1 google.golang.org/grpc v1.80.0 @@ -46,7 +47,6 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect - github.com/googleapis/gax-go/v2 v2.20.0 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.6 // indirect diff --git a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml index e87a0f7906f..a7e2bc19013 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml +++ b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml @@ -96,6 +96,625 @@ aspects: }() + ## Admin / management operations ## + # Pub/Sub admin (topic, subscription, snapshot and schema management) RPCs are + # implemented on the GAPIC clients in cloud.google.com/go/pubsub/v2/apiv1. A package-level + # tracer is injected into that package and each management method is wrapped to emit a + # gcp.pubsub.request span. + - id: Initialize pubsubtrace (admin) + join-point: + struct-definition: cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient + advice: + - inject-declarations: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation + lang: go1.18 + template: |- + var ( + __dd_instr_admin *instrumentation.Instrumentation + __dd_pstrace_admin *pubsubtrace.Tracer + ) + + func init() { + component := instrumentation.PackageGCPPubsubV2 + __dd_instr_admin = instrumentation.Load(component) + __dd_pstrace_admin = pubsubtrace.NewTracer(__dd_instr_admin, component) + } + + - id: TopicAdminClient.CreateTopic + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' + - name: CreateTopic + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "createTopic", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: TopicAdminClient.UpdateTopic + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' + - name: UpdateTopic + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "updateTopic", {{ $req }}.GetTopic().GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: TopicAdminClient.GetTopic + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' + - name: GetTopic + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "getTopic", {{ $req }}.GetTopic()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: TopicAdminClient.ListTopics + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' + - name: ListTopics + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listTopics", {{ $req }}.GetProject()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: TopicAdminClient.ListTopicSubscriptions + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' + - name: ListTopicSubscriptions + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listTopicSubscriptions", {{ $req }}.GetTopic()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: TopicAdminClient.ListTopicSnapshots + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' + - name: ListTopicSnapshots + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listTopicSnapshots", {{ $req }}.GetTopic()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: TopicAdminClient.DeleteTopic + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' + - name: DeleteTopic + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteTopic", {{ $req }}.GetTopic()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: TopicAdminClient.DetachSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' + - name: DetachSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "detachSubscription", {{ $req }}.GetSubscription()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.CreateSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: CreateSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "createSubscription", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.GetSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: GetSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "getSubscription", {{ $req }}.GetSubscription()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.UpdateSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: UpdateSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "updateSubscription", {{ $req }}.GetSubscription().GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.ListSubscriptions + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: ListSubscriptions + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listSubscriptions", {{ $req }}.GetProject()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: SubscriptionAdminClient.DeleteSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: DeleteSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteSubscription", {{ $req }}.GetSubscription()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.ModifyPushConfig + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: ModifyPushConfig + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "modifyPushConfig", {{ $req }}.GetSubscription()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.GetSnapshot + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: GetSnapshot + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "getSnapshot", {{ $req }}.GetSnapshot()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.ListSnapshots + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: ListSnapshots + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listSnapshots", {{ $req }}.GetProject()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: SubscriptionAdminClient.CreateSnapshot + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: CreateSnapshot + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "createSnapshot", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.UpdateSnapshot + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: UpdateSnapshot + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "updateSnapshot", {{ $req }}.GetSnapshot().GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.DeleteSnapshot + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: DeleteSnapshot + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteSnapshot", {{ $req }}.GetSnapshot()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriptionAdminClient.Seek + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' + - name: Seek + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "seek", {{ $req }}.GetSubscription()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.CreateSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: CreateSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "createSchema", {{ $req }}.GetParent()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.GetSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: GetSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "getSchema", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.ListSchemas + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: ListSchemas + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listSchemas", {{ $req }}.GetParent()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: SchemaClient.ListSchemaRevisions + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: ListSchemaRevisions + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listSchemaRevisions", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: SchemaClient.CommitSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: CommitSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "commitSchema", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.RollbackSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: RollbackSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "rollbackSchema", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.DeleteSchemaRevision + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: DeleteSchemaRevision + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteSchemaRevision", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.DeleteSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: DeleteSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteSchema", {{ $req }}.GetName()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.ValidateSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: ValidateSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "validateSchema", {{ $req }}.GetParent()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.ValidateMessage + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' + - name: ValidateMessage + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "validateMessage", {{ $req }}.GetParent()) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + # Note: These aspects are also necessary for v1, they should be present in only one of the orchestrion.yml files, # otherwise they will be applied twice and will cause the build to fail. - id: Add fields to PublishResult diff --git a/contrib/cloud.google.com/go/pubsubtrace/config.go b/contrib/cloud.google.com/go/pubsubtrace/config.go index be79564b194..ebaa2311b96 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/config.go +++ b/contrib/cloud.google.com/go/pubsubtrace/config.go @@ -19,6 +19,7 @@ type config struct { serviceSource string publishSpanName string receiveSpanName string + requestSpanName string measured bool propagationAsSpanLinks bool } @@ -35,6 +36,7 @@ func (tr *Tracer) defaultConfig() *config { serviceSource: string(tr.component), publishSpanName: tr.instr.OperationName(instrumentation.ComponentProducer, nil), receiveSpanName: tr.instr.OperationName(instrumentation.ComponentConsumer, nil), + requestSpanName: tr.instr.OperationName(instrumentation.ComponentClient, nil), measured: false, propagationAsSpanLinks: propagationAsSpanLinks, } diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index 1d5a5f6043c..0d028dd5b9b 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -14,6 +14,7 @@ package pubsubtrace import ( "context" + "strings" "sync" "time" @@ -142,3 +143,56 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont return ctx, func() { span.Finish() } } } + +// TraceAdmin starts a span for a Pub/Sub admin/management operation (e.g. createTopic, +// listSubscriptions, deleteSchema). method is the camelCase operation name used for the +// span resource and the pubsub.method tag, and resourcePath is the fully-qualified GCP +// resource path the operation targets (e.g. "projects/p/topics/t"), which may be empty for +// operations that don't reference a specific resource. The returned function finishes the +// span and must be called once the operation completes, passing along any error. +func (tr *Tracer) TraceAdmin(ctx context.Context, method string, resourcePath string, opts ...Option) (context.Context, func(err error)) { + cfg := tr.defaultConfig() + for _, opt := range opts { + opt.apply(cfg) + } + resource := method + if resourcePath != "" { + resource = method + " " + resourcePath + } + spanOpts := []tracer.StartSpanOption{ + tracer.ResourceName(resource), + tracer.SpanType(ext.SpanTypeWorker), + tracer.Tag(ext.Component, tr.component), + tracer.Tag(ext.SpanKind, ext.SpanKindClient), + tracer.Tag(ext.MessagingSystem, ext.MessagingSystemGCPPubsub), + tracer.Tag("pubsub.method", method), + tracer.Measured(), + } + if projectID := projectIDFromResourceName(resourcePath); projectID != "" { + spanOpts = append(spanOpts, tracer.Tag("gcloud.project_id", projectID)) + } + if cfg.serviceName != "" { + spanOpts = append(spanOpts, instrumentation.ServiceNameWithSource(cfg.serviceName, cfg.serviceSource)) + } + span, ctx := tracer.StartSpanFromContext(ctx, cfg.requestSpanName, spanOpts...) + + var once sync.Once + finish := func(err error) { + once.Do(func() { + span.Finish(tracer.WithError(err)) + }) + } + return ctx, finish +} + +// extracts the GCP project ID from a Pubsub resource name of the form +// "projects/{project}/topics/{topic}" or "projects/{project}/subscriptions/{subscription}" +func projectIDFromResourceName(name string) string { + const prefix = "projects/" + if !strings.HasPrefix(name, prefix) { + return "" + } + rest := name[len(prefix):] + project, _, _ := strings.Cut(rest, "/") + return project +} diff --git a/ddtrace/ext/app_types.go b/ddtrace/ext/app_types.go index 5561b63e33c..f04b83a8fb2 100644 --- a/ddtrace/ext/app_types.go +++ b/ddtrace/ext/app_types.go @@ -79,4 +79,8 @@ const ( // SpanTypeLLM marks a span as an LLM operation. SpanTypeLLM = "llm" + + // SpanTypeWorker marks a span as a worker/management operation, such as a + // Pub/Sub admin (topic, subscription, snapshot, schema management) request. + SpanTypeWorker = "worker" ) diff --git a/instrumentation/packages.go b/instrumentation/packages.go index b0175933555..0ecbced35bd 100644 --- a/instrumentation/packages.go +++ b/instrumentation/packages.go @@ -233,6 +233,12 @@ var packages = map[Package]PackageInfo{ buildOpNameV0: staticName("pubsub.publish"), buildOpNameV1: staticName("gcp.pubsub.send"), }, + ComponentClient: { + useDDServiceV0: false, + buildServiceNameV0: staticName(""), + buildOpNameV0: staticName("gcp.pubsub.request"), + buildOpNameV1: staticName("gcp.pubsub.request"), + }, }, }, PackageConfluentKafkaGo: { From 7e35f93f8220e7beb33eb8d0d81ba0959373effc Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 22 Jun 2026 13:12:19 -0400 Subject: [PATCH 15/33] use net/http component --- instrumentation/httptrace/inferred_proxy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go index f35bf0b728d..44c7f4f5952 100644 --- a/instrumentation/httptrace/inferred_proxy.go +++ b/instrumentation/httptrace/inferred_proxy.go @@ -238,7 +238,7 @@ func extractInferredPubsubContext(headers http.Header) *pubsubContext { func startInferredPubsubPushSubscriptionSpan(pubsubContex *pubsubContext, parent *tracer.SpanContext, opts ...tracer.StartSpanOption) *tracer.Span { configService := globalconfig.ServiceName() spanName := "pubsub.receive" - component := "cloud.google.com/go/pubsub" + component := "net/http" optsLocal := make([]tracer.StartSpanOption, len(opts), len(opts)+1) copy(optsLocal, opts) From cc1c3fda29258897cf1b12ee01bbf9764cb26ae7 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 23 Jun 2026 11:24:40 -0400 Subject: [PATCH 16/33] comments --- .../cloud.google.com/go/pubsub.v2/admin.go | 39 ++----------------- .../go/pubsubtrace/tracing.go | 7 +--- 2 files changed, 4 insertions(+), 42 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin.go b/contrib/cloud.google.com/go/pubsub.v2/admin.go index 4e2ade8ec03..0540899ff85 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/admin.go +++ b/contrib/cloud.google.com/go/pubsub.v2/admin.go @@ -13,7 +13,7 @@ import ( gax "github.com/googleapis/gax-go/v2" ) -// TopicAdminClient wraps a *apiv1.TopicAdminClient, tracing its topic and snapshot +// TopicAdminClient wraps *apiv1.TopicAdminClient, tracing its topic and snapshot // management operations. It embeds the wrapped client, so any method that is not traced // (e.g. Publish, IAM helpers, Close) is forwarded to the underlying client unchanged. type TopicAdminClient struct { @@ -21,13 +21,11 @@ type TopicAdminClient struct { opts []Option } -// WrapTopicAdminClient wraps a *apiv1.TopicAdminClient (commonly obtained from -// (*pubsub.Client).TopicAdminClient) so that its admin operations are traced. +// WrapTopicAdminClient wraps *apiv1.TopicAdminClient so that its admin operations are traced. func WrapTopicAdminClient(c *vkit.TopicAdminClient, opts ...Option) *TopicAdminClient { return &TopicAdminClient{TopicAdminClient: c, opts: opts} } -// CreateTopic traces a call to the wrapped client's CreateTopic. func (c *TopicAdminClient) CreateTopic(ctx context.Context, req *pubsubpb.Topic, opts ...gax.CallOption) (*pubsubpb.Topic, error) { ctx, finish := pstrace.TraceAdmin(ctx, "createTopic", req.GetName(), c.opts...) resp, err := c.TopicAdminClient.CreateTopic(ctx, req, opts...) @@ -35,7 +33,6 @@ func (c *TopicAdminClient) CreateTopic(ctx context.Context, req *pubsubpb.Topic, return resp, err } -// UpdateTopic traces a call to the wrapped client's UpdateTopic. func (c *TopicAdminClient) UpdateTopic(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { ctx, finish := pstrace.TraceAdmin(ctx, "updateTopic", req.GetTopic().GetName(), c.opts...) resp, err := c.TopicAdminClient.UpdateTopic(ctx, req, opts...) @@ -43,7 +40,6 @@ func (c *TopicAdminClient) UpdateTopic(ctx context.Context, req *pubsubpb.Update return resp, err } -// GetTopic traces a call to the wrapped client's GetTopic. func (c *TopicAdminClient) GetTopic(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { ctx, finish := pstrace.TraceAdmin(ctx, "getTopic", req.GetTopic(), c.opts...) resp, err := c.TopicAdminClient.GetTopic(ctx, req, opts...) @@ -51,8 +47,6 @@ func (c *TopicAdminClient) GetTopic(ctx context.Context, req *pubsubpb.GetTopicR return resp, err } -// ListTopics traces a call to the wrapped client's ListTopics. The span wraps the -// (synchronous) call that returns the iterator, mirroring the underlying lazy RPC behaviour. func (c *TopicAdminClient) ListTopics(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...gax.CallOption) *vkit.TopicIterator { ctx, finish := pstrace.TraceAdmin(ctx, "listTopics", req.GetProject(), c.opts...) it := c.TopicAdminClient.ListTopics(ctx, req, opts...) @@ -60,7 +54,6 @@ func (c *TopicAdminClient) ListTopics(ctx context.Context, req *pubsubpb.ListTop return it } -// ListTopicSubscriptions traces a call to the wrapped client's ListTopicSubscriptions. func (c *TopicAdminClient) ListTopicSubscriptions(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...gax.CallOption) *vkit.StringIterator { ctx, finish := pstrace.TraceAdmin(ctx, "listTopicSubscriptions", req.GetTopic(), c.opts...) it := c.TopicAdminClient.ListTopicSubscriptions(ctx, req, opts...) @@ -68,7 +61,6 @@ func (c *TopicAdminClient) ListTopicSubscriptions(ctx context.Context, req *pubs return it } -// ListTopicSnapshots traces a call to the wrapped client's ListTopicSnapshots. func (c *TopicAdminClient) ListTopicSnapshots(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...gax.CallOption) *vkit.StringIterator { ctx, finish := pstrace.TraceAdmin(ctx, "listTopicSnapshots", req.GetTopic(), c.opts...) it := c.TopicAdminClient.ListTopicSnapshots(ctx, req, opts...) @@ -76,7 +68,6 @@ func (c *TopicAdminClient) ListTopicSnapshots(ctx context.Context, req *pubsubpb return it } -// DeleteTopic traces a call to the wrapped client's DeleteTopic. func (c *TopicAdminClient) DeleteTopic(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...gax.CallOption) error { ctx, finish := pstrace.TraceAdmin(ctx, "deleteTopic", req.GetTopic(), c.opts...) err := c.TopicAdminClient.DeleteTopic(ctx, req, opts...) @@ -84,7 +75,6 @@ func (c *TopicAdminClient) DeleteTopic(ctx context.Context, req *pubsubpb.Delete return err } -// DetachSubscription traces a call to the wrapped client's DetachSubscription. func (c *TopicAdminClient) DetachSubscription(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.DetachSubscriptionResponse, error) { ctx, finish := pstrace.TraceAdmin(ctx, "detachSubscription", req.GetSubscription(), c.opts...) resp, err := c.TopicAdminClient.DetachSubscription(ctx, req, opts...) @@ -106,7 +96,6 @@ func WrapSubscriptionAdminClient(c *vkit.SubscriptionAdminClient, opts ...Option return &SubscriptionAdminClient{SubscriptionAdminClient: c, opts: opts} } -// CreateSubscription traces a call to the wrapped client's CreateSubscription. func (c *SubscriptionAdminClient) CreateSubscription(ctx context.Context, req *pubsubpb.Subscription, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { ctx, finish := pstrace.TraceAdmin(ctx, "createSubscription", req.GetName(), c.opts...) resp, err := c.SubscriptionAdminClient.CreateSubscription(ctx, req, opts...) @@ -114,7 +103,6 @@ func (c *SubscriptionAdminClient) CreateSubscription(ctx context.Context, req *p return resp, err } -// GetSubscription traces a call to the wrapped client's GetSubscription. func (c *SubscriptionAdminClient) GetSubscription(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { ctx, finish := pstrace.TraceAdmin(ctx, "getSubscription", req.GetSubscription(), c.opts...) resp, err := c.SubscriptionAdminClient.GetSubscription(ctx, req, opts...) @@ -122,7 +110,6 @@ func (c *SubscriptionAdminClient) GetSubscription(ctx context.Context, req *pubs return resp, err } -// UpdateSubscription traces a call to the wrapped client's UpdateSubscription. func (c *SubscriptionAdminClient) UpdateSubscription(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { ctx, finish := pstrace.TraceAdmin(ctx, "updateSubscription", req.GetSubscription().GetName(), c.opts...) resp, err := c.SubscriptionAdminClient.UpdateSubscription(ctx, req, opts...) @@ -130,7 +117,6 @@ func (c *SubscriptionAdminClient) UpdateSubscription(ctx context.Context, req *p return resp, err } -// ListSubscriptions traces a call to the wrapped client's ListSubscriptions. func (c *SubscriptionAdminClient) ListSubscriptions(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...gax.CallOption) *vkit.SubscriptionIterator { ctx, finish := pstrace.TraceAdmin(ctx, "listSubscriptions", req.GetProject(), c.opts...) it := c.SubscriptionAdminClient.ListSubscriptions(ctx, req, opts...) @@ -138,7 +124,6 @@ func (c *SubscriptionAdminClient) ListSubscriptions(ctx context.Context, req *pu return it } -// DeleteSubscription traces a call to the wrapped client's DeleteSubscription. func (c *SubscriptionAdminClient) DeleteSubscription(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...gax.CallOption) error { ctx, finish := pstrace.TraceAdmin(ctx, "deleteSubscription", req.GetSubscription(), c.opts...) err := c.SubscriptionAdminClient.DeleteSubscription(ctx, req, opts...) @@ -146,7 +131,6 @@ func (c *SubscriptionAdminClient) DeleteSubscription(ctx context.Context, req *p return err } -// ModifyPushConfig traces a call to the wrapped client's ModifyPushConfig. func (c *SubscriptionAdminClient) ModifyPushConfig(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...gax.CallOption) error { ctx, finish := pstrace.TraceAdmin(ctx, "modifyPushConfig", req.GetSubscription(), c.opts...) err := c.SubscriptionAdminClient.ModifyPushConfig(ctx, req, opts...) @@ -154,7 +138,6 @@ func (c *SubscriptionAdminClient) ModifyPushConfig(ctx context.Context, req *pub return err } -// GetSnapshot traces a call to the wrapped client's GetSnapshot. func (c *SubscriptionAdminClient) GetSnapshot(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { ctx, finish := pstrace.TraceAdmin(ctx, "getSnapshot", req.GetSnapshot(), c.opts...) resp, err := c.SubscriptionAdminClient.GetSnapshot(ctx, req, opts...) @@ -162,7 +145,6 @@ func (c *SubscriptionAdminClient) GetSnapshot(ctx context.Context, req *pubsubpb return resp, err } -// ListSnapshots traces a call to the wrapped client's ListSnapshots. func (c *SubscriptionAdminClient) ListSnapshots(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...gax.CallOption) *vkit.SnapshotIterator { ctx, finish := pstrace.TraceAdmin(ctx, "listSnapshots", req.GetProject(), c.opts...) it := c.SubscriptionAdminClient.ListSnapshots(ctx, req, opts...) @@ -170,7 +152,6 @@ func (c *SubscriptionAdminClient) ListSnapshots(ctx context.Context, req *pubsub return it } -// CreateSnapshot traces a call to the wrapped client's CreateSnapshot. func (c *SubscriptionAdminClient) CreateSnapshot(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { ctx, finish := pstrace.TraceAdmin(ctx, "createSnapshot", req.GetName(), c.opts...) resp, err := c.SubscriptionAdminClient.CreateSnapshot(ctx, req, opts...) @@ -178,7 +159,6 @@ func (c *SubscriptionAdminClient) CreateSnapshot(ctx context.Context, req *pubsu return resp, err } -// UpdateSnapshot traces a call to the wrapped client's UpdateSnapshot. func (c *SubscriptionAdminClient) UpdateSnapshot(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { ctx, finish := pstrace.TraceAdmin(ctx, "updateSnapshot", req.GetSnapshot().GetName(), c.opts...) resp, err := c.SubscriptionAdminClient.UpdateSnapshot(ctx, req, opts...) @@ -186,7 +166,6 @@ func (c *SubscriptionAdminClient) UpdateSnapshot(ctx context.Context, req *pubsu return resp, err } -// DeleteSnapshot traces a call to the wrapped client's DeleteSnapshot. func (c *SubscriptionAdminClient) DeleteSnapshot(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...gax.CallOption) error { ctx, finish := pstrace.TraceAdmin(ctx, "deleteSnapshot", req.GetSnapshot(), c.opts...) err := c.SubscriptionAdminClient.DeleteSnapshot(ctx, req, opts...) @@ -194,7 +173,6 @@ func (c *SubscriptionAdminClient) DeleteSnapshot(ctx context.Context, req *pubsu return err } -// Seek traces a call to the wrapped client's Seek. func (c *SubscriptionAdminClient) Seek(ctx context.Context, req *pubsubpb.SeekRequest, opts ...gax.CallOption) (*pubsubpb.SeekResponse, error) { ctx, finish := pstrace.TraceAdmin(ctx, "seek", req.GetSubscription(), c.opts...) resp, err := c.SubscriptionAdminClient.Seek(ctx, req, opts...) @@ -202,7 +180,7 @@ func (c *SubscriptionAdminClient) Seek(ctx context.Context, req *pubsubpb.SeekRe return resp, err } -// SchemaClient wraps a *apiv1.SchemaClient, tracing its schema management operations. +// SchemaClient wraps *apiv1.SchemaClient, tracing its schema management operations. // It embeds the wrapped client, so any method that is not traced (e.g. IAM helpers, Close) // is forwarded to the underlying client unchanged. type SchemaClient struct { @@ -210,12 +188,10 @@ type SchemaClient struct { opts []Option } -// WrapSchemaClient wraps a *apiv1.SchemaClient so that its operations are traced. func WrapSchemaClient(c *vkit.SchemaClient, opts ...Option) *SchemaClient { return &SchemaClient{SchemaClient: c, opts: opts} } -// CreateSchema traces a call to the wrapped client's CreateSchema. func (c *SchemaClient) CreateSchema(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { ctx, finish := pstrace.TraceAdmin(ctx, "createSchema", req.GetParent(), c.opts...) resp, err := c.SchemaClient.CreateSchema(ctx, req, opts...) @@ -223,7 +199,6 @@ func (c *SchemaClient) CreateSchema(ctx context.Context, req *pubsubpb.CreateSch return resp, err } -// GetSchema traces a call to the wrapped client's GetSchema. func (c *SchemaClient) GetSchema(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { ctx, finish := pstrace.TraceAdmin(ctx, "getSchema", req.GetName(), c.opts...) resp, err := c.SchemaClient.GetSchema(ctx, req, opts...) @@ -231,7 +206,6 @@ func (c *SchemaClient) GetSchema(ctx context.Context, req *pubsubpb.GetSchemaReq return resp, err } -// ListSchemas traces a call to the wrapped client's ListSchemas. func (c *SchemaClient) ListSchemas(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...gax.CallOption) *vkit.SchemaIterator { ctx, finish := pstrace.TraceAdmin(ctx, "listSchemas", req.GetParent(), c.opts...) it := c.SchemaClient.ListSchemas(ctx, req, opts...) @@ -239,7 +213,6 @@ func (c *SchemaClient) ListSchemas(ctx context.Context, req *pubsubpb.ListSchema return it } -// ListSchemaRevisions traces a call to the wrapped client's ListSchemaRevisions. func (c *SchemaClient) ListSchemaRevisions(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...gax.CallOption) *vkit.SchemaIterator { ctx, finish := pstrace.TraceAdmin(ctx, "listSchemaRevisions", req.GetName(), c.opts...) it := c.SchemaClient.ListSchemaRevisions(ctx, req, opts...) @@ -247,7 +220,6 @@ func (c *SchemaClient) ListSchemaRevisions(ctx context.Context, req *pubsubpb.Li return it } -// CommitSchema traces a call to the wrapped client's CommitSchema. func (c *SchemaClient) CommitSchema(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { ctx, finish := pstrace.TraceAdmin(ctx, "commitSchema", req.GetName(), c.opts...) resp, err := c.SchemaClient.CommitSchema(ctx, req, opts...) @@ -255,7 +227,6 @@ func (c *SchemaClient) CommitSchema(ctx context.Context, req *pubsubpb.CommitSch return resp, err } -// RollbackSchema traces a call to the wrapped client's RollbackSchema. func (c *SchemaClient) RollbackSchema(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { ctx, finish := pstrace.TraceAdmin(ctx, "rollbackSchema", req.GetName(), c.opts...) resp, err := c.SchemaClient.RollbackSchema(ctx, req, opts...) @@ -263,7 +234,6 @@ func (c *SchemaClient) RollbackSchema(ctx context.Context, req *pubsubpb.Rollbac return resp, err } -// DeleteSchemaRevision traces a call to the wrapped client's DeleteSchemaRevision. func (c *SchemaClient) DeleteSchemaRevision(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { ctx, finish := pstrace.TraceAdmin(ctx, "deleteSchemaRevision", req.GetName(), c.opts...) resp, err := c.SchemaClient.DeleteSchemaRevision(ctx, req, opts...) @@ -271,7 +241,6 @@ func (c *SchemaClient) DeleteSchemaRevision(ctx context.Context, req *pubsubpb.D return resp, err } -// DeleteSchema traces a call to the wrapped client's DeleteSchema. func (c *SchemaClient) DeleteSchema(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...gax.CallOption) error { ctx, finish := pstrace.TraceAdmin(ctx, "deleteSchema", req.GetName(), c.opts...) err := c.SchemaClient.DeleteSchema(ctx, req, opts...) @@ -279,7 +248,6 @@ func (c *SchemaClient) DeleteSchema(ctx context.Context, req *pubsubpb.DeleteSch return err } -// ValidateSchema traces a call to the wrapped client's ValidateSchema. func (c *SchemaClient) ValidateSchema(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.ValidateSchemaResponse, error) { ctx, finish := pstrace.TraceAdmin(ctx, "validateSchema", req.GetParent(), c.opts...) resp, err := c.SchemaClient.ValidateSchema(ctx, req, opts...) @@ -287,7 +255,6 @@ func (c *SchemaClient) ValidateSchema(ctx context.Context, req *pubsubpb.Validat return resp, err } -// ValidateMessage traces a call to the wrapped client's ValidateMessage. func (c *SchemaClient) ValidateMessage(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...gax.CallOption) (*pubsubpb.ValidateMessageResponse, error) { ctx, finish := pstrace.TraceAdmin(ctx, "validateMessage", req.GetParent(), c.opts...) resp, err := c.SchemaClient.ValidateMessage(ctx, req, opts...) diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index 0d028dd5b9b..7fdff1c0adb 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -144,12 +144,7 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont } } -// TraceAdmin starts a span for a Pub/Sub admin/management operation (e.g. createTopic, -// listSubscriptions, deleteSchema). method is the camelCase operation name used for the -// span resource and the pubsub.method tag, and resourcePath is the fully-qualified GCP -// resource path the operation targets (e.g. "projects/p/topics/t"), which may be empty for -// operations that don't reference a specific resource. The returned function finishes the -// span and must be called once the operation completes, passing along any error. +// TraceAdmin starts a span for a Pub/Sub admin operation (e.g. createTopic, listSubscriptions, deleteSchema) func (tr *Tracer) TraceAdmin(ctx context.Context, method string, resourcePath string, opts ...Option) (context.Context, func(err error)) { cfg := tr.defaultConfig() for _, opt := range opts { From ae5ddaffd6fdf9711257261d4cdb553074373bce Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Thu, 25 Jun 2026 10:45:18 -0400 Subject: [PATCH 17/33] implement v1 --- .../cloud.google.com/go/pubsub.v1/admin.go | 264 ++++++++ .../go/pubsub.v1/admin_test.go | 166 +++++ contrib/cloud.google.com/go/pubsub.v1/go.mod | 2 +- .../go/pubsub.v1/orchestrion.yml | 619 ++++++++++++++++++ .../cloud.google.com/go/pubsub.v2/admin.go | 78 ++- .../go/pubsub.v2/admin_test.go | 19 +- .../go/pubsub.v2/orchestrion.yml | 60 +- .../cloud.google.com/go/pubsubtrace/admin.go | 145 ++++ .../go/pubsubtrace/admin_v1.go | 147 +++++ .../go/pubsubtrace/tracing.go | 5 +- go.mod | 2 + go.sum | 4 + instrumentation/packages.go | 6 + 13 files changed, 1443 insertions(+), 74 deletions(-) create mode 100644 contrib/cloud.google.com/go/pubsub.v1/admin.go create mode 100644 contrib/cloud.google.com/go/pubsub.v1/admin_test.go create mode 100644 contrib/cloud.google.com/go/pubsubtrace/admin.go create mode 100644 contrib/cloud.google.com/go/pubsubtrace/admin_v1.go diff --git a/contrib/cloud.google.com/go/pubsub.v1/admin.go b/contrib/cloud.google.com/go/pubsub.v1/admin.go new file mode 100644 index 00000000000..b3c9ad7cb6f --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v1/admin.go @@ -0,0 +1,264 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pubsub + +import ( + "context" + + vkit "cloud.google.com/go/pubsub/apiv1" + pubsubpb "cloud.google.com/go/pubsub/apiv1/pubsubpb" + gax "github.com/googleapis/gax-go/v2" +) + +// PublisherClient wraps a *apiv1.PublisherClient, tracing its topic management +// operations. It embeds the wrapped client so any method that is not traced +// (e.g. Publish, IAM helpers, Close) is forwarded unchanged. +type PublisherClient struct { + *vkit.PublisherClient + opts []Option +} + +// WrapPublisherClient wraps a *apiv1.PublisherClient so that its admin operations +// (CreateTopic, GetTopic, ListTopics, ...) are traced. +func WrapPublisherClient(c *vkit.PublisherClient, opts ...Option) *PublisherClient { + return &PublisherClient{PublisherClient: c, opts: opts} +} + +func (c *PublisherClient) CreateTopic(ctx context.Context, req *pubsubpb.Topic, opts ...gax.CallOption) (*pubsubpb.Topic, error) { + ctx, finish := pstrace.TraceCreateTopicV1(ctx, req, c.opts...) + resp, err := c.PublisherClient.CreateTopic(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *PublisherClient) UpdateTopic(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { + ctx, finish := pstrace.TraceUpdateTopicV1(ctx, req, c.opts...) + resp, err := c.PublisherClient.UpdateTopic(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *PublisherClient) GetTopic(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { + ctx, finish := pstrace.TraceGetTopicV1(ctx, req, c.opts...) + resp, err := c.PublisherClient.GetTopic(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *PublisherClient) ListTopics(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...gax.CallOption) *vkit.TopicIterator { + ctx, finish := pstrace.TraceListTopicsV1(ctx, req, c.opts...) + it := c.PublisherClient.ListTopics(ctx, req, opts...) + finish(nil) + return it +} + +func (c *PublisherClient) ListTopicSubscriptions(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...gax.CallOption) *vkit.StringIterator { + ctx, finish := pstrace.TraceListTopicSubscriptionsV1(ctx, req, c.opts...) + it := c.PublisherClient.ListTopicSubscriptions(ctx, req, opts...) + finish(nil) + return it +} + +func (c *PublisherClient) ListTopicSnapshots(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...gax.CallOption) *vkit.StringIterator { + ctx, finish := pstrace.TraceListTopicSnapshotsV1(ctx, req, c.opts...) + it := c.PublisherClient.ListTopicSnapshots(ctx, req, opts...) + finish(nil) + return it +} + +func (c *PublisherClient) DeleteTopic(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceDeleteTopicV1(ctx, req, c.opts...) + err := c.PublisherClient.DeleteTopic(ctx, req, opts...) + finish(err) + return err +} + +func (c *PublisherClient) DetachSubscription(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.DetachSubscriptionResponse, error) { + ctx, finish := pstrace.TraceDetachSubscriptionV1(ctx, req, c.opts...) + resp, err := c.PublisherClient.DetachSubscription(ctx, req, opts...) + finish(err) + return resp, err +} + +// SubscriberClient wraps a *apiv1.SubscriberClient, tracing its subscription and +// snapshot management operations. Non-admin RPCs (Pull, Acknowledge, ModifyAckDeadline, +// Close, ...) are forwarded to the embedded client unchanged. +type SubscriberClient struct { + *vkit.SubscriberClient + opts []Option +} + +// WrapSubscriberClient wraps a *apiv1.SubscriberClient so that its admin operations +// (CreateSubscription, GetSubscription, ModifyPushConfig, Seek, ...) are traced. +func WrapSubscriberClient(c *vkit.SubscriberClient, opts ...Option) *SubscriberClient { + return &SubscriberClient{SubscriberClient: c, opts: opts} +} + +func (c *SubscriberClient) CreateSubscription(ctx context.Context, req *pubsubpb.Subscription, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { + ctx, finish := pstrace.TraceCreateSubscriptionV1(ctx, req, c.opts...) + resp, err := c.SubscriberClient.CreateSubscription(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SubscriberClient) GetSubscription(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { + ctx, finish := pstrace.TraceGetSubscriptionV1(ctx, req, c.opts...) + resp, err := c.SubscriberClient.GetSubscription(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SubscriberClient) UpdateSubscription(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { + ctx, finish := pstrace.TraceUpdateSubscriptionV1(ctx, req, c.opts...) + resp, err := c.SubscriberClient.UpdateSubscription(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SubscriberClient) ListSubscriptions(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...gax.CallOption) *vkit.SubscriptionIterator { + ctx, finish := pstrace.TraceListSubscriptionsV1(ctx, req, c.opts...) + it := c.SubscriberClient.ListSubscriptions(ctx, req, opts...) + finish(nil) + return it +} + +func (c *SubscriberClient) DeleteSubscription(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceDeleteSubscriptionV1(ctx, req, c.opts...) + err := c.SubscriberClient.DeleteSubscription(ctx, req, opts...) + finish(err) + return err +} + +func (c *SubscriberClient) ModifyPushConfig(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceModifyPushConfigV1(ctx, req, c.opts...) + err := c.SubscriberClient.ModifyPushConfig(ctx, req, opts...) + finish(err) + return err +} + +func (c *SubscriberClient) GetSnapshot(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { + ctx, finish := pstrace.TraceGetSnapshotV1(ctx, req, c.opts...) + resp, err := c.SubscriberClient.GetSnapshot(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SubscriberClient) ListSnapshots(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...gax.CallOption) *vkit.SnapshotIterator { + ctx, finish := pstrace.TraceListSnapshotsV1(ctx, req, c.opts...) + it := c.SubscriberClient.ListSnapshots(ctx, req, opts...) + finish(nil) + return it +} + +func (c *SubscriberClient) CreateSnapshot(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { + ctx, finish := pstrace.TraceCreateSnapshotV1(ctx, req, c.opts...) + resp, err := c.SubscriberClient.CreateSnapshot(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SubscriberClient) UpdateSnapshot(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { + ctx, finish := pstrace.TraceUpdateSnapshotV1(ctx, req, c.opts...) + resp, err := c.SubscriberClient.UpdateSnapshot(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SubscriberClient) DeleteSnapshot(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceDeleteSnapshotV1(ctx, req, c.opts...) + err := c.SubscriberClient.DeleteSnapshot(ctx, req, opts...) + finish(err) + return err +} + +func (c *SubscriberClient) Seek(ctx context.Context, req *pubsubpb.SeekRequest, opts ...gax.CallOption) (*pubsubpb.SeekResponse, error) { + ctx, finish := pstrace.TraceSeekV1(ctx, req, c.opts...) + resp, err := c.SubscriberClient.Seek(ctx, req, opts...) + finish(err) + return resp, err +} + +// SchemaClient wraps a *apiv1.SchemaClient, tracing its schema management operations. +// Non-admin RPCs (IAM helpers, Close) are forwarded unchanged. +type SchemaClient struct { + *vkit.SchemaClient + opts []Option +} + +// WrapSchemaClient wraps a *apiv1.SchemaClient so that its operations are traced. +func WrapSchemaClient(c *vkit.SchemaClient, opts ...Option) *SchemaClient { + return &SchemaClient{SchemaClient: c, opts: opts} +} + +func (c *SchemaClient) CreateSchema(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceCreateSchemaV1(ctx, req, c.opts...) + resp, err := c.SchemaClient.CreateSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SchemaClient) GetSchema(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceGetSchemaV1(ctx, req, c.opts...) + resp, err := c.SchemaClient.GetSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SchemaClient) ListSchemas(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...gax.CallOption) *vkit.SchemaIterator { + ctx, finish := pstrace.TraceListSchemasV1(ctx, req, c.opts...) + it := c.SchemaClient.ListSchemas(ctx, req, opts...) + finish(nil) + return it +} + +func (c *SchemaClient) ListSchemaRevisions(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...gax.CallOption) *vkit.SchemaIterator { + ctx, finish := pstrace.TraceListSchemaRevisionsV1(ctx, req, c.opts...) + it := c.SchemaClient.ListSchemaRevisions(ctx, req, opts...) + finish(nil) + return it +} + +func (c *SchemaClient) CommitSchema(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceCommitSchemaV1(ctx, req, c.opts...) + resp, err := c.SchemaClient.CommitSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SchemaClient) RollbackSchema(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceRollbackSchemaV1(ctx, req, c.opts...) + resp, err := c.SchemaClient.RollbackSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SchemaClient) DeleteSchemaRevision(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { + ctx, finish := pstrace.TraceDeleteSchemaRevisionV1(ctx, req, c.opts...) + resp, err := c.SchemaClient.DeleteSchemaRevision(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SchemaClient) DeleteSchema(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...gax.CallOption) error { + ctx, finish := pstrace.TraceDeleteSchemaV1(ctx, req, c.opts...) + err := c.SchemaClient.DeleteSchema(ctx, req, opts...) + finish(err) + return err +} + +func (c *SchemaClient) ValidateSchema(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.ValidateSchemaResponse, error) { + ctx, finish := pstrace.TraceValidateSchemaV1(ctx, req, c.opts...) + resp, err := c.SchemaClient.ValidateSchema(ctx, req, opts...) + finish(err) + return resp, err +} + +func (c *SchemaClient) ValidateMessage(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...gax.CallOption) (*pubsubpb.ValidateMessageResponse, error) { + ctx, finish := pstrace.TraceValidateMessageV1(ctx, req, c.opts...) + resp, err := c.SchemaClient.ValidateMessage(ctx, req, opts...) + finish(err) + return resp, err +} diff --git a/contrib/cloud.google.com/go/pubsub.v1/admin_test.go b/contrib/cloud.google.com/go/pubsub.v1/admin_test.go new file mode 100644 index 00000000000..6c3588caaab --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v1/admin_test.go @@ -0,0 +1,166 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pubsub + +import ( + "context" + "fmt" + "testing" + "time" + + vkit "cloud.google.com/go/pubsub/apiv1" + pubsubpb "cloud.google.com/go/pubsub/apiv1/pubsubpb" + "cloud.google.com/go/pubsub/pstest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/api/iterator" + "google.golang.org/api/option" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" +) + +const adminProjectID = "project" + +func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *PublisherClient, *SubscriberClient) { + mt := mocktracer.Start() + t.Cleanup(mt.Stop) + + srv := pstest.NewServer() + t.Cleanup(func() { assert.NoError(t, srv.Close()) }) + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + t.Cleanup(cancel) + + conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, conn.Close()) }) + + pc, err := vkit.NewPublisherClient(ctx, option.WithGRPCConn(conn)) + require.NoError(t, err) + sc, err := vkit.NewSubscriberClient(ctx, option.WithGRPCConn(conn)) + require.NoError(t, err) + + return ctx, mt, WrapPublisherClient(pc), WrapSubscriberClient(sc) +} + +func topicName(id string) string { + return fmt.Sprintf("projects/%s/topics/%s", adminProjectID, id) +} + +func subName(id string) string { + return fmt.Sprintf("projects/%s/subscriptions/%s", adminProjectID, id) +} + +func TestTraceAdminTopicOperations(t *testing.T) { + ctx, mt, pc, _ := setupAdmin(t) + + _, err := pc.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + + _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("topic")}) + require.NoError(t, err) + + it := pc.ListTopics(ctx, &pubsubpb.ListTopicsRequest{Project: fmt.Sprintf("projects/%s", adminProjectID)}) + for { + if _, err := it.Next(); err == iterator.Done { + break + } else { + require.NoError(t, err) + } + } + + err = pc.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: topicName("topic")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 4) + + assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) + assertAdminSpan(t, spans[1], "GetTopic", "GetTopic "+topicName("topic")) + assertAdminSpan(t, spans[2], "ListTopics", fmt.Sprintf("ListTopics projects/%s", adminProjectID)) + assertAdminSpan(t, spans[3], "DeleteTopic", "DeleteTopic "+topicName("topic")) +} + +func TestTraceAdminSubscriptionOperations(t *testing.T) { + ctx, mt, pc, sc := setupAdmin(t) + + _, err := pc.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + + _, err = sc.CreateSubscription(ctx, &pubsubpb.Subscription{ + Name: subName("sub"), + Topic: topicName("topic"), + }) + require.NoError(t, err) + + _, err = sc.GetSubscription(ctx, &pubsubpb.GetSubscriptionRequest{Subscription: subName("sub")}) + require.NoError(t, err) + + err = sc.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: subName("sub")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 4) + + assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) + assertAdminSpan(t, spans[1], "CreateSubscription", "CreateSubscription "+subName("sub")) + assertAdminSpan(t, spans[2], "GetSubscription", "GetSubscription "+subName("sub")) + assertAdminSpan(t, spans[3], "DeleteSubscription", "DeleteSubscription "+subName("sub")) +} + +func TestTraceAdminError(t *testing.T) { + ctx, mt, pc, _ := setupAdmin(t) + + _, err := pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("missing")}) + require.Error(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.Equal(t, err.Error(), spans[0].Tag(ext.ErrorMsg)) + assertAdminSpan(t, spans[0], "GetTopic", "GetTopic "+topicName("missing")) +} + +func TestTraceAdminWithService(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + srv := pstest.NewServer() + defer func() { assert.NoError(t, srv.Close()) }() + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + defer func() { assert.NoError(t, conn.Close()) }() + + pc, err := vkit.NewPublisherClient(ctx, option.WithGRPCConn(conn)) + require.NoError(t, err) + + wrapped := WrapPublisherClient(pc, WithService("my-admin-service")) + _, err = wrapped.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.Equal(t, "my-admin-service", spans[0].Tag(ext.ServiceName)) +} + +func assertAdminSpan(t *testing.T, span *mocktracer.Span, method, resource string) { + t.Helper() + assert.Equal(t, "gcp.pubsub.request", span.OperationName()) + assert.Equal(t, resource, span.Tag(ext.ResourceName)) + assert.Equal(t, ext.SpanTypeWorker, span.Tag(ext.SpanType)) + assert.Equal(t, ext.SpanKindClient, span.Tag(ext.SpanKind)) + assert.Equal(t, "cloud.google.com/go/pubsub.v1", span.Tag(ext.Component)) + assert.Equal(t, ext.MessagingSystemGCPPubsub, span.Tag(ext.MessagingSystem)) + assert.Equal(t, method, span.Tag("pubsub.method")) + assert.Equal(t, adminProjectID, span.Tag("gcloud.project_id")) + assert.Equal(t, "cloud.google.com/go/pubsub.v1", span.Integration()) +} diff --git a/contrib/cloud.google.com/go/pubsub.v1/go.mod b/contrib/cloud.google.com/go/pubsub.v1/go.mod index b29d7e2145a..4a41c263267 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v1/go.mod @@ -5,6 +5,7 @@ go 1.25.0 require ( cloud.google.com/go/pubsub v1.50.1 github.com/DataDog/dd-trace-go/v2 v2.10.0-dev + github.com/googleapis/gax-go/v2 v2.20.0 github.com/stretchr/testify v1.11.1 google.golang.org/api v0.273.1 google.golang.org/grpc v1.80.0 @@ -47,7 +48,6 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect - github.com/googleapis/gax-go/v2 v2.20.0 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.6 // indirect diff --git a/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml index 55790ac394b..2be83f3237a 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml +++ b/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml @@ -93,3 +93,622 @@ aspects: defer func() { {{ $publishResult }}.DDCloseSpan = __dd_closeSpan }() + + ## Admin / management operations ## + # In v1, admin RPCs live on the GAPIC PublisherClient (topics), SubscriberClient + # (subscriptions + snapshots), and SchemaClient under cloud.google.com/go/pubsub/apiv1. + # We hook each admin method and emit a gcp.pubsub.request span via the per-method + # helpers defined in pubsubtrace/admin_v1.go. + - id: Initialize pubsubtrace (admin) + join-point: + struct-definition: cloud.google.com/go/pubsub/apiv1.PublisherClient + advice: + - inject-declarations: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation + lang: go1.18 + template: |- + var ( + __dd_instr_admin *instrumentation.Instrumentation + __dd_pstrace_admin *pubsubtrace.Tracer + ) + + func init() { + component := instrumentation.PackageGCPPubsub + __dd_instr_admin = instrumentation.Load(component) + __dd_pstrace_admin = pubsubtrace.NewTracer(__dd_instr_admin, component) + } + + - id: PublisherClient.CreateTopic + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' + - name: CreateTopic + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateTopicV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: PublisherClient.UpdateTopic + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' + - name: UpdateTopic + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateTopicV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: PublisherClient.GetTopic + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' + - name: GetTopic + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetTopicV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: PublisherClient.ListTopics + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' + - name: ListTopics + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicsV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: PublisherClient.ListTopicSubscriptions + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' + - name: ListTopicSubscriptions + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicSubscriptionsV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: PublisherClient.ListTopicSnapshots + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' + - name: ListTopicSnapshots + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicSnapshotsV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: PublisherClient.DeleteTopic + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' + - name: DeleteTopic + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteTopicV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: PublisherClient.DetachSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' + - name: DetachSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDetachSubscriptionV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.CreateSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: CreateSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSubscriptionV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.GetSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: GetSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSubscriptionV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.UpdateSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: UpdateSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateSubscriptionV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.ListSubscriptions + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: ListSubscriptions + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSubscriptionsV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: SubscriberClient.DeleteSubscription + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: DeleteSubscription + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSubscriptionV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.ModifyPushConfig + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: ModifyPushConfig + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceModifyPushConfigV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.GetSnapshot + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: GetSnapshot + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSnapshotV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.ListSnapshots + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: ListSnapshots + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSnapshotsV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: SubscriberClient.CreateSnapshot + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: CreateSnapshot + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSnapshotV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.UpdateSnapshot + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: UpdateSnapshot + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateSnapshotV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.DeleteSnapshot + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: DeleteSnapshot + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSnapshotV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SubscriberClient.Seek + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' + - name: Seek + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceSeekV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.CreateSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: CreateSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSchemaV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.GetSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: GetSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSchemaV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.ListSchemas + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: ListSchemas + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSchemasV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: SchemaClient.ListSchemaRevisions + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: ListSchemaRevisions + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSchemaRevisionsV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan(nil) + }() + + - id: SchemaClient.CommitSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: CommitSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCommitSchemaV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.RollbackSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: RollbackSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceRollbackSchemaV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.DeleteSchemaRevision + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: DeleteSchemaRevision + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSchemaRevisionV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.DeleteSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: DeleteSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSchemaV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.ValidateSchema + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: ValidateSchema + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceValidateSchemaV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() + + - id: SchemaClient.ValidateMessage + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' + - name: ValidateMessage + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $ctx := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + {{- $err := .Function.Result 1 -}} + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceValidateMessageV1({{ $ctx }}, {{ $req }}) + {{ $ctx }} = __dd_ctx + defer func() { + __dd_closeSpan({{ $err }}) + }() diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin.go b/contrib/cloud.google.com/go/pubsub.v2/admin.go index 0540899ff85..c0be68cd1f6 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/admin.go +++ b/contrib/cloud.google.com/go/pubsub.v2/admin.go @@ -13,7 +13,7 @@ import ( gax "github.com/googleapis/gax-go/v2" ) -// TopicAdminClient wraps *apiv1.TopicAdminClient, tracing its topic and snapshot +// TopicAdminClient wraps a *apiv1.TopicAdminClient, tracing its topic and snapshot // management operations. It embeds the wrapped client, so any method that is not traced // (e.g. Publish, IAM helpers, Close) is forwarded to the underlying client unchanged. type TopicAdminClient struct { @@ -21,62 +21,63 @@ type TopicAdminClient struct { opts []Option } -// WrapTopicAdminClient wraps *apiv1.TopicAdminClient so that its admin operations are traced. +// WrapTopicAdminClient wraps a *apiv1.TopicAdminClient (commonly obtained from +// (*pubsub.Client).TopicAdminClient) so that its admin operations are traced. func WrapTopicAdminClient(c *vkit.TopicAdminClient, opts ...Option) *TopicAdminClient { return &TopicAdminClient{TopicAdminClient: c, opts: opts} } func (c *TopicAdminClient) CreateTopic(ctx context.Context, req *pubsubpb.Topic, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "createTopic", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceCreateTopic(ctx, req, c.opts...) resp, err := c.TopicAdminClient.CreateTopic(ctx, req, opts...) finish(err) return resp, err } func (c *TopicAdminClient) UpdateTopic(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "updateTopic", req.GetTopic().GetName(), c.opts...) + ctx, finish := pstrace.TraceUpdateTopic(ctx, req, c.opts...) resp, err := c.TopicAdminClient.UpdateTopic(ctx, req, opts...) finish(err) return resp, err } func (c *TopicAdminClient) GetTopic(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "getTopic", req.GetTopic(), c.opts...) + ctx, finish := pstrace.TraceGetTopic(ctx, req, c.opts...) resp, err := c.TopicAdminClient.GetTopic(ctx, req, opts...) finish(err) return resp, err } func (c *TopicAdminClient) ListTopics(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...gax.CallOption) *vkit.TopicIterator { - ctx, finish := pstrace.TraceAdmin(ctx, "listTopics", req.GetProject(), c.opts...) + ctx, finish := pstrace.TraceListTopics(ctx, req, c.opts...) it := c.TopicAdminClient.ListTopics(ctx, req, opts...) finish(nil) return it } func (c *TopicAdminClient) ListTopicSubscriptions(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...gax.CallOption) *vkit.StringIterator { - ctx, finish := pstrace.TraceAdmin(ctx, "listTopicSubscriptions", req.GetTopic(), c.opts...) + ctx, finish := pstrace.TraceListTopicSubscriptions(ctx, req, c.opts...) it := c.TopicAdminClient.ListTopicSubscriptions(ctx, req, opts...) finish(nil) return it } func (c *TopicAdminClient) ListTopicSnapshots(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...gax.CallOption) *vkit.StringIterator { - ctx, finish := pstrace.TraceAdmin(ctx, "listTopicSnapshots", req.GetTopic(), c.opts...) + ctx, finish := pstrace.TraceListTopicSnapshots(ctx, req, c.opts...) it := c.TopicAdminClient.ListTopicSnapshots(ctx, req, opts...) finish(nil) return it } func (c *TopicAdminClient) DeleteTopic(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceAdmin(ctx, "deleteTopic", req.GetTopic(), c.opts...) + ctx, finish := pstrace.TraceDeleteTopic(ctx, req, c.opts...) err := c.TopicAdminClient.DeleteTopic(ctx, req, opts...) finish(err) return err } func (c *TopicAdminClient) DetachSubscription(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.DetachSubscriptionResponse, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "detachSubscription", req.GetSubscription(), c.opts...) + ctx, finish := pstrace.TraceDetachSubscription(ctx, req, c.opts...) resp, err := c.TopicAdminClient.DetachSubscription(ctx, req, opts...) finish(err) return resp, err @@ -96,91 +97,93 @@ func WrapSubscriptionAdminClient(c *vkit.SubscriptionAdminClient, opts ...Option return &SubscriptionAdminClient{SubscriptionAdminClient: c, opts: opts} } +// CreateSubscription traces a call to the wrapped client's CreateSubscription. func (c *SubscriptionAdminClient) CreateSubscription(ctx context.Context, req *pubsubpb.Subscription, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "createSubscription", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceCreateSubscription(ctx, req, c.opts...) resp, err := c.SubscriptionAdminClient.CreateSubscription(ctx, req, opts...) finish(err) return resp, err } +// GetSubscription traces a call to the wrapped client's GetSubscription. func (c *SubscriptionAdminClient) GetSubscription(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "getSubscription", req.GetSubscription(), c.opts...) + ctx, finish := pstrace.TraceGetSubscription(ctx, req, c.opts...) resp, err := c.SubscriptionAdminClient.GetSubscription(ctx, req, opts...) finish(err) return resp, err } func (c *SubscriptionAdminClient) UpdateSubscription(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "updateSubscription", req.GetSubscription().GetName(), c.opts...) + ctx, finish := pstrace.TraceUpdateSubscription(ctx, req, c.opts...) resp, err := c.SubscriptionAdminClient.UpdateSubscription(ctx, req, opts...) finish(err) return resp, err } func (c *SubscriptionAdminClient) ListSubscriptions(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...gax.CallOption) *vkit.SubscriptionIterator { - ctx, finish := pstrace.TraceAdmin(ctx, "listSubscriptions", req.GetProject(), c.opts...) + ctx, finish := pstrace.TraceListSubscriptions(ctx, req, c.opts...) it := c.SubscriptionAdminClient.ListSubscriptions(ctx, req, opts...) finish(nil) return it } func (c *SubscriptionAdminClient) DeleteSubscription(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceAdmin(ctx, "deleteSubscription", req.GetSubscription(), c.opts...) + ctx, finish := pstrace.TraceDeleteSubscription(ctx, req, c.opts...) err := c.SubscriptionAdminClient.DeleteSubscription(ctx, req, opts...) finish(err) return err } func (c *SubscriptionAdminClient) ModifyPushConfig(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceAdmin(ctx, "modifyPushConfig", req.GetSubscription(), c.opts...) + ctx, finish := pstrace.TraceModifyPushConfig(ctx, req, c.opts...) err := c.SubscriptionAdminClient.ModifyPushConfig(ctx, req, opts...) finish(err) return err } func (c *SubscriptionAdminClient) GetSnapshot(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "getSnapshot", req.GetSnapshot(), c.opts...) + ctx, finish := pstrace.TraceGetSnapshot(ctx, req, c.opts...) resp, err := c.SubscriptionAdminClient.GetSnapshot(ctx, req, opts...) finish(err) return resp, err } func (c *SubscriptionAdminClient) ListSnapshots(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...gax.CallOption) *vkit.SnapshotIterator { - ctx, finish := pstrace.TraceAdmin(ctx, "listSnapshots", req.GetProject(), c.opts...) + ctx, finish := pstrace.TraceListSnapshots(ctx, req, c.opts...) it := c.SubscriptionAdminClient.ListSnapshots(ctx, req, opts...) finish(nil) return it } func (c *SubscriptionAdminClient) CreateSnapshot(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "createSnapshot", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceCreateSnapshot(ctx, req, c.opts...) resp, err := c.SubscriptionAdminClient.CreateSnapshot(ctx, req, opts...) finish(err) return resp, err } func (c *SubscriptionAdminClient) UpdateSnapshot(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "updateSnapshot", req.GetSnapshot().GetName(), c.opts...) + ctx, finish := pstrace.TraceUpdateSnapshot(ctx, req, c.opts...) resp, err := c.SubscriptionAdminClient.UpdateSnapshot(ctx, req, opts...) finish(err) return resp, err } func (c *SubscriptionAdminClient) DeleteSnapshot(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceAdmin(ctx, "deleteSnapshot", req.GetSnapshot(), c.opts...) + ctx, finish := pstrace.TraceDeleteSnapshot(ctx, req, c.opts...) err := c.SubscriptionAdminClient.DeleteSnapshot(ctx, req, opts...) finish(err) return err } func (c *SubscriptionAdminClient) Seek(ctx context.Context, req *pubsubpb.SeekRequest, opts ...gax.CallOption) (*pubsubpb.SeekResponse, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "seek", req.GetSubscription(), c.opts...) + ctx, finish := pstrace.TraceSeek(ctx, req, c.opts...) resp, err := c.SubscriptionAdminClient.Seek(ctx, req, opts...) finish(err) return resp, err } -// SchemaClient wraps *apiv1.SchemaClient, tracing its schema management operations. +// SchemaClient wraps a *apiv1.SchemaClient, tracing its schema management operations. // It embeds the wrapped client, so any method that is not traced (e.g. IAM helpers, Close) // is forwarded to the underlying client unchanged. type SchemaClient struct { @@ -188,75 +191,84 @@ type SchemaClient struct { opts []Option } +// WrapSchemaClient wraps a *apiv1.SchemaClient so that its operations are traced. func WrapSchemaClient(c *vkit.SchemaClient, opts ...Option) *SchemaClient { return &SchemaClient{SchemaClient: c, opts: opts} } func (c *SchemaClient) CreateSchema(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "createSchema", req.GetParent(), c.opts...) + ctx, finish := pstrace.TraceCreateSchema(ctx, req, c.opts...) resp, err := c.SchemaClient.CreateSchema(ctx, req, opts...) finish(err) return resp, err } func (c *SchemaClient) GetSchema(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "getSchema", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceGetSchema(ctx, req, c.opts...) resp, err := c.SchemaClient.GetSchema(ctx, req, opts...) finish(err) return resp, err } +// ListSchemas traces a call to the wrapped client's ListSchemas. func (c *SchemaClient) ListSchemas(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...gax.CallOption) *vkit.SchemaIterator { - ctx, finish := pstrace.TraceAdmin(ctx, "listSchemas", req.GetParent(), c.opts...) + ctx, finish := pstrace.TraceListSchemas(ctx, req, c.opts...) it := c.SchemaClient.ListSchemas(ctx, req, opts...) finish(nil) return it } +// ListSchemaRevisions traces a call to the wrapped client's ListSchemaRevisions. func (c *SchemaClient) ListSchemaRevisions(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...gax.CallOption) *vkit.SchemaIterator { - ctx, finish := pstrace.TraceAdmin(ctx, "listSchemaRevisions", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceListSchemaRevisions(ctx, req, c.opts...) it := c.SchemaClient.ListSchemaRevisions(ctx, req, opts...) finish(nil) return it } +// CommitSchema traces a call to the wrapped client's CommitSchema. func (c *SchemaClient) CommitSchema(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "commitSchema", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceCommitSchema(ctx, req, c.opts...) resp, err := c.SchemaClient.CommitSchema(ctx, req, opts...) finish(err) return resp, err } +// RollbackSchema traces a call to the wrapped client's RollbackSchema. func (c *SchemaClient) RollbackSchema(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "rollbackSchema", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceRollbackSchema(ctx, req, c.opts...) resp, err := c.SchemaClient.RollbackSchema(ctx, req, opts...) finish(err) return resp, err } +// DeleteSchemaRevision traces a call to the wrapped client's DeleteSchemaRevision. func (c *SchemaClient) DeleteSchemaRevision(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "deleteSchemaRevision", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceDeleteSchemaRevision(ctx, req, c.opts...) resp, err := c.SchemaClient.DeleteSchemaRevision(ctx, req, opts...) finish(err) return resp, err } +// DeleteSchema traces a call to the wrapped client's DeleteSchema. func (c *SchemaClient) DeleteSchema(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceAdmin(ctx, "deleteSchema", req.GetName(), c.opts...) + ctx, finish := pstrace.TraceDeleteSchema(ctx, req, c.opts...) err := c.SchemaClient.DeleteSchema(ctx, req, opts...) finish(err) return err } +// ValidateSchema traces a call to the wrapped client's ValidateSchema. func (c *SchemaClient) ValidateSchema(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.ValidateSchemaResponse, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "validateSchema", req.GetParent(), c.opts...) + ctx, finish := pstrace.TraceValidateSchema(ctx, req, c.opts...) resp, err := c.SchemaClient.ValidateSchema(ctx, req, opts...) finish(err) return resp, err } +// ValidateMessage traces a call to the wrapped client's ValidateMessage. func (c *SchemaClient) ValidateMessage(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...gax.CallOption) (*pubsubpb.ValidateMessageResponse, error) { - ctx, finish := pstrace.TraceAdmin(ctx, "validateMessage", req.GetParent(), c.opts...) + ctx, finish := pstrace.TraceValidateMessage(ctx, req, c.opts...) resp, err := c.SchemaClient.ValidateMessage(ctx, req, opts...) finish(err) return resp, err diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go index 4197285c97b..9b4cd25ee52 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go @@ -81,10 +81,10 @@ func TestTraceAdminTopicOperations(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 4) - assertAdminSpan(t, spans[0], "createTopic", "createTopic "+topicName("topic")) - assertAdminSpan(t, spans[1], "getTopic", "getTopic "+topicName("topic")) - assertAdminSpan(t, spans[2], "listTopics", fmt.Sprintf("listTopics projects/%s", adminProjectID)) - assertAdminSpan(t, spans[3], "deleteTopic", "deleteTopic "+topicName("topic")) + assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) + assertAdminSpan(t, spans[1], "GetTopic", "GetTopic "+topicName("topic")) + assertAdminSpan(t, spans[2], "ListTopics", fmt.Sprintf("ListTopics projects/%s", adminProjectID)) + assertAdminSpan(t, spans[3], "DeleteTopic", "DeleteTopic "+topicName("topic")) } func TestTraceAdminSubscriptionOperations(t *testing.T) { @@ -108,10 +108,10 @@ func TestTraceAdminSubscriptionOperations(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 4) - assertAdminSpan(t, spans[0], "createTopic", "createTopic "+topicName("topic")) - assertAdminSpan(t, spans[1], "createSubscription", "createSubscription "+subName("sub")) - assertAdminSpan(t, spans[2], "getSubscription", "getSubscription "+subName("sub")) - assertAdminSpan(t, spans[3], "deleteSubscription", "deleteSubscription "+subName("sub")) + assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) + assertAdminSpan(t, spans[1], "CreateSubscription", "CreateSubscription "+subName("sub")) + assertAdminSpan(t, spans[2], "GetSubscription", "GetSubscription "+subName("sub")) + assertAdminSpan(t, spans[3], "DeleteSubscription", "DeleteSubscription "+subName("sub")) } func TestTraceAdminError(t *testing.T) { @@ -124,7 +124,7 @@ func TestTraceAdminError(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 1) assert.Equal(t, err.Error(), spans[0].Tag(ext.ErrorMsg)) - assertAdminSpan(t, spans[0], "getTopic", "getTopic "+topicName("missing")) + assertAdminSpan(t, spans[0], "GetTopic", "GetTopic "+topicName("missing")) } func TestTraceAdminWithService(t *testing.T) { @@ -153,6 +153,7 @@ func TestTraceAdminWithService(t *testing.T) { assert.Equal(t, "my-admin-service", spans[0].Tag(ext.ServiceName)) } + func assertAdminSpan(t *testing.T, span *mocktracer.Span, method, resource string) { t.Helper() assert.Equal(t, "gcp.pubsub.request", span.OperationName()) diff --git a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml index a7e2bc19013..1f7ebf7c1f6 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml +++ b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml @@ -136,7 +136,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "createTopic", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateTopic({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -156,7 +156,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "updateTopic", {{ $req }}.GetTopic().GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateTopic({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -176,7 +176,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "getTopic", {{ $req }}.GetTopic()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetTopic({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -195,7 +195,7 @@ aspects: template: |- {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listTopics", {{ $req }}.GetProject()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopics({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan(nil) @@ -214,7 +214,7 @@ aspects: template: |- {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listTopicSubscriptions", {{ $req }}.GetTopic()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicSubscriptions({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan(nil) @@ -233,7 +233,7 @@ aspects: template: |- {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listTopicSnapshots", {{ $req }}.GetTopic()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicSnapshots({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan(nil) @@ -253,7 +253,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteTopic", {{ $req }}.GetTopic()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteTopic({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -273,7 +273,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "detachSubscription", {{ $req }}.GetSubscription()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDetachSubscription({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -293,7 +293,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "createSubscription", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSubscription({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -313,7 +313,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "getSubscription", {{ $req }}.GetSubscription()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSubscription({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -333,7 +333,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "updateSubscription", {{ $req }}.GetSubscription().GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateSubscription({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -352,7 +352,7 @@ aspects: template: |- {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listSubscriptions", {{ $req }}.GetProject()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSubscriptions({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan(nil) @@ -372,7 +372,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteSubscription", {{ $req }}.GetSubscription()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSubscription({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -392,7 +392,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "modifyPushConfig", {{ $req }}.GetSubscription()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceModifyPushConfig({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -412,7 +412,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "getSnapshot", {{ $req }}.GetSnapshot()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSnapshot({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -431,7 +431,7 @@ aspects: template: |- {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listSnapshots", {{ $req }}.GetProject()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSnapshots({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan(nil) @@ -451,7 +451,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "createSnapshot", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSnapshot({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -471,7 +471,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "updateSnapshot", {{ $req }}.GetSnapshot().GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateSnapshot({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -491,7 +491,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteSnapshot", {{ $req }}.GetSnapshot()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSnapshot({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -511,7 +511,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "seek", {{ $req }}.GetSubscription()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceSeek({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -531,7 +531,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "createSchema", {{ $req }}.GetParent()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSchema({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -551,7 +551,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "getSchema", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSchema({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -570,7 +570,7 @@ aspects: template: |- {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listSchemas", {{ $req }}.GetParent()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSchemas({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan(nil) @@ -589,7 +589,7 @@ aspects: template: |- {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "listSchemaRevisions", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSchemaRevisions({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan(nil) @@ -609,7 +609,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "commitSchema", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCommitSchema({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -629,7 +629,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "rollbackSchema", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceRollbackSchema({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -649,7 +649,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteSchemaRevision", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSchemaRevision({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -669,7 +669,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "deleteSchema", {{ $req }}.GetName()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSchema({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -689,7 +689,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "validateSchema", {{ $req }}.GetParent()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceValidateSchema({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) @@ -709,7 +709,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $req := .Function.Argument 1 -}} {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceAdmin({{ $ctx }}, "validateMessage", {{ $req }}.GetParent()) + __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceValidateMessage({{ $ctx }}, {{ $req }}) {{ $ctx }} = __dd_ctx defer func() { __dd_closeSpan({{ $err }}) diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin.go b/contrib/cloud.google.com/go/pubsubtrace/admin.go new file mode 100644 index 00000000000..ba4a30b16f4 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsubtrace/admin.go @@ -0,0 +1,145 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// helpers for Pub/Sub v2 admin tracing. +// +// Each helper exists so the manual instrumentation in contrib/.../pubsub.v2/admin.go +// and the orchestrion aspects in contrib/.../pubsub.v2/orchestrion.yml can share a +// single (method, resourcePath) mapping. Without these helpers the same span tag may +// drift between the two call paths. + +package pubsubtrace + +import ( + "context" + + "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" +) + +// -- TopicAdminClient -- + +func (tr *Tracer) TraceCreateTopic(ctx context.Context, req *pubsubpb.Topic, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CreateTopic", req.GetName(), opts...) +} + +func (tr *Tracer) TraceUpdateTopic(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "UpdateTopic", req.GetTopic().GetName(), opts...) +} + +func (tr *Tracer) TraceGetTopic(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "GetTopic", req.GetTopic(), opts...) +} + +func (tr *Tracer) TraceListTopics(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListTopics", req.GetProject(), opts...) +} + +func (tr *Tracer) TraceListTopicSubscriptions(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListTopicSubscriptions", req.GetTopic(), opts...) +} + +func (tr *Tracer) TraceListTopicSnapshots(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListTopicSnapshots", req.GetTopic(), opts...) +} + +func (tr *Tracer) TraceDeleteTopic(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteTopic", req.GetTopic(), opts...) +} + +func (tr *Tracer) TraceDetachSubscription(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DetachSubscription", req.GetSubscription(), opts...) +} + +// -- SubscriptionAdminClient -- + +func (tr *Tracer) TraceCreateSubscription(ctx context.Context, req *pubsubpb.Subscription, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CreateSubscription", req.GetName(), opts...) +} + +func (tr *Tracer) TraceGetSubscription(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "GetSubscription", req.GetSubscription(), opts...) +} + +func (tr *Tracer) TraceUpdateSubscription(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "UpdateSubscription", req.GetSubscription().GetName(), opts...) +} + +func (tr *Tracer) TraceListSubscriptions(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListSubscriptions", req.GetProject(), opts...) +} + +func (tr *Tracer) TraceDeleteSubscription(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteSubscription", req.GetSubscription(), opts...) +} + +func (tr *Tracer) TraceModifyPushConfig(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ModifyPushConfig", req.GetSubscription(), opts...) +} + +func (tr *Tracer) TraceGetSnapshot(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "GetSnapshot", req.GetSnapshot(), opts...) +} + +func (tr *Tracer) TraceListSnapshots(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListSnapshots", req.GetProject(), opts...) +} + +func (tr *Tracer) TraceCreateSnapshot(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CreateSnapshot", req.GetName(), opts...) +} + +func (tr *Tracer) TraceUpdateSnapshot(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "UpdateSnapshot", req.GetSnapshot().GetName(), opts...) +} + +func (tr *Tracer) TraceDeleteSnapshot(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteSnapshot", req.GetSnapshot(), opts...) +} + +func (tr *Tracer) TraceSeek(ctx context.Context, req *pubsubpb.SeekRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "Seek", req.GetSubscription(), opts...) +} + +// -- SchemaClient -- + +func (tr *Tracer) TraceCreateSchema(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CreateSchema", req.GetParent(), opts...) +} + +func (tr *Tracer) TraceGetSchema(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "GetSchema", req.GetName(), opts...) +} + +func (tr *Tracer) TraceListSchemas(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListSchemas", req.GetParent(), opts...) +} + +func (tr *Tracer) TraceListSchemaRevisions(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListSchemaRevisions", req.GetName(), opts...) +} + +func (tr *Tracer) TraceCommitSchema(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CommitSchema", req.GetName(), opts...) +} + +func (tr *Tracer) TraceRollbackSchema(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "RollbackSchema", req.GetName(), opts...) +} + +func (tr *Tracer) TraceDeleteSchemaRevision(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteSchemaRevision", req.GetName(), opts...) +} + +func (tr *Tracer) TraceDeleteSchema(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteSchema", req.GetName(), opts...) +} + +func (tr *Tracer) TraceValidateSchema(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ValidateSchema", req.GetParent(), opts...) +} + +func (tr *Tracer) TraceValidateMessage(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ValidateMessage", req.GetParent(), opts...) +} diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go new file mode 100644 index 00000000000..74e3f7e1986 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go @@ -0,0 +1,147 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// helpers for Pub/Sub v1 admin tracing. These mirror admin.go but take v1 +// pubsubpb types (cloud.google.com/go/pubsub/apiv1/pubsubpb), which are distinct +// Go types from v2's pubsubpb +// +// v1 distributes admin RPCs across the PublisherClient (topics) and SubscriberClient +// (subscriptions + snapshots) GAPIC clients, plus the SchemaClient. v2 separates +// these into TopicAdminClient/SubscriptionAdminClient/SchemaClient. The set of RPCs +// is the same; only the home struct differs. + +package pubsubtrace + +import ( + "context" + + pubsubpb "cloud.google.com/go/pubsub/apiv1/pubsubpb" +) + +// -- PublisherClient (topics) -- + +func (tr *Tracer) TraceCreateTopicV1(ctx context.Context, req *pubsubpb.Topic, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CreateTopic", req.GetName(), opts...) +} + +func (tr *Tracer) TraceUpdateTopicV1(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "UpdateTopic", req.GetTopic().GetName(), opts...) +} + +func (tr *Tracer) TraceGetTopicV1(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "GetTopic", req.GetTopic(), opts...) +} + +func (tr *Tracer) TraceListTopicsV1(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListTopics", req.GetProject(), opts...) +} + +func (tr *Tracer) TraceListTopicSubscriptionsV1(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListTopicSubscriptions", req.GetTopic(), opts...) +} + +func (tr *Tracer) TraceListTopicSnapshotsV1(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListTopicSnapshots", req.GetTopic(), opts...) +} + +func (tr *Tracer) TraceDeleteTopicV1(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteTopic", req.GetTopic(), opts...) +} + +func (tr *Tracer) TraceDetachSubscriptionV1(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DetachSubscription", req.GetSubscription(), opts...) +} + +// -- SubscriberClient (subscriptions + snapshots) -- + +func (tr *Tracer) TraceCreateSubscriptionV1(ctx context.Context, req *pubsubpb.Subscription, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CreateSubscription", req.GetName(), opts...) +} + +func (tr *Tracer) TraceGetSubscriptionV1(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "GetSubscription", req.GetSubscription(), opts...) +} + +func (tr *Tracer) TraceUpdateSubscriptionV1(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "UpdateSubscription", req.GetSubscription().GetName(), opts...) +} + +func (tr *Tracer) TraceListSubscriptionsV1(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListSubscriptions", req.GetProject(), opts...) +} + +func (tr *Tracer) TraceDeleteSubscriptionV1(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteSubscription", req.GetSubscription(), opts...) +} + +func (tr *Tracer) TraceModifyPushConfigV1(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ModifyPushConfig", req.GetSubscription(), opts...) +} + +func (tr *Tracer) TraceGetSnapshotV1(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "GetSnapshot", req.GetSnapshot(), opts...) +} + +func (tr *Tracer) TraceListSnapshotsV1(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListSnapshots", req.GetProject(), opts...) +} + +func (tr *Tracer) TraceCreateSnapshotV1(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CreateSnapshot", req.GetName(), opts...) +} + +func (tr *Tracer) TraceUpdateSnapshotV1(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "UpdateSnapshot", req.GetSnapshot().GetName(), opts...) +} + +func (tr *Tracer) TraceDeleteSnapshotV1(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteSnapshot", req.GetSnapshot(), opts...) +} + +func (tr *Tracer) TraceSeekV1(ctx context.Context, req *pubsubpb.SeekRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "Seek", req.GetSubscription(), opts...) +} + +// -- SchemaClient -- + +func (tr *Tracer) TraceCreateSchemaV1(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CreateSchema", req.GetParent(), opts...) +} + +func (tr *Tracer) TraceGetSchemaV1(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "GetSchema", req.GetName(), opts...) +} + +func (tr *Tracer) TraceListSchemasV1(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListSchemas", req.GetParent(), opts...) +} + +func (tr *Tracer) TraceListSchemaRevisionsV1(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ListSchemaRevisions", req.GetName(), opts...) +} + +func (tr *Tracer) TraceCommitSchemaV1(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "CommitSchema", req.GetName(), opts...) +} + +func (tr *Tracer) TraceRollbackSchemaV1(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "RollbackSchema", req.GetName(), opts...) +} + +func (tr *Tracer) TraceDeleteSchemaRevisionV1(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteSchemaRevision", req.GetName(), opts...) +} + +func (tr *Tracer) TraceDeleteSchemaV1(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "DeleteSchema", req.GetName(), opts...) +} + +func (tr *Tracer) TraceValidateSchemaV1(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ValidateSchema", req.GetParent(), opts...) +} + +func (tr *Tracer) TraceValidateMessageV1(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...Option) (context.Context, func(error)) { + return tr.TraceAdmin(ctx, "ValidateMessage", req.GetParent(), opts...) +} diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index 7fdff1c0adb..32e1534bd10 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -144,7 +144,9 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont } } -// TraceAdmin starts a span for a Pub/Sub admin operation (e.g. createTopic, listSubscriptions, deleteSchema) +// TraceAdmin starts a span for a Pub/Sub admin operation (e.g. CreateTopic, ListSubscriptions, DeleteSchema). +// Prefer the per-method helpers in admin.go (TraceCreateTopic, TraceGetTopic, ...) so the +// (method, resourcePath) mapping has a single source of truth shared with the orchestrion aspects. func (tr *Tracer) TraceAdmin(ctx context.Context, method string, resourcePath string, opts ...Option) (context.Context, func(err error)) { cfg := tr.defaultConfig() for _, opt := range opts { @@ -169,6 +171,7 @@ func (tr *Tracer) TraceAdmin(ctx context.Context, method string, resourcePath st if cfg.serviceName != "" { spanOpts = append(spanOpts, instrumentation.ServiceNameWithSource(cfg.serviceName, cfg.serviceSource)) } + span, ctx := tracer.StartSpanFromContext(ctx, cfg.requestSpanName, spanOpts...) var once sync.Once diff --git a/go.mod b/go.mod index ab016dcb765..e97de1e7f37 100644 --- a/go.mod +++ b/go.mod @@ -57,6 +57,8 @@ require ( ) require ( + cloud.google.com/go/pubsub v1.50.1 // indirect + cloud.google.com/go/pubsub/v2 v2.0.0 // indirect github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.79.0 // indirect github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.79.0 // indirect github.com/DataDog/datadog-agent/pkg/trace v0.79.0 // indirect diff --git a/go.sum b/go.sum index c466eb5d0d3..0237d6f6226 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,7 @@ +cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= +cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= +cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= +cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.79.0 h1:VZlYzVCzCsY3TsEdDCFHklzL2k2C3OeQvgDhU2gllg0= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.79.0/go.mod h1:dz3fkTBxANLLLigy9KQ5jhNZ28nA4dI9AxuLoGrmR0o= github.com/DataDog/datadog-agent/pkg/obfuscate v0.79.0 h1:PeYLm/gZQM7iKXOG4NgbKo6ZfpG73/+f8TSzmCUtA6g= diff --git a/instrumentation/packages.go b/instrumentation/packages.go index b4e1848fb6a..eaacf213898 100644 --- a/instrumentation/packages.go +++ b/instrumentation/packages.go @@ -216,6 +216,12 @@ var packages = map[Package]PackageInfo{ buildOpNameV0: staticName("pubsub.publish"), buildOpNameV1: staticName("gcp.pubsub.send"), }, + ComponentClient: { + useDDServiceV0: false, + buildServiceNameV0: staticName(""), + buildOpNameV0: staticName("gcp.pubsub.request"), + buildOpNameV1: staticName("gcp.pubsub.request"), + }, }, }, PackageGCPPubsubV2: { From ca2824fb4c39bcc72a338180825c51d37007fb99 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Thu, 25 Jun 2026 12:21:08 -0400 Subject: [PATCH 18/33] v2 span links tests --- .../go/pubsub.v2/pubsub_test.go | 77 +++++++++++++++++++ .../go/pubsubtrace/tracing.go | 1 - 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go index 7afa24bd98a..46200871c32 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go @@ -274,6 +274,83 @@ func TestPropagationNoPublisherSpan(t *testing.T) { assert.Equal("cloud.google.com/go/pubsub.v2", spans[0].Integration()) } +func TestPropagationAsSpanLinksOption(t *testing.T) { + assert := assert.New(t) + ctx, cancel, mt, pub, sub := setup(t) + + // Publisher + span, pctx := tracer.StartSpanFromContext(ctx, "propagation-test") + _, err := Publish(pctx, pub, &pubsub.Message{Data: []byte("hello")}).Get(pctx) + assert.NoError(err) + span.Finish() + + // Subscriber with WithPropagationAsSpanLinks option + var called bool + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + assert.False(called, "callback called twice") + msg.Ack() + called = true + cancel() + }, WithPropagationAsSpanLinks())) + assert.True(called, "callback not called") + assert.NoError(err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 3, "wrong number of spans") + + publishSpan := spans[0] + assert.Equal("pubsub.publish", publishSpan.OperationName()) + + receiveSpan := spans[2] + assert.Equal("pubsub.receive", receiveSpan.OperationName()) + + // Receive span must NOT share the producer trace — traces stay separate. + assert.NotEqual(publishSpan.TraceID(), receiveSpan.TraceID(), "receive span should start a new trace") + assert.Equal(uint64(0), receiveSpan.ParentID(), "receive span should have no parent") + + // The pubsub.publish span must appear as a span link on the receive span. + links := receiveSpan.Links() + require.Len(t, links, 1, "expected exactly one span link") + assert.Equal(publishSpan.SpanID(), links[0].SpanID, "span link should point to publish span") +} + +func TestPropagationAsSpanLinksEnvVar(t *testing.T) { + t.Setenv("DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS", "true") + + assert := assert.New(t) + ctx, cancel, mt, pub, sub := setup(t) + + // Publisher + span, pctx := tracer.StartSpanFromContext(ctx, "propagation-test") + _, err := Publish(pctx, pub, &pubsub.Message{Data: []byte("hello")}).Get(pctx) + assert.NoError(err) + span.Finish() + + // Subscriber — no explicit option, env var drives behavior. + var called bool + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + assert.False(called, "callback called twice") + msg.Ack() + called = true + cancel() + })) + assert.True(called, "callback not called") + assert.NoError(err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 3, "wrong number of spans") + + publishSpan := spans[0] + receiveSpan := spans[2] + assert.Equal("pubsub.receive", receiveSpan.OperationName()) + assert.NotEqual(publishSpan.TraceID(), receiveSpan.TraceID(), "receive span should start a new trace") + assert.Equal(uint64(0), receiveSpan.ParentID(), "receive span should have no parent") + + links := receiveSpan.Links() + require.Len(t, links, 1, "expected exactly one span link") + assert.Equal(publishSpan.SpanID(), links[0].SpanID, "span link should point to publish span") +} + func filterTags(m map[string]any) map[string]any { delete(m, "_dd.p.tid") delete(m, "_dd.profiling.enabled") diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index a7cc967a559..e55c7025398 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -123,7 +123,6 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont tracer.Tag(ext.MessagingSystem, ext.MessagingSystemGCPPubsub), tracer.Tag(ext.MessagingOperationName, "receive"), tracer.Tag(ext.MessagingDestinationName, s.String()), - tracer.ChildOf(parentSpanCtx), } if cfg.propagationAsSpanLinks && parentSpanCtx != nil { // Record the producer span as a span link From f4adadaffe5984c1fd9a59082e149e89132440a6 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Thu, 25 Jun 2026 12:33:07 -0400 Subject: [PATCH 19/33] update component in tests --- instrumentation/httptrace/httptrace_pubsub_push_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/httptrace/httptrace_pubsub_push_test.go b/instrumentation/httptrace/httptrace_pubsub_push_test.go index ce8c364ee55..db510bd7dd1 100644 --- a/instrumentation/httptrace/httptrace_pubsub_push_test.go +++ b/instrumentation/httptrace/httptrace_pubsub_push_test.go @@ -84,7 +84,7 @@ func TestInferredPubsubPushSpans(t *testing.T) { assert.Equal(t, ext.SpanTypeMessageConsumer, pubsubSpan.Tag(ext.SpanType)) assert.Equal(t, "pubsub.receive", pubsubSpan.Tag(ext.SpanName)) - assert.Equal(t, "cloud.google.com/go/pubsub", pubsubSpan.Tag(ext.Component)) + assert.Equal(t, "net/http", pubsubSpan.Tag(ext.Component)) assert.Equal(t, testSubscriptionName, pubsubSpan.Tag(ext.ResourceName)) assert.Equal(t, ext.SpanKindConsumer, pubsubSpan.Tag(ext.SpanKind)) assert.Equal(t, testSubscriptionID, pubsubSpan.Tag(ext.MessagingDestinationName)) From 712b6347f44a4e964accd4869dc357c2617c741b Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Thu, 25 Jun 2026 15:14:40 -0400 Subject: [PATCH 20/33] use new config implementation --- internal/env/supported_configurations.gen.go | 2 +- internal/env/supported_configurations.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/env/supported_configurations.gen.go b/internal/env/supported_configurations.gen.go index 7a1b9ce2738..fe220cc01e3 100644 --- a/internal/env/supported_configurations.gen.go +++ b/internal/env/supported_configurations.gen.go @@ -81,7 +81,7 @@ var SupportedConfigurations = map[string]struct{}{ "DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA": {}, "DD_GIT_REPOSITORY_URL": {}, "DD_GIT_TAG": {}, - "DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS": {}, + "DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS": {}, "DD_HAPROXY_SPOA_HEALTHCHECK_PORT": {}, "DD_HAPROXY_SPOA_HOST": {}, "DD_HAPROXY_SPOA_PORT": {}, diff --git a/internal/env/supported_configurations.json b/internal/env/supported_configurations.json index eed5fe1518a..7e408fce5f6 100644 --- a/internal/env/supported_configurations.json +++ b/internal/env/supported_configurations.json @@ -513,7 +513,7 @@ ], "DD_GOOGLE_CLOUD_PUBSUB_PROPAGATION_AS_SPAN_LINKS": [ { - "implementation": "A", + "implementation": "B", "type": "boolean", "default": "false" } @@ -1930,4 +1930,4 @@ } ] } -} \ No newline at end of file +} From 73cd7b6c8a02671b7764b7ed2052268d185cc1f8 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 14 Jul 2026 12:02:22 -0400 Subject: [PATCH 21/33] implement admin tracing via grpc interceptors instead of wrapping --- .../cloud.google.com/go/pubsub.v1/admin.go | 264 -------- .../go/pubsub.v1/admin_test.go | 20 +- contrib/cloud.google.com/go/pubsub.v1/go.mod | 2 +- .../go/pubsub.v1/orchestrion.yml | 638 +---------------- .../cloud.google.com/go/pubsub.v2/admin.go | 275 -------- .../go/pubsub.v2/admin_test.go | 20 +- .../go/pubsub.v2/example_test.go | 18 - contrib/cloud.google.com/go/pubsub.v2/go.mod | 3 +- contrib/cloud.google.com/go/pubsub.v2/go.sum | 2 + .../go/pubsub.v2/orchestrion.yml | 640 +----------------- .../cloud.google.com/go/pubsubtrace/admin.go | 223 +++--- .../go/pubsubtrace/admin_interceptor.go | 36 + .../go/pubsubtrace/admin_v1.go | 226 +++---- .../go/pubsubtrace/tracing.go | 4 +- go.mod | 6 +- go.work.sum | 67 ++ .../gcp_pubsub_admin.v1/gcp_pubsub_admin.go | 132 ++++ .../gcp_pubsub_admin.v1/generated_test.go | 20 + .../gcp_pubsub_admin.v2/gcp_pubsub_admin.go | 138 ++++ .../gcp_pubsub_admin.v2/generated_test.go | 20 + 20 files changed, 685 insertions(+), 2069 deletions(-) delete mode 100644 contrib/cloud.google.com/go/pubsub.v1/admin.go delete mode 100644 contrib/cloud.google.com/go/pubsub.v2/admin.go create mode 100644 contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go create mode 100644 internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go create mode 100644 internal/orchestrion/_integration/gcp_pubsub_admin.v1/generated_test.go create mode 100644 internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go create mode 100644 internal/orchestrion/_integration/gcp_pubsub_admin.v2/generated_test.go diff --git a/contrib/cloud.google.com/go/pubsub.v1/admin.go b/contrib/cloud.google.com/go/pubsub.v1/admin.go deleted file mode 100644 index b3c9ad7cb6f..00000000000 --- a/contrib/cloud.google.com/go/pubsub.v1/admin.go +++ /dev/null @@ -1,264 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2025 Datadog, Inc. - -package pubsub - -import ( - "context" - - vkit "cloud.google.com/go/pubsub/apiv1" - pubsubpb "cloud.google.com/go/pubsub/apiv1/pubsubpb" - gax "github.com/googleapis/gax-go/v2" -) - -// PublisherClient wraps a *apiv1.PublisherClient, tracing its topic management -// operations. It embeds the wrapped client so any method that is not traced -// (e.g. Publish, IAM helpers, Close) is forwarded unchanged. -type PublisherClient struct { - *vkit.PublisherClient - opts []Option -} - -// WrapPublisherClient wraps a *apiv1.PublisherClient so that its admin operations -// (CreateTopic, GetTopic, ListTopics, ...) are traced. -func WrapPublisherClient(c *vkit.PublisherClient, opts ...Option) *PublisherClient { - return &PublisherClient{PublisherClient: c, opts: opts} -} - -func (c *PublisherClient) CreateTopic(ctx context.Context, req *pubsubpb.Topic, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceCreateTopicV1(ctx, req, c.opts...) - resp, err := c.PublisherClient.CreateTopic(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *PublisherClient) UpdateTopic(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceUpdateTopicV1(ctx, req, c.opts...) - resp, err := c.PublisherClient.UpdateTopic(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *PublisherClient) GetTopic(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceGetTopicV1(ctx, req, c.opts...) - resp, err := c.PublisherClient.GetTopic(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *PublisherClient) ListTopics(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...gax.CallOption) *vkit.TopicIterator { - ctx, finish := pstrace.TraceListTopicsV1(ctx, req, c.opts...) - it := c.PublisherClient.ListTopics(ctx, req, opts...) - finish(nil) - return it -} - -func (c *PublisherClient) ListTopicSubscriptions(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...gax.CallOption) *vkit.StringIterator { - ctx, finish := pstrace.TraceListTopicSubscriptionsV1(ctx, req, c.opts...) - it := c.PublisherClient.ListTopicSubscriptions(ctx, req, opts...) - finish(nil) - return it -} - -func (c *PublisherClient) ListTopicSnapshots(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...gax.CallOption) *vkit.StringIterator { - ctx, finish := pstrace.TraceListTopicSnapshotsV1(ctx, req, c.opts...) - it := c.PublisherClient.ListTopicSnapshots(ctx, req, opts...) - finish(nil) - return it -} - -func (c *PublisherClient) DeleteTopic(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceDeleteTopicV1(ctx, req, c.opts...) - err := c.PublisherClient.DeleteTopic(ctx, req, opts...) - finish(err) - return err -} - -func (c *PublisherClient) DetachSubscription(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.DetachSubscriptionResponse, error) { - ctx, finish := pstrace.TraceDetachSubscriptionV1(ctx, req, c.opts...) - resp, err := c.PublisherClient.DetachSubscription(ctx, req, opts...) - finish(err) - return resp, err -} - -// SubscriberClient wraps a *apiv1.SubscriberClient, tracing its subscription and -// snapshot management operations. Non-admin RPCs (Pull, Acknowledge, ModifyAckDeadline, -// Close, ...) are forwarded to the embedded client unchanged. -type SubscriberClient struct { - *vkit.SubscriberClient - opts []Option -} - -// WrapSubscriberClient wraps a *apiv1.SubscriberClient so that its admin operations -// (CreateSubscription, GetSubscription, ModifyPushConfig, Seek, ...) are traced. -func WrapSubscriberClient(c *vkit.SubscriberClient, opts ...Option) *SubscriberClient { - return &SubscriberClient{SubscriberClient: c, opts: opts} -} - -func (c *SubscriberClient) CreateSubscription(ctx context.Context, req *pubsubpb.Subscription, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceCreateSubscriptionV1(ctx, req, c.opts...) - resp, err := c.SubscriberClient.CreateSubscription(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriberClient) GetSubscription(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceGetSubscriptionV1(ctx, req, c.opts...) - resp, err := c.SubscriberClient.GetSubscription(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriberClient) UpdateSubscription(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceUpdateSubscriptionV1(ctx, req, c.opts...) - resp, err := c.SubscriberClient.UpdateSubscription(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriberClient) ListSubscriptions(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...gax.CallOption) *vkit.SubscriptionIterator { - ctx, finish := pstrace.TraceListSubscriptionsV1(ctx, req, c.opts...) - it := c.SubscriberClient.ListSubscriptions(ctx, req, opts...) - finish(nil) - return it -} - -func (c *SubscriberClient) DeleteSubscription(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceDeleteSubscriptionV1(ctx, req, c.opts...) - err := c.SubscriberClient.DeleteSubscription(ctx, req, opts...) - finish(err) - return err -} - -func (c *SubscriberClient) ModifyPushConfig(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceModifyPushConfigV1(ctx, req, c.opts...) - err := c.SubscriberClient.ModifyPushConfig(ctx, req, opts...) - finish(err) - return err -} - -func (c *SubscriberClient) GetSnapshot(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceGetSnapshotV1(ctx, req, c.opts...) - resp, err := c.SubscriberClient.GetSnapshot(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriberClient) ListSnapshots(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...gax.CallOption) *vkit.SnapshotIterator { - ctx, finish := pstrace.TraceListSnapshotsV1(ctx, req, c.opts...) - it := c.SubscriberClient.ListSnapshots(ctx, req, opts...) - finish(nil) - return it -} - -func (c *SubscriberClient) CreateSnapshot(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceCreateSnapshotV1(ctx, req, c.opts...) - resp, err := c.SubscriberClient.CreateSnapshot(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriberClient) UpdateSnapshot(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceUpdateSnapshotV1(ctx, req, c.opts...) - resp, err := c.SubscriberClient.UpdateSnapshot(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriberClient) DeleteSnapshot(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceDeleteSnapshotV1(ctx, req, c.opts...) - err := c.SubscriberClient.DeleteSnapshot(ctx, req, opts...) - finish(err) - return err -} - -func (c *SubscriberClient) Seek(ctx context.Context, req *pubsubpb.SeekRequest, opts ...gax.CallOption) (*pubsubpb.SeekResponse, error) { - ctx, finish := pstrace.TraceSeekV1(ctx, req, c.opts...) - resp, err := c.SubscriberClient.Seek(ctx, req, opts...) - finish(err) - return resp, err -} - -// SchemaClient wraps a *apiv1.SchemaClient, tracing its schema management operations. -// Non-admin RPCs (IAM helpers, Close) are forwarded unchanged. -type SchemaClient struct { - *vkit.SchemaClient - opts []Option -} - -// WrapSchemaClient wraps a *apiv1.SchemaClient so that its operations are traced. -func WrapSchemaClient(c *vkit.SchemaClient, opts ...Option) *SchemaClient { - return &SchemaClient{SchemaClient: c, opts: opts} -} - -func (c *SchemaClient) CreateSchema(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceCreateSchemaV1(ctx, req, c.opts...) - resp, err := c.SchemaClient.CreateSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SchemaClient) GetSchema(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceGetSchemaV1(ctx, req, c.opts...) - resp, err := c.SchemaClient.GetSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SchemaClient) ListSchemas(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...gax.CallOption) *vkit.SchemaIterator { - ctx, finish := pstrace.TraceListSchemasV1(ctx, req, c.opts...) - it := c.SchemaClient.ListSchemas(ctx, req, opts...) - finish(nil) - return it -} - -func (c *SchemaClient) ListSchemaRevisions(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...gax.CallOption) *vkit.SchemaIterator { - ctx, finish := pstrace.TraceListSchemaRevisionsV1(ctx, req, c.opts...) - it := c.SchemaClient.ListSchemaRevisions(ctx, req, opts...) - finish(nil) - return it -} - -func (c *SchemaClient) CommitSchema(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceCommitSchemaV1(ctx, req, c.opts...) - resp, err := c.SchemaClient.CommitSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SchemaClient) RollbackSchema(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceRollbackSchemaV1(ctx, req, c.opts...) - resp, err := c.SchemaClient.RollbackSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SchemaClient) DeleteSchemaRevision(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceDeleteSchemaRevisionV1(ctx, req, c.opts...) - resp, err := c.SchemaClient.DeleteSchemaRevision(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SchemaClient) DeleteSchema(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceDeleteSchemaV1(ctx, req, c.opts...) - err := c.SchemaClient.DeleteSchema(ctx, req, opts...) - finish(err) - return err -} - -func (c *SchemaClient) ValidateSchema(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.ValidateSchemaResponse, error) { - ctx, finish := pstrace.TraceValidateSchemaV1(ctx, req, c.opts...) - resp, err := c.SchemaClient.ValidateSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SchemaClient) ValidateMessage(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...gax.CallOption) (*pubsubpb.ValidateMessageResponse, error) { - ctx, finish := pstrace.TraceValidateMessageV1(ctx, req, c.opts...) - resp, err := c.SchemaClient.ValidateMessage(ctx, req, opts...) - finish(err) - return resp, err -} diff --git a/contrib/cloud.google.com/go/pubsub.v1/admin_test.go b/contrib/cloud.google.com/go/pubsub.v1/admin_test.go index 6c3588caaab..b3ce4437cf6 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/admin_test.go +++ b/contrib/cloud.google.com/go/pubsub.v1/admin_test.go @@ -21,13 +21,14 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + "github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace" "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" ) const adminProjectID = "project" -func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *PublisherClient, *SubscriberClient) { +func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *vkit.PublisherClient, *vkit.SubscriberClient) { mt := mocktracer.Start() t.Cleanup(mt.Stop) @@ -37,7 +38,12 @@ func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *PublisherCli ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) t.Cleanup(cancel) - conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + // The admin GAPIC clients issue their RPCs over this connection, so + // installing the interceptor here traces their admin operations. + conn, err := grpc.NewClient(srv.Addr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithChainUnaryInterceptor(pubsubtrace.UnaryAdminInterceptorV1()), + ) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, conn.Close()) }) @@ -46,7 +52,7 @@ func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *PublisherCli sc, err := vkit.NewSubscriberClient(ctx, option.WithGRPCConn(conn)) require.NoError(t, err) - return ctx, mt, WrapPublisherClient(pc), WrapSubscriberClient(sc) + return ctx, mt, pc, sc } func topicName(id string) string { @@ -136,15 +142,17 @@ func TestTraceAdminWithService(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.NewClient(srv.Addr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithChainUnaryInterceptor(pubsubtrace.UnaryAdminInterceptorV1(WithService("my-admin-service"))), + ) require.NoError(t, err) defer func() { assert.NoError(t, conn.Close()) }() pc, err := vkit.NewPublisherClient(ctx, option.WithGRPCConn(conn)) require.NoError(t, err) - wrapped := WrapPublisherClient(pc, WithService("my-admin-service")) - _, err = wrapped.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + _, err = pc.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) require.NoError(t, err) spans := mt.FinishedSpans() diff --git a/contrib/cloud.google.com/go/pubsub.v1/go.mod b/contrib/cloud.google.com/go/pubsub.v1/go.mod index 2f8997f6817..5a89647812a 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v1/go.mod @@ -5,7 +5,6 @@ go 1.25.0 require ( cloud.google.com/go/pubsub v1.50.1 github.com/DataDog/dd-trace-go/v2 v2.10.0-dev - github.com/googleapis/gax-go/v2 v2.20.0 github.com/stretchr/testify v1.11.1 google.golang.org/api v0.273.1 google.golang.org/grpc v1.80.0 @@ -48,6 +47,7 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.20.0 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.6 // indirect diff --git a/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml index 2be83f3237a..85b915c0851 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml +++ b/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml @@ -23,7 +23,7 @@ aspects: __dd_instr *instrumentation.Instrumentation __dd_pstrace *pubsubtrace.Tracer ) - + func init() { component := instrumentation.PackageGCPPubsub __dd_instr = instrumentation.Load(component) @@ -96,619 +96,23 @@ aspects: ## Admin / management operations ## # In v1, admin RPCs live on the GAPIC PublisherClient (topics), SubscriberClient - # (subscriptions + snapshots), and SchemaClient under cloud.google.com/go/pubsub/apiv1. - # We hook each admin method and emit a gcp.pubsub.request span via the per-method - # helpers defined in pubsubtrace/admin_v1.go. - - id: Initialize pubsubtrace (admin) - join-point: - struct-definition: cloud.google.com/go/pubsub/apiv1.PublisherClient - advice: - - inject-declarations: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation - lang: go1.18 - template: |- - var ( - __dd_instr_admin *instrumentation.Instrumentation - __dd_pstrace_admin *pubsubtrace.Tracer - ) - - func init() { - component := instrumentation.PackageGCPPubsub - __dd_instr_admin = instrumentation.Load(component) - __dd_pstrace_admin = pubsubtrace.NewTracer(__dd_instr_admin, component) - } - - - id: PublisherClient.CreateTopic - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' - - name: CreateTopic - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateTopicV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: PublisherClient.UpdateTopic - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' - - name: UpdateTopic - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateTopicV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: PublisherClient.GetTopic - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' - - name: GetTopic - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetTopicV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: PublisherClient.ListTopics - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' - - name: ListTopics - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicsV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: PublisherClient.ListTopicSubscriptions - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' - - name: ListTopicSubscriptions - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicSubscriptionsV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: PublisherClient.ListTopicSnapshots - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' - - name: ListTopicSnapshots - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicSnapshotsV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: PublisherClient.DeleteTopic - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' - - name: DeleteTopic - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteTopicV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: PublisherClient.DetachSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.PublisherClient' - - name: DetachSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDetachSubscriptionV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.CreateSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: CreateSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSubscriptionV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.GetSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: GetSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSubscriptionV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.UpdateSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: UpdateSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateSubscriptionV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.ListSubscriptions - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: ListSubscriptions - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSubscriptionsV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: SubscriberClient.DeleteSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: DeleteSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSubscriptionV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.ModifyPushConfig - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: ModifyPushConfig - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceModifyPushConfigV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.GetSnapshot - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: GetSnapshot - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSnapshotV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.ListSnapshots - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: ListSnapshots - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSnapshotsV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: SubscriberClient.CreateSnapshot - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: CreateSnapshot - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSnapshotV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.UpdateSnapshot - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: UpdateSnapshot - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateSnapshotV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.DeleteSnapshot - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: DeleteSnapshot - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSnapshotV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriberClient.Seek - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SubscriberClient' - - name: Seek - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceSeekV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.CreateSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: CreateSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSchemaV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.GetSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: GetSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSchemaV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.ListSchemas - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: ListSchemas - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSchemasV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: SchemaClient.ListSchemaRevisions - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: ListSchemaRevisions - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSchemaRevisionsV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: SchemaClient.CommitSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: CommitSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCommitSchemaV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.RollbackSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: RollbackSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceRollbackSchemaV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.DeleteSchemaRevision - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: DeleteSchemaRevision - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSchemaRevisionV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.DeleteSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: DeleteSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSchemaV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.ValidateSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: ValidateSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceValidateSchemaV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.ValidateMessage - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/apiv1.SchemaClient' - - name: ValidateMessage - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceValidateMessageV1({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() + # (subscriptions + snapshots) and SchemaClient under cloud.google.com/go/pubsub/apiv1, + # issued over their gRPC connection. Rather than wrapping every method, we append a + # unary client interceptor to each admin client constructor. The interceptor emits a + # gcp.pubsub.request span for admin RPCs and forwards the data-plane RPCs (Publish, + # Pull, Acknowledge, ...) that share the same connection untouched. + - id: Admin client interceptor + join-point: + one-of: + - function-call: cloud.google.com/go/pubsub/apiv1.NewPublisherClient + - function-call: cloud.google.com/go/pubsub/apiv1.NewSubscriberClient + - function-call: cloud.google.com/go/pubsub/apiv1.NewSchemaClient + advice: + - append-args: + type: google.golang.org/api/option.ClientOption + values: + - imports: + option: google.golang.org/api/option + grpc: google.golang.org/grpc + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: option.WithGRPCDialOption(grpc.WithChainUnaryInterceptor(pubsubtrace.UnaryAdminInterceptorV1())) diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin.go b/contrib/cloud.google.com/go/pubsub.v2/admin.go deleted file mode 100644 index c0be68cd1f6..00000000000 --- a/contrib/cloud.google.com/go/pubsub.v2/admin.go +++ /dev/null @@ -1,275 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2025 Datadog, Inc. - -package pubsub - -import ( - "context" - - vkit "cloud.google.com/go/pubsub/v2/apiv1" - "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" - gax "github.com/googleapis/gax-go/v2" -) - -// TopicAdminClient wraps a *apiv1.TopicAdminClient, tracing its topic and snapshot -// management operations. It embeds the wrapped client, so any method that is not traced -// (e.g. Publish, IAM helpers, Close) is forwarded to the underlying client unchanged. -type TopicAdminClient struct { - *vkit.TopicAdminClient - opts []Option -} - -// WrapTopicAdminClient wraps a *apiv1.TopicAdminClient (commonly obtained from -// (*pubsub.Client).TopicAdminClient) so that its admin operations are traced. -func WrapTopicAdminClient(c *vkit.TopicAdminClient, opts ...Option) *TopicAdminClient { - return &TopicAdminClient{TopicAdminClient: c, opts: opts} -} - -func (c *TopicAdminClient) CreateTopic(ctx context.Context, req *pubsubpb.Topic, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceCreateTopic(ctx, req, c.opts...) - resp, err := c.TopicAdminClient.CreateTopic(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *TopicAdminClient) UpdateTopic(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceUpdateTopic(ctx, req, c.opts...) - resp, err := c.TopicAdminClient.UpdateTopic(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *TopicAdminClient) GetTopic(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...gax.CallOption) (*pubsubpb.Topic, error) { - ctx, finish := pstrace.TraceGetTopic(ctx, req, c.opts...) - resp, err := c.TopicAdminClient.GetTopic(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *TopicAdminClient) ListTopics(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...gax.CallOption) *vkit.TopicIterator { - ctx, finish := pstrace.TraceListTopics(ctx, req, c.opts...) - it := c.TopicAdminClient.ListTopics(ctx, req, opts...) - finish(nil) - return it -} - -func (c *TopicAdminClient) ListTopicSubscriptions(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...gax.CallOption) *vkit.StringIterator { - ctx, finish := pstrace.TraceListTopicSubscriptions(ctx, req, c.opts...) - it := c.TopicAdminClient.ListTopicSubscriptions(ctx, req, opts...) - finish(nil) - return it -} - -func (c *TopicAdminClient) ListTopicSnapshots(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...gax.CallOption) *vkit.StringIterator { - ctx, finish := pstrace.TraceListTopicSnapshots(ctx, req, c.opts...) - it := c.TopicAdminClient.ListTopicSnapshots(ctx, req, opts...) - finish(nil) - return it -} - -func (c *TopicAdminClient) DeleteTopic(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceDeleteTopic(ctx, req, c.opts...) - err := c.TopicAdminClient.DeleteTopic(ctx, req, opts...) - finish(err) - return err -} - -func (c *TopicAdminClient) DetachSubscription(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.DetachSubscriptionResponse, error) { - ctx, finish := pstrace.TraceDetachSubscription(ctx, req, c.opts...) - resp, err := c.TopicAdminClient.DetachSubscription(ctx, req, opts...) - finish(err) - return resp, err -} - -// SubscriptionAdminClient wraps a *apiv1.SubscriptionAdminClient, tracing its subscription -// and snapshot management operations. It embeds the wrapped client, so any method that is not -// traced (e.g. Pull, Acknowledge, ModifyAckDeadline, Close) is forwarded unchanged. -type SubscriptionAdminClient struct { - *vkit.SubscriptionAdminClient - opts []Option -} - -// WrapSubscriptionAdminClient wraps a *apiv1.SubscriptionAdminClient (commonly obtained from -// (*pubsub.Client).SubscriptionAdminClient) so that its admin operations are traced. -func WrapSubscriptionAdminClient(c *vkit.SubscriptionAdminClient, opts ...Option) *SubscriptionAdminClient { - return &SubscriptionAdminClient{SubscriptionAdminClient: c, opts: opts} -} - -// CreateSubscription traces a call to the wrapped client's CreateSubscription. -func (c *SubscriptionAdminClient) CreateSubscription(ctx context.Context, req *pubsubpb.Subscription, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceCreateSubscription(ctx, req, c.opts...) - resp, err := c.SubscriptionAdminClient.CreateSubscription(ctx, req, opts...) - finish(err) - return resp, err -} - -// GetSubscription traces a call to the wrapped client's GetSubscription. -func (c *SubscriptionAdminClient) GetSubscription(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceGetSubscription(ctx, req, c.opts...) - resp, err := c.SubscriptionAdminClient.GetSubscription(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriptionAdminClient) UpdateSubscription(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...gax.CallOption) (*pubsubpb.Subscription, error) { - ctx, finish := pstrace.TraceUpdateSubscription(ctx, req, c.opts...) - resp, err := c.SubscriptionAdminClient.UpdateSubscription(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriptionAdminClient) ListSubscriptions(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...gax.CallOption) *vkit.SubscriptionIterator { - ctx, finish := pstrace.TraceListSubscriptions(ctx, req, c.opts...) - it := c.SubscriptionAdminClient.ListSubscriptions(ctx, req, opts...) - finish(nil) - return it -} - -func (c *SubscriptionAdminClient) DeleteSubscription(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceDeleteSubscription(ctx, req, c.opts...) - err := c.SubscriptionAdminClient.DeleteSubscription(ctx, req, opts...) - finish(err) - return err -} - -func (c *SubscriptionAdminClient) ModifyPushConfig(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceModifyPushConfig(ctx, req, c.opts...) - err := c.SubscriptionAdminClient.ModifyPushConfig(ctx, req, opts...) - finish(err) - return err -} - -func (c *SubscriptionAdminClient) GetSnapshot(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceGetSnapshot(ctx, req, c.opts...) - resp, err := c.SubscriptionAdminClient.GetSnapshot(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriptionAdminClient) ListSnapshots(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...gax.CallOption) *vkit.SnapshotIterator { - ctx, finish := pstrace.TraceListSnapshots(ctx, req, c.opts...) - it := c.SubscriptionAdminClient.ListSnapshots(ctx, req, opts...) - finish(nil) - return it -} - -func (c *SubscriptionAdminClient) CreateSnapshot(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceCreateSnapshot(ctx, req, c.opts...) - resp, err := c.SubscriptionAdminClient.CreateSnapshot(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriptionAdminClient) UpdateSnapshot(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...gax.CallOption) (*pubsubpb.Snapshot, error) { - ctx, finish := pstrace.TraceUpdateSnapshot(ctx, req, c.opts...) - resp, err := c.SubscriptionAdminClient.UpdateSnapshot(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SubscriptionAdminClient) DeleteSnapshot(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceDeleteSnapshot(ctx, req, c.opts...) - err := c.SubscriptionAdminClient.DeleteSnapshot(ctx, req, opts...) - finish(err) - return err -} - -func (c *SubscriptionAdminClient) Seek(ctx context.Context, req *pubsubpb.SeekRequest, opts ...gax.CallOption) (*pubsubpb.SeekResponse, error) { - ctx, finish := pstrace.TraceSeek(ctx, req, c.opts...) - resp, err := c.SubscriptionAdminClient.Seek(ctx, req, opts...) - finish(err) - return resp, err -} - -// SchemaClient wraps a *apiv1.SchemaClient, tracing its schema management operations. -// It embeds the wrapped client, so any method that is not traced (e.g. IAM helpers, Close) -// is forwarded to the underlying client unchanged. -type SchemaClient struct { - *vkit.SchemaClient - opts []Option -} - -// WrapSchemaClient wraps a *apiv1.SchemaClient so that its operations are traced. -func WrapSchemaClient(c *vkit.SchemaClient, opts ...Option) *SchemaClient { - return &SchemaClient{SchemaClient: c, opts: opts} -} - -func (c *SchemaClient) CreateSchema(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceCreateSchema(ctx, req, c.opts...) - resp, err := c.SchemaClient.CreateSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -func (c *SchemaClient) GetSchema(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceGetSchema(ctx, req, c.opts...) - resp, err := c.SchemaClient.GetSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -// ListSchemas traces a call to the wrapped client's ListSchemas. -func (c *SchemaClient) ListSchemas(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...gax.CallOption) *vkit.SchemaIterator { - ctx, finish := pstrace.TraceListSchemas(ctx, req, c.opts...) - it := c.SchemaClient.ListSchemas(ctx, req, opts...) - finish(nil) - return it -} - -// ListSchemaRevisions traces a call to the wrapped client's ListSchemaRevisions. -func (c *SchemaClient) ListSchemaRevisions(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...gax.CallOption) *vkit.SchemaIterator { - ctx, finish := pstrace.TraceListSchemaRevisions(ctx, req, c.opts...) - it := c.SchemaClient.ListSchemaRevisions(ctx, req, opts...) - finish(nil) - return it -} - -// CommitSchema traces a call to the wrapped client's CommitSchema. -func (c *SchemaClient) CommitSchema(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceCommitSchema(ctx, req, c.opts...) - resp, err := c.SchemaClient.CommitSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -// RollbackSchema traces a call to the wrapped client's RollbackSchema. -func (c *SchemaClient) RollbackSchema(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceRollbackSchema(ctx, req, c.opts...) - resp, err := c.SchemaClient.RollbackSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -// DeleteSchemaRevision traces a call to the wrapped client's DeleteSchemaRevision. -func (c *SchemaClient) DeleteSchemaRevision(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...gax.CallOption) (*pubsubpb.Schema, error) { - ctx, finish := pstrace.TraceDeleteSchemaRevision(ctx, req, c.opts...) - resp, err := c.SchemaClient.DeleteSchemaRevision(ctx, req, opts...) - finish(err) - return resp, err -} - -// DeleteSchema traces a call to the wrapped client's DeleteSchema. -func (c *SchemaClient) DeleteSchema(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...gax.CallOption) error { - ctx, finish := pstrace.TraceDeleteSchema(ctx, req, c.opts...) - err := c.SchemaClient.DeleteSchema(ctx, req, opts...) - finish(err) - return err -} - -// ValidateSchema traces a call to the wrapped client's ValidateSchema. -func (c *SchemaClient) ValidateSchema(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...gax.CallOption) (*pubsubpb.ValidateSchemaResponse, error) { - ctx, finish := pstrace.TraceValidateSchema(ctx, req, c.opts...) - resp, err := c.SchemaClient.ValidateSchema(ctx, req, opts...) - finish(err) - return resp, err -} - -// ValidateMessage traces a call to the wrapped client's ValidateMessage. -func (c *SchemaClient) ValidateMessage(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...gax.CallOption) (*pubsubpb.ValidateMessageResponse, error) { - ctx, finish := pstrace.TraceValidateMessage(ctx, req, c.opts...) - resp, err := c.SchemaClient.ValidateMessage(ctx, req, opts...) - finish(err) - return resp, err -} diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go index e1d63737d3f..a4677f730d6 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go @@ -21,13 +21,14 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + "github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace" "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" ) const adminProjectID = "project" -func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *TopicAdminClient, *SubscriptionAdminClient) { +func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *vkit.TopicAdminClient, *vkit.SubscriptionAdminClient) { mt := mocktracer.Start() t.Cleanup(mt.Stop) @@ -37,7 +38,12 @@ func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *TopicAdminCl ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) t.Cleanup(cancel) - conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + // The admin GAPIC clients issue their RPCs over this connection, so + // installing the interceptor here traces their admin operations. + conn, err := grpc.NewClient(srv.Addr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithChainUnaryInterceptor(pubsubtrace.UnaryAdminInterceptorV2()), + ) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, conn.Close()) }) @@ -46,7 +52,7 @@ func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *TopicAdminCl sac, err := vkit.NewSubscriptionAdminClient(ctx, option.WithGRPCConn(conn)) require.NoError(t, err) - return ctx, mt, WrapTopicAdminClient(tac), WrapSubscriptionAdminClient(sac) + return ctx, mt, tac, sac } func topicName(id string) string { @@ -137,15 +143,17 @@ func TestTraceAdminWithService(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.NewClient(srv.Addr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithChainUnaryInterceptor(pubsubtrace.UnaryAdminInterceptorV2(WithService("my-admin-service"))), + ) require.NoError(t, err) defer func() { assert.NoError(t, conn.Close()) }() tac, err := vkit.NewTopicAdminClient(ctx, option.WithGRPCConn(conn)) require.NoError(t, err) - wrapped := WrapTopicAdminClient(tac, WithService("my-admin-service")) - _, err = wrapped.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + _, err = tac.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) require.NoError(t, err) spans := mt.FinishedSpans() diff --git a/contrib/cloud.google.com/go/pubsub.v2/example_test.go b/contrib/cloud.google.com/go/pubsub.v2/example_test.go index fe99db4922c..d13a2fad9bc 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/example_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/example_test.go @@ -10,7 +10,6 @@ import ( "log" "cloud.google.com/go/pubsub/v2" - "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" pubsubtrace "github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2" ) @@ -42,20 +41,3 @@ func ExampleSubscriber_Receive() { log.Fatal(err) } } - -func ExampleWrapTopicAdminClient() { - client, err := pubsub.NewClient(context.Background(), "project-id") - if err != nil { - log.Fatal(err) - } - - // Wrap the admin client to trace topic, subscription, snapshot and schema - // management operations as gcp.pubsub.request spans. - topicAdmin := pubsubtrace.WrapTopicAdminClient(client.TopicAdminClient) - _, err = topicAdmin.CreateTopic(context.Background(), &pubsubpb.Topic{ - Name: "projects/project-id/topics/topic", - }) - if err != nil { - log.Fatal(err) - } -} diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod index a6c020ddd2d..a19672a8ce7 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -5,7 +5,6 @@ go 1.25.0 require ( cloud.google.com/go/pubsub/v2 v2.0.0 github.com/DataDog/dd-trace-go/v2 v2.10.0-dev - github.com/googleapis/gax-go/v2 v2.20.0 github.com/stretchr/testify v1.11.1 google.golang.org/api v0.273.1 google.golang.org/grpc v1.80.0 @@ -17,6 +16,7 @@ require ( cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/pubsub v1.50.1 // indirect github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.79.0 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.79.0 // indirect github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.79.0 // indirect @@ -47,6 +47,7 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.20.0 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.6 // indirect diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.sum b/contrib/cloud.google.com/go/pubsub.v2/go.sum index acc7f776c88..d01885c63b6 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.sum +++ b/contrib/cloud.google.com/go/pubsub.v2/go.sum @@ -9,6 +9,8 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= +cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= diff --git a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml index 1f7ebf7c1f6..cec56b4e801 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml +++ b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml @@ -24,7 +24,7 @@ aspects: __dd_instr *instrumentation.Instrumentation __dd_pstrace *pubsubtrace.Tracer ) - + func init() { component := instrumentation.PackageGCPPubsubV2 __dd_instr = instrumentation.Load(component) @@ -94,626 +94,30 @@ aspects: defer func() { {{ $publishResult }}.DDCloseSpan = __dd_closeSpan }() - + ## Admin / management operations ## # Pub/Sub admin (topic, subscription, snapshot and schema management) RPCs are - # implemented on the GAPIC clients in cloud.google.com/go/pubsub/v2/apiv1. A package-level - # tracer is injected into that package and each management method is wrapped to emit a - # gcp.pubsub.request span. - - id: Initialize pubsubtrace (admin) - join-point: - struct-definition: cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient - advice: - - inject-declarations: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation - lang: go1.18 - template: |- - var ( - __dd_instr_admin *instrumentation.Instrumentation - __dd_pstrace_admin *pubsubtrace.Tracer - ) - - func init() { - component := instrumentation.PackageGCPPubsubV2 - __dd_instr_admin = instrumentation.Load(component) - __dd_pstrace_admin = pubsubtrace.NewTracer(__dd_instr_admin, component) - } - - - id: TopicAdminClient.CreateTopic - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' - - name: CreateTopic - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateTopic({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: TopicAdminClient.UpdateTopic - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' - - name: UpdateTopic - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateTopic({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: TopicAdminClient.GetTopic - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' - - name: GetTopic - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetTopic({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: TopicAdminClient.ListTopics - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' - - name: ListTopics - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopics({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: TopicAdminClient.ListTopicSubscriptions - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' - - name: ListTopicSubscriptions - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicSubscriptions({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: TopicAdminClient.ListTopicSnapshots - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' - - name: ListTopicSnapshots - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListTopicSnapshots({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: TopicAdminClient.DeleteTopic - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' - - name: DeleteTopic - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteTopic({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: TopicAdminClient.DetachSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.TopicAdminClient' - - name: DetachSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDetachSubscription({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.CreateSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: CreateSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSubscription({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.GetSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: GetSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSubscription({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.UpdateSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: UpdateSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateSubscription({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.ListSubscriptions - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: ListSubscriptions - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSubscriptions({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: SubscriptionAdminClient.DeleteSubscription - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: DeleteSubscription - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSubscription({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.ModifyPushConfig - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: ModifyPushConfig - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceModifyPushConfig({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.GetSnapshot - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: GetSnapshot - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSnapshot({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.ListSnapshots - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: ListSnapshots - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSnapshots({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: SubscriptionAdminClient.CreateSnapshot - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: CreateSnapshot - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSnapshot({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.UpdateSnapshot - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: UpdateSnapshot - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceUpdateSnapshot({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.DeleteSnapshot - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: DeleteSnapshot - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSnapshot({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SubscriptionAdminClient.Seek - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SubscriptionAdminClient' - - name: Seek - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceSeek({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.CreateSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: CreateSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCreateSchema({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.GetSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: GetSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceGetSchema({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.ListSchemas - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: ListSchemas - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSchemas({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: SchemaClient.ListSchemaRevisions - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: ListSchemaRevisions - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceListSchemaRevisions({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan(nil) - }() - - - id: SchemaClient.CommitSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: CommitSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceCommitSchema({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.RollbackSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: RollbackSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceRollbackSchema({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.DeleteSchemaRevision - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: DeleteSchemaRevision - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSchemaRevision({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.DeleteSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: DeleteSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 0 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceDeleteSchema({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.ValidateSchema - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: ValidateSchema - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceValidateSchema({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() - - - id: SchemaClient.ValidateMessage - join-point: - function-body: - function: - - receiver: '*cloud.google.com/go/pubsub/v2/apiv1.SchemaClient' - - name: ValidateMessage - advice: - - prepend-statements: - imports: - pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace - template: |- - {{- $ctx := .Function.Argument 0 -}} - {{- $req := .Function.Argument 1 -}} - {{- $err := .Function.Result 1 -}} - __dd_ctx, __dd_closeSpan := __dd_pstrace_admin.TraceValidateMessage({{ $ctx }}, {{ $req }}) - {{ $ctx }} = __dd_ctx - defer func() { - __dd_closeSpan({{ $err }}) - }() + # issued by the GAPIC clients in cloud.google.com/go/pubsub/v2/apiv1 over their gRPC + # connection. Rather than wrapping every method, we append a unary client interceptor + # to each admin client constructor. The interceptor emits a gcp.pubsub.request span + # for admin RPCs and forwards the data-plane RPCs (Publish, Pull, Acknowledge, ...) + # that share the same connection untouched. + - id: Admin client interceptor + join-point: + one-of: + - function-call: cloud.google.com/go/pubsub/v2/apiv1.NewTopicAdminClient + - function-call: cloud.google.com/go/pubsub/v2/apiv1.NewSubscriptionAdminClient + - function-call: cloud.google.com/go/pubsub/v2/apiv1.NewSchemaClient + advice: + - append-args: + type: google.golang.org/api/option.ClientOption + values: + - imports: + option: google.golang.org/api/option + grpc: google.golang.org/grpc + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: option.WithGRPCDialOption(grpc.WithChainUnaryInterceptor(pubsubtrace.UnaryAdminInterceptorV2())) # Note: These aspects are also necessary for v1, they should be present in only one of the orchestrion.yml files, # otherwise they will be applied twice and will cause the build to fail. diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin.go b/contrib/cloud.google.com/go/pubsubtrace/admin.go index ba4a30b16f4..0563c7d5983 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin.go @@ -3,143 +3,110 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2025 Datadog, Inc. -// helpers for Pub/Sub v2 admin tracing. -// -// Each helper exists so the manual instrumentation in contrib/.../pubsub.v2/admin.go -// and the orchestrion aspects in contrib/.../pubsub.v2/orchestrion.yml can share a -// single (method, resourcePath) mapping. Without these helpers the same span tag may -// drift between the two call paths. +// v2 admin request→resource mapping. Is implemented as a grpc unary client interceptor +// Uses cloud.google.com/go/pubsub/v2/apiv1/pubsubpb, which is distinct from v1's pubsubpb +// (see admin_v1.go). package pubsubtrace import ( - "context" + "sync" "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" -) - -// -- TopicAdminClient -- - -func (tr *Tracer) TraceCreateTopic(ctx context.Context, req *pubsubpb.Topic, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CreateTopic", req.GetName(), opts...) -} - -func (tr *Tracer) TraceUpdateTopic(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "UpdateTopic", req.GetTopic().GetName(), opts...) -} - -func (tr *Tracer) TraceGetTopic(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "GetTopic", req.GetTopic(), opts...) -} - -func (tr *Tracer) TraceListTopics(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListTopics", req.GetProject(), opts...) -} - -func (tr *Tracer) TraceListTopicSubscriptions(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListTopicSubscriptions", req.GetTopic(), opts...) -} - -func (tr *Tracer) TraceListTopicSnapshots(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListTopicSnapshots", req.GetTopic(), opts...) -} - -func (tr *Tracer) TraceDeleteTopic(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteTopic", req.GetTopic(), opts...) -} - -func (tr *Tracer) TraceDetachSubscription(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DetachSubscription", req.GetSubscription(), opts...) -} - -// -- SubscriptionAdminClient -- - -func (tr *Tracer) TraceCreateSubscription(ctx context.Context, req *pubsubpb.Subscription, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CreateSubscription", req.GetName(), opts...) -} - -func (tr *Tracer) TraceGetSubscription(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "GetSubscription", req.GetSubscription(), opts...) -} - -func (tr *Tracer) TraceUpdateSubscription(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "UpdateSubscription", req.GetSubscription().GetName(), opts...) -} - -func (tr *Tracer) TraceListSubscriptions(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListSubscriptions", req.GetProject(), opts...) -} - -func (tr *Tracer) TraceDeleteSubscription(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteSubscription", req.GetSubscription(), opts...) -} - -func (tr *Tracer) TraceModifyPushConfig(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ModifyPushConfig", req.GetSubscription(), opts...) -} - -func (tr *Tracer) TraceGetSnapshot(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "GetSnapshot", req.GetSnapshot(), opts...) -} - -func (tr *Tracer) TraceListSnapshots(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListSnapshots", req.GetProject(), opts...) -} - -func (tr *Tracer) TraceCreateSnapshot(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CreateSnapshot", req.GetName(), opts...) -} - -func (tr *Tracer) TraceUpdateSnapshot(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "UpdateSnapshot", req.GetSnapshot().GetName(), opts...) -} - -func (tr *Tracer) TraceDeleteSnapshot(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteSnapshot", req.GetSnapshot(), opts...) -} - -func (tr *Tracer) TraceSeek(ctx context.Context, req *pubsubpb.SeekRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "Seek", req.GetSubscription(), opts...) -} - -// -- SchemaClient -- - -func (tr *Tracer) TraceCreateSchema(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CreateSchema", req.GetParent(), opts...) -} - -func (tr *Tracer) TraceGetSchema(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "GetSchema", req.GetName(), opts...) -} - -func (tr *Tracer) TraceListSchemas(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListSchemas", req.GetParent(), opts...) -} - -func (tr *Tracer) TraceListSchemaRevisions(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListSchemaRevisions", req.GetName(), opts...) -} + "google.golang.org/grpc" -func (tr *Tracer) TraceCommitSchema(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CommitSchema", req.GetName(), opts...) -} - -func (tr *Tracer) TraceRollbackSchema(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "RollbackSchema", req.GetName(), opts...) -} - -func (tr *Tracer) TraceDeleteSchemaRevision(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteSchemaRevision", req.GetName(), opts...) -} + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) -func (tr *Tracer) TraceDeleteSchema(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteSchema", req.GetName(), opts...) +// UnaryAdminInterceptorV2 returns a grpc.UnaryClientInterceptor that traces +// TopicAdminClient, SubscriptionAdminClient, and SchemaClient admin operations. +func UnaryAdminInterceptorV2(opts ...Option) grpc.UnaryClientInterceptor { + return defaultTracerV2().unaryAdminInterceptor(resolveAdminResourceV2, opts...) } -func (tr *Tracer) TraceValidateSchema(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ValidateSchema", req.GetParent(), opts...) -} +var ( + v2TracerOnce sync.Once + v2Tracer *Tracer +) -func (tr *Tracer) TraceValidateMessage(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ValidateMessage", req.GetParent(), opts...) +func defaultTracerV2() *Tracer { + v2TracerOnce.Do(func() { + component := instrumentation.PackageGCPPubsubV2 + v2Tracer = NewTracer(instrumentation.Load(component), component) + }) + return v2Tracer +} + +// resolveAdminResourceV2 maps a v2 admin request to its resource path, or "" if not admin. +func resolveAdminResourceV2(req any) string { + switch r := req.(type) { + // TopicAdminClient + case *pubsubpb.Topic: + return r.GetName() + case *pubsubpb.UpdateTopicRequest: + return r.GetTopic().GetName() + case *pubsubpb.GetTopicRequest: + return r.GetTopic() + case *pubsubpb.ListTopicsRequest: + return r.GetProject() + case *pubsubpb.ListTopicSubscriptionsRequest: + return r.GetTopic() + case *pubsubpb.ListTopicSnapshotsRequest: + return r.GetTopic() + case *pubsubpb.DeleteTopicRequest: + return r.GetTopic() + case *pubsubpb.DetachSubscriptionRequest: + return r.GetSubscription() + + // SubscriptionAdminClient + case *pubsubpb.Subscription: + return r.GetName() + case *pubsubpb.GetSubscriptionRequest: + return r.GetSubscription() + case *pubsubpb.UpdateSubscriptionRequest: + return r.GetSubscription().GetName() + case *pubsubpb.ListSubscriptionsRequest: + return r.GetProject() + case *pubsubpb.DeleteSubscriptionRequest: + return r.GetSubscription() + case *pubsubpb.ModifyPushConfigRequest: + return r.GetSubscription() + case *pubsubpb.GetSnapshotRequest: + return r.GetSnapshot() + case *pubsubpb.ListSnapshotsRequest: + return r.GetProject() + case *pubsubpb.CreateSnapshotRequest: + return r.GetName() + case *pubsubpb.UpdateSnapshotRequest: + return r.GetSnapshot().GetName() + case *pubsubpb.DeleteSnapshotRequest: + return r.GetSnapshot() + case *pubsubpb.SeekRequest: + return r.GetSubscription() + + // SchemaClient + case *pubsubpb.CreateSchemaRequest: + return r.GetParent() + case *pubsubpb.GetSchemaRequest: + return r.GetName() + case *pubsubpb.ListSchemasRequest: + return r.GetParent() + case *pubsubpb.ListSchemaRevisionsRequest: + return r.GetName() + case *pubsubpb.CommitSchemaRequest: + return r.GetName() + case *pubsubpb.RollbackSchemaRequest: + return r.GetName() + case *pubsubpb.DeleteSchemaRevisionRequest: + return r.GetName() + case *pubsubpb.DeleteSchemaRequest: + return r.GetName() + case *pubsubpb.ValidateSchemaRequest: + return r.GetParent() + case *pubsubpb.ValidateMessageRequest: + return r.GetParent() + + default: + return "" + } } diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go b/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go new file mode 100644 index 00000000000..59342c8b62f --- /dev/null +++ b/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go @@ -0,0 +1,36 @@ +package pubsubtrace + +import ( + "context" + "strings" + + "google.golang.org/grpc" +) + +// adminResolver returns the resource path targeted by an admin request, or an +// empty string when req is not a traced admin operation (data-plane, IAM, ...). +type adminResolver func(req any) (resourcePath string) + +// unaryAdminInterceptor builds a grpc.UnaryClientInterceptor that emits a +// gcp.pubsub.request span for each admin RPC recognised by resolve. +func (tr *Tracer) unaryAdminInterceptor(resolve adminResolver, opts ...Option) grpc.UnaryClientInterceptor { + return func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, callOpts ...grpc.CallOption) error { + resourcePath := resolve(req) + if resourcePath == "" { + return invoker(ctx, method, req, reply, cc, callOpts...) + } + ctx, finish := tr.TraceAdmin(ctx, adminMethodName(method), resourcePath, opts...) + err := invoker(ctx, method, req, reply, cc, callOpts...) + finish(err) + return err + } +} + +// adminMethodName returns the RPC method name from a gRPC full-method string, e.g. +// "/google.pubsub.v1.Publisher/CreateTopic" -> "CreateTopic". +func adminMethodName(fullMethod string) string { + if i := strings.LastIndex(fullMethod, "/"); i >= 0 { + return fullMethod[i+1:] + } + return fullMethod +} diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go index 74e3f7e1986..799c5d1fc1e 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go @@ -3,145 +3,111 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2025 Datadog, Inc. -// helpers for Pub/Sub v1 admin tracing. These mirror admin.go but take v1 -// pubsubpb types (cloud.google.com/go/pubsub/apiv1/pubsubpb), which are distinct -// Go types from v2's pubsubpb -// -// v1 distributes admin RPCs across the PublisherClient (topics) and SubscriberClient -// (subscriptions + snapshots) GAPIC clients, plus the SchemaClient. v2 separates -// these into TopicAdminClient/SubscriptionAdminClient/SchemaClient. The set of RPCs -// is the same; only the home struct differs. +// v1 admin request→resource mapping. Uses cloud.google.com/go/pubsub/apiv1/pubsubpb, +// which distinct from v2's pubsubpb (see admin.go). package pubsubtrace import ( - "context" + "sync" pubsubpb "cloud.google.com/go/pubsub/apiv1/pubsubpb" -) - -// -- PublisherClient (topics) -- - -func (tr *Tracer) TraceCreateTopicV1(ctx context.Context, req *pubsubpb.Topic, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CreateTopic", req.GetName(), opts...) -} - -func (tr *Tracer) TraceUpdateTopicV1(ctx context.Context, req *pubsubpb.UpdateTopicRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "UpdateTopic", req.GetTopic().GetName(), opts...) -} - -func (tr *Tracer) TraceGetTopicV1(ctx context.Context, req *pubsubpb.GetTopicRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "GetTopic", req.GetTopic(), opts...) -} - -func (tr *Tracer) TraceListTopicsV1(ctx context.Context, req *pubsubpb.ListTopicsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListTopics", req.GetProject(), opts...) -} - -func (tr *Tracer) TraceListTopicSubscriptionsV1(ctx context.Context, req *pubsubpb.ListTopicSubscriptionsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListTopicSubscriptions", req.GetTopic(), opts...) -} - -func (tr *Tracer) TraceListTopicSnapshotsV1(ctx context.Context, req *pubsubpb.ListTopicSnapshotsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListTopicSnapshots", req.GetTopic(), opts...) -} - -func (tr *Tracer) TraceDeleteTopicV1(ctx context.Context, req *pubsubpb.DeleteTopicRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteTopic", req.GetTopic(), opts...) -} - -func (tr *Tracer) TraceDetachSubscriptionV1(ctx context.Context, req *pubsubpb.DetachSubscriptionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DetachSubscription", req.GetSubscription(), opts...) -} - -// -- SubscriberClient (subscriptions + snapshots) -- - -func (tr *Tracer) TraceCreateSubscriptionV1(ctx context.Context, req *pubsubpb.Subscription, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CreateSubscription", req.GetName(), opts...) -} - -func (tr *Tracer) TraceGetSubscriptionV1(ctx context.Context, req *pubsubpb.GetSubscriptionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "GetSubscription", req.GetSubscription(), opts...) -} - -func (tr *Tracer) TraceUpdateSubscriptionV1(ctx context.Context, req *pubsubpb.UpdateSubscriptionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "UpdateSubscription", req.GetSubscription().GetName(), opts...) -} - -func (tr *Tracer) TraceListSubscriptionsV1(ctx context.Context, req *pubsubpb.ListSubscriptionsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListSubscriptions", req.GetProject(), opts...) -} - -func (tr *Tracer) TraceDeleteSubscriptionV1(ctx context.Context, req *pubsubpb.DeleteSubscriptionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteSubscription", req.GetSubscription(), opts...) -} - -func (tr *Tracer) TraceModifyPushConfigV1(ctx context.Context, req *pubsubpb.ModifyPushConfigRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ModifyPushConfig", req.GetSubscription(), opts...) -} - -func (tr *Tracer) TraceGetSnapshotV1(ctx context.Context, req *pubsubpb.GetSnapshotRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "GetSnapshot", req.GetSnapshot(), opts...) -} - -func (tr *Tracer) TraceListSnapshotsV1(ctx context.Context, req *pubsubpb.ListSnapshotsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListSnapshots", req.GetProject(), opts...) -} - -func (tr *Tracer) TraceCreateSnapshotV1(ctx context.Context, req *pubsubpb.CreateSnapshotRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CreateSnapshot", req.GetName(), opts...) -} - -func (tr *Tracer) TraceUpdateSnapshotV1(ctx context.Context, req *pubsubpb.UpdateSnapshotRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "UpdateSnapshot", req.GetSnapshot().GetName(), opts...) -} - -func (tr *Tracer) TraceDeleteSnapshotV1(ctx context.Context, req *pubsubpb.DeleteSnapshotRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteSnapshot", req.GetSnapshot(), opts...) -} - -func (tr *Tracer) TraceSeekV1(ctx context.Context, req *pubsubpb.SeekRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "Seek", req.GetSubscription(), opts...) -} - -// -- SchemaClient -- - -func (tr *Tracer) TraceCreateSchemaV1(ctx context.Context, req *pubsubpb.CreateSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CreateSchema", req.GetParent(), opts...) -} - -func (tr *Tracer) TraceGetSchemaV1(ctx context.Context, req *pubsubpb.GetSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "GetSchema", req.GetName(), opts...) -} - -func (tr *Tracer) TraceListSchemasV1(ctx context.Context, req *pubsubpb.ListSchemasRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListSchemas", req.GetParent(), opts...) -} - -func (tr *Tracer) TraceListSchemaRevisionsV1(ctx context.Context, req *pubsubpb.ListSchemaRevisionsRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ListSchemaRevisions", req.GetName(), opts...) -} + "google.golang.org/grpc" -func (tr *Tracer) TraceCommitSchemaV1(ctx context.Context, req *pubsubpb.CommitSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "CommitSchema", req.GetName(), opts...) -} - -func (tr *Tracer) TraceRollbackSchemaV1(ctx context.Context, req *pubsubpb.RollbackSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "RollbackSchema", req.GetName(), opts...) -} - -func (tr *Tracer) TraceDeleteSchemaRevisionV1(ctx context.Context, req *pubsubpb.DeleteSchemaRevisionRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteSchemaRevision", req.GetName(), opts...) -} + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) -func (tr *Tracer) TraceDeleteSchemaV1(ctx context.Context, req *pubsubpb.DeleteSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "DeleteSchema", req.GetName(), opts...) +// UnaryAdminInterceptorV1 returns a grpc.UnaryClientInterceptor that traces the admin +// operations of the cloud.google.com/go/pubsub (v1) GAPIC clients (PublisherClient, +// SubscriberClient, SchemaClient). +func UnaryAdminInterceptorV1(opts ...Option) grpc.UnaryClientInterceptor { + return defaultTracerV1().unaryAdminInterceptor(resolveAdminResourceV1, opts...) } -func (tr *Tracer) TraceValidateSchemaV1(ctx context.Context, req *pubsubpb.ValidateSchemaRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ValidateSchema", req.GetParent(), opts...) -} +var ( + v1TracerOnce sync.Once + v1Tracer *Tracer +) -func (tr *Tracer) TraceValidateMessageV1(ctx context.Context, req *pubsubpb.ValidateMessageRequest, opts ...Option) (context.Context, func(error)) { - return tr.TraceAdmin(ctx, "ValidateMessage", req.GetParent(), opts...) +func defaultTracerV1() *Tracer { + v1TracerOnce.Do(func() { + component := instrumentation.PackageGCPPubsub + v1Tracer = NewTracer(instrumentation.Load(component), component) + }) + return v1Tracer +} + +// resolveAdminResourceV1 maps a v1 admin request to its resource path. Non-admin +// requests (Publish, Pull, Acknowledge, ModifyAckDeadline, IAM, ...) return "". +func resolveAdminResourceV1(req any) string { + switch r := req.(type) { + // PublisherClient (topics) + case *pubsubpb.Topic: + return r.GetName() + case *pubsubpb.UpdateTopicRequest: + return r.GetTopic().GetName() + case *pubsubpb.GetTopicRequest: + return r.GetTopic() + case *pubsubpb.ListTopicsRequest: + return r.GetProject() + case *pubsubpb.ListTopicSubscriptionsRequest: + return r.GetTopic() + case *pubsubpb.ListTopicSnapshotsRequest: + return r.GetTopic() + case *pubsubpb.DeleteTopicRequest: + return r.GetTopic() + case *pubsubpb.DetachSubscriptionRequest: + return r.GetSubscription() + + // SubscriberClient (subscriptions + snapshots) + case *pubsubpb.Subscription: + return r.GetName() + case *pubsubpb.GetSubscriptionRequest: + return r.GetSubscription() + case *pubsubpb.UpdateSubscriptionRequest: + return r.GetSubscription().GetName() + case *pubsubpb.ListSubscriptionsRequest: + return r.GetProject() + case *pubsubpb.DeleteSubscriptionRequest: + return r.GetSubscription() + case *pubsubpb.ModifyPushConfigRequest: + return r.GetSubscription() + case *pubsubpb.GetSnapshotRequest: + return r.GetSnapshot() + case *pubsubpb.ListSnapshotsRequest: + return r.GetProject() + case *pubsubpb.CreateSnapshotRequest: + return r.GetName() + case *pubsubpb.UpdateSnapshotRequest: + return r.GetSnapshot().GetName() + case *pubsubpb.DeleteSnapshotRequest: + return r.GetSnapshot() + case *pubsubpb.SeekRequest: + return r.GetSubscription() + + // SchemaClient + case *pubsubpb.CreateSchemaRequest: + return r.GetParent() + case *pubsubpb.GetSchemaRequest: + return r.GetName() + case *pubsubpb.ListSchemasRequest: + return r.GetParent() + case *pubsubpb.ListSchemaRevisionsRequest: + return r.GetName() + case *pubsubpb.CommitSchemaRequest: + return r.GetName() + case *pubsubpb.RollbackSchemaRequest: + return r.GetName() + case *pubsubpb.DeleteSchemaRevisionRequest: + return r.GetName() + case *pubsubpb.DeleteSchemaRequest: + return r.GetName() + case *pubsubpb.ValidateSchemaRequest: + return r.GetParent() + case *pubsubpb.ValidateMessageRequest: + return r.GetParent() + + default: + return "" + } } diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index bacfe6faadb..e77149824f4 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -179,8 +179,8 @@ func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx cont } // TraceAdmin starts a span for a Pub/Sub admin operation (e.g. CreateTopic, ListSubscriptions, DeleteSchema). -// Prefer the per-method helpers in admin.go (TraceCreateTopic, TraceGetTopic, ...) so the -// (method, resourcePath) mapping has a single source of truth shared with the orchestrion aspects. +// It is driven by the unary client interceptor in admin.go / admin_v1.go, which is the single source of +// truth for the (method, resourcePath) mapping across both the manual and orchestrion instrumentation. func (tr *Tracer) TraceAdmin(ctx context.Context, method string, resourcePath string, opts ...Option) (context.Context, func(err error)) { cfg := tr.defaultConfig() for _, opt := range opts { diff --git a/go.mod b/go.mod index daa18d01e8c..77f4a480d2b 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,8 @@ go 1.25.0 godebug x509negativeserial=1 require ( + cloud.google.com/go/pubsub v1.50.1 + cloud.google.com/go/pubsub/v2 v2.0.0 github.com/DataDog/datadog-agent/pkg/obfuscate v0.79.0 github.com/DataDog/datadog-agent/pkg/proto v0.79.0 github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.79.0 @@ -53,12 +55,11 @@ require ( golang.org/x/time v0.15.0 golang.org/x/tools v0.44.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da + google.golang.org/grpc v1.80.0 google.golang.org/protobuf v1.36.11 ) require ( - cloud.google.com/go/pubsub v1.50.1 // indirect - cloud.google.com/go/pubsub/v2 v2.0.0 // indirect github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.79.0 // indirect github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.79.0 // indirect github.com/DataDog/datadog-agent/pkg/trace v0.79.0 // indirect @@ -106,7 +107,6 @@ require ( golang.org/x/text v0.37.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d // indirect - google.golang.org/grpc v1.80.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.work.sum b/go.work.sum index 20f199d5e82..5c5ddedd604 100644 --- a/go.work.sum +++ b/go.work.sum @@ -397,14 +397,17 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOC github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/agent-payload/v5 v5.0.180 h1:+jGPiWICAq6MT3y0haBxPv2qwKYc9TGflsncfVGRyP4= github.com/DataDog/agent-payload/v5 v5.0.180/go.mod h1:9PtvPKsgZVTTvqgYtcwB4bjXAkxYzC2wzSXSadPRHv8= +github.com/DataDog/agent-payload/v5 v5.0.184 h1:4ZEWKWTQHoC+WCjlE1l695ymi/PjA9BPGMMVAbaM0uo= github.com/DataDog/agent-payload/v5 v5.0.184/go.mod h1:MScePfb6eN9vN9GqPhCXTeqq1V0TlCpnjrN4OujCaQs= github.com/DataDog/datadog-agent/comp/api/api/def v0.77.0 h1:6/iby51Fow8liFUakdfmJugfbhjTZWKNuMhQoH9adBA= github.com/DataDog/datadog-agent/comp/api/api/def v0.77.0/go.mod h1:dqfei0M/vs1kd5ylu5pqPFKDi/LxvCa0/Lmbs5LRCKA= +github.com/DataDog/datadog-agent/comp/api/api/def v0.78.3 h1:d1PYYF3Q5y9MqsNz6yfI+a72n+bx3fGlPUk7MASQB6o= github.com/DataDog/datadog-agent/comp/api/api/def v0.78.3/go.mod h1:s8PrkR3Xo7bR4yVtrvkX0QRLBYrYSbf47qykYEP/itI= github.com/DataDog/datadog-agent/comp/api/api/def v0.78.4/go.mod h1:s8PrkR3Xo7bR4yVtrvkX0QRLBYrYSbf47qykYEP/itI= github.com/DataDog/datadog-agent/comp/api/api/def v0.79.0/go.mod h1:A6xrfXgjp5yguPN0jiDvvS4+c4PAGCSTz4NwcW46gTQ= github.com/DataDog/datadog-agent/comp/core/config v0.77.0 h1:GDSGyrIkzuUPBTka+hp4hcu7CPtECo2wcvksZPJtpAI= github.com/DataDog/datadog-agent/comp/core/config v0.77.0/go.mod h1:MD7RyLkOUMXuMNfajqFoFNY3JPNpBMynQXMcgkutbes= +github.com/DataDog/datadog-agent/comp/core/config v0.78.3 h1:fpknyRAmvgHyC2wo6mtivPn37o0jTjT0L+N2cY2sUDI= github.com/DataDog/datadog-agent/comp/core/config v0.78.3/go.mod h1:qSNsISpmjvGRCr2aXDQ5Uz5qjGaOZBqSqfQwe3WZBDk= github.com/DataDog/datadog-agent/comp/core/config v0.78.4/go.mod h1:xoKeWtCJH90YT7L23OG2aQrBeuPKCqzNCwk5ojlwKNI= github.com/DataDog/datadog-agent/comp/core/config v0.79.0/go.mod h1:dsFyft7HMqYlCRxD6xcB62/NK1V9sj/8Id1jJw+zKXQ= @@ -412,45 +415,55 @@ github.com/DataDog/datadog-agent/comp/core/delegatedauth v0.78.3/go.mod h1:r1Acs github.com/DataDog/datadog-agent/comp/core/delegatedauth v0.78.4/go.mod h1:bE5nPKpmkvPIHQFh1zdmskHIyREGgr4GZ3R3U5kQaD4= github.com/DataDog/datadog-agent/comp/core/delegatedauth v0.79.0 h1:W0thCGjpLXtkgbukyv6V1hCvfVscJ6OEBsV/QtJH7Ew= github.com/DataDog/datadog-agent/comp/core/delegatedauth v0.79.0/go.mod h1:zYYs3gIwpse673ySxSgjWGxeNrwuRxjodWK5hbycznk= +github.com/DataDog/datadog-agent/comp/core/delegatedauth/api/cloudauth/aws v0.79.0 h1:jmXDW4NPauTNjz6I28jg5tl/daYkwGrt5MZsCxg8lGQ= github.com/DataDog/datadog-agent/comp/core/delegatedauth/api/cloudauth/aws v0.79.0/go.mod h1:YtlYWdGMbTWunlGafAKoLerjqbZSUZCa7/EPWrduD1c= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.77.0 h1:cIhhcMGJz1S0zBSWYdMo/Jt4P4H+yDOwPksv60NTGkk= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.77.0/go.mod h1:g2vLYYoro8nFzgnYDwjDU212mHcfbFTZ2nDKdh3T5zI= +github.com/DataDog/datadog-agent/comp/core/flare/builder v0.78.3 h1:ltRjyUfd0NFtIkxUNN6RDFA3zEjnUjXalMMNt4tbWro= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.78.3/go.mod h1:i0ubPpcORp84qXFb8vsqPKnFiC8a9n1kr4tLJQXCghw= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.78.4/go.mod h1:i0ubPpcORp84qXFb8vsqPKnFiC8a9n1kr4tLJQXCghw= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.79.0/go.mod h1:DU/7Fz53GEyOdrX2rpCs7ZyF6j9Uj7m3G2WN45G5y6M= github.com/DataDog/datadog-agent/comp/core/flare/types v0.77.0 h1:Ygky8O2viBoFMF6AoXR4vG0O/7OndxhoY6tWtLuvTgA= github.com/DataDog/datadog-agent/comp/core/flare/types v0.77.0/go.mod h1:FCxVmnGsFC3YniDj8d2GidCiTNkE0z6LVDAPS0kYRd4= +github.com/DataDog/datadog-agent/comp/core/flare/types v0.78.3 h1:s9iYfMhO/1bZ5e66A3GaY+qkBVlR9HxEdy4XvJcBU1g= github.com/DataDog/datadog-agent/comp/core/flare/types v0.78.3/go.mod h1:1+9Qgt2ScNdz3vC8X6Nf+A0zpY0uasjgcwtzf9pBG+c= github.com/DataDog/datadog-agent/comp/core/flare/types v0.78.4/go.mod h1:jaGOt6dAK2Tv1lnZQq32ZjNTYMABCHVghY5gkKOeJuI= github.com/DataDog/datadog-agent/comp/core/flare/types v0.79.0/go.mod h1:UwnTidQLvpY7qaOSyuwBQwHV1zX9gY9mIqnDpuNkjMU= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.77.0 h1:BVEqA9wDTEjMuZfFAvbPt5tin+dnjahc8B42d+yGdiU= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.77.0/go.mod h1:jHb95aV0An5zVhqwh2fGu9vuaJJApqo9z9k4lw6jbNU= +github.com/DataDog/datadog-agent/comp/core/ipc/def v0.78.3 h1:bAkzybB4vp8vy6f7eJa3wzc5vrInisHozxbXyo4tHIg= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.78.3/go.mod h1:I17GLzh5qJrNWCjgaDDQXXSo+qx5HIQ2UOzkv6JFogU= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.78.4/go.mod h1:I17GLzh5qJrNWCjgaDDQXXSo+qx5HIQ2UOzkv6JFogU= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.79.0/go.mod h1:oaThopsveAc6zvawCIwIoWCYxdWdoZoiFrvgpCGTRsw= github.com/DataDog/datadog-agent/comp/core/ipc/httphelpers v0.77.0 h1:9KAUkNOeDjA9dUpsV1GtLXfrRIdf/nWGY28AyO/UnEE= github.com/DataDog/datadog-agent/comp/core/ipc/httphelpers v0.77.0/go.mod h1:pVD75zIstiQQJwLwbbQarg+BAmU3qXA1l+8wvhYM6h4= +github.com/DataDog/datadog-agent/comp/core/ipc/httphelpers v0.78.3 h1:XTDosZjO947tWjWPDCZ6TDBRbv8ex9Ow+yiZoOaqAmU= github.com/DataDog/datadog-agent/comp/core/ipc/httphelpers v0.78.3/go.mod h1:K4AbQdDcVwWA92oaIfDAvTB+VW+0UdER/B9rVXcOK+w= github.com/DataDog/datadog-agent/comp/core/ipc/mock v0.77.0 h1:ZGekGRqmIVPrhePuAlWXlYDbQke2LJ/7W1jWy0gjapA= github.com/DataDog/datadog-agent/comp/core/ipc/mock v0.77.0/go.mod h1:IOdGOI+vZsp+BGPkypgNvmEQB62Y4Z2Su4wO28er5RM= +github.com/DataDog/datadog-agent/comp/core/ipc/mock v0.78.3 h1:COeksThUio1llIuMF26Vucn94e0q2NWHLbWOBvxldag= github.com/DataDog/datadog-agent/comp/core/ipc/mock v0.78.3/go.mod h1:hLw+uLezPeKhyz0j2gQRIN/3ZUTROTTGdfW4C/YMcxU= github.com/DataDog/datadog-agent/comp/core/log/def v0.77.0 h1:FN2tmMGDUJszpzqpW4xN3EDQ1cgRvj3l0JW6nUrD3/k= github.com/DataDog/datadog-agent/comp/core/log/def v0.77.0/go.mod h1:/dcGxIG3oFvL1FRJ2vikKVgG5IyOPkPnY+Umj0ICJnA= +github.com/DataDog/datadog-agent/comp/core/log/def v0.78.3 h1:1TuZy2Mb8IP6EPa6mEd+P5xr4S0v8OqHzGwfXcukMBg= github.com/DataDog/datadog-agent/comp/core/log/def v0.78.3/go.mod h1:rPaq6xA1AMB2T1fer8fkgRzkEOcQmL0NWnW9M4DW1JY= github.com/DataDog/datadog-agent/comp/core/log/def v0.78.4/go.mod h1:rPaq6xA1AMB2T1fer8fkgRzkEOcQmL0NWnW9M4DW1JY= github.com/DataDog/datadog-agent/comp/core/log/def v0.79.0/go.mod h1:PIIaHqfofGFsTPB+/uWe3HkPomEpYan8CIKdYB8ZHGs= github.com/DataDog/datadog-agent/comp/core/log/fx v0.77.0 h1:JbIbTsJYSebh4IcCTN6m1Rj0pOEqj0ut2sXtyS/WmKU= github.com/DataDog/datadog-agent/comp/core/log/fx v0.77.0/go.mod h1:o76+Df1rS+ZWylgmYtr4QkXKgD6xNB7FPVQrsdFLpYc= +github.com/DataDog/datadog-agent/comp/core/log/fx v0.78.3 h1:VQCFHeTBtlFvtlecyZwTxiRJrsgVMo28aOm7TnNgcCc= github.com/DataDog/datadog-agent/comp/core/log/fx v0.78.3/go.mod h1:QpDh+fxXI53N8HZnV8j5MqfPSB7ierNsvaEBFfLx+zs= github.com/DataDog/datadog-agent/comp/core/log/fx v0.78.4/go.mod h1:uzivQwrkb22Z1bx/c5+LiWWyICpOhvyCQxs94RK3KA4= github.com/DataDog/datadog-agent/comp/core/log/fx v0.79.0/go.mod h1:swQeQ91AocIID4eS0H6O0Up+FMwOwgr97A+oOHZx6G8= github.com/DataDog/datadog-agent/comp/core/log/impl v0.77.0 h1:/gz0FE03uEffsrdhdbHRYojAfuKalMnhlyjNLZOyOcs= github.com/DataDog/datadog-agent/comp/core/log/impl v0.77.0/go.mod h1:YVucxWku2G1M5FLm+0QPdQ9jERAqiBdxJ1fvkV4vbgQ= +github.com/DataDog/datadog-agent/comp/core/log/impl v0.78.3 h1:SYzdKdxH/pBG7JhfD5Z2oaPgWHEDkRWAvFLwiYtq1Pc= github.com/DataDog/datadog-agent/comp/core/log/impl v0.78.3/go.mod h1:jbqsjFqF2uFK47qmE0vxwvWNyQ0p7c0/HmcZOEMppKI= github.com/DataDog/datadog-agent/comp/core/log/impl v0.78.4/go.mod h1:H14Gwb99jwqnfyMbSWneYs/xb1dooH109xFKYAjNVF0= github.com/DataDog/datadog-agent/comp/core/log/impl v0.79.0/go.mod h1:JZ+jvjVR6YLQMr9YbBlXORK/gV8/zXDXOGbwUVF6mgs= github.com/DataDog/datadog-agent/comp/core/log/mock v0.77.0 h1:PViWKQewBQ9dYMZDZCVKcWrXiGd5MPFvOzHNew/vk2U= github.com/DataDog/datadog-agent/comp/core/log/mock v0.77.0/go.mod h1:MN+6ffL4iovMZycv8ymsT44msvmHw1WeQ3RUcvZAZZ8= +github.com/DataDog/datadog-agent/comp/core/log/mock v0.78.3 h1:JwCuGsCeIXhr5lQ2avdbTAOZtir/9Ugxc6QaAaZbBRc= github.com/DataDog/datadog-agent/comp/core/log/mock v0.78.3/go.mod h1:4QewFpeT00PGRdJDyD6hxReaFiFEkk1VHkgDEk5nkn0= github.com/DataDog/datadog-agent/comp/core/secrets/def v0.77.0 h1:RJgNzrS8N7A8JRZKMjxOc2Sk/cJ/Q+lmvzN6QlYhEM4= github.com/DataDog/datadog-agent/comp/core/secrets/def v0.77.0/go.mod h1:WWcGLfYPblCAomMD876kvboI6gw8KkgJ6cVmexcNv9M= @@ -460,35 +473,43 @@ github.com/DataDog/datadog-agent/comp/core/secrets/def v0.79.0 h1:cD+5OvfweyfBxB github.com/DataDog/datadog-agent/comp/core/secrets/def v0.79.0/go.mod h1:4LD5qx/kZ2LqsNATA/cfSYHtR7dNm0lGJYCajdIELdg= github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.77.0 h1:9vyICu4QIFYPaLRhwi3VvpLO4btzuKILD36UD+IsJnc= github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.77.0/go.mod h1:nKN6QJcRbbh2Xqk5w2vYZ9072M2H4YLLJoK85YWET/Q= +github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.79.0 h1:CI54GtMlHKNw1qUIfHLATS9cchWhjnQ+A+5usvoJOo0= github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.79.0/go.mod h1:QJLbq2BLh4Sm55c0vqNV4nu9sA6UgypzE1DzrWzNvE8= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.77.0 h1:zzYvKLPP3zQHAiMibPBGLW0G/9YermLBxj9XOUlVhLY= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.77.0/go.mod h1:5HF2Nddmu4Ct4nwZULSPTZGpFNjPyZ4OghD1BTyBWt8= +github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.78.3 h1:lS6oDSJ6q7GXp0zzWLf8M+M2FuwOyDrlqvy5AZLnCcA= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.78.3/go.mod h1:qsswuP3IdS5SPhm92OHBgfcxJeca3EsynMrMWeIj1ck= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.78.4/go.mod h1:HbHbM0aTHZgkAVILnuYJeUOgzkpp3J+4BIgmuUo1Fz8= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.79.0/go.mod h1:WHGFxmLSwBktondqFTBhFKNIsg9RGAIJHka6th7J0jg= github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.77.0 h1:B8sjgfnQ+tr/sR1gKPKvQxz2YI/5/J2AE8w3eUyJ1K8= github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.77.0/go.mod h1:lEQc9L0HAfD3Ii3cIEjmg5rMVjnaELr35o0Lxg8ZVng= +github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.79.0 h1:nQ0KPy7pGJUvRR5agZbhP0Ou4k704befGV6B3tpYeHY= github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.79.0/go.mod h1:+uTKQoxkecJGncfE4YXfTWINck1WF3MFn7xBc0lc//g= github.com/DataDog/datadog-agent/comp/core/status v0.77.0 h1:ClLrhl55PC4x8nMejCFAGkpIA71V5Kegt73lqeTGbzg= github.com/DataDog/datadog-agent/comp/core/status v0.77.0/go.mod h1:JUOovjtT/1Fte9Ya6roMLjZWiMfRHEPgGwnT0ro5CWw= +github.com/DataDog/datadog-agent/comp/core/status v0.79.0 h1:8ZUD7S+uOjfzu6EPgCcgP9VPnfk0AukHQcoyXVvcrCs= github.com/DataDog/datadog-agent/comp/core/status v0.79.0/go.mod h1:s6MsjIHjjhV6BPi5+NckSdv9fe+A1Pd2pSSETtYz1to= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.77.0 h1:5ieRjnB17PYqlpUpQtKX4rpau3+Uv95HQJl3cR9+UFE= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.77.0/go.mod h1:e9MJy5kPvHC2+1FouSQ1wn0EY7XvA4CFjnZa9QfWY3E= +github.com/DataDog/datadog-agent/comp/core/tagger/def v0.78.3 h1:bZjfVJOyMCx3UYkwRNR6UAPKADan+HbcWV4lja/PSjw= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.78.3/go.mod h1:6B4wKV4acfNxAm4US9ajIMuEQ4eT0AsL+053ua8U6Jc= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.78.4/go.mod h1:oqLhL8989ed0P/K1bLvaJ0I9p/S8Wo0e49/VpujCNlE= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.79.0/go.mod h1:UGVmAEXpqpBWuO+n++2qy7k5oqyBH12I0qOmPx47Mrc= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.77.0 h1:W83mrEqdADpQjxUMLdXwbCjFlLuPnTc/lXlqGgAPtvs= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.77.0/go.mod h1:5um8UBNkTlLX//VvBGtFF0EkU7MH9zXMbX2cLJEGA5Y= +github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.78.3 h1:Rtz6r5olDGoxbBe1H/AeKrqjBbkyc3YZm7y78rBag4Y= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.78.3/go.mod h1:O9QTcB/WguoS3iK8uBvVIbqb1qOoykCvB47PjE34U6w= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.78.4/go.mod h1:5fkE0XBXC2hwTBhi0EavDWcOJt7PSZ0zvW3Wkh2ay0U= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.79.0/go.mod h1:5zPPkyqw0Ts0CWMdrVBoO3an/LwZzhXTwPxmS7nH3TI= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.77.0 h1:dPVPZgavLNpxXdh/s1Idc3KH6qhJEC4ILIb5QhJ3ZHE= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.77.0/go.mod h1:B9MdPAb7RHQMEs6dtqX5dxGqjrN3iquory3YmMO/xkA= +github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.78.3 h1:y1C6CZ+S/iUcK3CbgjH3EQ/osB+ZQHt+a6uyrdjvzQQ= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.78.3/go.mod h1:Mg7H7OAMf0hdOzQzU25rYdCDbB7sKg6VW/c1cAbTdcA= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.78.4/go.mod h1:WQOJE/FqULXLfZlbG+NgN071gknXBvIP69ZVrgA4dYI= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.79.0/go.mod h1:O7M3uxD6a3kKyG+YY7b7DSgNVW0EZhxOVxmnyPybhWY= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.77.0 h1:KoZ9sjgsrMS7lunXn+0SBhlO9bnRq8AVobLxsHtOrzw= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.77.0/go.mod h1:K0H/QSvC1pRJRTzOIF1eEYOPwdejP/B2ljsaxg/Lapw= +github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.78.3 h1:Kbed1VFJsLIzaAmssAey06x0mRvmrMT+HrTqNUow2MI= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.78.3/go.mod h1:pplBN99vrM5DolJQhVx6EOoO7Yxxj/C5UHcaa/38ux8= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.78.4/go.mod h1:JE9EXTmNN/kuDlARwK4Xsn0HjmSJ78oM2HIPXbh3Dj4= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.79.0/go.mod h1:EFFDoBUsS5avoIhUAdXIdftVGL2RVdzmlhKTOW4WlZE= @@ -498,21 +519,25 @@ github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.78.3/go.mod github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.78.4/go.mod h1:PGGPjYvc4aQ2zaIkgRH6oilI3RW8ebvHDJ3rPrpSWE4= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.77.0 h1:bdmqRC0sBY/q5rQuIkVcAz5mZ9HxMFjOB7lQS4zp3uU= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.77.0/go.mod h1:GcFv6oCuvePlpWQQdGT8nRl41FL/s9BRmbsmmL6DsSM= +github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.78.3 h1:0NTq/nixSNSGBIGAa6oS6sIfWcUtNBlsdufaACtGkZY= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.78.3/go.mod h1:I+xGzWNoZLmTla6hWzgt2tV9lghfH8drfFz1JFU+6yE= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.78.4/go.mod h1:I+xGzWNoZLmTla6hWzgt2tV9lghfH8drfFz1JFU+6yE= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.79.0/go.mod h1:42H9Is8VNNekJPXpYwnQpLIuVioWzmfyrgV9kwi2wZI= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.77.0 h1:SA2AiToolgevpXCQc3e5YX86W6B+zUAb6MGeWhCiyJY= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.77.0/go.mod h1:nEtC9Dc2Wol/V2jvnd7MErEP/vM6Ut3k/1KNCxXIBkw= +github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.78.3 h1:w23MtTkal/oKxqaoUnffBQXa3zcNXL6+WOaV40L/EmQ= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.78.3/go.mod h1:GmHPOSSJkiR0f3KNbqEQcmug02FxE7KdB+Epau0srUg= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.78.4/go.mod h1:rOf8zwtD4XpOjV8fewb09OUjswaYXFX43XkMkx22TPU= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.79.0/go.mod h1:ZqfVeUKY/WeJS5qbZb394CS2fu5MPDZS351jEZdJ+Kk= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.77.0 h1:WmH82Jo0x13jBVYlJLGyPR41kka2z1Dc0kl3kB0b1/o= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.77.0/go.mod h1:IGQY7ufZ7HLV/fVRLpBnM6jFItHdu+41pSSaX4pmIiU= +github.com/DataDog/datadog-agent/comp/core/tagger/types v0.78.3 h1:eee1rIVe7OgawEvqYX3FyYV/NMuLP3/e8CtqGK/dJQs= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.78.3/go.mod h1:4oXVhNHPRK+ZL6AL7Mr4hEXD/K3kzUVTar5rUuqYBbw= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.78.4/go.mod h1:1YpNFhHCjoarmR6cKW1hOeeDxt7zzq3p4NulNrSrUL4= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.79.0/go.mod h1:drdCchGpLOOpxhSFRk3JGk45Ouij5pF1TCiN66c5VO0= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.77.0 h1:JNajNueR+/jDbunfPh1dIfAB9gXogbozjydJ8cIPtZQ= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.77.0/go.mod h1:uQQYEqv2pnEbauwFIaOEaUig8Z2Bbg451o5K0zZz6ow= +github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.78.3 h1:t/kJZxWJzKuaZXDiIMG29w9kY/1Ipn7hb1BrO2JxBHc= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.78.3/go.mod h1:sKyy4kjLCWU1rbj3Wb6HUFcREiXy5n0bUHCQQOSIQ/M= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.78.4/go.mod h1:sKyy4kjLCWU1rbj3Wb6HUFcREiXy5n0bUHCQQOSIQ/M= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.79.0/go.mod h1:llPBkDG50ot1haxaNRgHlrPtABcVbBIxF4Ym5nM7qJo= @@ -530,22 +555,27 @@ github.com/DataDog/datadog-agent/comp/def v0.79.0 h1:8CPRZ06xWOLUIgVIU22vs2FbJ/p github.com/DataDog/datadog-agent/comp/def v0.79.0/go.mod h1:2D7rmniQw4C1Tdvs1pVMYm3vyRKhgASRYqZeZnDXOqQ= github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.77.0 h1:KWPLh8uoA8fPoSqnDL2S7tEcPMcDsljHy1sJhld7coY= github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.77.0/go.mod h1:uJhQdumC5PCM6cZKbPDn6QSjwe+xOjUrO7oR5o6qsR0= +github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.78.3 h1:RhB//CQTNDDHvS8oJ8B0wOqM7u7gwbZoF8Gb/0M+Xvk= github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.78.3/go.mod h1:m2bnbU0EW9+nQZwVgdk7tVIYZw3Eue3WavsPtRyobFE= github.com/DataDog/datadog-agent/comp/forwarder/orchestrator/orchestratorinterface v0.77.0 h1:48767O59nSwpXIvcKOn0gF5TPUk+kvuwv1dH4S52tGo= github.com/DataDog/datadog-agent/comp/forwarder/orchestrator/orchestratorinterface v0.77.0/go.mod h1:bqLT6/LJHhIw8QH67a8oLVGfNiqudR62PUKdAaa9Lks= +github.com/DataDog/datadog-agent/comp/forwarder/orchestrator/orchestratorinterface v0.78.3 h1:DvsGuifHZ7CsmRZP7mMLFvc2dbnT7P3x41cvVSKosTw= github.com/DataDog/datadog-agent/comp/forwarder/orchestrator/orchestratorinterface v0.78.3/go.mod h1:PGvrdD+jtN+x+Pr88i1Uq2U49GpnNx6BWoEIGiOG/xg= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.77.0 h1:tCwV1tnwEylsGzrzSu2gwTXb9cr2zO6NozhPCjpEH94= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.77.0/go.mod h1:isGq1DiNoWTstt+pEP0mL+pDijaIPP2rDxpfN1rnc0E= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.78.3 h1:Hry8ks9PWGzQL32bSz3X3Lf0k6g6lTGPRz7cDvVVmlo= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.78.3/go.mod h1:HoQkgrtTdrwwY8gLIi1z+ZJ+UYHaKlOr2ZPqvugTt/k= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.78.4/go.mod h1:sNMuhuDQTQjl4aT7cHptZxOZJjgUlmrA1jbI03B8cq4= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.79.0/go.mod h1:YKsRAZiK64/DKD+EfwzqDfeU1ApWca6YbQ+nV4Cscq0= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.77.0 h1:KcyQ1xMoiGzKqZtOh3W8rBHKzIcaxy7HUPLlkbY1H5E= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.77.0/go.mod h1:F9QCFWYC83wGRtlLsPWcBX4o/KGTDmGZGTbbQ2xAB6I= +github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.78.3 h1:rtmXy1MI7B49bxiDrdCrOzI/FYoO3NTVpRY/PjwPSJU= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.78.3/go.mod h1:ZiReKr49evIBrgGdw5rTxVhJzl93R8QqYFtkErWXFYA= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.78.4/go.mod h1:yDYyYjXNt1NpcvYplCmcw8fJtag3nnPdAlt4QA+iv3w= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.79.0/go.mod h1:Md7difW0CfmsWkLiOWiv1o44+iEnP6GOSeWFRsSJzIA= github.com/DataDog/datadog-agent/comp/serializer/metricscompression v0.77.0 h1:QAzuLwGpsCw9chNiU7Miwa9L4m55SEVvpGVoKDKo4YY= github.com/DataDog/datadog-agent/comp/serializer/metricscompression v0.77.0/go.mod h1:l05ZNSI2KGsI1i+/P5ieUyMq5a2+PqlDNrn+v9pNwoI= +github.com/DataDog/datadog-agent/comp/serializer/metricscompression v0.78.3 h1:Jd1Xjpyu+PTxspSsD3RBDoGlo04ZqeWOOjnu53BgakM= github.com/DataDog/datadog-agent/comp/serializer/metricscompression v0.78.3/go.mod h1:6QZ8nnLU4E1nSRmbHfHM6WyUztsP8UTFHDrATSL3Vi8= github.com/DataDog/datadog-agent/comp/trace/compression/def v0.77.0 h1:rgP4zfDobUH5btXEnOBiI/V8J0CiqlECXg4svZmGl4g= github.com/DataDog/datadog-agent/comp/trace/compression/def v0.77.0/go.mod h1:1T7WAixRlrwi6HT+gViXvYgzxi7Sb0PD0nL3bArcx7E= @@ -561,6 +591,7 @@ github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.79.0 h1:659 github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.79.0/go.mod h1:5d87IX3KRjxms6AbUzZUEIDXvpa4Ds32O13QfIq4+p4= github.com/DataDog/datadog-agent/pkg/aggregator/ckey v0.77.0 h1:6A4edHFeSW4DrryvwUbP/NbYTrD7M+DUePWlPYRjovQ= github.com/DataDog/datadog-agent/pkg/aggregator/ckey v0.77.0/go.mod h1:0SSAMQKJFX5NcLNqvm3GWvk6woMSvD/YWNk3Y/vlwh0= +github.com/DataDog/datadog-agent/pkg/aggregator/ckey v0.78.3 h1:1TcXxiYiL6Hh+HAWWvnHVpH92pCZglnT+yXk+ZexXFQ= github.com/DataDog/datadog-agent/pkg/aggregator/ckey v0.78.3/go.mod h1:zHvru+kuBzH91N8xupM7WkPeeTVjpRB67uG0+vejyXc= github.com/DataDog/datadog-agent/pkg/api v0.77.0 h1:rET03ZEAAykE956zTX5BjNnyLu8A3cCc4r0fDFTd8bE= github.com/DataDog/datadog-agent/pkg/api v0.77.0/go.mod h1:4Wbaon3A/E1ghXDLlza4GeGdIfRMMjXzsBO9tF/+RdM= @@ -654,6 +685,7 @@ github.com/DataDog/datadog-agent/pkg/fips v0.79.0 h1:ASF/Hq/LQsDkZAl4EZb/pQTMLh2 github.com/DataDog/datadog-agent/pkg/fips v0.79.0/go.mod h1:pYBWHNCILJawjzTYiaibfDnsXmb/QHW0Pg1rjVLM9eU= github.com/DataDog/datadog-agent/pkg/metrics v0.77.0 h1:wdAFtCKbN1SUcG3U1sLtJ/wP5gjnp4R6ZDtJYVSOjrE= github.com/DataDog/datadog-agent/pkg/metrics v0.77.0/go.mod h1:7yL5IJt6IoUNLL905C45SYdpY6U0XA2JgTaYoe9KI+A= +github.com/DataDog/datadog-agent/pkg/metrics v0.78.3 h1:/d2VhMvqTtaTLHo7wRbGpir1/f7Ix31TkOfDnXEhis8= github.com/DataDog/datadog-agent/pkg/metrics v0.78.3/go.mod h1:anhsmOXRe5EJ2ZlZqSK+KmLH+1yKkGW5ceFarUl6uGk= github.com/DataDog/datadog-agent/pkg/obfuscate v0.75.2/go.mod h1:+IvQjXkCQBwDgigh2AvG3TWvW6Y/n0Kt7I2LUK/zRnY= github.com/DataDog/datadog-agent/pkg/obfuscate v0.76.2/go.mod h1:Q1B0h6Gyk8twdN1huri/UkQvLbUooVmEsooE49cqEFk= @@ -661,6 +693,7 @@ github.com/DataDog/datadog-agent/pkg/obfuscate v0.78.3/go.mod h1:Gaa+M7tW8muicqT github.com/DataDog/datadog-agent/pkg/obfuscate v0.78.4/go.mod h1:Gaa+M7tW8muicqTy8vPRCW7P1X0CUGSsCIAXqAx67iA= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.77.0 h1:qSu+ah+hDSh/Mh14bOQrhnUcA+XeS9iSec4asS8pgkU= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.77.0/go.mod h1:Mve3eNIdPMZGfMjblXsRia9U+0Cw5liGaF34KRFMBFw= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.78.3 h1:09QLIW4Euy8XQEMxVh3rC47vllaxczLKBnQwYJ5A54E= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.78.3/go.mod h1:+uMbLC2Xat1Xxh1jaHOLEt/1A/OmI4OZ0KnNcRAkBYM= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.78.4/go.mod h1:0OGk/uC/reN06fqlxcCiJC1t625zPN3xMNkGdK9fwmw= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.79.0/go.mod h1:Ndbgk9JQkhvO6MKcpeUROU6gvryoTE2HW8wS3SDrhdw= @@ -671,9 +704,11 @@ github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0 github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.79.0-devel/go.mod h1:eHk7wzrqZo+uuxdi3bX6YHFyWxYrax7mtdV+LXg0Io4= github.com/DataDog/datadog-agent/pkg/orchestrator/model v0.77.0 h1:7+VqyxcPbfilTVhoUwWn5oYV8pQoNWKzE3yDcvAFsQY= github.com/DataDog/datadog-agent/pkg/orchestrator/model v0.77.0/go.mod h1:/TWPvfkbr0Cf+QRCyVCymmre5UgezcvkVxQJL081g28= +github.com/DataDog/datadog-agent/pkg/orchestrator/model v0.78.3 h1:auNcWkTMuqwNOd+p4z5bEdk7PRRw0HJoHGatUG1frRg= github.com/DataDog/datadog-agent/pkg/orchestrator/model v0.78.3/go.mod h1:oRykmVwE9OeyhpMlNI47RV+67myuLGHsRpdndlWJNGc= github.com/DataDog/datadog-agent/pkg/process/util/api v0.77.0 h1:s8YvLO6DUpbku1ANcYzLxKDVk8H1cef9Fxj1486fKhk= github.com/DataDog/datadog-agent/pkg/process/util/api v0.77.0/go.mod h1:5FdY/34/lbOQeuBRhJvFRPQKKZz+bKqYNT5V/4mq6Yw= +github.com/DataDog/datadog-agent/pkg/process/util/api v0.78.3 h1:uAznrRzer8tdT6925YgzCk6k21zIU+lNyWwk1C3o3II= github.com/DataDog/datadog-agent/pkg/process/util/api v0.78.3/go.mod h1:QyukfYXunLf/G6rRwvG9VGYvD0npMzrnJyXr30shzZg= github.com/DataDog/datadog-agent/pkg/proto v0.75.2/go.mod h1:nf8egqNvcahxrzAigMpKohPzYetJ7cVgG8kBc9gUoTw= github.com/DataDog/datadog-agent/pkg/proto v0.76.2/go.mod h1:RzHSkeIpR6OBEmwGy4fUPtQ1hPgt7ljwYlJmKxMHSX4= @@ -686,24 +721,29 @@ github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.78.3/go.mod h1:PrZa3X github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.78.4/go.mod h1:PrZa3X3U2w0m7uiFsY51RWRLBxDAL7cSAjUG+3p2k80= github.com/DataDog/datadog-agent/pkg/serializer v0.77.0 h1:AVa6MgY3gMfSAAxb6QTQ0XIHDDa9EVpgJ8SrkvBCrJs= github.com/DataDog/datadog-agent/pkg/serializer v0.77.0/go.mod h1:47IJz8LJxwKKeXsVS7iAzvEz1H4cvM2reKwQUxb76Dw= +github.com/DataDog/datadog-agent/pkg/serializer v0.78.3 h1:Wmubb63UJKCZRv2yxJVB5AP6/gTlRg5tlM6EYq8rqSM= github.com/DataDog/datadog-agent/pkg/serializer v0.78.3/go.mod h1:AfJDZ64qRpx1mo4WtNv+6wRgHB7ki6EjZfJCnMpdnQM= github.com/DataDog/datadog-agent/pkg/serializer v0.78.4/go.mod h1:UYBvlVSFltCfFWokz8pqqFE390lQJMkyKCS7hJ4yglw= github.com/DataDog/datadog-agent/pkg/serializer v0.79.0/go.mod h1:HV7/lS1xczdtPsflOcvwJWIuhhmcFh67L5RNd7fU8BE= github.com/DataDog/datadog-agent/pkg/status/health v0.77.0 h1:QMW2iSaosACTzOKnsfbvlmnRb79pQC2Jyz2NCMUxjIs= github.com/DataDog/datadog-agent/pkg/status/health v0.77.0/go.mod h1:Vb9OTl+HDFwMOBJRuLgkoOF93nHVcM5+DTcLUH6507o= +github.com/DataDog/datadog-agent/pkg/status/health v0.78.3 h1:2Sodi28nRsYhDc8RwXLUkrks4juEd3phuQ9OJLI35KM= github.com/DataDog/datadog-agent/pkg/status/health v0.78.3/go.mod h1:HCpJQ4ke3WBWTmRM1hV1WBK18e85e03MkodnbopktJQ= github.com/DataDog/datadog-agent/pkg/tagger/types v0.77.0 h1:zZgSRr79JtsVqmdYdanwlTRZLELG9YqbjV3LX5goIGE= github.com/DataDog/datadog-agent/pkg/tagger/types v0.77.0/go.mod h1:oTzZdsJjDVX/7Cz5BQNLLADGN92wgRjsuEUbhTWBV4M= +github.com/DataDog/datadog-agent/pkg/tagger/types v0.78.3 h1:OWHILXP48hYbYsIGSOh4+MjNQ1Z8Uqwy/7KidNAXAZ4= github.com/DataDog/datadog-agent/pkg/tagger/types v0.78.3/go.mod h1:9Brrcr865wabAaYRRaV9Mf5+Jnvwmie2vLKJl+0PSQU= github.com/DataDog/datadog-agent/pkg/tagger/types v0.78.4/go.mod h1:irTPFzKi+QGc0RoV1G/SwDAYTr99BNzgFD4K5BqQ8cM= github.com/DataDog/datadog-agent/pkg/tagger/types v0.79.0/go.mod h1:93J6HCMDi/qalGI8R7dE3fp+E2AU/2MohZBU2SpuAa0= github.com/DataDog/datadog-agent/pkg/tagset v0.77.0 h1:9oPUbCplu3TL4YKqjHJCktZ85HoGQcN0JGedAS+7doo= github.com/DataDog/datadog-agent/pkg/tagset v0.77.0/go.mod h1:Z+kAyX4K2rXNUFCWie/7JGB6QEx8/xrL02u7TwQVc4U= +github.com/DataDog/datadog-agent/pkg/tagset v0.78.3 h1:zKN4rmMtuZR2YPJM5pyt+PXRgUdUg7PzMkmwqANwqk0= github.com/DataDog/datadog-agent/pkg/tagset v0.78.3/go.mod h1:rHrIGfMukeU4Uzg2X8qbUOZ7n0Odpbl8Es0xqRgonFo= github.com/DataDog/datadog-agent/pkg/tagset v0.78.4/go.mod h1:WTs7GSJQkEqv6bRVz8jctG8JLhOBEK0KKt4mgN0qsfs= github.com/DataDog/datadog-agent/pkg/tagset v0.79.0/go.mod h1:CXYr7gucyt2d1WiTXczDwP/NXtoedNMTqLRELzhjGtk= github.com/DataDog/datadog-agent/pkg/telemetry v0.77.0 h1:AXx7ovcxjglQtnvSTJA1xu/po1fajOPoE6n7w0t7teY= github.com/DataDog/datadog-agent/pkg/telemetry v0.77.0/go.mod h1:wPR67+LvCA4NT5014BTFTe/vocycC4kfFEPbuBbprSo= +github.com/DataDog/datadog-agent/pkg/telemetry v0.78.3 h1:MTMyikUWvpsVj+g/OxMThyehynwYV8cnr5KVdWexh5I= github.com/DataDog/datadog-agent/pkg/telemetry v0.78.3/go.mod h1:Fd++cD42DsK99bLsVZzZL7H7uymGh7IADAJhh+1AEpo= github.com/DataDog/datadog-agent/pkg/telemetry v0.78.4/go.mod h1:g1enPk0qq3FHzJ/W1GXwrEOjAbPwfP9E/wdx/VCKpAM= github.com/DataDog/datadog-agent/pkg/telemetry v0.79.0/go.mod h1:ueOtN1BKhTT7OGhHGkz1wsUxvbvmHXRlqYBKklrL7F8= @@ -721,6 +761,7 @@ github.com/DataDog/datadog-agent/pkg/trace/log v0.76.2/go.mod h1:sHKgo3EBOqLu35q github.com/DataDog/datadog-agent/pkg/trace/log v0.78.3/go.mod h1:y52uQ1lhszVASzOy2YiK2x+mgnUD6DgKRpNYzOdwWxk= github.com/DataDog/datadog-agent/pkg/trace/log v0.78.4/go.mod h1:y52uQ1lhszVASzOy2YiK2x+mgnUD6DgKRpNYzOdwWxk= github.com/DataDog/datadog-agent/pkg/trace/otel v0.76.2/go.mod h1:E4FYEUnCneDDPEzN8s+0le1oIrV4I4Nm1oeEvqC2rUA= +github.com/DataDog/datadog-agent/pkg/trace/otel v0.78.3 h1:AQNFv+b9sf9ZqTlViiOXtJ24etDR6m3av5MAye0i8OU= github.com/DataDog/datadog-agent/pkg/trace/otel v0.78.3/go.mod h1:wkYEb0uTKb56dSz17epvbhy5kMUIgpaE4kBnBT/3ZMI= github.com/DataDog/datadog-agent/pkg/trace/otel v0.78.4/go.mod h1:7c8IaIytbo/5PUGYT+DbEDBDOr8B03wq+Eed1fWOhIg= github.com/DataDog/datadog-agent/pkg/trace/stats v0.76.2/go.mod h1:hKGPJA7eGRZCTKNIYzE+8OlpIbNJasgVOtegVaALqVs= @@ -731,15 +772,19 @@ github.com/DataDog/datadog-agent/pkg/trace/traceutil v0.76.2/go.mod h1:YiflIHg6c github.com/DataDog/datadog-agent/pkg/trace/traceutil v0.78.3/go.mod h1:7nq5il3MqrJs4t8UouutgryMOkfi8DpNgVv9agFGB0Q= github.com/DataDog/datadog-agent/pkg/trace/traceutil v0.78.4/go.mod h1:t04G5iUadj3p56RtTLqyqJldTxxTgmRA3nZ29pdebMg= github.com/DataDog/datadog-agent/pkg/trace/traceutil v0.79.0-devel/go.mod h1:ZFZZHcBsn1IcxYkyZ8FPfXhznWhGled8BwhEKHrnzvQ= +github.com/DataDog/datadog-agent/pkg/util/aws/creds v0.79.0 h1:zJkaHp1r4AvoPSFjhoOGtIc8xs/WiR/rbvLUpTPKbZk= github.com/DataDog/datadog-agent/pkg/util/aws/creds v0.79.0/go.mod h1:27rR0PWCrgWRpluux6Z9InnMPAkCqj/kDZtKdHWcNyE= github.com/DataDog/datadog-agent/pkg/util/backoff v0.77.0 h1:p7x2jzZ/35EBpfO4YVdBnYYhXYBpaD7sumBD4O1zdAk= github.com/DataDog/datadog-agent/pkg/util/backoff v0.77.0/go.mod h1:SclwB5LKpXX+EtROQXIbvOVXlrnlZhWpywLUvw/ejDY= +github.com/DataDog/datadog-agent/pkg/util/backoff v0.78.3 h1:yv/axNetQWNRiD/IrVDgdPcyixDPj5RXc6O2kZqfjzU= github.com/DataDog/datadog-agent/pkg/util/backoff v0.78.3/go.mod h1:HqcimdpJ0IAlu4XhClpGYAe1nI+Tutzn3Du7nxqrdX0= github.com/DataDog/datadog-agent/pkg/util/buf v0.77.0 h1:A7NcGPv3Lfl67hf6ECeyIWnFYRsGVmj1dv+H3qQ829E= github.com/DataDog/datadog-agent/pkg/util/buf v0.77.0/go.mod h1:2qCCeh5+eR+Mwa9Ti1FNxgNTqS/LdWby0m+iFNx7Owk= +github.com/DataDog/datadog-agent/pkg/util/buf v0.78.3 h1:zta9+7R4+tpXAIUurTlmg8hu0k9H62Yy+5pHJrZdVzU= github.com/DataDog/datadog-agent/pkg/util/buf v0.78.3/go.mod h1:QAkmOIo326sXcnOLUaH/0FctTR/cjICRhFmgaqWkiXI= github.com/DataDog/datadog-agent/pkg/util/cache v0.77.0 h1:5b8KT6gToDh1fF/4AwuqJJAWqZTVAdMj3NaMCMMckNY= github.com/DataDog/datadog-agent/pkg/util/cache v0.77.0/go.mod h1:BfHiOUQ3gQzYy3E40oalOdSwOdmNKgfS80EmEMl9klc= +github.com/DataDog/datadog-agent/pkg/util/cache v0.78.3 h1:ttfi5KmNpeFimDfMcOvvOQGB9lthKoAND1Dxbiv4POY= github.com/DataDog/datadog-agent/pkg/util/cache v0.78.3/go.mod h1:GCDQazdL05pOK8Y9Gg3OTiiYU9elmVescZscrT/9Jzk= github.com/DataDog/datadog-agent/pkg/util/cache v0.78.4/go.mod h1:GCDQazdL05pOK8Y9Gg3OTiiYU9elmVescZscrT/9Jzk= github.com/DataDog/datadog-agent/pkg/util/cache v0.79.0/go.mod h1:RBNmKn63Fzuf2ZR4lNFO6RpfBwUxBet/CoUvaPvtF70= @@ -751,14 +796,17 @@ github.com/DataDog/datadog-agent/pkg/util/cgroups v0.79.0 h1:J+TMadZUGdENg27GI+u github.com/DataDog/datadog-agent/pkg/util/cgroups v0.79.0/go.mod h1:8Y2nQt0V18/i/GfE0Iv3vloo5m0ijoIoDLyATTaGE9w= github.com/DataDog/datadog-agent/pkg/util/common v0.77.0 h1:vRlUjd3LCJ/tzhCv57V2g/Fx90s/mSI2Ia6p6X1/zAA= github.com/DataDog/datadog-agent/pkg/util/common v0.77.0/go.mod h1:kF/I1f6immce1C3vp7lBe7XHv3zn9leY5pKl0IHCGq8= +github.com/DataDog/datadog-agent/pkg/util/common v0.78.3 h1:sO5ugpUGIV6ECxvKDKhDPc0+DjgAtYEI0Jn4HYRtT1M= github.com/DataDog/datadog-agent/pkg/util/common v0.78.3/go.mod h1:6ot8QXfSwbPfb4TaAAmE1oSVckwmyufzuEfr3H2Jetg= github.com/DataDog/datadog-agent/pkg/util/common v0.78.4/go.mod h1:6ot8QXfSwbPfb4TaAAmE1oSVckwmyufzuEfr3H2Jetg= github.com/DataDog/datadog-agent/pkg/util/common v0.79.0/go.mod h1:W41/GAJETw4YhW7CpDPBc7fHbqIYXL/hRvgWBPZz87w= github.com/DataDog/datadog-agent/pkg/util/compression v0.77.0 h1:SPLNrH0smKyQymTNejKOtcGiWKP+708NjHSq1cyeIBg= github.com/DataDog/datadog-agent/pkg/util/compression v0.77.0/go.mod h1:SQw5TCkvjSE5fdTH1T8Jp0vz3fbRdUGfahKunTzgIlg= +github.com/DataDog/datadog-agent/pkg/util/compression v0.78.3 h1:YuLQJ1/I+OVWxuhOeG2O5DmTHzivJHlkeTCGg2lHG2s= github.com/DataDog/datadog-agent/pkg/util/compression v0.78.3/go.mod h1:sSt220DrQDGyVXs9GDuZ8sXDFfZ7wryNAftVQP4l0Tc= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.77.0 h1:YPI6ZwSLRxIU/MQWzC1HEM77l8HaK5tQe2KjV+6dOx4= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.77.0/go.mod h1:5U9K+nML/0SKR8xzjN32jqilO+Gkuzji3IuAll3Wgc4= +github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.78.3 h1:sbexeqgDSRQm1rssd2eIeRn0lAwSn3Rskrw7YTQKlZI= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.78.3/go.mod h1:15XTqryAado5YvVSG1v7wIzA9jr1WDtkbhaU5DFiu/k= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.78.4/go.mod h1:/fXMrm0sSNxTR4rBRxJHuQ+UZ7BYq6Yh8T/PyO9+6QM= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.79.0/go.mod h1:OirWf0O3MJSDxr1K/5YvnPD0K/DLvMFUTKUHjkG7/hY= @@ -788,6 +836,7 @@ github.com/DataDog/datadog-agent/pkg/util/fxutil v0.79.0 h1:vuM2PaLZj13C3xrgjNC2 github.com/DataDog/datadog-agent/pkg/util/fxutil v0.79.0/go.mod h1:vdKVvGLOdevuomFtJgNbT4scNSVxoEz/lh/ancrvwPI= github.com/DataDog/datadog-agent/pkg/util/grpc v0.77.0 h1:fMkOYt5oqMsC83cVFLhGawBnWXh6OP2mUJzExBFe0sU= github.com/DataDog/datadog-agent/pkg/util/grpc v0.77.0/go.mod h1:W24v7tFjikCuC1xjq45Of5Z9qa9VUbBddp6dz1qjt3c= +github.com/DataDog/datadog-agent/pkg/util/grpc v0.78.3 h1:xMoCEV5rSzI/y4vYsMi3ll25bzmff780dgaipQkkFy4= github.com/DataDog/datadog-agent/pkg/util/grpc v0.78.3/go.mod h1:/f44/yxnq/qyskH2O3CKXbDBn+PVX0s0oBbRI0W/5EA= github.com/DataDog/datadog-agent/pkg/util/grpc v0.78.4/go.mod h1:CPQAiWUNIkWtXfQm8jtkTWtzKXzNZ3psP1A9XqJjA8I= github.com/DataDog/datadog-agent/pkg/util/grpc v0.79.0/go.mod h1:P8EEyKeMgqRzZJ26ZlarfBgNtMCXaQ7u1UX9psh67rU= @@ -795,9 +844,11 @@ github.com/DataDog/datadog-agent/pkg/util/http v0.77.0 h1:8RwTJ4H47Hx+OGzBpL5gHl github.com/DataDog/datadog-agent/pkg/util/http v0.77.0/go.mod h1:Ay19xAifymmSpmx5S1mhFScfx6BMOMkmKiyqLBCRtQw= github.com/DataDog/datadog-agent/pkg/util/http v0.78.3/go.mod h1:pnUZnsbsnYzpoWZsKw0YbLiTjmcFMhon/rdbs8i2q4Q= github.com/DataDog/datadog-agent/pkg/util/http v0.78.4/go.mod h1:mUm0tLQNrAjNb/MgDKkVv7rSh/+ifWGIa9pig9Xi0YI= +github.com/DataDog/datadog-agent/pkg/util/http v0.79.0 h1:KqGgFOO8gjHE0+f2iXQvW230F26NNVnnMAehSIhUTaA= github.com/DataDog/datadog-agent/pkg/util/http v0.79.0/go.mod h1:Eo0p/3xf5aq8i3aErUJ39x1FKRWDYfOoDfPT3E1jU88= github.com/DataDog/datadog-agent/pkg/util/json v0.77.0 h1:83v9K94M5tsLfq1KfXIkcQyH6a5hcqM3oradjknzKek= github.com/DataDog/datadog-agent/pkg/util/json v0.77.0/go.mod h1:ueb7RqbUfuxNVSlhjngH67bFnt4Sz8jw3T2dFCo4NPg= +github.com/DataDog/datadog-agent/pkg/util/json v0.78.3 h1:WQbfmLepl1dOXW+Fqy20dK2uwF+9z6326jFh9iJ2kU0= github.com/DataDog/datadog-agent/pkg/util/json v0.78.3/go.mod h1:iBHJDW0DrFVuADZEVTVq+eTjysTD8Yb/WlyR9XTejVY= github.com/DataDog/datadog-agent/pkg/util/kubernetes/apiserver/common/namespace v0.77.0 h1:96jy17lJrMGcM53TsUseeshC0N5I0ihE0DuJjGX+NF8= github.com/DataDog/datadog-agent/pkg/util/kubernetes/apiserver/common/namespace v0.77.0/go.mod h1:JRli2R7aoOM9HUhrPFWy8UGv5xfxQme9XpmRNt+HzZ0= @@ -811,6 +862,7 @@ github.com/DataDog/datadog-agent/pkg/util/log v0.79.0 h1:uha71PQaP0o40aM51BPZOy8 github.com/DataDog/datadog-agent/pkg/util/log v0.79.0/go.mod h1:CAY0JEL1p/Zm3U03My4N1QQcjL/tQGHufrN+dYkqb2I= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.77.0 h1:QYefMr5grpo0+QKByZPmHLBl0Jn8kbwG36l3gVs/CAs= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.77.0/go.mod h1:AfvtDnaaPcype4uoKhpo4wT+r7gyBHvn3vO4hvxUCzU= +github.com/DataDog/datadog-agent/pkg/util/log/setup v0.78.3 h1:Ts20zpwycPs8ABJzIP+vaK7X1wWRnPO9WZiKyMXOpXc= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.78.3/go.mod h1:/5gAdX1mFR/wcXk288fpI8ek+eCZqqShha0F3Joe/40= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.78.4/go.mod h1:+52sqMfnavPo1GX69ZNh3cJsBht87Wbng2jRgB0g288= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.79.0/go.mod h1:lFjsW0G4b445XZATb5ohyCGIvHsC6yNQK5tR6kuoqhA= @@ -828,6 +880,7 @@ github.com/DataDog/datadog-agent/pkg/util/pointer v0.79.0 h1:1lnlaoaK8PRrxdK2ltw github.com/DataDog/datadog-agent/pkg/util/pointer v0.79.0/go.mod h1:vZmAREnlaPyhNnfJfVmFIZ/xYBXef1pxvi130b0Le6M= github.com/DataDog/datadog-agent/pkg/util/quantile v0.77.0 h1:YPziONVGNejkbwPy62IUE3DWf2F9hKph/Y+eRzR6j9Y= github.com/DataDog/datadog-agent/pkg/util/quantile v0.77.0/go.mod h1:9kbZYKlzYzTrDf93E+QLArzGWystLeLqsuEqhJJMldg= +github.com/DataDog/datadog-agent/pkg/util/quantile v0.78.3 h1:yigfS4kzITrkm3MP0DnKaSe0xLWzPRZQJg9suN4P4Y4= github.com/DataDog/datadog-agent/pkg/util/quantile v0.78.3/go.mod h1:52zEFnuN463FekTqydYlqbo+cAEq7XTzGR/2UboSrjI= github.com/DataDog/datadog-agent/pkg/util/scrubber v0.75.2/go.mod h1:EHbtirXEWLNY0PDr6ibaEmxSL3FFxGAOJd0Wv5tOYJg= github.com/DataDog/datadog-agent/pkg/util/scrubber v0.76.2/go.mod h1:/GvOF3H0meWMxBWGzSkh9t7aqlAxIEbeQSeaGk711Ho= @@ -837,6 +890,7 @@ github.com/DataDog/datadog-agent/pkg/util/scrubber v0.79.0 h1:402z0kcTCt8Qd5gqLH github.com/DataDog/datadog-agent/pkg/util/scrubber v0.79.0/go.mod h1:1oGeiD/i554PfGrds1SzMG+ncO9gGPqC5FNNAlx+YoE= github.com/DataDog/datadog-agent/pkg/util/sort v0.77.0 h1:36jXEIiuGxT7wYB/yiYPctonkLWdoQBXrF8d1R+BoRM= github.com/DataDog/datadog-agent/pkg/util/sort v0.77.0/go.mod h1:FkUBvsOPjP+5Q8KgpdAnt42Hpy7bhhsGSSE2P+UJC3U= +github.com/DataDog/datadog-agent/pkg/util/sort v0.78.3 h1:hXE/wlNGo2j5YnNSYAw6YnhNxHbWKeIx2PlN3U5bGKs= github.com/DataDog/datadog-agent/pkg/util/sort v0.78.3/go.mod h1:zdbmBf4yUxiIHlcwsNMIY1w3QF27+CvzR8azQCYFX6w= github.com/DataDog/datadog-agent/pkg/util/sort v0.78.4/go.mod h1:zdbmBf4yUxiIHlcwsNMIY1w3QF27+CvzR8azQCYFX6w= github.com/DataDog/datadog-agent/pkg/util/sort v0.79.0/go.mod h1:GKgV7y9W6+KZnUp6W0GZ4mfkCjPH5kM2ME3ZaSoNWhA= @@ -869,6 +923,7 @@ github.com/DataDog/datadog-go/v5 v5.8.2/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUF github.com/DataDog/go-libddwaf/v4 v4.8.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= github.com/DataDog/go-libddwaf/v4 v4.9.0 h1:a788e37iuH7sR9uIYHkulvTnp2FkXTiZ3yY/kuaHgZE= github.com/DataDog/go-libddwaf/v4 v4.9.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-libddwaf/v4 v4.10.0 h1:e1kqR5yqqttLRuFXHb8FrrgLfMWTx5LnZICMwQwTDYM= github.com/DataDog/go-libddwaf/v4 v4.10.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= github.com/DataDog/go-sqllexer v0.1.10/go.mod h1:vOw7Ia7z+z6nl3zGZlLIZe0vQlPtCPR906WIPBJadxc= @@ -976,6 +1031,7 @@ github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bits-and-blooms/bitset v1.24.0 h1:H4x4TuulnokZKvHLfzVRTHJfFfnHEeSYJizujEZvmAM= github.com/bits-and-blooms/bitset v1.24.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.4 h1:95H15Og1clikBrKr/DuzMXkQzECs1M6hhoGXLwLQOZE= github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -1001,11 +1057,13 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWs github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/cilium/ebpf v0.16.0 h1:+BiEnHL6Z7lXnlGUsXQPPAE7+kenAd4ES8MQ5min0Ok= github.com/cilium/ebpf v0.16.0/go.mod h1:L7u2Blt2jMM/vLAVgjxluxtBKlz3/GWjB0dMOEngfwE= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/clipperhouse/displaywidth v0.9.0/go.mod h1:aCAAqTlh4GIVkhQnJpbL0T/WfcrJXHcj8C0yjYcjOZA= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/clipperhouse/uax29/v2 v2.5.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= @@ -1391,6 +1449,7 @@ github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3/go.mod h1:autxFIv github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/lyft/protoc-gen-star/v2 v2.0.4 h1:JDlNKttNIRd68AAIychs0AqEpO8/I/WYi01OQ7Raw6Q= github.com/lyft/protoc-gen-star/v2 v2.0.4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= @@ -1535,6 +1594,7 @@ github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+D github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 h1:hp2CYQUINdZMHdvTdXtPOY2ainKl4IoMcpAXEf2xj3Q= github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1583,6 +1643,7 @@ github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhg github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad h1:W0LEBv82YCGEtcmPA3uNZBI33/qF//HAAs3MawDjRa0= github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad/go.mod h1:Hy8o65+MXnS6EwGElrSRjUzQDLXreJlzYLlWiHtt8hM= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= @@ -1928,6 +1989,7 @@ go.opentelemetry.io/collector/processor/processorhelper v0.150.0 h1:3SbVF+FbglKr go.opentelemetry.io/collector/processor/processorhelper v0.150.0/go.mod h1:Z15LjctXPaisovFoaxvkqfFXUCkFVgem2fkE0KKAKd0= go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.145.0 h1:sj71PeiUvjwJpgPCA89DBggglUnMnHnVDj1p5mqopbU= go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.145.0/go.mod h1:eziJnPjzFuVntzgDuZTJhckjiavWYSoJG+kID45wJHU= +go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.147.0 h1:iHSXnNw0pnHnbx2p3RQws4+RhXccD/odYS76Qh/gC+w= go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.147.0/go.mod h1:AvFsKbfOvHsE4XfAvsHmwf1PCNvMcQRcCSSS3mb/mT8= go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.150.0/go.mod h1:EDYHe859rnTXTQbDLOzfWtIbX759nwB1AE5ry7NSHJM= go.opentelemetry.io/collector/processor/processortest v0.147.0/go.mod h1:JkeOS3E1BH6MUAcvTaVNIgUSXD+IGggi1pdvbRwMctE= @@ -2019,6 +2081,7 @@ go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9 go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw= go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE= +go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 h1:ojdSRDvjrnm30beHOmwsSvLpoRF40MlwNCA+Oo93kXU= go.opentelemetry.io/contrib/bridges/otelzap v0.10.0/go.mod h1:oTTm4g7NEtHSV2i/0FeVdPaPgUIZPfQkFbq0vbzqnv0= go.opentelemetry.io/contrib/bridges/otelzap v0.11.0/go.mod h1:pJPCLM8gzX4ASqLlyAXjHBEYxgbOQJ/9bidWxD6PEPQ= go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= @@ -2030,6 +2093,7 @@ go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPx go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= @@ -2206,6 +2270,7 @@ golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -2729,6 +2794,7 @@ gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/httprequest.v1 v1.2.1 h1:pEPLMdF/gjWHnKxLpuCYaHFjc8vAB2wrYjXrqDVC16E= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.2 h1:JtOSMb9OuaCZKr7h5D/h6iii14sK0hLbplTc6frx4Ss= gopkg.in/ini.v1 v1.67.2/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss= gopkg.in/jinzhu/gorm.v1 v1.9.2 h1:sTqyEcgrxG68jdeUXA9syQHNdeRhhfaYZ+vcL3x730I= gopkg.in/jinzhu/gorm.v1 v1.9.2/go.mod h1:56JJPUzbikvTVnoyP1nppSkbJ2L8sunqTBDY2fDrmFg= @@ -2740,6 +2806,7 @@ gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go new file mode 100644 index 00000000000..755ce326b82 --- /dev/null +++ b/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go @@ -0,0 +1,132 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +// Package gcppubsubadmin exercises orchestrion tracing of Pub/Sub v1 admin +// operations via high-level and GAPIC clients dialing the emulator themselves. +package gcppubsubadmin + +import ( + "context" + "fmt" + "testing" + + "cloud.google.com/go/pubsub" + vkit "cloud.google.com/go/pubsub/apiv1" + "cloud.google.com/go/pubsub/apiv1/pubsubpb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + "github.com/testcontainers/testcontainers-go/modules/gcloud" + "google.golang.org/api/option" + "google.golang.org/api/option/internaloption" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +const ( + testProject = "pstest-orchestrion" + testTopic = "admin-topic" + testSubscription = "admin-subscription" +) + +type TestCase struct { + container *gcloud.GCloudContainer + client *pubsub.Client + uri string + projectID string +} + +// emulatorOptions returns the client options needed to reach the plaintext Pub/Sub +// emulator by dialing internally. Passing these (rather than a pre-built +// option.WithGRPCConn) lets orchestrion append the admin interceptor to the GAPIC +// client constructors it hooks. +func emulatorOptions(uri string) []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint(uri), + option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), + option.WithoutAuthentication(), + internaloption.SkipDialSettingsValidation(), + } +} + +func (tc *TestCase) topicPath(id string) string { + return fmt.Sprintf("projects/%s/topics/%s", tc.projectID, id) +} + +func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + tc.container, err = gcloud.RunPubsub(ctx, + "gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators", + gcloud.WithProjectID(testProject), + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, tc.container) + + tc.projectID = tc.container.Settings.ProjectID + tc.uri = tc.container.URI + + tc.client, err = pubsub.NewClient(ctx, tc.projectID, emulatorOptions(tc.uri)...) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, tc.client.Close()) }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + // Pattern 1: the high-level pubsub.Client. CreateTopic / CreateSubscription are + // backed by the GAPIC PublisherClient / SubscriberClient constructed internally + // by pubsub.NewClient (a variadic-spread call), exercising orchestrion's + // interceptor injection into that path. + topic, err := tc.client.CreateTopic(ctx, testTopic) + require.NoError(t, err) + + _, err = tc.client.CreateSubscription(ctx, testSubscription, pubsub.SubscriptionConfig{ + Topic: topic, + }) + require.NoError(t, err) + + // Pattern 2: a directly-constructed GAPIC admin client. + pc, err := vkit.NewPublisherClient(ctx, emulatorOptions(tc.uri)...) + require.NoError(t, err) + defer func() { assert.NoError(t, pc.Close()) }() + + _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath(testTopic)}) + require.NoError(t, err) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + tc.adminTrace("CreateTopic", tc.topicPath(testTopic)), + tc.adminTrace("CreateSubscription", fmt.Sprintf("projects/%s/subscriptions/%s", tc.projectID, testSubscription)), + tc.adminTrace("GetTopic", tc.topicPath(testTopic)), + } +} + +func (tc *TestCase) adminTrace(method, resourcePath string) *trace.Trace { + return &trace.Trace{ + Tags: map[string]any{ + "name": "gcp.pubsub.request", + "type": "worker", + "resource": method + " " + resourcePath, + "service": "gcp_pubsub_admin.v1.test", + }, + Meta: map[string]string{ + "span.kind": "client", + "component": "cloud.google.com/go/pubsub.v1", + "messaging.system": "googlepubsub", + "pubsub.method": method, + "gcloud.project_id": testProject, + }, + } +} diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v1/generated_test.go b/internal/orchestrion/_integration/gcp_pubsub_admin.v1/generated_test.go new file mode 100644 index 00000000000..ee05f86b4a4 --- /dev/null +++ b/internal/orchestrion/_integration/gcp_pubsub_admin.v1/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package gcppubsubadmin + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go new file mode 100644 index 00000000000..a827597b88e --- /dev/null +++ b/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go @@ -0,0 +1,138 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +// Package gcppubsubadmin exercises orchestrion tracing of Pub/Sub v2 admin +// operations via high-level and GAPIC clients dialing the emulator themselves. +package gcppubsubadmin + +import ( + "context" + "fmt" + "testing" + + "cloud.google.com/go/pubsub/v2" + vkit "cloud.google.com/go/pubsub/v2/apiv1" + "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + "github.com/testcontainers/testcontainers-go/modules/gcloud" + "google.golang.org/api/option" + "google.golang.org/api/option/internaloption" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +const ( + testProject = "pstest-orchestrion" + testTopic = "admin-topic" + testSubscription = "admin-subscription" +) + +type TestCase struct { + container *gcloud.GCloudContainer + client *pubsub.Client + uri string + projectID string +} + +// emulatorOptions returns the client options needed to reach the plaintext Pub/Sub +// emulator by dialing internally. Passing these (rather than a pre-built +// option.WithGRPCConn) lets orchestrion append the admin interceptor to the GAPIC +// client constructors it hooks. +func emulatorOptions(uri string) []option.ClientOption { + return []option.ClientOption{ + option.WithEndpoint(uri), + option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), + option.WithoutAuthentication(), + internaloption.SkipDialSettingsValidation(), + } +} + +func (tc *TestCase) topicPath(id string) string { + return fmt.Sprintf("projects/%s/topics/%s", tc.projectID, id) +} + +func (tc *TestCase) subscriptionPath(id string) string { + return fmt.Sprintf("projects/%s/subscriptions/%s", tc.projectID, id) +} + +func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + tc.container, err = gcloud.RunPubsub(ctx, + "gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators", + gcloud.WithProjectID(testProject), + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, tc.container) + + tc.projectID = tc.container.Settings.ProjectID + tc.uri = tc.container.URI + + tc.client, err = pubsub.NewClient(ctx, tc.projectID, emulatorOptions(tc.uri)...) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, tc.client.Close()) }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + // Pattern 1: admin clients exposed by the high-level pubsub.Client. These are + // constructed internally by pubsub.NewClient (a variadic-spread call), so this + // exercises orchestrion's interceptor injection into that path. + topic, err := tc.client.TopicAdminClient.CreateTopic(ctx, &pubsubpb.Topic{ + Name: tc.topicPath(testTopic), + }) + require.NoError(t, err) + + _, err = tc.client.SubscriptionAdminClient.CreateSubscription(ctx, &pubsubpb.Subscription{ + Name: tc.subscriptionPath(testSubscription), + Topic: topic.Name, + }) + require.NoError(t, err) + + // Pattern 2: a directly-constructed GAPIC admin client. + tac, err := vkit.NewTopicAdminClient(ctx, emulatorOptions(tc.uri)...) + require.NoError(t, err) + defer func() { assert.NoError(t, tac.Close()) }() + + _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath(testTopic)}) + require.NoError(t, err) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + tc.adminTrace("CreateTopic", tc.topicPath(testTopic)), + tc.adminTrace("CreateSubscription", tc.subscriptionPath(testSubscription)), + tc.adminTrace("GetTopic", tc.topicPath(testTopic)), + } +} + +func (tc *TestCase) adminTrace(method, resourcePath string) *trace.Trace { + return &trace.Trace{ + Tags: map[string]any{ + "name": "gcp.pubsub.request", + "type": "worker", + "resource": method + " " + resourcePath, + "service": "gcp_pubsub_admin.v2.test", + }, + Meta: map[string]string{ + "span.kind": "client", + "component": "cloud.google.com/go/pubsub.v2", + "messaging.system": "googlepubsub", + "pubsub.method": method, + "gcloud.project_id": testProject, + }, + } +} diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v2/generated_test.go b/internal/orchestrion/_integration/gcp_pubsub_admin.v2/generated_test.go new file mode 100644 index 00000000000..ee05f86b4a4 --- /dev/null +++ b/internal/orchestrion/_integration/gcp_pubsub_admin.v2/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package gcppubsubadmin + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} From 907136fd52b0bf11406cb798c43049a893e3376f Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 14 Jul 2026 13:39:22 -0400 Subject: [PATCH 22/33] copyrght header --- contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go b/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go index 59342c8b62f..3ea53943c4a 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go @@ -1,3 +1,8 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2026 Datadog, Inc. + package pubsubtrace import ( From ef1d99998190600850239f7dcc170a8e6b61fe55 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 15 Jul 2026 09:19:55 -0400 Subject: [PATCH 23/33] add back v2.11 --- contrib/cloud.google.com/go/pubsub.v1/go.mod | 2 +- contrib/cloud.google.com/go/pubsub.v2/go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v1/go.mod b/contrib/cloud.google.com/go/pubsub.v1/go.mod index 5a89647812a..56ae7918307 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v1/go.mod @@ -4,7 +4,7 @@ go 1.25.0 require ( cloud.google.com/go/pubsub v1.50.1 - github.com/DataDog/dd-trace-go/v2 v2.10.0-dev + github.com/DataDog/dd-trace-go/v2 v2.11.0-dev github.com/stretchr/testify v1.11.1 google.golang.org/api v0.273.1 google.golang.org/grpc v1.80.0 diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod index a19672a8ce7..b2ad5495a2d 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -4,7 +4,7 @@ go 1.25.0 require ( cloud.google.com/go/pubsub/v2 v2.0.0 - github.com/DataDog/dd-trace-go/v2 v2.10.0-dev + github.com/DataDog/dd-trace-go/v2 v2.11.0-dev github.com/stretchr/testify v1.11.1 google.golang.org/api v0.273.1 google.golang.org/grpc v1.80.0 From 2a5e4ca42d3b1382f9241f525c6cb3d8a538ded7 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 20 Jul 2026 12:18:21 -0400 Subject: [PATCH 24/33] handle empty resource case --- .../go/pubsub.v1/admin_test.go | 160 ++++++++++++++++-- .../go/pubsub.v2/admin_test.go | 160 ++++++++++++++++-- .../cloud.google.com/go/pubsubtrace/admin.go | 67 ++++---- .../go/pubsubtrace/admin_interceptor.go | 9 +- .../go/pubsubtrace/admin_v1.go | 68 ++++---- .../gcp_pubsub_admin.v1/gcp_pubsub_admin.go | 113 ++++++++++++- .../gcp_pubsub_admin.v2/gcp_pubsub_admin.go | 116 ++++++++++++- 7 files changed, 578 insertions(+), 115 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v1/admin_test.go b/contrib/cloud.google.com/go/pubsub.v1/admin_test.go index b3ce4437cf6..7d1756fd0d3 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/admin_test.go +++ b/contrib/cloud.google.com/go/pubsub.v1/admin_test.go @@ -28,7 +28,7 @@ import ( const adminProjectID = "project" -func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *vkit.PublisherClient, *vkit.SubscriberClient) { +func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *vkit.PublisherClient, *vkit.SubscriberClient, *vkit.SchemaClient) { mt := mocktracer.Start() t.Cleanup(mt.Stop) @@ -51,8 +51,10 @@ func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *vkit.Publish require.NoError(t, err) sc, err := vkit.NewSubscriberClient(ctx, option.WithGRPCConn(conn)) require.NoError(t, err) + schema, err := vkit.NewSchemaClient(ctx, option.WithGRPCConn(conn)) + require.NoError(t, err) - return ctx, mt, pc, sc + return ctx, mt, pc, sc, schema } func topicName(id string) string { @@ -63,23 +65,40 @@ func subName(id string) string { return fmt.Sprintf("projects/%s/subscriptions/%s", adminProjectID, id) } -func TestTraceAdminTopicOperations(t *testing.T) { - ctx, mt, pc, _ := setupAdmin(t) +func snapshotName(id string) string { + return fmt.Sprintf("projects/%s/snapshots/%s", adminProjectID, id) +} - _, err := pc.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) - require.NoError(t, err) +func schemaName(id string) string { + return fmt.Sprintf("projects/%s/schemas/%s", adminProjectID, id) +} - _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("topic")}) - require.NoError(t, err) +func projectName() string { + return fmt.Sprintf("projects/%s", adminProjectID) +} - it := pc.ListTopics(ctx, &pubsubpb.ListTopicsRequest{Project: fmt.Sprintf("projects/%s", adminProjectID)}) +func drain[T any](t *testing.T, next func() (T, error)) { + t.Helper() for { - if _, err := it.Next(); err == iterator.Done { - break + if _, err := next(); err == iterator.Done { + return } else { require.NoError(t, err) } } +} + +func TestTraceAdminTopicOperations(t *testing.T) { + ctx, mt, pc, _, _ := setupAdmin(t) + + _, err := pc.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + + _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("topic")}) + require.NoError(t, err) + + it := pc.ListTopics(ctx, &pubsubpb.ListTopicsRequest{Project: projectName()}) + drain(t, it.Next) err = pc.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: topicName("topic")}) require.NoError(t, err) @@ -89,12 +108,12 @@ func TestTraceAdminTopicOperations(t *testing.T) { assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) assertAdminSpan(t, spans[1], "GetTopic", "GetTopic "+topicName("topic")) - assertAdminSpan(t, spans[2], "ListTopics", fmt.Sprintf("ListTopics projects/%s", adminProjectID)) + assertAdminSpan(t, spans[2], "ListTopics", "ListTopics "+projectName()) assertAdminSpan(t, spans[3], "DeleteTopic", "DeleteTopic "+topicName("topic")) } func TestTraceAdminSubscriptionOperations(t *testing.T) { - ctx, mt, pc, sc := setupAdmin(t) + ctx, mt, pc, sc, _ := setupAdmin(t) _, err := pc.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) require.NoError(t, err) @@ -108,20 +127,101 @@ func TestTraceAdminSubscriptionOperations(t *testing.T) { _, err = sc.GetSubscription(ctx, &pubsubpb.GetSubscriptionRequest{Subscription: subName("sub")}) require.NoError(t, err) + it := sc.ListSubscriptions(ctx, &pubsubpb.ListSubscriptionsRequest{Project: projectName()}) + drain(t, it.Next) + err = sc.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: subName("sub")}) require.NoError(t, err) spans := mt.FinishedSpans() - require.Len(t, spans, 4) + require.Len(t, spans, 5) assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) assertAdminSpan(t, spans[1], "CreateSubscription", "CreateSubscription "+subName("sub")) assertAdminSpan(t, spans[2], "GetSubscription", "GetSubscription "+subName("sub")) - assertAdminSpan(t, spans[3], "DeleteSubscription", "DeleteSubscription "+subName("sub")) + assertAdminSpan(t, spans[3], "ListSubscriptions", "ListSubscriptions "+projectName()) + assertAdminSpan(t, spans[4], "DeleteSubscription", "DeleteSubscription "+subName("sub")) +} + +func TestTraceAdminSnapshotOperations(t *testing.T) { + ctx, mt, pc, sc, _ := setupAdmin(t) + + _, err := pc.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + _, err = sc.CreateSubscription(ctx, &pubsubpb.Subscription{ + Name: subName("sub"), + Topic: topicName("topic"), + }) + require.NoError(t, err) + + // pstest does not implement snapshots, so these RPCs error — but the + // interceptor must still emit spans with the resolved resource path. + _, err = sc.CreateSnapshot(ctx, &pubsubpb.CreateSnapshotRequest{ + Name: snapshotName("snap"), + Subscription: subName("sub"), + }) + require.Error(t, err) + + _, err = sc.GetSnapshot(ctx, &pubsubpb.GetSnapshotRequest{Snapshot: snapshotName("snap")}) + require.Error(t, err) + + it := sc.ListSnapshots(ctx, &pubsubpb.ListSnapshotsRequest{Project: projectName()}) + _, err = it.Next() + require.Error(t, err) + require.NotEqual(t, iterator.Done, err) + + err = sc.DeleteSnapshot(ctx, &pubsubpb.DeleteSnapshotRequest{Snapshot: snapshotName("snap")}) + require.Error(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 6) + + assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) + assertAdminSpan(t, spans[1], "CreateSubscription", "CreateSubscription "+subName("sub")) + assertAdminSpan(t, spans[2], "CreateSnapshot", "CreateSnapshot "+snapshotName("snap")) + assert.NotNil(t, spans[2].Tag(ext.ErrorMsg)) + assertAdminSpan(t, spans[3], "GetSnapshot", "GetSnapshot "+snapshotName("snap")) + assert.NotNil(t, spans[3].Tag(ext.ErrorMsg)) + assertAdminSpan(t, spans[4], "ListSnapshots", "ListSnapshots "+projectName()) + assert.NotNil(t, spans[4].Tag(ext.ErrorMsg)) + assertAdminSpan(t, spans[5], "DeleteSnapshot", "DeleteSnapshot "+snapshotName("snap")) + assert.NotNil(t, spans[5].Tag(ext.ErrorMsg)) +} + +func TestTraceAdminSchemaOperations(t *testing.T) { + ctx, mt, _, _, sc := setupAdmin(t) + + const avroDef = `{"type":"record","name":"Test","fields":[{"name":"f","type":"string"}]}` + _, err := sc.CreateSchema(ctx, &pubsubpb.CreateSchemaRequest{ + Parent: projectName(), + Schema: &pubsubpb.Schema{ + Type: pubsubpb.Schema_AVRO, + Definition: avroDef, + }, + SchemaId: "schema", + }) + require.NoError(t, err) + + _, err = sc.GetSchema(ctx, &pubsubpb.GetSchemaRequest{Name: schemaName("schema")}) + require.NoError(t, err) + + it := sc.ListSchemas(ctx, &pubsubpb.ListSchemasRequest{Parent: projectName()}) + drain(t, it.Next) + + err = sc.DeleteSchema(ctx, &pubsubpb.DeleteSchemaRequest{Name: schemaName("schema")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 4) + + assertAdminSpan(t, spans[0], "CreateSchema", "CreateSchema "+projectName()) + assertAdminSpan(t, spans[1], "GetSchema", "GetSchema "+schemaName("schema")) + assertAdminSpan(t, spans[2], "ListSchemas", "ListSchemas "+projectName()) + assertAdminSpan(t, spans[3], "DeleteSchema", "DeleteSchema "+schemaName("schema")) } func TestTraceAdminError(t *testing.T) { - ctx, mt, pc, _ := setupAdmin(t) + ctx, mt, pc, _, _ := setupAdmin(t) _, err := pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("missing")}) require.Error(t, err) @@ -132,6 +232,34 @@ func TestTraceAdminError(t *testing.T) { assertAdminSpan(t, spans[0], "GetTopic", "GetTopic "+topicName("missing")) } +func TestTraceAdminMissingResource(t *testing.T) { + ctx, mt, pc, _, _ := setupAdmin(t) + + // Recognized admin RPCs with an empty resource field must still emit a + // span; TraceAdmin falls back to a method-only resource name. + _, createErr := pc.CreateTopic(ctx, &pubsubpb.Topic{}) + _, getErr := pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{}) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + + assert.Equal(t, "gcp.pubsub.request", spans[0].OperationName()) + assert.Equal(t, "CreateTopic", spans[0].Tag(ext.ResourceName)) + assert.Equal(t, "CreateTopic", spans[0].Tag("pubsub.method")) + assert.Nil(t, spans[0].Tag("gcloud.project_id")) + if createErr != nil { + assert.Equal(t, createErr.Error(), spans[0].Tag(ext.ErrorMsg)) + } + + assert.Equal(t, "gcp.pubsub.request", spans[1].OperationName()) + assert.Equal(t, "GetTopic", spans[1].Tag(ext.ResourceName)) + assert.Equal(t, "GetTopic", spans[1].Tag("pubsub.method")) + assert.Nil(t, spans[1].Tag("gcloud.project_id")) + if getErr != nil { + assert.Equal(t, getErr.Error(), spans[1].Tag(ext.ErrorMsg)) + } +} + func TestTraceAdminWithService(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go index a4677f730d6..e6afc1d435d 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go @@ -28,7 +28,7 @@ import ( const adminProjectID = "project" -func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *vkit.TopicAdminClient, *vkit.SubscriptionAdminClient) { +func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *vkit.TopicAdminClient, *vkit.SubscriptionAdminClient, *vkit.SchemaClient) { mt := mocktracer.Start() t.Cleanup(mt.Stop) @@ -51,8 +51,10 @@ func setupAdmin(t *testing.T) (context.Context, mocktracer.Tracer, *vkit.TopicAd require.NoError(t, err) sac, err := vkit.NewSubscriptionAdminClient(ctx, option.WithGRPCConn(conn)) require.NoError(t, err) + schema, err := vkit.NewSchemaClient(ctx, option.WithGRPCConn(conn)) + require.NoError(t, err) - return ctx, mt, tac, sac + return ctx, mt, tac, sac, schema } func topicName(id string) string { @@ -63,23 +65,40 @@ func subName(id string) string { return fmt.Sprintf("projects/%s/subscriptions/%s", adminProjectID, id) } -func TestTraceAdminTopicOperations(t *testing.T) { - ctx, mt, tac, _ := setupAdmin(t) +func snapshotName(id string) string { + return fmt.Sprintf("projects/%s/snapshots/%s", adminProjectID, id) +} - _, err := tac.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) - require.NoError(t, err) +func schemaName(id string) string { + return fmt.Sprintf("projects/%s/schemas/%s", adminProjectID, id) +} - _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("topic")}) - require.NoError(t, err) +func projectName() string { + return fmt.Sprintf("projects/%s", adminProjectID) +} - it := tac.ListTopics(ctx, &pubsubpb.ListTopicsRequest{Project: fmt.Sprintf("projects/%s", adminProjectID)}) +func drain[T any](t *testing.T, next func() (T, error)) { + t.Helper() for { - if _, err := it.Next(); err == iterator.Done { - break + if _, err := next(); err == iterator.Done { + return } else { require.NoError(t, err) } } +} + +func TestTraceAdminTopicOperations(t *testing.T) { + ctx, mt, tac, _, _ := setupAdmin(t) + + _, err := tac.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + + _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("topic")}) + require.NoError(t, err) + + it := tac.ListTopics(ctx, &pubsubpb.ListTopicsRequest{Project: projectName()}) + drain(t, it.Next) err = tac.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: topicName("topic")}) require.NoError(t, err) @@ -89,12 +108,12 @@ func TestTraceAdminTopicOperations(t *testing.T) { assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) assertAdminSpan(t, spans[1], "GetTopic", "GetTopic "+topicName("topic")) - assertAdminSpan(t, spans[2], "ListTopics", fmt.Sprintf("ListTopics projects/%s", adminProjectID)) + assertAdminSpan(t, spans[2], "ListTopics", "ListTopics "+projectName()) assertAdminSpan(t, spans[3], "DeleteTopic", "DeleteTopic "+topicName("topic")) } func TestTraceAdminSubscriptionOperations(t *testing.T) { - ctx, mt, tac, sac := setupAdmin(t) + ctx, mt, tac, sac, _ := setupAdmin(t) _, err := tac.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) require.NoError(t, err) @@ -108,20 +127,101 @@ func TestTraceAdminSubscriptionOperations(t *testing.T) { _, err = sac.GetSubscription(ctx, &pubsubpb.GetSubscriptionRequest{Subscription: subName("sub")}) require.NoError(t, err) + it := sac.ListSubscriptions(ctx, &pubsubpb.ListSubscriptionsRequest{Project: projectName()}) + drain(t, it.Next) + err = sac.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: subName("sub")}) require.NoError(t, err) spans := mt.FinishedSpans() - require.Len(t, spans, 4) + require.Len(t, spans, 5) assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) assertAdminSpan(t, spans[1], "CreateSubscription", "CreateSubscription "+subName("sub")) assertAdminSpan(t, spans[2], "GetSubscription", "GetSubscription "+subName("sub")) - assertAdminSpan(t, spans[3], "DeleteSubscription", "DeleteSubscription "+subName("sub")) + assertAdminSpan(t, spans[3], "ListSubscriptions", "ListSubscriptions "+projectName()) + assertAdminSpan(t, spans[4], "DeleteSubscription", "DeleteSubscription "+subName("sub")) +} + +func TestTraceAdminSnapshotOperations(t *testing.T) { + ctx, mt, tac, sac, _ := setupAdmin(t) + + _, err := tac.CreateTopic(ctx, &pubsubpb.Topic{Name: topicName("topic")}) + require.NoError(t, err) + _, err = sac.CreateSubscription(ctx, &pubsubpb.Subscription{ + Name: subName("sub"), + Topic: topicName("topic"), + }) + require.NoError(t, err) + + // pstest does not implement snapshots, so these RPCs error — but the + // interceptor must still emit spans with the resolved resource path. + _, err = sac.CreateSnapshot(ctx, &pubsubpb.CreateSnapshotRequest{ + Name: snapshotName("snap"), + Subscription: subName("sub"), + }) + require.Error(t, err) + + _, err = sac.GetSnapshot(ctx, &pubsubpb.GetSnapshotRequest{Snapshot: snapshotName("snap")}) + require.Error(t, err) + + it := sac.ListSnapshots(ctx, &pubsubpb.ListSnapshotsRequest{Project: projectName()}) + _, err = it.Next() + require.Error(t, err) + require.NotEqual(t, iterator.Done, err) + + err = sac.DeleteSnapshot(ctx, &pubsubpb.DeleteSnapshotRequest{Snapshot: snapshotName("snap")}) + require.Error(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 6) + + assertAdminSpan(t, spans[0], "CreateTopic", "CreateTopic "+topicName("topic")) + assertAdminSpan(t, spans[1], "CreateSubscription", "CreateSubscription "+subName("sub")) + assertAdminSpan(t, spans[2], "CreateSnapshot", "CreateSnapshot "+snapshotName("snap")) + assert.NotNil(t, spans[2].Tag(ext.ErrorMsg)) + assertAdminSpan(t, spans[3], "GetSnapshot", "GetSnapshot "+snapshotName("snap")) + assert.NotNil(t, spans[3].Tag(ext.ErrorMsg)) + assertAdminSpan(t, spans[4], "ListSnapshots", "ListSnapshots "+projectName()) + assert.NotNil(t, spans[4].Tag(ext.ErrorMsg)) + assertAdminSpan(t, spans[5], "DeleteSnapshot", "DeleteSnapshot "+snapshotName("snap")) + assert.NotNil(t, spans[5].Tag(ext.ErrorMsg)) +} + +func TestTraceAdminSchemaOperations(t *testing.T) { + ctx, mt, _, _, sc := setupAdmin(t) + + const avroDef = `{"type":"record","name":"Test","fields":[{"name":"f","type":"string"}]}` + _, err := sc.CreateSchema(ctx, &pubsubpb.CreateSchemaRequest{ + Parent: projectName(), + Schema: &pubsubpb.Schema{ + Type: pubsubpb.Schema_AVRO, + Definition: avroDef, + }, + SchemaId: "schema", + }) + require.NoError(t, err) + + _, err = sc.GetSchema(ctx, &pubsubpb.GetSchemaRequest{Name: schemaName("schema")}) + require.NoError(t, err) + + it := sc.ListSchemas(ctx, &pubsubpb.ListSchemasRequest{Parent: projectName()}) + drain(t, it.Next) + + err = sc.DeleteSchema(ctx, &pubsubpb.DeleteSchemaRequest{Name: schemaName("schema")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 4) + + assertAdminSpan(t, spans[0], "CreateSchema", "CreateSchema "+projectName()) + assertAdminSpan(t, spans[1], "GetSchema", "GetSchema "+schemaName("schema")) + assertAdminSpan(t, spans[2], "ListSchemas", "ListSchemas "+projectName()) + assertAdminSpan(t, spans[3], "DeleteSchema", "DeleteSchema "+schemaName("schema")) } func TestTraceAdminError(t *testing.T) { - ctx, mt, tac, _ := setupAdmin(t) + ctx, mt, tac, _, _ := setupAdmin(t) // Getting a topic that does not exist returns an error, which must be recorded on the span. _, err := tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: topicName("missing")}) @@ -133,6 +233,34 @@ func TestTraceAdminError(t *testing.T) { assertAdminSpan(t, spans[0], "GetTopic", "GetTopic "+topicName("missing")) } +func TestTraceAdminMissingResource(t *testing.T) { + ctx, mt, tac, _, _ := setupAdmin(t) + + // Recognized admin RPCs with an empty resource field must still emit a + // span; TraceAdmin falls back to a method-only resource name. + _, createErr := tac.CreateTopic(ctx, &pubsubpb.Topic{}) + _, getErr := tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{}) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + + assert.Equal(t, "gcp.pubsub.request", spans[0].OperationName()) + assert.Equal(t, "CreateTopic", spans[0].Tag(ext.ResourceName)) + assert.Equal(t, "CreateTopic", spans[0].Tag("pubsub.method")) + assert.Nil(t, spans[0].Tag("gcloud.project_id")) + if createErr != nil { + assert.Equal(t, createErr.Error(), spans[0].Tag(ext.ErrorMsg)) + } + + assert.Equal(t, "gcp.pubsub.request", spans[1].OperationName()) + assert.Equal(t, "GetTopic", spans[1].Tag(ext.ResourceName)) + assert.Equal(t, "GetTopic", spans[1].Tag("pubsub.method")) + assert.Nil(t, spans[1].Tag("gcloud.project_id")) + if getErr != nil { + assert.Equal(t, getErr.Error(), spans[1].Tag(ext.ErrorMsg)) + } +} + func TestTraceAdminWithService(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin.go b/contrib/cloud.google.com/go/pubsubtrace/admin.go index 0563c7d5983..dc46f4b9b5b 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin.go @@ -37,76 +37,77 @@ func defaultTracerV2() *Tracer { return v2Tracer } -// resolveAdminResourceV2 maps a v2 admin request to its resource path, or "" if not admin. -func resolveAdminResourceV2(req any) string { +// resolveAdminResourceV2 maps a v2 admin request to its resource path. +// ok is false for non-admin requests (Publish, Pull, Acknowledge, IAM, ...). +func resolveAdminResourceV2(req any) (resourcePath string, ok bool) { switch r := req.(type) { // TopicAdminClient case *pubsubpb.Topic: - return r.GetName() + return r.GetName(), true case *pubsubpb.UpdateTopicRequest: - return r.GetTopic().GetName() + return r.GetTopic().GetName(), true case *pubsubpb.GetTopicRequest: - return r.GetTopic() + return r.GetTopic(), true case *pubsubpb.ListTopicsRequest: - return r.GetProject() + return r.GetProject(), true case *pubsubpb.ListTopicSubscriptionsRequest: - return r.GetTopic() + return r.GetTopic(), true case *pubsubpb.ListTopicSnapshotsRequest: - return r.GetTopic() + return r.GetTopic(), true case *pubsubpb.DeleteTopicRequest: - return r.GetTopic() + return r.GetTopic(), true case *pubsubpb.DetachSubscriptionRequest: - return r.GetSubscription() + return r.GetSubscription(), true // SubscriptionAdminClient case *pubsubpb.Subscription: - return r.GetName() + return r.GetName(), true case *pubsubpb.GetSubscriptionRequest: - return r.GetSubscription() + return r.GetSubscription(), true case *pubsubpb.UpdateSubscriptionRequest: - return r.GetSubscription().GetName() + return r.GetSubscription().GetName(), true case *pubsubpb.ListSubscriptionsRequest: - return r.GetProject() + return r.GetProject(), true case *pubsubpb.DeleteSubscriptionRequest: - return r.GetSubscription() + return r.GetSubscription(), true case *pubsubpb.ModifyPushConfigRequest: - return r.GetSubscription() + return r.GetSubscription(), true case *pubsubpb.GetSnapshotRequest: - return r.GetSnapshot() + return r.GetSnapshot(), true case *pubsubpb.ListSnapshotsRequest: - return r.GetProject() + return r.GetProject(), true case *pubsubpb.CreateSnapshotRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.UpdateSnapshotRequest: - return r.GetSnapshot().GetName() + return r.GetSnapshot().GetName(), true case *pubsubpb.DeleteSnapshotRequest: - return r.GetSnapshot() + return r.GetSnapshot(), true case *pubsubpb.SeekRequest: - return r.GetSubscription() + return r.GetSubscription(), true // SchemaClient case *pubsubpb.CreateSchemaRequest: - return r.GetParent() + return r.GetParent(), true case *pubsubpb.GetSchemaRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.ListSchemasRequest: - return r.GetParent() + return r.GetParent(), true case *pubsubpb.ListSchemaRevisionsRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.CommitSchemaRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.RollbackSchemaRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.DeleteSchemaRevisionRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.DeleteSchemaRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.ValidateSchemaRequest: - return r.GetParent() + return r.GetParent(), true case *pubsubpb.ValidateMessageRequest: - return r.GetParent() + return r.GetParent(), true default: - return "" + return "", false } } diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go b/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go index 3ea53943c4a..9daa945a6f3 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin_interceptor.go @@ -12,16 +12,15 @@ import ( "google.golang.org/grpc" ) -// adminResolver returns the resource path targeted by an admin request, or an -// empty string when req is not a traced admin operation (data-plane, IAM, ...). -type adminResolver func(req any) (resourcePath string) +// adminResolver returns the resource path and true for recognized admin requests, else false. +type adminResolver func(req any) (resourcePath string, ok bool) // unaryAdminInterceptor builds a grpc.UnaryClientInterceptor that emits a // gcp.pubsub.request span for each admin RPC recognised by resolve. func (tr *Tracer) unaryAdminInterceptor(resolve adminResolver, opts ...Option) grpc.UnaryClientInterceptor { return func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, callOpts ...grpc.CallOption) error { - resourcePath := resolve(req) - if resourcePath == "" { + resourcePath, ok := resolve(req) + if !ok { return invoker(ctx, method, req, reply, cc, callOpts...) } ctx, finish := tr.TraceAdmin(ctx, adminMethodName(method), resourcePath, opts...) diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go index 799c5d1fc1e..fcfce114d59 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go @@ -37,77 +37,77 @@ func defaultTracerV1() *Tracer { return v1Tracer } -// resolveAdminResourceV1 maps a v1 admin request to its resource path. Non-admin -// requests (Publish, Pull, Acknowledge, ModifyAckDeadline, IAM, ...) return "". -func resolveAdminResourceV1(req any) string { +// resolveAdminResourceV1 maps a v1 admin request to its resource path. +// ok is false for non-admin requests (Publish, Pull, Acknowledge, ModifyAckDeadline, IAM, ...). +func resolveAdminResourceV1(req any) (resourcePath string, ok bool) { switch r := req.(type) { // PublisherClient (topics) case *pubsubpb.Topic: - return r.GetName() + return r.GetName(), true case *pubsubpb.UpdateTopicRequest: - return r.GetTopic().GetName() + return r.GetTopic().GetName(), true case *pubsubpb.GetTopicRequest: - return r.GetTopic() + return r.GetTopic(), true case *pubsubpb.ListTopicsRequest: - return r.GetProject() + return r.GetProject(), true case *pubsubpb.ListTopicSubscriptionsRequest: - return r.GetTopic() + return r.GetTopic(), true case *pubsubpb.ListTopicSnapshotsRequest: - return r.GetTopic() + return r.GetTopic(), true case *pubsubpb.DeleteTopicRequest: - return r.GetTopic() + return r.GetTopic(), true case *pubsubpb.DetachSubscriptionRequest: - return r.GetSubscription() + return r.GetSubscription(), true // SubscriberClient (subscriptions + snapshots) case *pubsubpb.Subscription: - return r.GetName() + return r.GetName(), true case *pubsubpb.GetSubscriptionRequest: - return r.GetSubscription() + return r.GetSubscription(), true case *pubsubpb.UpdateSubscriptionRequest: - return r.GetSubscription().GetName() + return r.GetSubscription().GetName(), true case *pubsubpb.ListSubscriptionsRequest: - return r.GetProject() + return r.GetProject(), true case *pubsubpb.DeleteSubscriptionRequest: - return r.GetSubscription() + return r.GetSubscription(), true case *pubsubpb.ModifyPushConfigRequest: - return r.GetSubscription() + return r.GetSubscription(), true case *pubsubpb.GetSnapshotRequest: - return r.GetSnapshot() + return r.GetSnapshot(), true case *pubsubpb.ListSnapshotsRequest: - return r.GetProject() + return r.GetProject(), true case *pubsubpb.CreateSnapshotRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.UpdateSnapshotRequest: - return r.GetSnapshot().GetName() + return r.GetSnapshot().GetName(), true case *pubsubpb.DeleteSnapshotRequest: - return r.GetSnapshot() + return r.GetSnapshot(), true case *pubsubpb.SeekRequest: - return r.GetSubscription() + return r.GetSubscription(), true // SchemaClient case *pubsubpb.CreateSchemaRequest: - return r.GetParent() + return r.GetParent(), true case *pubsubpb.GetSchemaRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.ListSchemasRequest: - return r.GetParent() + return r.GetParent(), true case *pubsubpb.ListSchemaRevisionsRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.CommitSchemaRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.RollbackSchemaRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.DeleteSchemaRevisionRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.DeleteSchemaRequest: - return r.GetName() + return r.GetName(), true case *pubsubpb.ValidateSchemaRequest: - return r.GetParent() + return r.GetParent(), true case *pubsubpb.ValidateMessageRequest: - return r.GetParent() + return r.GetParent(), true default: - return "" + return "", false } } diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go index 755ce326b82..166be713848 100644 --- a/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go @@ -22,6 +22,7 @@ import ( "github.com/testcontainers/testcontainers-go" tclog "github.com/testcontainers/testcontainers-go/log" "github.com/testcontainers/testcontainers-go/modules/gcloud" + "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" "google.golang.org/grpc" @@ -36,13 +37,17 @@ const ( testProject = "pstest-orchestrion" testTopic = "admin-topic" testSubscription = "admin-subscription" + testSnapshot = "admin-snapshot" + testSchema = "admin-schema" + avroDefinition = `{"type":"record","name":"Test","fields":[{"name":"f","type":"string"}]}` ) type TestCase struct { - container *gcloud.GCloudContainer - client *pubsub.Client - uri string - projectID string + container *gcloud.GCloudContainer + client *pubsub.Client + uri string + projectID string + missingErrMsg string } // emulatorOptions returns the client options needed to reach the plaintext Pub/Sub @@ -58,10 +63,37 @@ func emulatorOptions(uri string) []option.ClientOption { } } +func (tc *TestCase) projectPath() string { + return fmt.Sprintf("projects/%s", tc.projectID) +} + func (tc *TestCase) topicPath(id string) string { return fmt.Sprintf("projects/%s/topics/%s", tc.projectID, id) } +func (tc *TestCase) subscriptionPath(id string) string { + return fmt.Sprintf("projects/%s/subscriptions/%s", tc.projectID, id) +} + +func (tc *TestCase) snapshotPath(id string) string { + return fmt.Sprintf("projects/%s/snapshots/%s", tc.projectID, id) +} + +func (tc *TestCase) schemaPath(id string) string { + return fmt.Sprintf("projects/%s/schemas/%s", tc.projectID, id) +} + +func drain[T any](t *testing.T, next func() (T, error)) { + t.Helper() + for { + if _, err := next(); err == iterator.Done { + return + } else { + require.NoError(t, err) + } + } +} + func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { containers.SkipIfProviderIsNotHealthy(t) @@ -96,20 +128,83 @@ func (tc *TestCase) Run(ctx context.Context, t *testing.T) { }) require.NoError(t, err) - // Pattern 2: a directly-constructed GAPIC admin client. + // Pattern 2: directly-constructed GAPIC admin clients. pc, err := vkit.NewPublisherClient(ctx, emulatorOptions(tc.uri)...) require.NoError(t, err) defer func() { assert.NoError(t, pc.Close()) }() + sc, err := vkit.NewSubscriberClient(ctx, emulatorOptions(tc.uri)...) + require.NoError(t, err) + defer func() { assert.NoError(t, sc.Close()) }() + + drain(t, pc.ListTopics(ctx, &pubsubpb.ListTopicsRequest{Project: tc.projectPath()}).Next) + drain(t, sc.ListSubscriptions(ctx, &pubsubpb.ListSubscriptionsRequest{Project: tc.projectPath()}).Next) + + _, err = sc.CreateSnapshot(ctx, &pubsubpb.CreateSnapshotRequest{ + Name: tc.snapshotPath(testSnapshot), + Subscription: tc.subscriptionPath(testSubscription), + }) + require.NoError(t, err) + + drain(t, sc.ListSnapshots(ctx, &pubsubpb.ListSnapshotsRequest{Project: tc.projectPath()}).Next) + + // SchemaClient is only constructed explicitly (not via pubsub.NewClient). + schemaClient, err := vkit.NewSchemaClient(ctx, emulatorOptions(tc.uri)...) + require.NoError(t, err) + defer func() { assert.NoError(t, schemaClient.Close()) }() + + _, err = schemaClient.CreateSchema(ctx, &pubsubpb.CreateSchemaRequest{ + Parent: tc.projectPath(), + Schema: &pubsubpb.Schema{ + Type: pubsubpb.Schema_AVRO, + Definition: avroDefinition, + }, + SchemaId: testSchema, + }) + require.NoError(t, err) + + _, err = schemaClient.GetSchema(ctx, &pubsubpb.GetSchemaRequest{Name: tc.schemaPath(testSchema)}) + require.NoError(t, err) + + drain(t, schemaClient.ListSchemas(ctx, &pubsubpb.ListSchemasRequest{Parent: tc.projectPath()}).Next) + + err = schemaClient.DeleteSchema(ctx, &pubsubpb.DeleteSchemaRequest{Name: tc.schemaPath(testSchema)}) + require.NoError(t, err) + _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath(testTopic)}) require.NoError(t, err) + + _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath("missing")}) + require.Error(t, err) + tc.missingErrMsg = err.Error() + + err = sc.DeleteSnapshot(ctx, &pubsubpb.DeleteSnapshotRequest{Snapshot: tc.snapshotPath(testSnapshot)}) + require.NoError(t, err) + + err = sc.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: tc.subscriptionPath(testSubscription)}) + require.NoError(t, err) + + err = pc.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: tc.topicPath(testTopic)}) + require.NoError(t, err) } func (tc *TestCase) ExpectedTraces() trace.Traces { return trace.Traces{ tc.adminTrace("CreateTopic", tc.topicPath(testTopic)), - tc.adminTrace("CreateSubscription", fmt.Sprintf("projects/%s/subscriptions/%s", tc.projectID, testSubscription)), + tc.adminTrace("CreateSubscription", tc.subscriptionPath(testSubscription)), + tc.adminTrace("ListTopics", tc.projectPath()), + tc.adminTrace("ListSubscriptions", tc.projectPath()), + tc.adminTrace("CreateSnapshot", tc.snapshotPath(testSnapshot)), + tc.adminTrace("ListSnapshots", tc.projectPath()), + tc.adminTrace("CreateSchema", tc.projectPath()), + tc.adminTrace("GetSchema", tc.schemaPath(testSchema)), + tc.adminTrace("ListSchemas", tc.projectPath()), + tc.adminTrace("DeleteSchema", tc.schemaPath(testSchema)), tc.adminTrace("GetTopic", tc.topicPath(testTopic)), + tc.adminErrorTrace("GetTopic", tc.topicPath("missing"), tc.missingErrMsg), + tc.adminTrace("DeleteSnapshot", tc.snapshotPath(testSnapshot)), + tc.adminTrace("DeleteSubscription", tc.subscriptionPath(testSubscription)), + tc.adminTrace("DeleteTopic", tc.topicPath(testTopic)), } } @@ -130,3 +225,9 @@ func (tc *TestCase) adminTrace(method, resourcePath string) *trace.Trace { }, } } + +func (tc *TestCase) adminErrorTrace(method, resourcePath, errMsg string) *trace.Trace { + tr := tc.adminTrace(method, resourcePath) + tr.Meta["error.message"] = errMsg + return tr +} diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go index a827597b88e..c42d9bf7a3b 100644 --- a/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go @@ -22,6 +22,7 @@ import ( "github.com/testcontainers/testcontainers-go" tclog "github.com/testcontainers/testcontainers-go/log" "github.com/testcontainers/testcontainers-go/modules/gcloud" + "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/api/option/internaloption" "google.golang.org/grpc" @@ -36,13 +37,17 @@ const ( testProject = "pstest-orchestrion" testTopic = "admin-topic" testSubscription = "admin-subscription" + testSnapshot = "admin-snapshot" + testSchema = "admin-schema" + avroDefinition = `{"type":"record","name":"Test","fields":[{"name":"f","type":"string"}]}` ) type TestCase struct { - container *gcloud.GCloudContainer - client *pubsub.Client - uri string - projectID string + container *gcloud.GCloudContainer + client *pubsub.Client + uri string + projectID string + missingErrMsg string } // emulatorOptions returns the client options needed to reach the plaintext Pub/Sub @@ -58,6 +63,10 @@ func emulatorOptions(uri string) []option.ClientOption { } } +func (tc *TestCase) projectPath() string { + return fmt.Sprintf("projects/%s", tc.projectID) +} + func (tc *TestCase) topicPath(id string) string { return fmt.Sprintf("projects/%s/topics/%s", tc.projectID, id) } @@ -66,6 +75,25 @@ func (tc *TestCase) subscriptionPath(id string) string { return fmt.Sprintf("projects/%s/subscriptions/%s", tc.projectID, id) } +func (tc *TestCase) snapshotPath(id string) string { + return fmt.Sprintf("projects/%s/snapshots/%s", tc.projectID, id) +} + +func (tc *TestCase) schemaPath(id string) string { + return fmt.Sprintf("projects/%s/schemas/%s", tc.projectID, id) +} + +func drain[T any](t *testing.T, next func() (T, error)) { + t.Helper() + for { + if _, err := next(); err == iterator.Done { + return + } else { + require.NoError(t, err) + } + } +} + func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { containers.SkipIfProviderIsNotHealthy(t) @@ -102,20 +130,92 @@ func (tc *TestCase) Run(ctx context.Context, t *testing.T) { }) require.NoError(t, err) - // Pattern 2: a directly-constructed GAPIC admin client. + drain(t, tc.client.TopicAdminClient.ListTopics(ctx, &pubsubpb.ListTopicsRequest{ + Project: tc.projectPath(), + }).Next) + drain(t, tc.client.SubscriptionAdminClient.ListSubscriptions(ctx, &pubsubpb.ListSubscriptionsRequest{ + Project: tc.projectPath(), + }).Next) + + _, err = tc.client.SubscriptionAdminClient.CreateSnapshot(ctx, &pubsubpb.CreateSnapshotRequest{ + Name: tc.snapshotPath(testSnapshot), + Subscription: tc.subscriptionPath(testSubscription), + }) + require.NoError(t, err) + + drain(t, tc.client.SubscriptionAdminClient.ListSnapshots(ctx, &pubsubpb.ListSnapshotsRequest{ + Project: tc.projectPath(), + }).Next) + + // Pattern 2: a directly-constructed GAPIC SchemaClient (not exposed on + // pubsub.Client), covering the SchemaClient constructor join-point. + schemaClient, err := vkit.NewSchemaClient(ctx, emulatorOptions(tc.uri)...) + require.NoError(t, err) + defer func() { assert.NoError(t, schemaClient.Close()) }() + + _, err = schemaClient.CreateSchema(ctx, &pubsubpb.CreateSchemaRequest{ + Parent: tc.projectPath(), + Schema: &pubsubpb.Schema{ + Type: pubsubpb.Schema_AVRO, + Definition: avroDefinition, + }, + SchemaId: testSchema, + }) + require.NoError(t, err) + + _, err = schemaClient.GetSchema(ctx, &pubsubpb.GetSchemaRequest{Name: tc.schemaPath(testSchema)}) + require.NoError(t, err) + + drain(t, schemaClient.ListSchemas(ctx, &pubsubpb.ListSchemasRequest{Parent: tc.projectPath()}).Next) + + err = schemaClient.DeleteSchema(ctx, &pubsubpb.DeleteSchemaRequest{Name: tc.schemaPath(testSchema)}) + require.NoError(t, err) + + // Pattern 3: a directly-constructed GAPIC TopicAdminClient. tac, err := vkit.NewTopicAdminClient(ctx, emulatorOptions(tc.uri)...) require.NoError(t, err) defer func() { assert.NoError(t, tac.Close()) }() _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath(testTopic)}) require.NoError(t, err) + + _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath("missing")}) + require.Error(t, err) + tc.missingErrMsg = err.Error() + + err = tc.client.SubscriptionAdminClient.DeleteSnapshot(ctx, &pubsubpb.DeleteSnapshotRequest{ + Snapshot: tc.snapshotPath(testSnapshot), + }) + require.NoError(t, err) + + err = tc.client.SubscriptionAdminClient.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{ + Subscription: tc.subscriptionPath(testSubscription), + }) + require.NoError(t, err) + + err = tc.client.TopicAdminClient.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{ + Topic: tc.topicPath(testTopic), + }) + require.NoError(t, err) } func (tc *TestCase) ExpectedTraces() trace.Traces { return trace.Traces{ tc.adminTrace("CreateTopic", tc.topicPath(testTopic)), tc.adminTrace("CreateSubscription", tc.subscriptionPath(testSubscription)), + tc.adminTrace("ListTopics", tc.projectPath()), + tc.adminTrace("ListSubscriptions", tc.projectPath()), + tc.adminTrace("CreateSnapshot", tc.snapshotPath(testSnapshot)), + tc.adminTrace("ListSnapshots", tc.projectPath()), + tc.adminTrace("CreateSchema", tc.projectPath()), + tc.adminTrace("GetSchema", tc.schemaPath(testSchema)), + tc.adminTrace("ListSchemas", tc.projectPath()), + tc.adminTrace("DeleteSchema", tc.schemaPath(testSchema)), tc.adminTrace("GetTopic", tc.topicPath(testTopic)), + tc.adminErrorTrace("GetTopic", tc.topicPath("missing"), tc.missingErrMsg), + tc.adminTrace("DeleteSnapshot", tc.snapshotPath(testSnapshot)), + tc.adminTrace("DeleteSubscription", tc.subscriptionPath(testSubscription)), + tc.adminTrace("DeleteTopic", tc.topicPath(testTopic)), } } @@ -136,3 +236,9 @@ func (tc *TestCase) adminTrace(method, resourcePath string) *trace.Trace { }, } } + +func (tc *TestCase) adminErrorTrace(method, resourcePath, errMsg string) *trace.Trace { + tr := tc.adminTrace(method, resourcePath) + tr.Meta["error.message"] = errMsg + return tr +} From e81adfce191ad7a530b04413868e906226890a6a Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Mon, 20 Jul 2026 13:26:52 -0400 Subject: [PATCH 25/33] comments --- contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml | 4 ++++ contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml | 4 ++++ contrib/cloud.google.com/go/pubsubtrace/admin.go | 4 ++++ contrib/cloud.google.com/go/pubsubtrace/admin_v1.go | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml index 85b915c0851..4833a71001a 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml +++ b/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml @@ -101,6 +101,10 @@ aspects: # unary client interceptor to each admin client constructor. The interceptor emits a # gcp.pubsub.request span for admin RPCs and forwards the data-plane RPCs (Publish, # Pull, Acknowledge, ...) that share the same connection untouched. + # + # Limitation: option.WithGRPCDialOption is ignored when option.WithGRPCConn is set, + # so admin spans are not created for clients that reuse a pre-built grpc.ClientConn. + # WithGRPCConn users should add pubsubtrace.UnaryAdminInterceptorV1 on their dial - id: Admin client interceptor join-point: one-of: diff --git a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml index cec56b4e801..abe25869e95 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml +++ b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml @@ -103,6 +103,10 @@ aspects: # to each admin client constructor. The interceptor emits a gcp.pubsub.request span # for admin RPCs and forwards the data-plane RPCs (Publish, Pull, Acknowledge, ...) # that share the same connection untouched. + # + # Limitation: option.WithGRPCDialOption is ignored when option.WithGRPCConn is set, + # so admin spans are not created for clients that reuse a pre-built grpc.ClientConn. + # WithGRPCConn users should add pubsubtrace.UnaryAdminInterceptorV2 on their dial - id: Admin client interceptor join-point: one-of: diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin.go b/contrib/cloud.google.com/go/pubsubtrace/admin.go index dc46f4b9b5b..6c9554ff925 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin.go @@ -20,6 +20,10 @@ import ( // UnaryAdminInterceptorV2 returns a grpc.UnaryClientInterceptor that traces // TopicAdminClient, SubscriptionAdminClient, and SchemaClient admin operations. +// +// When constructing admin clients with option.WithGRPCConn, install this +// interceptor on the dial that creates the connection (WithGRPCDialOption on +// the client constructor is ignored in that case). func UnaryAdminInterceptorV2(opts ...Option) grpc.UnaryClientInterceptor { return defaultTracerV2().unaryAdminInterceptor(resolveAdminResourceV2, opts...) } diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go index fcfce114d59..b5b53505cc7 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go @@ -20,6 +20,10 @@ import ( // UnaryAdminInterceptorV1 returns a grpc.UnaryClientInterceptor that traces the admin // operations of the cloud.google.com/go/pubsub (v1) GAPIC clients (PublisherClient, // SubscriberClient, SchemaClient). +// +// When constructing admin clients with option.WithGRPCConn, install this +// interceptor on the dial that creates the connection (WithGRPCDialOption on +// the client constructor is ignored in that case). func UnaryAdminInterceptorV1(opts ...Option) grpc.UnaryClientInterceptor { return defaultTracerV1().unaryAdminInterceptor(resolveAdminResourceV1, opts...) } From 6d9de884722b533e12b1096fc65a959140a7d1ee Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 21 Jul 2026 11:27:39 -0400 Subject: [PATCH 26/33] combine orchestrion admin endpoints test into pubsub package --- .../gcp_pubsub_admin.go | 268 +++++++++++------- .../gcp_pubsub.v1/generated_test.go | 12 + .../gcp_pubsub_admin.go | 263 ++++++++++------- .../gcp_pubsub.v2/generated_test.go | 12 + .../gcp_pubsub_admin.v1/generated_test.go | 20 -- .../gcp_pubsub_admin.v2/generated_test.go | 20 -- 6 files changed, 341 insertions(+), 254 deletions(-) rename internal/orchestrion/_integration/{gcp_pubsub_admin.v1 => gcp_pubsub.v1}/gcp_pubsub_admin.go (52%) rename internal/orchestrion/_integration/{gcp_pubsub_admin.v2 => gcp_pubsub.v2}/gcp_pubsub_admin.go (57%) delete mode 100644 internal/orchestrion/_integration/gcp_pubsub_admin.v1/generated_test.go delete mode 100644 internal/orchestrion/_integration/gcp_pubsub_admin.v2/generated_test.go diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go similarity index 52% rename from internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go rename to internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go index 166be713848..a5f4f6987fd 100644 --- a/internal/orchestrion/_integration/gcp_pubsub_admin.v1/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go @@ -5,9 +5,7 @@ //go:build linux || !githubci -// Package gcppubsubadmin exercises orchestrion tracing of Pub/Sub v1 admin -// operations via high-level and GAPIC clients dialing the emulator themselves. -package gcppubsubadmin +package gcppubsub import ( "context" @@ -34,20 +32,18 @@ import ( ) const ( - testProject = "pstest-orchestrion" - testTopic = "admin-topic" - testSubscription = "admin-subscription" - testSnapshot = "admin-snapshot" - testSchema = "admin-schema" - avroDefinition = `{"type":"record","name":"Test","fields":[{"name":"f","type":"string"}]}` + adminProject = "pstest-orchestrion" + adminTopic = "admin-topic" + adminSubscription = "admin-subscription" + adminSnapshot = "admin-snapshot" + adminSchema = "admin-schema" + avroDefinition = `{"type":"record","name":"Test","fields":[{"name":"f","type":"string"}]}` ) -type TestCase struct { - container *gcloud.GCloudContainer - client *pubsub.Client - uri string - projectID string - missingErrMsg string +type adminBase struct { + container *gcloud.GCloudContainer + uri string + projectID string } // emulatorOptions returns the client options needed to reach the plaintext Pub/Sub @@ -63,24 +59,41 @@ func emulatorOptions(uri string) []option.ClientOption { } } -func (tc *TestCase) projectPath() string { - return fmt.Sprintf("projects/%s", tc.projectID) +func (b *adminBase) setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + b.container, err = gcloud.RunPubsub(ctx, + "gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators", + gcloud.WithProjectID(adminProject), + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, b.container) + + b.projectID = b.container.Settings.ProjectID + b.uri = b.container.URI +} + +func (b *adminBase) projectPath() string { + return fmt.Sprintf("projects/%s", b.projectID) } -func (tc *TestCase) topicPath(id string) string { - return fmt.Sprintf("projects/%s/topics/%s", tc.projectID, id) +func (b *adminBase) topicPath(id string) string { + return fmt.Sprintf("projects/%s/topics/%s", b.projectID, id) } -func (tc *TestCase) subscriptionPath(id string) string { - return fmt.Sprintf("projects/%s/subscriptions/%s", tc.projectID, id) +func (b *adminBase) subscriptionPath(id string) string { + return fmt.Sprintf("projects/%s/subscriptions/%s", b.projectID, id) } -func (tc *TestCase) snapshotPath(id string) string { - return fmt.Sprintf("projects/%s/snapshots/%s", tc.projectID, id) +func (b *adminBase) snapshotPath(id string) string { + return fmt.Sprintf("projects/%s/snapshots/%s", b.projectID, id) } -func (tc *TestCase) schemaPath(id string) string { - return fmt.Sprintf("projects/%s/schemas/%s", tc.projectID, id) +func (b *adminBase) schemaPath(id string) string { + return fmt.Sprintf("projects/%s/schemas/%s", b.projectID, id) } func drain[T any](t *testing.T, next func() (T, error)) { @@ -94,41 +107,94 @@ func drain[T any](t *testing.T, next func() (T, error)) { } } -func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { - containers.SkipIfProviderIsNotHealthy(t) +func (b *adminBase) adminTrace(method, resourcePath string) *trace.Trace { + return &trace.Trace{ + Tags: map[string]any{ + "name": "gcp.pubsub.request", + "type": "worker", + "resource": method + " " + resourcePath, + "service": "gcp_pubsub.v1.test", + }, + Meta: map[string]string{ + "span.kind": "client", + "component": "cloud.google.com/go/pubsub.v1", + "messaging.system": "googlepubsub", + "pubsub.method": method, + "gcloud.project_id": adminProject, + }, + } +} - var err error - tc.container, err = gcloud.RunPubsub(ctx, - "gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators", - gcloud.WithProjectID(testProject), - testcontainers.WithLogger(tclog.TestLogger(t)), - containers.WithTestLogConsumer(t), - ) - containers.AssertTestContainersError(t, err) - containers.RegisterContainerCleanup(t, tc.container) +func (b *adminBase) adminErrorTrace(method, resourcePath, errMsg string) *trace.Trace { + tr := b.adminTrace(method, resourcePath) + tr.Meta["error.message"] = errMsg + return tr +} + +// TestCaseAdminClient exercises admin ops via the high-level pubsub.Client. +// CreateTopic / CreateSubscription are backed by GAPIC clients constructed +// internally by pubsub.NewClient (a variadic-spread call). +type TestCaseAdminClient struct { + adminBase + client *pubsub.Client +} - tc.projectID = tc.container.Settings.ProjectID - tc.uri = tc.container.URI +func (tc *TestCaseAdminClient) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + var err error tc.client, err = pubsub.NewClient(ctx, tc.projectID, emulatorOptions(tc.uri)...) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, tc.client.Close()) }) } -func (tc *TestCase) Run(ctx context.Context, t *testing.T) { - // Pattern 1: the high-level pubsub.Client. CreateTopic / CreateSubscription are - // backed by the GAPIC PublisherClient / SubscriberClient constructed internally - // by pubsub.NewClient (a variadic-spread call), exercising orchestrion's - // interceptor injection into that path. - topic, err := tc.client.CreateTopic(ctx, testTopic) +func (tc *TestCaseAdminClient) Run(ctx context.Context, t *testing.T) { + topic, err := tc.client.CreateTopic(ctx, adminTopic) require.NoError(t, err) - _, err = tc.client.CreateSubscription(ctx, testSubscription, pubsub.SubscriptionConfig{ + sub, err := tc.client.CreateSubscription(ctx, adminSubscription, pubsub.SubscriptionConfig{ Topic: topic, }) require.NoError(t, err) - // Pattern 2: directly-constructed GAPIC admin clients. + require.NoError(t, sub.Delete(ctx)) + require.NoError(t, topic.Delete(ctx)) +} + +func (tc *TestCaseAdminClient) ExpectedTraces() trace.Traces { + return trace.Traces{ + tc.adminTrace("CreateTopic", tc.topicPath(adminTopic)), + tc.adminTrace("CreateSubscription", tc.subscriptionPath(adminSubscription)), + tc.adminTrace("DeleteSubscription", tc.subscriptionPath(adminSubscription)), + tc.adminTrace("DeleteTopic", tc.topicPath(adminTopic)), + } +} + +// TestCaseAdminGAPIC exercises admin ops via directly-constructed GAPIC +// PublisherClient and SubscriberClient. +type TestCaseAdminGAPIC struct { + adminBase + missingErrMsg string +} + +func (tc *TestCaseAdminGAPIC) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + // Fixture resources are created before the tracer starts. + client, err := pubsub.NewClient(ctx, tc.projectID, emulatorOptions(tc.uri)...) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, client.Close()) }) + + topic, err := client.CreateTopic(ctx, adminTopic) + require.NoError(t, err) + + _, err = client.CreateSubscription(ctx, adminSubscription, pubsub.SubscriptionConfig{ + Topic: topic, + }) + require.NoError(t, err) +} + +func (tc *TestCaseAdminGAPIC) Run(ctx context.Context, t *testing.T) { pc, err := vkit.NewPublisherClient(ctx, emulatorOptions(tc.uri)...) require.NoError(t, err) defer func() { assert.NoError(t, pc.Close()) }() @@ -141,93 +207,83 @@ func (tc *TestCase) Run(ctx context.Context, t *testing.T) { drain(t, sc.ListSubscriptions(ctx, &pubsubpb.ListSubscriptionsRequest{Project: tc.projectPath()}).Next) _, err = sc.CreateSnapshot(ctx, &pubsubpb.CreateSnapshotRequest{ - Name: tc.snapshotPath(testSnapshot), - Subscription: tc.subscriptionPath(testSubscription), + Name: tc.snapshotPath(adminSnapshot), + Subscription: tc.subscriptionPath(adminSubscription), }) require.NoError(t, err) drain(t, sc.ListSnapshots(ctx, &pubsubpb.ListSnapshotsRequest{Project: tc.projectPath()}).Next) - // SchemaClient is only constructed explicitly (not via pubsub.NewClient). - schemaClient, err := vkit.NewSchemaClient(ctx, emulatorOptions(tc.uri)...) - require.NoError(t, err) - defer func() { assert.NoError(t, schemaClient.Close()) }() - - _, err = schemaClient.CreateSchema(ctx, &pubsubpb.CreateSchemaRequest{ - Parent: tc.projectPath(), - Schema: &pubsubpb.Schema{ - Type: pubsubpb.Schema_AVRO, - Definition: avroDefinition, - }, - SchemaId: testSchema, - }) - require.NoError(t, err) - - _, err = schemaClient.GetSchema(ctx, &pubsubpb.GetSchemaRequest{Name: tc.schemaPath(testSchema)}) - require.NoError(t, err) - - drain(t, schemaClient.ListSchemas(ctx, &pubsubpb.ListSchemasRequest{Parent: tc.projectPath()}).Next) - - err = schemaClient.DeleteSchema(ctx, &pubsubpb.DeleteSchemaRequest{Name: tc.schemaPath(testSchema)}) - require.NoError(t, err) - - _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath(testTopic)}) + _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath(adminTopic)}) require.NoError(t, err) _, err = pc.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath("missing")}) require.Error(t, err) tc.missingErrMsg = err.Error() - err = sc.DeleteSnapshot(ctx, &pubsubpb.DeleteSnapshotRequest{Snapshot: tc.snapshotPath(testSnapshot)}) + err = sc.DeleteSnapshot(ctx, &pubsubpb.DeleteSnapshotRequest{Snapshot: tc.snapshotPath(adminSnapshot)}) require.NoError(t, err) - err = sc.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: tc.subscriptionPath(testSubscription)}) + err = sc.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{Subscription: tc.subscriptionPath(adminSubscription)}) require.NoError(t, err) - err = pc.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: tc.topicPath(testTopic)}) + err = pc.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{Topic: tc.topicPath(adminTopic)}) require.NoError(t, err) } -func (tc *TestCase) ExpectedTraces() trace.Traces { +func (tc *TestCaseAdminGAPIC) ExpectedTraces() trace.Traces { return trace.Traces{ - tc.adminTrace("CreateTopic", tc.topicPath(testTopic)), - tc.adminTrace("CreateSubscription", tc.subscriptionPath(testSubscription)), tc.adminTrace("ListTopics", tc.projectPath()), tc.adminTrace("ListSubscriptions", tc.projectPath()), - tc.adminTrace("CreateSnapshot", tc.snapshotPath(testSnapshot)), + tc.adminTrace("CreateSnapshot", tc.snapshotPath(adminSnapshot)), tc.adminTrace("ListSnapshots", tc.projectPath()), - tc.adminTrace("CreateSchema", tc.projectPath()), - tc.adminTrace("GetSchema", tc.schemaPath(testSchema)), - tc.adminTrace("ListSchemas", tc.projectPath()), - tc.adminTrace("DeleteSchema", tc.schemaPath(testSchema)), - tc.adminTrace("GetTopic", tc.topicPath(testTopic)), + tc.adminTrace("GetTopic", tc.topicPath(adminTopic)), tc.adminErrorTrace("GetTopic", tc.topicPath("missing"), tc.missingErrMsg), - tc.adminTrace("DeleteSnapshot", tc.snapshotPath(testSnapshot)), - tc.adminTrace("DeleteSubscription", tc.subscriptionPath(testSubscription)), - tc.adminTrace("DeleteTopic", tc.topicPath(testTopic)), + tc.adminTrace("DeleteSnapshot", tc.snapshotPath(adminSnapshot)), + tc.adminTrace("DeleteSubscription", tc.subscriptionPath(adminSubscription)), + tc.adminTrace("DeleteTopic", tc.topicPath(adminTopic)), } } -func (tc *TestCase) adminTrace(method, resourcePath string) *trace.Trace { - return &trace.Trace{ - Tags: map[string]any{ - "name": "gcp.pubsub.request", - "type": "worker", - "resource": method + " " + resourcePath, - "service": "gcp_pubsub_admin.v1.test", - }, - Meta: map[string]string{ - "span.kind": "client", - "component": "cloud.google.com/go/pubsub.v1", - "messaging.system": "googlepubsub", - "pubsub.method": method, - "gcloud.project_id": testProject, +// TestCaseAdminSchema exercises admin ops via a directly-constructed GAPIC +// SchemaClient (not constructed via pubsub.NewClient). +type TestCaseAdminSchema struct { + adminBase +} + +func (tc *TestCaseAdminSchema) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) +} + +func (tc *TestCaseAdminSchema) Run(ctx context.Context, t *testing.T) { + schemaClient, err := vkit.NewSchemaClient(ctx, emulatorOptions(tc.uri)...) + require.NoError(t, err) + defer func() { assert.NoError(t, schemaClient.Close()) }() + + _, err = schemaClient.CreateSchema(ctx, &pubsubpb.CreateSchemaRequest{ + Parent: tc.projectPath(), + Schema: &pubsubpb.Schema{ + Type: pubsubpb.Schema_AVRO, + Definition: avroDefinition, }, - } + SchemaId: adminSchema, + }) + require.NoError(t, err) + + _, err = schemaClient.GetSchema(ctx, &pubsubpb.GetSchemaRequest{Name: tc.schemaPath(adminSchema)}) + require.NoError(t, err) + + drain(t, schemaClient.ListSchemas(ctx, &pubsubpb.ListSchemasRequest{Parent: tc.projectPath()}).Next) + + err = schemaClient.DeleteSchema(ctx, &pubsubpb.DeleteSchemaRequest{Name: tc.schemaPath(adminSchema)}) + require.NoError(t, err) } -func (tc *TestCase) adminErrorTrace(method, resourcePath, errMsg string) *trace.Trace { - tr := tc.adminTrace(method, resourcePath) - tr.Meta["error.message"] = errMsg - return tr +func (tc *TestCaseAdminSchema) ExpectedTraces() trace.Traces { + return trace.Traces{ + tc.adminTrace("CreateSchema", tc.projectPath()), + tc.adminTrace("GetSchema", tc.schemaPath(adminSchema)), + tc.adminTrace("ListSchemas", tc.projectPath()), + tc.adminTrace("DeleteSchema", tc.schemaPath(adminSchema)), + } } diff --git a/internal/orchestrion/_integration/gcp_pubsub.v1/generated_test.go b/internal/orchestrion/_integration/gcp_pubsub.v1/generated_test.go index b50b1e5f8af..dd73eb14ab4 100644 --- a/internal/orchestrion/_integration/gcp_pubsub.v1/generated_test.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v1/generated_test.go @@ -18,3 +18,15 @@ import ( func Test(t *testing.T) { harness.Run(t, new(TestCase)) } + +func TestAdminClient(t *testing.T) { + harness.Run(t, new(TestCaseAdminClient)) +} + +func TestAdminGAPIC(t *testing.T) { + harness.Run(t, new(TestCaseAdminGAPIC)) +} + +func TestAdminSchema(t *testing.T) { + harness.Run(t, new(TestCaseAdminSchema)) +} diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go similarity index 57% rename from internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go rename to internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go index c42d9bf7a3b..dd1d887dd9f 100644 --- a/internal/orchestrion/_integration/gcp_pubsub_admin.v2/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go @@ -5,9 +5,7 @@ //go:build linux || !githubci -// Package gcppubsubadmin exercises orchestrion tracing of Pub/Sub v2 admin -// operations via high-level and GAPIC clients dialing the emulator themselves. -package gcppubsubadmin +package gcppubsub import ( "context" @@ -34,20 +32,17 @@ import ( ) const ( - testProject = "pstest-orchestrion" - testTopic = "admin-topic" - testSubscription = "admin-subscription" - testSnapshot = "admin-snapshot" - testSchema = "admin-schema" - avroDefinition = `{"type":"record","name":"Test","fields":[{"name":"f","type":"string"}]}` + adminTopic = "admin-topic" + adminSubscription = "admin-subscription" + adminSnapshot = "admin-snapshot" + adminSchema = "admin-schema" + avroDefinition = `{"type":"record","name":"Test","fields":[{"name":"f","type":"string"}]}` ) -type TestCase struct { - container *gcloud.GCloudContainer - client *pubsub.Client - uri string - projectID string - missingErrMsg string +type adminBase struct { + container *gcloud.GCloudContainer + uri string + projectID string } // emulatorOptions returns the client options needed to reach the plaintext Pub/Sub @@ -63,24 +58,41 @@ func emulatorOptions(uri string) []option.ClientOption { } } -func (tc *TestCase) projectPath() string { - return fmt.Sprintf("projects/%s", tc.projectID) +func (b *adminBase) setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + b.container, err = gcloud.RunPubsub(ctx, + "gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators", + gcloud.WithProjectID(testProject), + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, b.container) + + b.projectID = b.container.Settings.ProjectID + b.uri = b.container.URI +} + +func (b *adminBase) projectPath() string { + return fmt.Sprintf("projects/%s", b.projectID) } -func (tc *TestCase) topicPath(id string) string { - return fmt.Sprintf("projects/%s/topics/%s", tc.projectID, id) +func (b *adminBase) topicPath(id string) string { + return fmt.Sprintf("projects/%s/topics/%s", b.projectID, id) } -func (tc *TestCase) subscriptionPath(id string) string { - return fmt.Sprintf("projects/%s/subscriptions/%s", tc.projectID, id) +func (b *adminBase) subscriptionPath(id string) string { + return fmt.Sprintf("projects/%s/subscriptions/%s", b.projectID, id) } -func (tc *TestCase) snapshotPath(id string) string { - return fmt.Sprintf("projects/%s/snapshots/%s", tc.projectID, id) +func (b *adminBase) snapshotPath(id string) string { + return fmt.Sprintf("projects/%s/snapshots/%s", b.projectID, id) } -func (tc *TestCase) schemaPath(id string) string { - return fmt.Sprintf("projects/%s/schemas/%s", tc.projectID, id) +func (b *adminBase) schemaPath(id string) string { + return fmt.Sprintf("projects/%s/schemas/%s", b.projectID, id) } func drain[T any](t *testing.T, next func() (T, error)) { @@ -94,38 +106,55 @@ func drain[T any](t *testing.T, next func() (T, error)) { } } -func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { - containers.SkipIfProviderIsNotHealthy(t) +func (b *adminBase) adminTrace(method, resourcePath string) *trace.Trace { + return &trace.Trace{ + Tags: map[string]any{ + "name": "gcp.pubsub.request", + "type": "worker", + "resource": method + " " + resourcePath, + "service": "gcp_pubsub.v2.test", + }, + Meta: map[string]string{ + "span.kind": "client", + "component": "cloud.google.com/go/pubsub.v2", + "messaging.system": "googlepubsub", + "pubsub.method": method, + "gcloud.project_id": testProject, + }, + } +} - var err error - tc.container, err = gcloud.RunPubsub(ctx, - "gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators", - gcloud.WithProjectID(testProject), - testcontainers.WithLogger(tclog.TestLogger(t)), - containers.WithTestLogConsumer(t), - ) - containers.AssertTestContainersError(t, err) - containers.RegisterContainerCleanup(t, tc.container) +func (b *adminBase) adminErrorTrace(method, resourcePath, errMsg string) *trace.Trace { + tr := b.adminTrace(method, resourcePath) + tr.Meta["error.message"] = errMsg + return tr +} - tc.projectID = tc.container.Settings.ProjectID - tc.uri = tc.container.URI +// TestCaseAdminClient exercises admin ops via admin clients exposed by the +// high-level pubsub.Client. These are constructed internally by pubsub.NewClient +// (a variadic-spread call). +type TestCaseAdminClient struct { + adminBase + client *pubsub.Client +} + +func (tc *TestCaseAdminClient) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + var err error tc.client, err = pubsub.NewClient(ctx, tc.projectID, emulatorOptions(tc.uri)...) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, tc.client.Close()) }) } -func (tc *TestCase) Run(ctx context.Context, t *testing.T) { - // Pattern 1: admin clients exposed by the high-level pubsub.Client. These are - // constructed internally by pubsub.NewClient (a variadic-spread call), so this - // exercises orchestrion's interceptor injection into that path. +func (tc *TestCaseAdminClient) Run(ctx context.Context, t *testing.T) { topic, err := tc.client.TopicAdminClient.CreateTopic(ctx, &pubsubpb.Topic{ - Name: tc.topicPath(testTopic), + Name: tc.topicPath(adminTopic), }) require.NoError(t, err) _, err = tc.client.SubscriptionAdminClient.CreateSubscription(ctx, &pubsubpb.Subscription{ - Name: tc.subscriptionPath(testSubscription), + Name: tc.subscriptionPath(adminSubscription), Topic: topic.Name, }) require.NoError(t, err) @@ -138,8 +167,8 @@ func (tc *TestCase) Run(ctx context.Context, t *testing.T) { }).Next) _, err = tc.client.SubscriptionAdminClient.CreateSnapshot(ctx, &pubsubpb.CreateSnapshotRequest{ - Name: tc.snapshotPath(testSnapshot), - Subscription: tc.subscriptionPath(testSubscription), + Name: tc.snapshotPath(adminSnapshot), + Subscription: tc.subscriptionPath(adminSubscription), }) require.NoError(t, err) @@ -147,98 +176,116 @@ func (tc *TestCase) Run(ctx context.Context, t *testing.T) { Project: tc.projectPath(), }).Next) - // Pattern 2: a directly-constructed GAPIC SchemaClient (not exposed on - // pubsub.Client), covering the SchemaClient constructor join-point. - schemaClient, err := vkit.NewSchemaClient(ctx, emulatorOptions(tc.uri)...) + err = tc.client.SubscriptionAdminClient.DeleteSnapshot(ctx, &pubsubpb.DeleteSnapshotRequest{ + Snapshot: tc.snapshotPath(adminSnapshot), + }) require.NoError(t, err) - defer func() { assert.NoError(t, schemaClient.Close()) }() - _, err = schemaClient.CreateSchema(ctx, &pubsubpb.CreateSchemaRequest{ - Parent: tc.projectPath(), - Schema: &pubsubpb.Schema{ - Type: pubsubpb.Schema_AVRO, - Definition: avroDefinition, - }, - SchemaId: testSchema, + err = tc.client.SubscriptionAdminClient.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{ + Subscription: tc.subscriptionPath(adminSubscription), }) require.NoError(t, err) - _, err = schemaClient.GetSchema(ctx, &pubsubpb.GetSchemaRequest{Name: tc.schemaPath(testSchema)}) + err = tc.client.TopicAdminClient.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{ + Topic: tc.topicPath(adminTopic), + }) require.NoError(t, err) +} - drain(t, schemaClient.ListSchemas(ctx, &pubsubpb.ListSchemasRequest{Parent: tc.projectPath()}).Next) +func (tc *TestCaseAdminClient) ExpectedTraces() trace.Traces { + return trace.Traces{ + tc.adminTrace("CreateTopic", tc.topicPath(adminTopic)), + tc.adminTrace("CreateSubscription", tc.subscriptionPath(adminSubscription)), + tc.adminTrace("ListTopics", tc.projectPath()), + tc.adminTrace("ListSubscriptions", tc.projectPath()), + tc.adminTrace("CreateSnapshot", tc.snapshotPath(adminSnapshot)), + tc.adminTrace("ListSnapshots", tc.projectPath()), + tc.adminTrace("DeleteSnapshot", tc.snapshotPath(adminSnapshot)), + tc.adminTrace("DeleteSubscription", tc.subscriptionPath(adminSubscription)), + tc.adminTrace("DeleteTopic", tc.topicPath(adminTopic)), + } +} + +// TestCaseAdminGAPIC exercises admin ops via a directly-constructed GAPIC +// TopicAdminClient. +type TestCaseAdminGAPIC struct { + adminBase + missingErrMsg string +} + +func (tc *TestCaseAdminGAPIC) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + // Fixture topic is created before the tracer starts. + client, err := pubsub.NewClient(ctx, tc.projectID, emulatorOptions(tc.uri)...) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, client.Close()) }) - err = schemaClient.DeleteSchema(ctx, &pubsubpb.DeleteSchemaRequest{Name: tc.schemaPath(testSchema)}) + _, err = client.TopicAdminClient.CreateTopic(ctx, &pubsubpb.Topic{ + Name: tc.topicPath(adminTopic), + }) require.NoError(t, err) +} - // Pattern 3: a directly-constructed GAPIC TopicAdminClient. +func (tc *TestCaseAdminGAPIC) Run(ctx context.Context, t *testing.T) { tac, err := vkit.NewTopicAdminClient(ctx, emulatorOptions(tc.uri)...) require.NoError(t, err) defer func() { assert.NoError(t, tac.Close()) }() - _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath(testTopic)}) + _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath(adminTopic)}) require.NoError(t, err) _, err = tac.GetTopic(ctx, &pubsubpb.GetTopicRequest{Topic: tc.topicPath("missing")}) require.Error(t, err) tc.missingErrMsg = err.Error() +} - err = tc.client.SubscriptionAdminClient.DeleteSnapshot(ctx, &pubsubpb.DeleteSnapshotRequest{ - Snapshot: tc.snapshotPath(testSnapshot), - }) +func (tc *TestCaseAdminGAPIC) ExpectedTraces() trace.Traces { + return trace.Traces{ + tc.adminTrace("GetTopic", tc.topicPath(adminTopic)), + tc.adminErrorTrace("GetTopic", tc.topicPath("missing"), tc.missingErrMsg), + } +} + +// TestCaseAdminSchema exercises admin ops via a directly-constructed GAPIC +// SchemaClient (not exposed on pubsub.Client). +type TestCaseAdminSchema struct { + adminBase +} + +func (tc *TestCaseAdminSchema) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) +} + +func (tc *TestCaseAdminSchema) Run(ctx context.Context, t *testing.T) { + schemaClient, err := vkit.NewSchemaClient(ctx, emulatorOptions(tc.uri)...) require.NoError(t, err) + defer func() { assert.NoError(t, schemaClient.Close()) }() - err = tc.client.SubscriptionAdminClient.DeleteSubscription(ctx, &pubsubpb.DeleteSubscriptionRequest{ - Subscription: tc.subscriptionPath(testSubscription), + _, err = schemaClient.CreateSchema(ctx, &pubsubpb.CreateSchemaRequest{ + Parent: tc.projectPath(), + Schema: &pubsubpb.Schema{ + Type: pubsubpb.Schema_AVRO, + Definition: avroDefinition, + }, + SchemaId: adminSchema, }) require.NoError(t, err) - err = tc.client.TopicAdminClient.DeleteTopic(ctx, &pubsubpb.DeleteTopicRequest{ - Topic: tc.topicPath(testTopic), - }) + _, err = schemaClient.GetSchema(ctx, &pubsubpb.GetSchemaRequest{Name: tc.schemaPath(adminSchema)}) + require.NoError(t, err) + + drain(t, schemaClient.ListSchemas(ctx, &pubsubpb.ListSchemasRequest{Parent: tc.projectPath()}).Next) + + err = schemaClient.DeleteSchema(ctx, &pubsubpb.DeleteSchemaRequest{Name: tc.schemaPath(adminSchema)}) require.NoError(t, err) } -func (tc *TestCase) ExpectedTraces() trace.Traces { +func (tc *TestCaseAdminSchema) ExpectedTraces() trace.Traces { return trace.Traces{ - tc.adminTrace("CreateTopic", tc.topicPath(testTopic)), - tc.adminTrace("CreateSubscription", tc.subscriptionPath(testSubscription)), - tc.adminTrace("ListTopics", tc.projectPath()), - tc.adminTrace("ListSubscriptions", tc.projectPath()), - tc.adminTrace("CreateSnapshot", tc.snapshotPath(testSnapshot)), - tc.adminTrace("ListSnapshots", tc.projectPath()), tc.adminTrace("CreateSchema", tc.projectPath()), - tc.adminTrace("GetSchema", tc.schemaPath(testSchema)), + tc.adminTrace("GetSchema", tc.schemaPath(adminSchema)), tc.adminTrace("ListSchemas", tc.projectPath()), - tc.adminTrace("DeleteSchema", tc.schemaPath(testSchema)), - tc.adminTrace("GetTopic", tc.topicPath(testTopic)), - tc.adminErrorTrace("GetTopic", tc.topicPath("missing"), tc.missingErrMsg), - tc.adminTrace("DeleteSnapshot", tc.snapshotPath(testSnapshot)), - tc.adminTrace("DeleteSubscription", tc.subscriptionPath(testSubscription)), - tc.adminTrace("DeleteTopic", tc.topicPath(testTopic)), - } -} - -func (tc *TestCase) adminTrace(method, resourcePath string) *trace.Trace { - return &trace.Trace{ - Tags: map[string]any{ - "name": "gcp.pubsub.request", - "type": "worker", - "resource": method + " " + resourcePath, - "service": "gcp_pubsub_admin.v2.test", - }, - Meta: map[string]string{ - "span.kind": "client", - "component": "cloud.google.com/go/pubsub.v2", - "messaging.system": "googlepubsub", - "pubsub.method": method, - "gcloud.project_id": testProject, - }, + tc.adminTrace("DeleteSchema", tc.schemaPath(adminSchema)), } } - -func (tc *TestCase) adminErrorTrace(method, resourcePath, errMsg string) *trace.Trace { - tr := tc.adminTrace(method, resourcePath) - tr.Meta["error.message"] = errMsg - return tr -} diff --git a/internal/orchestrion/_integration/gcp_pubsub.v2/generated_test.go b/internal/orchestrion/_integration/gcp_pubsub.v2/generated_test.go index b50b1e5f8af..dd73eb14ab4 100644 --- a/internal/orchestrion/_integration/gcp_pubsub.v2/generated_test.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v2/generated_test.go @@ -18,3 +18,15 @@ import ( func Test(t *testing.T) { harness.Run(t, new(TestCase)) } + +func TestAdminClient(t *testing.T) { + harness.Run(t, new(TestCaseAdminClient)) +} + +func TestAdminGAPIC(t *testing.T) { + harness.Run(t, new(TestCaseAdminGAPIC)) +} + +func TestAdminSchema(t *testing.T) { + harness.Run(t, new(TestCaseAdminSchema)) +} diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v1/generated_test.go b/internal/orchestrion/_integration/gcp_pubsub_admin.v1/generated_test.go deleted file mode 100644 index ee05f86b4a4..00000000000 --- a/internal/orchestrion/_integration/gcp_pubsub_admin.v1/generated_test.go +++ /dev/null @@ -1,20 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023-present Datadog, Inc. -// -// Code generated by 'go generate'; DO NOT EDIT. - -//go:build linux || !githubci - -package gcppubsubadmin - -import ( - "testing" - - "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" -) - -func Test(t *testing.T) { - harness.Run(t, new(TestCase)) -} diff --git a/internal/orchestrion/_integration/gcp_pubsub_admin.v2/generated_test.go b/internal/orchestrion/_integration/gcp_pubsub_admin.v2/generated_test.go deleted file mode 100644 index ee05f86b4a4..00000000000 --- a/internal/orchestrion/_integration/gcp_pubsub_admin.v2/generated_test.go +++ /dev/null @@ -1,20 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023-present Datadog, Inc. -// -// Code generated by 'go generate'; DO NOT EDIT. - -//go:build linux || !githubci - -package gcppubsubadmin - -import ( - "testing" - - "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" -) - -func Test(t *testing.T) { - harness.Run(t, new(TestCase)) -} From ca33ec8680e9c87f1b68de55ce67db67ef0a63f8 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 21 Jul 2026 13:31:19 -0400 Subject: [PATCH 27/33] undo go version change --- contrib/cloud.google.com/go/pubsub.v2/go.mod | 2 +- go.mod | 2 +- go.work.sum | 23 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod index 51c9f94b5fc..27b7fcdb5bc 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -1,6 +1,6 @@ module github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 -go 1.25.8 +go 1.25.0 require ( cloud.google.com/go/pubsub/v2 v2.6.1 diff --git a/go.mod b/go.mod index 0d64e3bcc86..c5306aaf0ce 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/DataDog/dd-trace-go/v2 -go 1.25.8 +go 1.25.0 godebug x509negativeserial=1 diff --git a/go.work.sum b/go.work.sum index 2cf6174898e..27f949639d4 100644 --- a/go.work.sum +++ b/go.work.sum @@ -205,12 +205,14 @@ cloud.google.com/go/grafeas v0.3.16/go.mod h1:I/yrRMOEsLasrmZXQzmDXwrJ3ZPn3dQWLa cloud.google.com/go/gsuiteaddons v1.7.8 h1:Dayrv57XW8kZIvmQjAc89Tp7Kr3O9Am/hf6pXkTjYFY= cloud.google.com/go/gsuiteaddons v1.7.8/go.mod h1:DBKNHH4YXAdd/rd6zVvtOGAJNGo0ekOh+nIjTUDEJ5U= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/iam v1.7.0/go.mod h1:tetWZW1PD/m6vcuY2Zj/aU0eCHNPuxedbnbRTyKXvdY= cloud.google.com/go/iap v1.11.3 h1:Nheb77nO0/pECm/thoE3wHVAbkQSI+G8KBWviqBepiA= cloud.google.com/go/iap v1.11.3/go.mod h1:+gXO0ClH62k2LVlfhHzrpiHQNyINlEVmGAE3+DB4ShU= cloud.google.com/go/ids v1.5.7 h1:V0pSk+KKW+5/AVpeQMhM9D1VI7aMZkayj5jddNETJos= cloud.google.com/go/ids v1.5.7/go.mod h1:N3ZQOIgIBwwOu2tzyhmh3JDT+kt8PcoKkn2BRT9Qe4A= cloud.google.com/go/iot v1.8.7 h1:PDUtxCzlFwFHODEFAgaGJy/Zv4tdvLbZ+lvZ1mKQXE4= cloud.google.com/go/iot v1.8.7/go.mod h1:HvVcypV8LPv1yTXSLCNK+YCtqGHhq+p0F3BXETfpN+U= +cloud.google.com/go/kms v1.31.0/go.mod h1:YIyXZym11R5uovJJt4oN5eUL3oPmirF3yKeIh6QAf4U= cloud.google.com/go/language v1.14.6 h1:/0Fbd3/T4oNmpPqIq5/hrWdHc/eoYGtVH5lDNkuHH3k= cloud.google.com/go/language v1.14.6/go.mod h1:7y3J9OexQsfkWNGCxhT+7lb64pa60e12ZCoWDOHxJ1M= cloud.google.com/go/lifesciences v0.10.7 h1:MO5aBahcYv7JeuCpHbg/11h7KL/BYt1+PpgHhleLDbI= @@ -222,6 +224,8 @@ cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZC cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= +cloud.google.com/go/longrunning v0.9.0/go.mod h1:pkTz846W7bF4o2SzdWJ40Hu0Re+UoNT6Q5t+igIcb8E= +cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/managedidentities v1.7.7 h1:vC/q7D+97PZfb0UNf7r/+/clHauuaf1PqWwP7neuaeg= cloud.google.com/go/managedidentities v1.7.7/go.mod h1:nwNlMxtBo2YJMvsKXRtAD1bL41qiCI9npS7cbqrsJUs= cloud.google.com/go/maps v1.24.0 h1:5G4ZtU8Wjy2grR3tbqMD6IW6uTeGHYIgt/glLmrupcA= @@ -274,6 +278,8 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.50.2/go.mod h1:jyCWeZdGFqd4mitSsBERnJcpqaHBsxQoPkNvjj4sp0w= +cloud.google.com/go/pubsub/v2 v2.6.0/go.mod h1:4anqvV/w8Pcgu2tO0qr2XgsF3GXHowzryfQ5gOnVmWY= cloud.google.com/go/pubsublite v1.8.2 h1:jLQozsEVr+c6tOU13vDugtnaBSUy/PD5zK6mhm+uF1Y= cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= @@ -1375,6 +1381,7 @@ github.com/googleapis/cloud-bigtable-clients-test v0.0.4/go.mod h1:NNHPqSxC2OBSL github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/enterprise-certificate-proxy v0.3.7/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/enterprise-certificate-proxy v0.3.11/go.mod h1:RFV7MUdlb7AgEq2v7FmMCfeSMCllAzWxFgRdusoGks8= +github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= @@ -1382,6 +1389,8 @@ github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld github.com/googleapis/gax-go/v2 v2.16.0/go.mod h1:o1vfQjjNZn4+dPnRdl/4ZD7S9414Y4xA+a/6Icj6l14= github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= +github.com/googleapis/gax-go/v2 v2.21.0/go.mod h1:But/NJU6TnZsrLai/xBAQLLz+Hc7fHZJt/hsCz3Fih4= +github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -1768,6 +1777,8 @@ github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.einride.tech/aip v0.83.0 h1:TI21IdeOnLTwZEJ3BxtImIZk6bsN2Q+sd0x99SLiQ+M= +go.einride.tech/aip v0.83.0/go.mod h1:E8+wdTApA70odnpFzJgsGogHozC2JCIhFJBKPr8bVig= go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= @@ -2260,6 +2271,7 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1: go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/contrib/otelconf v0.18.0 h1:ciF2Gf00BWs0DnexKFZXcxg9kJ8r3SUW1LOzW3CsKA8= go.opentelemetry.io/contrib/otelconf v0.18.0/go.mod h1:FcP7k+JLwBLdOxS6qY6VQ/4b5VBntI6L6o80IMwhAeI= go.opentelemetry.io/contrib/otelconf v0.23.0 h1:s3C7KdMYiutf4rC8hKFA0WOIDG+gIru8ajjQKS59ir8= @@ -2510,6 +2522,7 @@ golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= @@ -2641,6 +2654,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= @@ -2776,6 +2790,8 @@ google.golang.org/api v0.256.0/go.mod h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqc google.golang.org/api v0.258.0/go.mod h1:qhOMTQEZ6lUps63ZNq9jhODswwjkjYYguA7fA3TBFww= google.golang.org/api v0.259.0/go.mod h1:LC2ISWGWbRoyQVpxGntWwLWN/vLNxxKBK9KuJRI8Te4= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= +google.golang.org/api v0.274.0/go.mod h1:JbAt7mF+XVmWu6xNP8/+CTiGH30ofmCmk9nM8d8fHew= +google.golang.org/api v0.285.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -2852,6 +2868,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go. google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= +google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:vYFwMYFbmA8vl6Z/krj/h7+U/AqpHknwJX4Uqgfyc7I= google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0/go.mod h1:8ytArBbtOy2xfht+y2fqKd5DRDJRUQhqbyEnQ4bDChs= google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= @@ -2874,6 +2891,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go. google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:etfGUgejTiadZAUaEP14NP97xi1RGeawqkjDARA/UOs= google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/api v0.0.0-20260615183401-62b3387ff324/go.mod h1:Z4WJ5pJOYWFWcHEQUelD5QaZDknIQkpIL/+fyJOT9+A= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240325203815-454cdb8f5daa h1:wBkzraZsSqhj1M4L/nMrljUU6XasJkgHvUsq8oRGwF0= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:IN9OQUXZ0xT+26MDwZL8fJcYw+y99b0eYPA2U15Jt8o= google.golang.org/genproto/googleapis/bytestream v0.0.0-20241209162323-e6fa225c2576 h1:H8LrtQMZ6iQnV+zpgeb0YqwdByodQltmFqIhjuwexOI= @@ -2888,6 +2906,7 @@ google.golang.org/genproto/googleapis/bytestream v0.0.0-20251213004720-97cd9d5ae google.golang.org/genproto/googleapis/bytestream v0.0.0-20251213004720-97cd9d5aeac2/go.mod h1:G3Q0qS3k/oFEmVMddPsSYcFnm2+Mq2XRmxujrtu5hr0= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260319201613-d00831a3d3e7 h1:6jJ8xNMxB3mmH3HsxEMPjJU+WeFOiwBJ+cLm60OvSZs= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:6TABGosqSqU2l1+fJ3jdvOYPPVryeKybxYF0cCZkTBE= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20260630182238-925bb5da69e7/go.mod h1:6TABGosqSqU2l1+fJ3jdvOYPPVryeKybxYF0cCZkTBE= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= @@ -2900,6 +2919,7 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= @@ -2922,12 +2942,15 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260401001100-f93e5f3e9f0f/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= From 2a3c953182162f73a26c6bee1169a0879e870f92 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 21 Jul 2026 13:39:51 -0400 Subject: [PATCH 28/33] update pubsub version --- contrib/cloud.google.com/go/pubsub.v2/go.mod | 3 ++- contrib/cloud.google.com/go/pubsub.v2/go.sum | 8 ++++++-- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod index 27b7fcdb5bc..d8e4b0c9bf2 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -3,7 +3,7 @@ module github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 go 1.25.0 require ( - cloud.google.com/go/pubsub/v2 v2.6.1 + cloud.google.com/go/pubsub/v2 v2.6.0 github.com/DataDog/dd-trace-go/v2 v2.11.0-dev github.com/stretchr/testify v1.11.1 google.golang.org/api v0.287.1 @@ -72,6 +72,7 @@ require ( github.com/tklauser/numcpus v0.11.0 // indirect github.com/trailofbits/go-mutexasserts v0.0.0-20250514102930-c1f3d2e37561 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.einride.tech/aip v0.83.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/collector/component v1.61.0 // indirect diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.sum b/contrib/cloud.google.com/go/pubsub.v2/go.sum index 52f881d1f59..5dd2ed5601a 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.sum +++ b/contrib/cloud.google.com/go/pubsub.v2/go.sum @@ -11,8 +11,8 @@ cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= cloud.google.com/go/pubsub v1.51.0 h1:XOaCejsqX7EEtUdQz+WPag66wWsUUGliyCOfGPKfo90= cloud.google.com/go/pubsub v1.51.0/go.mod h1:NERXf11sd82UV3VnflcUj8POIyQUXT/QwrKlxD8di/I= -cloud.google.com/go/pubsub/v2 v2.6.1 h1:jX6gnC4n8BgYx6MOYICgbbaXZpr1vKeNOE3Bn17P5zg= -cloud.google.com/go/pubsub/v2 v2.6.1/go.mod h1:1y2lZnKfUFPZz0PU4YmXyk4lA11+xmYA42zbC32RkxQ= +cloud.google.com/go/pubsub/v2 v2.6.0 h1:8pjR0id+GTB+krKx5G6AGJoYrHog58w2Q89PCOrfM64= +cloud.google.com/go/pubsub/v2 v2.6.0/go.mod h1:4anqvV/w8Pcgu2tO0qr2XgsF3GXHowzryfQ5gOnVmWY= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2 h1:D78y0XOvACwT7QsOCx0QDDRe3yMGFdyrIgbZKRtoD6E= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2/go.mod h1:6LC1ryDn2VNqF0iNapwcLLdsfoFUMnT4p+JPu6sEkHg= @@ -211,6 +211,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.einride.tech/aip v0.83.0 h1:TI21IdeOnLTwZEJ3BxtImIZk6bsN2Q+sd0x99SLiQ+M= +go.einride.tech/aip v0.83.0/go.mod h1:E8+wdTApA70odnpFzJgsGogHozC2JCIhFJBKPr8bVig= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= @@ -369,5 +371,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/go.mod b/go.mod index c5306aaf0ce..391c1f0600a 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ godebug x509negativeserial=1 require ( cloud.google.com/go/pubsub v1.51.0 - cloud.google.com/go/pubsub/v2 v2.6.1 + cloud.google.com/go/pubsub/v2 v2.6.0 github.com/DataDog/datadog-agent/pkg/obfuscate v0.82.0-rc.2 github.com/DataDog/datadog-agent/pkg/proto v0.82.0-rc.2 github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.82.0-rc.2 diff --git a/go.sum b/go.sum index 508d6523bba..7b93dfd5051 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ cloud.google.com/go/pubsub v1.51.0 h1:XOaCejsqX7EEtUdQz+WPag66wWsUUGliyCOfGPKfo90= cloud.google.com/go/pubsub v1.51.0/go.mod h1:NERXf11sd82UV3VnflcUj8POIyQUXT/QwrKlxD8di/I= -cloud.google.com/go/pubsub/v2 v2.6.1 h1:jX6gnC4n8BgYx6MOYICgbbaXZpr1vKeNOE3Bn17P5zg= -cloud.google.com/go/pubsub/v2 v2.6.1/go.mod h1:1y2lZnKfUFPZz0PU4YmXyk4lA11+xmYA42zbC32RkxQ= +cloud.google.com/go/pubsub/v2 v2.6.0 h1:8pjR0id+GTB+krKx5G6AGJoYrHog58w2Q89PCOrfM64= +cloud.google.com/go/pubsub/v2 v2.6.0/go.mod h1:4anqvV/w8Pcgu2tO0qr2XgsF3GXHowzryfQ5gOnVmWY= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2 h1:D78y0XOvACwT7QsOCx0QDDRe3yMGFdyrIgbZKRtoD6E= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2/go.mod h1:6LC1ryDn2VNqF0iNapwcLLdsfoFUMnT4p+JPu6sEkHg= github.com/DataDog/datadog-agent/pkg/obfuscate v0.82.0-rc.2 h1:3uIMYQvZNimspb7EFD66vEz0GteKjeT371QT+gVP/JQ= From e1f9963730b2b7686f189fc85d7a1242ea8725f7 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 21 Jul 2026 13:54:26 -0400 Subject: [PATCH 29/33] update go mod --- contrib/cloud.google.com/go/pubsub.v2/go.mod | 2 +- go.work.sum | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod index d8e4b0c9bf2..b41b2ae0a96 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -3,7 +3,7 @@ module github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 go 1.25.0 require ( - cloud.google.com/go/pubsub/v2 v2.6.0 + cloud.google.com/go/pubsub/v2 v2.0.0 github.com/DataDog/dd-trace-go/v2 v2.11.0-dev github.com/stretchr/testify v1.11.1 google.golang.org/api v0.287.1 diff --git a/go.work.sum b/go.work.sum index 27f949639d4..30dacb61da0 100644 --- a/go.work.sum +++ b/go.work.sum @@ -279,7 +279,6 @@ cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+ cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.50.2/go.mod h1:jyCWeZdGFqd4mitSsBERnJcpqaHBsxQoPkNvjj4sp0w= -cloud.google.com/go/pubsub/v2 v2.6.0/go.mod h1:4anqvV/w8Pcgu2tO0qr2XgsF3GXHowzryfQ5gOnVmWY= cloud.google.com/go/pubsublite v1.8.2 h1:jLQozsEVr+c6tOU13vDugtnaBSUy/PD5zK6mhm+uF1Y= cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= @@ -1715,6 +1714,7 @@ github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= @@ -1777,8 +1777,6 @@ github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.einride.tech/aip v0.83.0 h1:TI21IdeOnLTwZEJ3BxtImIZk6bsN2Q+sd0x99SLiQ+M= -go.einride.tech/aip v0.83.0/go.mod h1:E8+wdTApA70odnpFzJgsGogHozC2JCIhFJBKPr8bVig= go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= From f688f771023093f48fbadef1123b072ac11c4ef8 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 21 Jul 2026 14:05:33 -0400 Subject: [PATCH 30/33] go mod stuff --- contrib/cloud.google.com/go/pubsub.v2/go.mod | 2 +- contrib/cloud.google.com/go/pubsub.v2/go.sum | 8 ++++---- go.mod | 4 ++-- go.sum | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod index b41b2ae0a96..1c0747b53d2 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -16,7 +16,7 @@ require ( cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.11.0 // indirect - cloud.google.com/go/pubsub v1.51.0 // indirect + cloud.google.com/go/pubsub v1.50.1 // indirect github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.82.0-rc.2 // indirect github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.82.0-rc.2 // indirect diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.sum b/contrib/cloud.google.com/go/pubsub.v2/go.sum index 5dd2ed5601a..33e8c8c0393 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.sum +++ b/contrib/cloud.google.com/go/pubsub.v2/go.sum @@ -9,10 +9,10 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= -cloud.google.com/go/pubsub v1.51.0 h1:XOaCejsqX7EEtUdQz+WPag66wWsUUGliyCOfGPKfo90= -cloud.google.com/go/pubsub v1.51.0/go.mod h1:NERXf11sd82UV3VnflcUj8POIyQUXT/QwrKlxD8di/I= -cloud.google.com/go/pubsub/v2 v2.6.0 h1:8pjR0id+GTB+krKx5G6AGJoYrHog58w2Q89PCOrfM64= -cloud.google.com/go/pubsub/v2 v2.6.0/go.mod h1:4anqvV/w8Pcgu2tO0qr2XgsF3GXHowzryfQ5gOnVmWY= +cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= +cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= +cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= +cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2 h1:D78y0XOvACwT7QsOCx0QDDRe3yMGFdyrIgbZKRtoD6E= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2/go.mod h1:6LC1ryDn2VNqF0iNapwcLLdsfoFUMnT4p+JPu6sEkHg= diff --git a/go.mod b/go.mod index 391c1f0600a..b06fa128a10 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.25.0 godebug x509negativeserial=1 require ( - cloud.google.com/go/pubsub v1.51.0 - cloud.google.com/go/pubsub/v2 v2.6.0 + cloud.google.com/go/pubsub v1.50.1 + cloud.google.com/go/pubsub/v2 v2.0.0 github.com/DataDog/datadog-agent/pkg/obfuscate v0.82.0-rc.2 github.com/DataDog/datadog-agent/pkg/proto v0.82.0-rc.2 github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.82.0-rc.2 diff --git a/go.sum b/go.sum index 7b93dfd5051..00f7f3567cd 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ -cloud.google.com/go/pubsub v1.51.0 h1:XOaCejsqX7EEtUdQz+WPag66wWsUUGliyCOfGPKfo90= -cloud.google.com/go/pubsub v1.51.0/go.mod h1:NERXf11sd82UV3VnflcUj8POIyQUXT/QwrKlxD8di/I= -cloud.google.com/go/pubsub/v2 v2.6.0 h1:8pjR0id+GTB+krKx5G6AGJoYrHog58w2Q89PCOrfM64= -cloud.google.com/go/pubsub/v2 v2.6.0/go.mod h1:4anqvV/w8Pcgu2tO0qr2XgsF3GXHowzryfQ5gOnVmWY= +cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= +cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= +cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= +cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2 h1:D78y0XOvACwT7QsOCx0QDDRe3yMGFdyrIgbZKRtoD6E= github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2/go.mod h1:6LC1ryDn2VNqF0iNapwcLLdsfoFUMnT4p+JPu6sEkHg= github.com/DataDog/datadog-agent/pkg/obfuscate v0.82.0-rc.2 h1:3uIMYQvZNimspb7EFD66vEz0GteKjeT371QT+gVP/JQ= From d844b1201d86434e265c93b8926f36c4b4e8b058 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Tue, 21 Jul 2026 21:39:26 -0400 Subject: [PATCH 31/33] ci fix maybe --- contrib/cloud.google.com/go/pubsub.v2/go.mod | 18 ++-- contrib/cloud.google.com/go/pubsub.v2/go.sum | 36 ++++---- go.mod | 4 +- go.sum | 8 +- go.work.sum | 86 ------------------- .../gcp_pubsub.v1/gcp_pubsub_admin.go | 2 +- .../gcp_pubsub.v2/gcp_pubsub_admin.go | 2 +- 7 files changed, 35 insertions(+), 121 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod index 1c0747b53d2..c6556adca56 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.mod +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -6,16 +6,16 @@ require ( cloud.google.com/go/pubsub/v2 v2.0.0 github.com/DataDog/dd-trace-go/v2 v2.11.0-dev github.com/stretchr/testify v1.11.1 - google.golang.org/api v0.287.1 + google.golang.org/api v0.273.1 google.golang.org/grpc v1.82.0 ) require ( cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.20.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.11.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect cloud.google.com/go/pubsub v1.50.1 // indirect github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.82.0-rc.2 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.82.0-rc.2 // indirect @@ -46,8 +46,8 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.17 // indirect - github.com/googleapis/gax-go/v2 v2.23.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.20.0 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.6 // indirect @@ -72,14 +72,14 @@ require ( github.com/tklauser/numcpus v0.11.0 // indirect github.com/trailofbits/go-mutexasserts v0.0.0-20250514102930-c1f3d2e37561 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.einride.tech/aip v0.83.0 // indirect + go.einride.tech/aip v0.73.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/collector/component v1.61.0 // indirect go.opentelemetry.io/collector/featuregate v1.61.0 // indirect go.opentelemetry.io/collector/pdata v1.61.0 // indirect go.opentelemetry.io/collector/pdata/pprofile v0.155.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect go.opentelemetry.io/otel v1.44.0 // indirect go.opentelemetry.io/otel/metric v1.44.0 // indirect @@ -102,8 +102,8 @@ require ( golang.org/x/time v0.15.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260618152121-87f3d3e198d3 // indirect google.golang.org/protobuf v1.36.12-0.20260116114154-8c4c4ae446ca // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.sum b/contrib/cloud.google.com/go/pubsub.v2/go.sum index 33e8c8c0393..4ec9c7f389f 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/go.sum +++ b/contrib/cloud.google.com/go/pubsub.v2/go.sum @@ -1,14 +1,14 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA= -cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.11.0 h1:KieQ9Pb+LLPak1O3Rv3GgCxhnmkYf7Xyh0P5HfF1jFM= -cloud.google.com/go/iam v1.11.0/go.mod h1:KP+nKGugNJW4LcLx1uEZcq1ok5sQHFaQehQNl4QDgV4= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/pubsub v1.50.1 h1:fzbXpPyJnSGvWXF1jabhQeXyxdbCIkXTpjXHy7xviBM= cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= @@ -125,10 +125,10 @@ github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.17 h1:73NfMHdiqo9JFU9+7a5ExpVa10/R29pXfZIaW559nrg= -github.com/googleapis/enterprise-certificate-proxy v0.3.17/go.mod h1:rSEsBUemEBZEexP2y6jPp16LUmUbjmSbcPMQizR0o4k= -github.com/googleapis/gax-go/v2 v2.23.0 h1:Tchl7qkvE7Ip3y+ztvNufYFvkfqTe7NfLTYGIdJRLuE= -github.com/googleapis/gax-go/v2 v2.23.0/go.mod h1:rBQKOVJCdb8IFEzg+FCwlt1LP/xMDGuqUXhUG+XMXEg= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.20.0 h1:NIKVuLhDlIV74muWlsMM4CcQZqN6JJ20Qcxd9YMuYcs= +github.com/googleapis/gax-go/v2 v2.20.0/go.mod h1:But/NJU6TnZsrLai/xBAQLLz+Hc7fHZJt/hsCz3Fih4= github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -211,8 +211,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.einride.tech/aip v0.83.0 h1:TI21IdeOnLTwZEJ3BxtImIZk6bsN2Q+sd0x99SLiQ+M= -go.einride.tech/aip v0.83.0/go.mod h1:E8+wdTApA70odnpFzJgsGogHozC2JCIhFJBKPr8bVig= +go.einride.tech/aip v0.73.0 h1:bPo4oqBo2ZQeBKo4ZzLb1kxYXTY1ysJhpvQyfuGzvps= +go.einride.tech/aip v0.73.0/go.mod h1:Mj7rFbmXEgw0dq1dqJ7JGMvYCZZVxmGOR3S4ZcV5LvQ= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= @@ -229,8 +229,8 @@ go.opentelemetry.io/collector/pdata v1.61.0 h1:EVfGB/9dcyMXhMsZ5kzKeGFJj8QWqvmZj go.opentelemetry.io/collector/pdata v1.61.0/go.mod h1:qYEsyeIJ9tWHb2jSR5HQ9/VmbCGVca+G+ZDAB8dFCMc= go.opentelemetry.io/collector/pdata/pprofile v0.155.0 h1:13LsyUy9SN88xcqbz89kvDqyn6qQSF5RpvXJ/c84nrw= go.opentelemetry.io/collector/pdata/pprofile v0.155.0/go.mod h1:wlPe4OkzIYSmd1bCgAzmbKMlPDwlXCOLjbG68Fn7SG0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 h1:yI1/OhfEPy7J9eoa6Sj051C7n5dvpj0QX8g4sRchg04= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= @@ -334,8 +334,8 @@ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhS golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.287.1 h1:LiyJx32VU3cwQfLchn/513qKhc25hq0pEANYJoWNnnI= -google.golang.org/api v0.287.1/go.mod h1:lM2kYRzYUCBY91P9h6VF1PYmvhxii3O5hji37qRvIcY= +google.golang.org/api v0.273.1 h1:L7G/TmpAMz0nKx/ciAVssVmWQiOF6+pOuXeKrWVsquY= +google.golang.org/api v0.273.1/go.mod h1:JbAt7mF+XVmWu6xNP8/+CTiGH30ofmCmk9nM8d8fHew= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -343,10 +343,10 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 h1:XzmzkmB14QhVhgnawEVsOn6OFsnpyxNPRY9QV01dNB0= google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:L43LFes82YgSonw6iTXTxXUX1OlULt4AQtkik4ULL/I= -google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 h1:jQ9p21COKWjP3VwuFrNRiiOTMh3mPpN45R7SLrH/HUU= -google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7/go.mod h1:KqHwBx2upmfa1XSi1WuRvC+2VGCLtooKkfmyvRbUmqA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 h1:eM/YSd5bBFagF51o1E745Ta7RwzpW0h+z+QDNZOgmQ8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= +google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260618152121-87f3d3e198d3 h1:phvBWCAQMGN1945mp5fjCXP6jEF0+a0+4TjokS4sxNY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260618152121-87f3d3e198d3/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= diff --git a/go.mod b/go.mod index b06fa128a10..aadb12f22c9 100644 --- a/go.mod +++ b/go.mod @@ -104,8 +104,8 @@ require ( go.uber.org/zap v1.28.0 // indirect golang.org/x/net v0.56.0 // indirect golang.org/x/text v0.38.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260618152121-87f3d3e198d3 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 00f7f3567cd..964b7b236b1 100644 --- a/go.sum +++ b/go.sum @@ -281,10 +281,10 @@ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhS golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 h1:jQ9p21COKWjP3VwuFrNRiiOTMh3mPpN45R7SLrH/HUU= -google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7/go.mod h1:KqHwBx2upmfa1XSi1WuRvC+2VGCLtooKkfmyvRbUmqA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 h1:eM/YSd5bBFagF51o1E745Ta7RwzpW0h+z+QDNZOgmQ8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec= +google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260618152121-87f3d3e198d3 h1:phvBWCAQMGN1945mp5fjCXP6jEF0+a0+4TjokS4sxNY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260618152121-87f3d3e198d3/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= diff --git a/go.work.sum b/go.work.sum index 30dacb61da0..8ae87e5097d 100644 --- a/go.work.sum +++ b/go.work.sum @@ -205,14 +205,12 @@ cloud.google.com/go/grafeas v0.3.16/go.mod h1:I/yrRMOEsLasrmZXQzmDXwrJ3ZPn3dQWLa cloud.google.com/go/gsuiteaddons v1.7.8 h1:Dayrv57XW8kZIvmQjAc89Tp7Kr3O9Am/hf6pXkTjYFY= cloud.google.com/go/gsuiteaddons v1.7.8/go.mod h1:DBKNHH4YXAdd/rd6zVvtOGAJNGo0ekOh+nIjTUDEJ5U= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= -cloud.google.com/go/iam v1.7.0/go.mod h1:tetWZW1PD/m6vcuY2Zj/aU0eCHNPuxedbnbRTyKXvdY= cloud.google.com/go/iap v1.11.3 h1:Nheb77nO0/pECm/thoE3wHVAbkQSI+G8KBWviqBepiA= cloud.google.com/go/iap v1.11.3/go.mod h1:+gXO0ClH62k2LVlfhHzrpiHQNyINlEVmGAE3+DB4ShU= cloud.google.com/go/ids v1.5.7 h1:V0pSk+KKW+5/AVpeQMhM9D1VI7aMZkayj5jddNETJos= cloud.google.com/go/ids v1.5.7/go.mod h1:N3ZQOIgIBwwOu2tzyhmh3JDT+kt8PcoKkn2BRT9Qe4A= cloud.google.com/go/iot v1.8.7 h1:PDUtxCzlFwFHODEFAgaGJy/Zv4tdvLbZ+lvZ1mKQXE4= cloud.google.com/go/iot v1.8.7/go.mod h1:HvVcypV8LPv1yTXSLCNK+YCtqGHhq+p0F3BXETfpN+U= -cloud.google.com/go/kms v1.31.0/go.mod h1:YIyXZym11R5uovJJt4oN5eUL3oPmirF3yKeIh6QAf4U= cloud.google.com/go/language v1.14.6 h1:/0Fbd3/T4oNmpPqIq5/hrWdHc/eoYGtVH5lDNkuHH3k= cloud.google.com/go/language v1.14.6/go.mod h1:7y3J9OexQsfkWNGCxhT+7lb64pa60e12ZCoWDOHxJ1M= cloud.google.com/go/lifesciences v0.10.7 h1:MO5aBahcYv7JeuCpHbg/11h7KL/BYt1+PpgHhleLDbI= @@ -224,8 +222,6 @@ cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZC cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= -cloud.google.com/go/longrunning v0.9.0/go.mod h1:pkTz846W7bF4o2SzdWJ40Hu0Re+UoNT6Q5t+igIcb8E= -cloud.google.com/go/longrunning v1.2.0/go.mod h1:5KMQALFGOCtFoi2xSOA1u3H7WKlhmckgiyFw7+LGQp0= cloud.google.com/go/managedidentities v1.7.7 h1:vC/q7D+97PZfb0UNf7r/+/clHauuaf1PqWwP7neuaeg= cloud.google.com/go/managedidentities v1.7.7/go.mod h1:nwNlMxtBo2YJMvsKXRtAD1bL41qiCI9npS7cbqrsJUs= cloud.google.com/go/maps v1.24.0 h1:5G4ZtU8Wjy2grR3tbqMD6IW6uTeGHYIgt/glLmrupcA= @@ -278,7 +274,6 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.50.2/go.mod h1:jyCWeZdGFqd4mitSsBERnJcpqaHBsxQoPkNvjj4sp0w= cloud.google.com/go/pubsublite v1.8.2 h1:jLQozsEVr+c6tOU13vDugtnaBSUy/PD5zK6mhm+uF1Y= cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= @@ -402,18 +397,15 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOC github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/agent-payload/v5 v5.0.180 h1:+jGPiWICAq6MT3y0haBxPv2qwKYc9TGflsncfVGRyP4= github.com/DataDog/agent-payload/v5 v5.0.180/go.mod h1:9PtvPKsgZVTTvqgYtcwB4bjXAkxYzC2wzSXSadPRHv8= -github.com/DataDog/agent-payload/v5 v5.0.184 h1:4ZEWKWTQHoC+WCjlE1l695ymi/PjA9BPGMMVAbaM0uo= github.com/DataDog/agent-payload/v5 v5.0.184/go.mod h1:MScePfb6eN9vN9GqPhCXTeqq1V0TlCpnjrN4OujCaQs= github.com/DataDog/agent-payload/v5 v5.0.205/go.mod h1:GyA1vuCeRywrNNCbYeR0cOYKE8QkOVNAFDqsH8VNF5M= github.com/DataDog/datadog-agent/comp/api/api/def v0.77.0 h1:6/iby51Fow8liFUakdfmJugfbhjTZWKNuMhQoH9adBA= github.com/DataDog/datadog-agent/comp/api/api/def v0.77.0/go.mod h1:dqfei0M/vs1kd5ylu5pqPFKDi/LxvCa0/Lmbs5LRCKA= -github.com/DataDog/datadog-agent/comp/api/api/def v0.78.3 h1:d1PYYF3Q5y9MqsNz6yfI+a72n+bx3fGlPUk7MASQB6o= github.com/DataDog/datadog-agent/comp/api/api/def v0.78.3/go.mod h1:s8PrkR3Xo7bR4yVtrvkX0QRLBYrYSbf47qykYEP/itI= github.com/DataDog/datadog-agent/comp/api/api/def v0.78.4/go.mod h1:s8PrkR3Xo7bR4yVtrvkX0QRLBYrYSbf47qykYEP/itI= github.com/DataDog/datadog-agent/comp/api/api/def v0.79.0/go.mod h1:A6xrfXgjp5yguPN0jiDvvS4+c4PAGCSTz4NwcW46gTQ= github.com/DataDog/datadog-agent/comp/core/config v0.77.0 h1:GDSGyrIkzuUPBTka+hp4hcu7CPtECo2wcvksZPJtpAI= github.com/DataDog/datadog-agent/comp/core/config v0.77.0/go.mod h1:MD7RyLkOUMXuMNfajqFoFNY3JPNpBMynQXMcgkutbes= -github.com/DataDog/datadog-agent/comp/core/config v0.78.3 h1:fpknyRAmvgHyC2wo6mtivPn37o0jTjT0L+N2cY2sUDI= github.com/DataDog/datadog-agent/comp/core/config v0.78.3/go.mod h1:qSNsISpmjvGRCr2aXDQ5Uz5qjGaOZBqSqfQwe3WZBDk= github.com/DataDog/datadog-agent/comp/core/config v0.78.4/go.mod h1:xoKeWtCJH90YT7L23OG2aQrBeuPKCqzNCwk5ojlwKNI= github.com/DataDog/datadog-agent/comp/core/config v0.79.0/go.mod h1:dsFyft7HMqYlCRxD6xcB62/NK1V9sj/8Id1jJw+zKXQ= @@ -426,53 +418,44 @@ github.com/DataDog/datadog-agent/comp/core/delegatedauth/api/cloudauth/aws v0.79 github.com/DataDog/datadog-agent/comp/core/delegatedauth/api/cloudauth/aws v0.82.0-rc.2/go.mod h1:+J3NkltBgLb1Zx9ojzq/Zfo+Hk+kte3+8hGNdCEuqHc= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.77.0 h1:cIhhcMGJz1S0zBSWYdMo/Jt4P4H+yDOwPksv60NTGkk= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.77.0/go.mod h1:g2vLYYoro8nFzgnYDwjDU212mHcfbFTZ2nDKdh3T5zI= -github.com/DataDog/datadog-agent/comp/core/flare/builder v0.78.3 h1:ltRjyUfd0NFtIkxUNN6RDFA3zEjnUjXalMMNt4tbWro= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.78.3/go.mod h1:i0ubPpcORp84qXFb8vsqPKnFiC8a9n1kr4tLJQXCghw= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.78.4/go.mod h1:i0ubPpcORp84qXFb8vsqPKnFiC8a9n1kr4tLJQXCghw= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.79.0/go.mod h1:DU/7Fz53GEyOdrX2rpCs7ZyF6j9Uj7m3G2WN45G5y6M= github.com/DataDog/datadog-agent/comp/core/flare/builder v0.82.0-rc.2/go.mod h1:TdMI9nGt5LyA/Bt7VmcEYzs+ZP8i7136/cxk8ClfriM= github.com/DataDog/datadog-agent/comp/core/flare/types v0.77.0 h1:Ygky8O2viBoFMF6AoXR4vG0O/7OndxhoY6tWtLuvTgA= github.com/DataDog/datadog-agent/comp/core/flare/types v0.77.0/go.mod h1:FCxVmnGsFC3YniDj8d2GidCiTNkE0z6LVDAPS0kYRd4= -github.com/DataDog/datadog-agent/comp/core/flare/types v0.78.3 h1:s9iYfMhO/1bZ5e66A3GaY+qkBVlR9HxEdy4XvJcBU1g= github.com/DataDog/datadog-agent/comp/core/flare/types v0.78.3/go.mod h1:1+9Qgt2ScNdz3vC8X6Nf+A0zpY0uasjgcwtzf9pBG+c= github.com/DataDog/datadog-agent/comp/core/flare/types v0.78.4/go.mod h1:jaGOt6dAK2Tv1lnZQq32ZjNTYMABCHVghY5gkKOeJuI= github.com/DataDog/datadog-agent/comp/core/flare/types v0.79.0/go.mod h1:UwnTidQLvpY7qaOSyuwBQwHV1zX9gY9mIqnDpuNkjMU= github.com/DataDog/datadog-agent/comp/core/flare/types v0.82.0-rc.2/go.mod h1:tFHWFMwaOIJrUdj5SnuCQ1QgkV1nRhCRF+kT0O19ziY= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.77.0 h1:BVEqA9wDTEjMuZfFAvbPt5tin+dnjahc8B42d+yGdiU= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.77.0/go.mod h1:jHb95aV0An5zVhqwh2fGu9vuaJJApqo9z9k4lw6jbNU= -github.com/DataDog/datadog-agent/comp/core/ipc/def v0.78.3 h1:bAkzybB4vp8vy6f7eJa3wzc5vrInisHozxbXyo4tHIg= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.78.3/go.mod h1:I17GLzh5qJrNWCjgaDDQXXSo+qx5HIQ2UOzkv6JFogU= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.78.4/go.mod h1:I17GLzh5qJrNWCjgaDDQXXSo+qx5HIQ2UOzkv6JFogU= github.com/DataDog/datadog-agent/comp/core/ipc/def v0.79.0/go.mod h1:oaThopsveAc6zvawCIwIoWCYxdWdoZoiFrvgpCGTRsw= github.com/DataDog/datadog-agent/comp/core/ipc/httphelpers v0.77.0 h1:9KAUkNOeDjA9dUpsV1GtLXfrRIdf/nWGY28AyO/UnEE= github.com/DataDog/datadog-agent/comp/core/ipc/httphelpers v0.77.0/go.mod h1:pVD75zIstiQQJwLwbbQarg+BAmU3qXA1l+8wvhYM6h4= -github.com/DataDog/datadog-agent/comp/core/ipc/httphelpers v0.78.3 h1:XTDosZjO947tWjWPDCZ6TDBRbv8ex9Ow+yiZoOaqAmU= github.com/DataDog/datadog-agent/comp/core/ipc/httphelpers v0.78.3/go.mod h1:K4AbQdDcVwWA92oaIfDAvTB+VW+0UdER/B9rVXcOK+w= github.com/DataDog/datadog-agent/comp/core/ipc/mock v0.77.0 h1:ZGekGRqmIVPrhePuAlWXlYDbQke2LJ/7W1jWy0gjapA= github.com/DataDog/datadog-agent/comp/core/ipc/mock v0.77.0/go.mod h1:IOdGOI+vZsp+BGPkypgNvmEQB62Y4Z2Su4wO28er5RM= -github.com/DataDog/datadog-agent/comp/core/ipc/mock v0.78.3 h1:COeksThUio1llIuMF26Vucn94e0q2NWHLbWOBvxldag= github.com/DataDog/datadog-agent/comp/core/ipc/mock v0.78.3/go.mod h1:hLw+uLezPeKhyz0j2gQRIN/3ZUTROTTGdfW4C/YMcxU= github.com/DataDog/datadog-agent/comp/core/log/def v0.77.0 h1:FN2tmMGDUJszpzqpW4xN3EDQ1cgRvj3l0JW6nUrD3/k= github.com/DataDog/datadog-agent/comp/core/log/def v0.77.0/go.mod h1:/dcGxIG3oFvL1FRJ2vikKVgG5IyOPkPnY+Umj0ICJnA= -github.com/DataDog/datadog-agent/comp/core/log/def v0.78.3 h1:1TuZy2Mb8IP6EPa6mEd+P5xr4S0v8OqHzGwfXcukMBg= github.com/DataDog/datadog-agent/comp/core/log/def v0.78.3/go.mod h1:rPaq6xA1AMB2T1fer8fkgRzkEOcQmL0NWnW9M4DW1JY= github.com/DataDog/datadog-agent/comp/core/log/def v0.78.4/go.mod h1:rPaq6xA1AMB2T1fer8fkgRzkEOcQmL0NWnW9M4DW1JY= github.com/DataDog/datadog-agent/comp/core/log/def v0.79.0/go.mod h1:PIIaHqfofGFsTPB+/uWe3HkPomEpYan8CIKdYB8ZHGs= github.com/DataDog/datadog-agent/comp/core/log/fx v0.77.0 h1:JbIbTsJYSebh4IcCTN6m1Rj0pOEqj0ut2sXtyS/WmKU= github.com/DataDog/datadog-agent/comp/core/log/fx v0.77.0/go.mod h1:o76+Df1rS+ZWylgmYtr4QkXKgD6xNB7FPVQrsdFLpYc= -github.com/DataDog/datadog-agent/comp/core/log/fx v0.78.3 h1:VQCFHeTBtlFvtlecyZwTxiRJrsgVMo28aOm7TnNgcCc= github.com/DataDog/datadog-agent/comp/core/log/fx v0.78.3/go.mod h1:QpDh+fxXI53N8HZnV8j5MqfPSB7ierNsvaEBFfLx+zs= github.com/DataDog/datadog-agent/comp/core/log/fx v0.78.4/go.mod h1:uzivQwrkb22Z1bx/c5+LiWWyICpOhvyCQxs94RK3KA4= github.com/DataDog/datadog-agent/comp/core/log/fx v0.79.0/go.mod h1:swQeQ91AocIID4eS0H6O0Up+FMwOwgr97A+oOHZx6G8= github.com/DataDog/datadog-agent/comp/core/log/impl v0.77.0 h1:/gz0FE03uEffsrdhdbHRYojAfuKalMnhlyjNLZOyOcs= github.com/DataDog/datadog-agent/comp/core/log/impl v0.77.0/go.mod h1:YVucxWku2G1M5FLm+0QPdQ9jERAqiBdxJ1fvkV4vbgQ= -github.com/DataDog/datadog-agent/comp/core/log/impl v0.78.3 h1:SYzdKdxH/pBG7JhfD5Z2oaPgWHEDkRWAvFLwiYtq1Pc= github.com/DataDog/datadog-agent/comp/core/log/impl v0.78.3/go.mod h1:jbqsjFqF2uFK47qmE0vxwvWNyQ0p7c0/HmcZOEMppKI= github.com/DataDog/datadog-agent/comp/core/log/impl v0.78.4/go.mod h1:H14Gwb99jwqnfyMbSWneYs/xb1dooH109xFKYAjNVF0= github.com/DataDog/datadog-agent/comp/core/log/impl v0.79.0/go.mod h1:JZ+jvjVR6YLQMr9YbBlXORK/gV8/zXDXOGbwUVF6mgs= github.com/DataDog/datadog-agent/comp/core/log/mock v0.77.0 h1:PViWKQewBQ9dYMZDZCVKcWrXiGd5MPFvOzHNew/vk2U= github.com/DataDog/datadog-agent/comp/core/log/mock v0.77.0/go.mod h1:MN+6ffL4iovMZycv8ymsT44msvmHw1WeQ3RUcvZAZZ8= -github.com/DataDog/datadog-agent/comp/core/log/mock v0.78.3 h1:JwCuGsCeIXhr5lQ2avdbTAOZtir/9Ugxc6QaAaZbBRc= github.com/DataDog/datadog-agent/comp/core/log/mock v0.78.3/go.mod h1:4QewFpeT00PGRdJDyD6hxReaFiFEkk1VHkgDEk5nkn0= github.com/DataDog/datadog-agent/comp/core/secrets/def v0.77.0 h1:RJgNzrS8N7A8JRZKMjxOc2Sk/cJ/Q+lmvzN6QlYhEM4= github.com/DataDog/datadog-agent/comp/core/secrets/def v0.77.0/go.mod h1:WWcGLfYPblCAomMD876kvboI6gw8KkgJ6cVmexcNv9M= @@ -483,46 +466,38 @@ github.com/DataDog/datadog-agent/comp/core/secrets/def v0.79.0/go.mod h1:4LD5qx/ github.com/DataDog/datadog-agent/comp/core/secrets/def v0.82.0-rc.2/go.mod h1:dOxmNfeUSghnHoiVcGt/GblHAdGTyZiQ8J3wBVBvxYQ= github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.77.0 h1:9vyICu4QIFYPaLRhwi3VvpLO4btzuKILD36UD+IsJnc= github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.77.0/go.mod h1:nKN6QJcRbbh2Xqk5w2vYZ9072M2H4YLLJoK85YWET/Q= -github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.79.0 h1:CI54GtMlHKNw1qUIfHLATS9cchWhjnQ+A+5usvoJOo0= github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.79.0/go.mod h1:QJLbq2BLh4Sm55c0vqNV4nu9sA6UgypzE1DzrWzNvE8= github.com/DataDog/datadog-agent/comp/core/secrets/mock v0.82.0-rc.2/go.mod h1:3Y2sD+mHEnQI9O0gi32lXqzV24b0O3UVWZcCmHljBUo= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.77.0 h1:zzYvKLPP3zQHAiMibPBGLW0G/9YermLBxj9XOUlVhLY= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.77.0/go.mod h1:5HF2Nddmu4Ct4nwZULSPTZGpFNjPyZ4OghD1BTyBWt8= -github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.78.3 h1:lS6oDSJ6q7GXp0zzWLf8M+M2FuwOyDrlqvy5AZLnCcA= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.78.3/go.mod h1:qsswuP3IdS5SPhm92OHBgfcxJeca3EsynMrMWeIj1ck= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.78.4/go.mod h1:HbHbM0aTHZgkAVILnuYJeUOgzkpp3J+4BIgmuUo1Fz8= github.com/DataDog/datadog-agent/comp/core/secrets/noop-impl v0.79.0/go.mod h1:WHGFxmLSwBktondqFTBhFKNIsg9RGAIJHka6th7J0jg= github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.77.0 h1:B8sjgfnQ+tr/sR1gKPKvQxz2YI/5/J2AE8w3eUyJ1K8= github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.77.0/go.mod h1:lEQc9L0HAfD3Ii3cIEjmg5rMVjnaELr35o0Lxg8ZVng= -github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.79.0 h1:nQ0KPy7pGJUvRR5agZbhP0Ou4k704befGV6B3tpYeHY= github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.79.0/go.mod h1:+uTKQoxkecJGncfE4YXfTWINck1WF3MFn7xBc0lc//g= github.com/DataDog/datadog-agent/comp/core/secrets/utils v0.82.0-rc.2/go.mod h1:91THt6HQOalyXIsmeGYAWfsY43JWjbvQMcbk9zn1j30= github.com/DataDog/datadog-agent/comp/core/status v0.77.0 h1:ClLrhl55PC4x8nMejCFAGkpIA71V5Kegt73lqeTGbzg= github.com/DataDog/datadog-agent/comp/core/status v0.77.0/go.mod h1:JUOovjtT/1Fte9Ya6roMLjZWiMfRHEPgGwnT0ro5CWw= -github.com/DataDog/datadog-agent/comp/core/status v0.79.0 h1:8ZUD7S+uOjfzu6EPgCcgP9VPnfk0AukHQcoyXVvcrCs= github.com/DataDog/datadog-agent/comp/core/status v0.79.0/go.mod h1:s6MsjIHjjhV6BPi5+NckSdv9fe+A1Pd2pSSETtYz1to= github.com/DataDog/datadog-agent/comp/core/status v0.82.0-rc.2/go.mod h1:Lx8hmBAjifRTGHQgx1avofOkEMUEJ2Mz+fuAVoQfSOk= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.77.0 h1:5ieRjnB17PYqlpUpQtKX4rpau3+Uv95HQJl3cR9+UFE= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.77.0/go.mod h1:e9MJy5kPvHC2+1FouSQ1wn0EY7XvA4CFjnZa9QfWY3E= -github.com/DataDog/datadog-agent/comp/core/tagger/def v0.78.3 h1:bZjfVJOyMCx3UYkwRNR6UAPKADan+HbcWV4lja/PSjw= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.78.3/go.mod h1:6B4wKV4acfNxAm4US9ajIMuEQ4eT0AsL+053ua8U6Jc= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.78.4/go.mod h1:oqLhL8989ed0P/K1bLvaJ0I9p/S8Wo0e49/VpujCNlE= github.com/DataDog/datadog-agent/comp/core/tagger/def v0.79.0/go.mod h1:UGVmAEXpqpBWuO+n++2qy7k5oqyBH12I0qOmPx47Mrc= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.77.0 h1:W83mrEqdADpQjxUMLdXwbCjFlLuPnTc/lXlqGgAPtvs= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.77.0/go.mod h1:5um8UBNkTlLX//VvBGtFF0EkU7MH9zXMbX2cLJEGA5Y= -github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.78.3 h1:Rtz6r5olDGoxbBe1H/AeKrqjBbkyc3YZm7y78rBag4Y= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.78.3/go.mod h1:O9QTcB/WguoS3iK8uBvVIbqb1qOoykCvB47PjE34U6w= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.78.4/go.mod h1:5fkE0XBXC2hwTBhi0EavDWcOJt7PSZ0zvW3Wkh2ay0U= github.com/DataDog/datadog-agent/comp/core/tagger/fx-remote v0.79.0/go.mod h1:5zPPkyqw0Ts0CWMdrVBoO3an/LwZzhXTwPxmS7nH3TI= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.77.0 h1:dPVPZgavLNpxXdh/s1Idc3KH6qhJEC4ILIb5QhJ3ZHE= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.77.0/go.mod h1:B9MdPAb7RHQMEs6dtqX5dxGqjrN3iquory3YmMO/xkA= -github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.78.3 h1:y1C6CZ+S/iUcK3CbgjH3EQ/osB+ZQHt+a6uyrdjvzQQ= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.78.3/go.mod h1:Mg7H7OAMf0hdOzQzU25rYdCDbB7sKg6VW/c1cAbTdcA= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.78.4/go.mod h1:WQOJE/FqULXLfZlbG+NgN071gknXBvIP69ZVrgA4dYI= github.com/DataDog/datadog-agent/comp/core/tagger/generic_store v0.79.0/go.mod h1:O7M3uxD6a3kKyG+YY7b7DSgNVW0EZhxOVxmnyPybhWY= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.77.0 h1:KoZ9sjgsrMS7lunXn+0SBhlO9bnRq8AVobLxsHtOrzw= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.77.0/go.mod h1:K0H/QSvC1pRJRTzOIF1eEYOPwdejP/B2ljsaxg/Lapw= -github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.78.3 h1:Kbed1VFJsLIzaAmssAey06x0mRvmrMT+HrTqNUow2MI= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.78.3/go.mod h1:pplBN99vrM5DolJQhVx6EOoO7Yxxj/C5UHcaa/38ux8= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.78.4/go.mod h1:JE9EXTmNN/kuDlARwK4Xsn0HjmSJ78oM2HIPXbh3Dj4= github.com/DataDog/datadog-agent/comp/core/tagger/impl-remote v0.79.0/go.mod h1:EFFDoBUsS5avoIhUAdXIdftVGL2RVdzmlhKTOW4WlZE= @@ -533,25 +508,21 @@ github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.78.4/go.mod github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.79.0/go.mod h1:dz3fkTBxANLLLigy9KQ5jhNZ28nA4dI9AxuLoGrmR0o= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.77.0 h1:bdmqRC0sBY/q5rQuIkVcAz5mZ9HxMFjOB7lQS4zp3uU= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.77.0/go.mod h1:GcFv6oCuvePlpWQQdGT8nRl41FL/s9BRmbsmmL6DsSM= -github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.78.3 h1:0NTq/nixSNSGBIGAa6oS6sIfWcUtNBlsdufaACtGkZY= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.78.3/go.mod h1:I+xGzWNoZLmTla6hWzgt2tV9lghfH8drfFz1JFU+6yE= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.78.4/go.mod h1:I+xGzWNoZLmTla6hWzgt2tV9lghfH8drfFz1JFU+6yE= github.com/DataDog/datadog-agent/comp/core/tagger/tags v0.79.0/go.mod h1:42H9Is8VNNekJPXpYwnQpLIuVioWzmfyrgV9kwi2wZI= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.77.0 h1:SA2AiToolgevpXCQc3e5YX86W6B+zUAb6MGeWhCiyJY= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.77.0/go.mod h1:nEtC9Dc2Wol/V2jvnd7MErEP/vM6Ut3k/1KNCxXIBkw= -github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.78.3 h1:w23MtTkal/oKxqaoUnffBQXa3zcNXL6+WOaV40L/EmQ= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.78.3/go.mod h1:GmHPOSSJkiR0f3KNbqEQcmug02FxE7KdB+Epau0srUg= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.78.4/go.mod h1:rOf8zwtD4XpOjV8fewb09OUjswaYXFX43XkMkx22TPU= github.com/DataDog/datadog-agent/comp/core/tagger/telemetry v0.79.0/go.mod h1:ZqfVeUKY/WeJS5qbZb394CS2fu5MPDZS351jEZdJ+Kk= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.77.0 h1:WmH82Jo0x13jBVYlJLGyPR41kka2z1Dc0kl3kB0b1/o= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.77.0/go.mod h1:IGQY7ufZ7HLV/fVRLpBnM6jFItHdu+41pSSaX4pmIiU= -github.com/DataDog/datadog-agent/comp/core/tagger/types v0.78.3 h1:eee1rIVe7OgawEvqYX3FyYV/NMuLP3/e8CtqGK/dJQs= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.78.3/go.mod h1:4oXVhNHPRK+ZL6AL7Mr4hEXD/K3kzUVTar5rUuqYBbw= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.78.4/go.mod h1:1YpNFhHCjoarmR6cKW1hOeeDxt7zzq3p4NulNrSrUL4= github.com/DataDog/datadog-agent/comp/core/tagger/types v0.79.0/go.mod h1:drdCchGpLOOpxhSFRk3JGk45Ouij5pF1TCiN66c5VO0= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.77.0 h1:JNajNueR+/jDbunfPh1dIfAB9gXogbozjydJ8cIPtZQ= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.77.0/go.mod h1:uQQYEqv2pnEbauwFIaOEaUig8Z2Bbg451o5K0zZz6ow= -github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.78.3 h1:t/kJZxWJzKuaZXDiIMG29w9kY/1Ipn7hb1BrO2JxBHc= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.78.3/go.mod h1:sKyy4kjLCWU1rbj3Wb6HUFcREiXy5n0bUHCQQOSIQ/M= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.78.4/go.mod h1:sKyy4kjLCWU1rbj3Wb6HUFcREiXy5n0bUHCQQOSIQ/M= github.com/DataDog/datadog-agent/comp/core/tagger/utils v0.79.0/go.mod h1:llPBkDG50ot1haxaNRgHlrPtABcVbBIxF4Ym5nM7qJo= @@ -571,27 +542,22 @@ github.com/DataDog/datadog-agent/comp/def v0.79.0/go.mod h1:2D7rmniQw4C1Tdvs1pVM github.com/DataDog/datadog-agent/comp/def v0.82.0-rc.2/go.mod h1:RP4BgGtOEYssv3UBC4b7nHeAUNtX5Vr1CyXvSaL6qj4= github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.77.0 h1:KWPLh8uoA8fPoSqnDL2S7tEcPMcDsljHy1sJhld7coY= github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.77.0/go.mod h1:uJhQdumC5PCM6cZKbPDn6QSjwe+xOjUrO7oR5o6qsR0= -github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.78.3 h1:RhB//CQTNDDHvS8oJ8B0wOqM7u7gwbZoF8Gb/0M+Xvk= github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder v0.78.3/go.mod h1:m2bnbU0EW9+nQZwVgdk7tVIYZw3Eue3WavsPtRyobFE= github.com/DataDog/datadog-agent/comp/forwarder/orchestrator/orchestratorinterface v0.77.0 h1:48767O59nSwpXIvcKOn0gF5TPUk+kvuwv1dH4S52tGo= github.com/DataDog/datadog-agent/comp/forwarder/orchestrator/orchestratorinterface v0.77.0/go.mod h1:bqLT6/LJHhIw8QH67a8oLVGfNiqudR62PUKdAaa9Lks= -github.com/DataDog/datadog-agent/comp/forwarder/orchestrator/orchestratorinterface v0.78.3 h1:DvsGuifHZ7CsmRZP7mMLFvc2dbnT7P3x41cvVSKosTw= github.com/DataDog/datadog-agent/comp/forwarder/orchestrator/orchestratorinterface v0.78.3/go.mod h1:PGvrdD+jtN+x+Pr88i1Uq2U49GpnNx6BWoEIGiOG/xg= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.77.0 h1:tCwV1tnwEylsGzrzSu2gwTXb9cr2zO6NozhPCjpEH94= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.77.0/go.mod h1:isGq1DiNoWTstt+pEP0mL+pDijaIPP2rDxpfN1rnc0E= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.78.3 h1:Hry8ks9PWGzQL32bSz3X3Lf0k6g6lTGPRz7cDvVVmlo= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.78.3/go.mod h1:HoQkgrtTdrwwY8gLIi1z+ZJ+UYHaKlOr2ZPqvugTt/k= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.78.4/go.mod h1:sNMuhuDQTQjl4aT7cHptZxOZJjgUlmrA1jbI03B8cq4= github.com/DataDog/datadog-agent/comp/otelcol/otlp/components/processor/infraattributesprocessor v0.79.0/go.mod h1:YKsRAZiK64/DKD+EfwzqDfeU1ApWca6YbQ+nV4Cscq0= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.77.0 h1:KcyQ1xMoiGzKqZtOh3W8rBHKzIcaxy7HUPLlkbY1H5E= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.77.0/go.mod h1:F9QCFWYC83wGRtlLsPWcBX4o/KGTDmGZGTbbQ2xAB6I= -github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.78.3 h1:rtmXy1MI7B49bxiDrdCrOzI/FYoO3NTVpRY/PjwPSJU= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.78.3/go.mod h1:ZiReKr49evIBrgGdw5rTxVhJzl93R8QqYFtkErWXFYA= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.78.4/go.mod h1:yDYyYjXNt1NpcvYplCmcw8fJtag3nnPdAlt4QA+iv3w= github.com/DataDog/datadog-agent/comp/otelcol/otlp/testutil v0.79.0/go.mod h1:Md7difW0CfmsWkLiOWiv1o44+iEnP6GOSeWFRsSJzIA= github.com/DataDog/datadog-agent/comp/serializer/metricscompression v0.77.0 h1:QAzuLwGpsCw9chNiU7Miwa9L4m55SEVvpGVoKDKo4YY= github.com/DataDog/datadog-agent/comp/serializer/metricscompression v0.77.0/go.mod h1:l05ZNSI2KGsI1i+/P5ieUyMq5a2+PqlDNrn+v9pNwoI= -github.com/DataDog/datadog-agent/comp/serializer/metricscompression v0.78.3 h1:Jd1Xjpyu+PTxspSsD3RBDoGlo04ZqeWOOjnu53BgakM= github.com/DataDog/datadog-agent/comp/serializer/metricscompression v0.78.3/go.mod h1:6QZ8nnLU4E1nSRmbHfHM6WyUztsP8UTFHDrATSL3Vi8= github.com/DataDog/datadog-agent/comp/trace/compression/def v0.77.0 h1:rgP4zfDobUH5btXEnOBiI/V8J0CiqlECXg4svZmGl4g= github.com/DataDog/datadog-agent/comp/trace/compression/def v0.77.0/go.mod h1:1T7WAixRlrwi6HT+gViXvYgzxi7Sb0PD0nL3bArcx7E= @@ -610,7 +576,6 @@ github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.79.0/go.mod github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.82.0-rc.2/go.mod h1:WMtMu3KBFLX2rY7V6aYi3UDl9vLem9h4UQHn3WU0fLc= github.com/DataDog/datadog-agent/pkg/aggregator/ckey v0.77.0 h1:6A4edHFeSW4DrryvwUbP/NbYTrD7M+DUePWlPYRjovQ= github.com/DataDog/datadog-agent/pkg/aggregator/ckey v0.77.0/go.mod h1:0SSAMQKJFX5NcLNqvm3GWvk6woMSvD/YWNk3Y/vlwh0= -github.com/DataDog/datadog-agent/pkg/aggregator/ckey v0.78.3 h1:1TcXxiYiL6Hh+HAWWvnHVpH92pCZglnT+yXk+ZexXFQ= github.com/DataDog/datadog-agent/pkg/aggregator/ckey v0.78.3/go.mod h1:zHvru+kuBzH91N8xupM7WkPeeTVjpRB67uG0+vejyXc= github.com/DataDog/datadog-agent/pkg/api v0.77.0 h1:rET03ZEAAykE956zTX5BjNnyLu8A3cCc4r0fDFTd8bE= github.com/DataDog/datadog-agent/pkg/api v0.77.0/go.mod h1:4Wbaon3A/E1ghXDLlza4GeGdIfRMMjXzsBO9tF/+RdM= @@ -718,7 +683,6 @@ github.com/DataDog/datadog-agent/pkg/fips v0.79.0/go.mod h1:pYBWHNCILJawjzTYiaib github.com/DataDog/datadog-agent/pkg/fips v0.82.0-rc.2/go.mod h1:1t48EvAXnUSEba5GWeq5uB8iOs3FDhlj08EVrWu8Is0= github.com/DataDog/datadog-agent/pkg/metrics v0.77.0 h1:wdAFtCKbN1SUcG3U1sLtJ/wP5gjnp4R6ZDtJYVSOjrE= github.com/DataDog/datadog-agent/pkg/metrics v0.77.0/go.mod h1:7yL5IJt6IoUNLL905C45SYdpY6U0XA2JgTaYoe9KI+A= -github.com/DataDog/datadog-agent/pkg/metrics v0.78.3 h1:/d2VhMvqTtaTLHo7wRbGpir1/f7Ix31TkOfDnXEhis8= github.com/DataDog/datadog-agent/pkg/metrics v0.78.3/go.mod h1:anhsmOXRe5EJ2ZlZqSK+KmLH+1yKkGW5ceFarUl6uGk= github.com/DataDog/datadog-agent/pkg/obfuscate v0.75.2/go.mod h1:+IvQjXkCQBwDgigh2AvG3TWvW6Y/n0Kt7I2LUK/zRnY= github.com/DataDog/datadog-agent/pkg/obfuscate v0.76.2/go.mod h1:Q1B0h6Gyk8twdN1huri/UkQvLbUooVmEsooE49cqEFk= @@ -727,7 +691,6 @@ github.com/DataDog/datadog-agent/pkg/obfuscate v0.78.4/go.mod h1:Gaa+M7tW8muicqT github.com/DataDog/datadog-agent/pkg/obfuscate v0.79.0/go.mod h1:1Us875zf/kICMHUcxHE5HNo1rCQlvLBmo1tfZEuzJVw= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.77.0 h1:qSu+ah+hDSh/Mh14bOQrhnUcA+XeS9iSec4asS8pgkU= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.77.0/go.mod h1:Mve3eNIdPMZGfMjblXsRia9U+0Cw5liGaF34KRFMBFw= -github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.78.3 h1:09QLIW4Euy8XQEMxVh3rC47vllaxczLKBnQwYJ5A54E= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.78.3/go.mod h1:+uMbLC2Xat1Xxh1jaHOLEt/1A/OmI4OZ0KnNcRAkBYM= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.78.4/go.mod h1:0OGk/uC/reN06fqlxcCiJC1t625zPN3xMNkGdK9fwmw= github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/inframetadata v0.79.0/go.mod h1:Ndbgk9JQkhvO6MKcpeUROU6gvryoTE2HW8wS3SDrhdw= @@ -739,11 +702,9 @@ github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0 github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.79.0/go.mod h1:GqMFabP1nLfle3seDNJYcj/wfCSKbAcUGFkkEasd7JE= github.com/DataDog/datadog-agent/pkg/orchestrator/model v0.77.0 h1:7+VqyxcPbfilTVhoUwWn5oYV8pQoNWKzE3yDcvAFsQY= github.com/DataDog/datadog-agent/pkg/orchestrator/model v0.77.0/go.mod h1:/TWPvfkbr0Cf+QRCyVCymmre5UgezcvkVxQJL081g28= -github.com/DataDog/datadog-agent/pkg/orchestrator/model v0.78.3 h1:auNcWkTMuqwNOd+p4z5bEdk7PRRw0HJoHGatUG1frRg= github.com/DataDog/datadog-agent/pkg/orchestrator/model v0.78.3/go.mod h1:oRykmVwE9OeyhpMlNI47RV+67myuLGHsRpdndlWJNGc= github.com/DataDog/datadog-agent/pkg/process/util/api v0.77.0 h1:s8YvLO6DUpbku1ANcYzLxKDVk8H1cef9Fxj1486fKhk= github.com/DataDog/datadog-agent/pkg/process/util/api v0.77.0/go.mod h1:5FdY/34/lbOQeuBRhJvFRPQKKZz+bKqYNT5V/4mq6Yw= -github.com/DataDog/datadog-agent/pkg/process/util/api v0.78.3 h1:uAznrRzer8tdT6925YgzCk6k21zIU+lNyWwk1C3o3II= github.com/DataDog/datadog-agent/pkg/process/util/api v0.78.3/go.mod h1:QyukfYXunLf/G6rRwvG9VGYvD0npMzrnJyXr30shzZg= github.com/DataDog/datadog-agent/pkg/proto v0.75.2/go.mod h1:nf8egqNvcahxrzAigMpKohPzYetJ7cVgG8kBc9gUoTw= github.com/DataDog/datadog-agent/pkg/proto v0.76.2/go.mod h1:RzHSkeIpR6OBEmwGy4fUPtQ1hPgt7ljwYlJmKxMHSX4= @@ -758,29 +719,24 @@ github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.78.4/go.mod h1:PrZa3X github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.79.0/go.mod h1:kFG+DDnQHvaQ1EUlhKmVRny7pYXmWhpQVWCM48uWP8I= github.com/DataDog/datadog-agent/pkg/serializer v0.77.0 h1:AVa6MgY3gMfSAAxb6QTQ0XIHDDa9EVpgJ8SrkvBCrJs= github.com/DataDog/datadog-agent/pkg/serializer v0.77.0/go.mod h1:47IJz8LJxwKKeXsVS7iAzvEz1H4cvM2reKwQUxb76Dw= -github.com/DataDog/datadog-agent/pkg/serializer v0.78.3 h1:Wmubb63UJKCZRv2yxJVB5AP6/gTlRg5tlM6EYq8rqSM= github.com/DataDog/datadog-agent/pkg/serializer v0.78.3/go.mod h1:AfJDZ64qRpx1mo4WtNv+6wRgHB7ki6EjZfJCnMpdnQM= github.com/DataDog/datadog-agent/pkg/serializer v0.78.4/go.mod h1:UYBvlVSFltCfFWokz8pqqFE390lQJMkyKCS7hJ4yglw= github.com/DataDog/datadog-agent/pkg/serializer v0.79.0/go.mod h1:HV7/lS1xczdtPsflOcvwJWIuhhmcFh67L5RNd7fU8BE= github.com/DataDog/datadog-agent/pkg/status/health v0.77.0 h1:QMW2iSaosACTzOKnsfbvlmnRb79pQC2Jyz2NCMUxjIs= github.com/DataDog/datadog-agent/pkg/status/health v0.77.0/go.mod h1:Vb9OTl+HDFwMOBJRuLgkoOF93nHVcM5+DTcLUH6507o= -github.com/DataDog/datadog-agent/pkg/status/health v0.78.3 h1:2Sodi28nRsYhDc8RwXLUkrks4juEd3phuQ9OJLI35KM= github.com/DataDog/datadog-agent/pkg/status/health v0.78.3/go.mod h1:HCpJQ4ke3WBWTmRM1hV1WBK18e85e03MkodnbopktJQ= github.com/DataDog/datadog-agent/pkg/tagger/types v0.77.0 h1:zZgSRr79JtsVqmdYdanwlTRZLELG9YqbjV3LX5goIGE= github.com/DataDog/datadog-agent/pkg/tagger/types v0.77.0/go.mod h1:oTzZdsJjDVX/7Cz5BQNLLADGN92wgRjsuEUbhTWBV4M= -github.com/DataDog/datadog-agent/pkg/tagger/types v0.78.3 h1:OWHILXP48hYbYsIGSOh4+MjNQ1Z8Uqwy/7KidNAXAZ4= github.com/DataDog/datadog-agent/pkg/tagger/types v0.78.3/go.mod h1:9Brrcr865wabAaYRRaV9Mf5+Jnvwmie2vLKJl+0PSQU= github.com/DataDog/datadog-agent/pkg/tagger/types v0.78.4/go.mod h1:irTPFzKi+QGc0RoV1G/SwDAYTr99BNzgFD4K5BqQ8cM= github.com/DataDog/datadog-agent/pkg/tagger/types v0.79.0/go.mod h1:93J6HCMDi/qalGI8R7dE3fp+E2AU/2MohZBU2SpuAa0= github.com/DataDog/datadog-agent/pkg/tagset v0.77.0 h1:9oPUbCplu3TL4YKqjHJCktZ85HoGQcN0JGedAS+7doo= github.com/DataDog/datadog-agent/pkg/tagset v0.77.0/go.mod h1:Z+kAyX4K2rXNUFCWie/7JGB6QEx8/xrL02u7TwQVc4U= -github.com/DataDog/datadog-agent/pkg/tagset v0.78.3 h1:zKN4rmMtuZR2YPJM5pyt+PXRgUdUg7PzMkmwqANwqk0= github.com/DataDog/datadog-agent/pkg/tagset v0.78.3/go.mod h1:rHrIGfMukeU4Uzg2X8qbUOZ7n0Odpbl8Es0xqRgonFo= github.com/DataDog/datadog-agent/pkg/tagset v0.78.4/go.mod h1:WTs7GSJQkEqv6bRVz8jctG8JLhOBEK0KKt4mgN0qsfs= github.com/DataDog/datadog-agent/pkg/tagset v0.79.0/go.mod h1:CXYr7gucyt2d1WiTXczDwP/NXtoedNMTqLRELzhjGtk= github.com/DataDog/datadog-agent/pkg/telemetry v0.77.0 h1:AXx7ovcxjglQtnvSTJA1xu/po1fajOPoE6n7w0t7teY= github.com/DataDog/datadog-agent/pkg/telemetry v0.77.0/go.mod h1:wPR67+LvCA4NT5014BTFTe/vocycC4kfFEPbuBbprSo= -github.com/DataDog/datadog-agent/pkg/telemetry v0.78.3 h1:MTMyikUWvpsVj+g/OxMThyehynwYV8cnr5KVdWexh5I= github.com/DataDog/datadog-agent/pkg/telemetry v0.78.3/go.mod h1:Fd++cD42DsK99bLsVZzZL7H7uymGh7IADAJhh+1AEpo= github.com/DataDog/datadog-agent/pkg/telemetry v0.78.4/go.mod h1:g1enPk0qq3FHzJ/W1GXwrEOjAbPwfP9E/wdx/VCKpAM= github.com/DataDog/datadog-agent/pkg/telemetry v0.79.0/go.mod h1:ueOtN1BKhTT7OGhHGkz1wsUxvbvmHXRlqYBKklrL7F8= @@ -801,7 +757,6 @@ github.com/DataDog/datadog-agent/pkg/trace/log v0.78.3/go.mod h1:y52uQ1lhszVASzO github.com/DataDog/datadog-agent/pkg/trace/log v0.78.4/go.mod h1:y52uQ1lhszVASzOy2YiK2x+mgnUD6DgKRpNYzOdwWxk= github.com/DataDog/datadog-agent/pkg/trace/log v0.79.0/go.mod h1:7JxAuxV2tRfr9Si8C9W+dF5qFU0x0K1hi07nrn9xIAU= github.com/DataDog/datadog-agent/pkg/trace/otel v0.76.2/go.mod h1:E4FYEUnCneDDPEzN8s+0le1oIrV4I4Nm1oeEvqC2rUA= -github.com/DataDog/datadog-agent/pkg/trace/otel v0.78.3 h1:AQNFv+b9sf9ZqTlViiOXtJ24etDR6m3av5MAye0i8OU= github.com/DataDog/datadog-agent/pkg/trace/otel v0.78.3/go.mod h1:wkYEb0uTKb56dSz17epvbhy5kMUIgpaE4kBnBT/3ZMI= github.com/DataDog/datadog-agent/pkg/trace/otel v0.78.4/go.mod h1:7c8IaIytbo/5PUGYT+DbEDBDOr8B03wq+Eed1fWOhIg= github.com/DataDog/datadog-agent/pkg/trace/stats v0.76.2/go.mod h1:hKGPJA7eGRZCTKNIYzE+8OlpIbNJasgVOtegVaALqVs= @@ -818,15 +773,12 @@ github.com/DataDog/datadog-agent/pkg/util/aws/creds v0.79.0/go.mod h1:27rR0PWCrg github.com/DataDog/datadog-agent/pkg/util/aws/creds v0.82.0-rc.2/go.mod h1:yig1Rp6zZL6FL82qL2Y+yFQ06NekHatWyG5MyMLiaYE= github.com/DataDog/datadog-agent/pkg/util/backoff v0.77.0 h1:p7x2jzZ/35EBpfO4YVdBnYYhXYBpaD7sumBD4O1zdAk= github.com/DataDog/datadog-agent/pkg/util/backoff v0.77.0/go.mod h1:SclwB5LKpXX+EtROQXIbvOVXlrnlZhWpywLUvw/ejDY= -github.com/DataDog/datadog-agent/pkg/util/backoff v0.78.3 h1:yv/axNetQWNRiD/IrVDgdPcyixDPj5RXc6O2kZqfjzU= github.com/DataDog/datadog-agent/pkg/util/backoff v0.78.3/go.mod h1:HqcimdpJ0IAlu4XhClpGYAe1nI+Tutzn3Du7nxqrdX0= github.com/DataDog/datadog-agent/pkg/util/buf v0.77.0 h1:A7NcGPv3Lfl67hf6ECeyIWnFYRsGVmj1dv+H3qQ829E= github.com/DataDog/datadog-agent/pkg/util/buf v0.77.0/go.mod h1:2qCCeh5+eR+Mwa9Ti1FNxgNTqS/LdWby0m+iFNx7Owk= -github.com/DataDog/datadog-agent/pkg/util/buf v0.78.3 h1:zta9+7R4+tpXAIUurTlmg8hu0k9H62Yy+5pHJrZdVzU= github.com/DataDog/datadog-agent/pkg/util/buf v0.78.3/go.mod h1:QAkmOIo326sXcnOLUaH/0FctTR/cjICRhFmgaqWkiXI= github.com/DataDog/datadog-agent/pkg/util/cache v0.77.0 h1:5b8KT6gToDh1fF/4AwuqJJAWqZTVAdMj3NaMCMMckNY= github.com/DataDog/datadog-agent/pkg/util/cache v0.77.0/go.mod h1:BfHiOUQ3gQzYy3E40oalOdSwOdmNKgfS80EmEMl9klc= -github.com/DataDog/datadog-agent/pkg/util/cache v0.78.3 h1:ttfi5KmNpeFimDfMcOvvOQGB9lthKoAND1Dxbiv4POY= github.com/DataDog/datadog-agent/pkg/util/cache v0.78.3/go.mod h1:GCDQazdL05pOK8Y9Gg3OTiiYU9elmVescZscrT/9Jzk= github.com/DataDog/datadog-agent/pkg/util/cache v0.78.4/go.mod h1:GCDQazdL05pOK8Y9Gg3OTiiYU9elmVescZscrT/9Jzk= github.com/DataDog/datadog-agent/pkg/util/cache v0.79.0/go.mod h1:RBNmKn63Fzuf2ZR4lNFO6RpfBwUxBet/CoUvaPvtF70= @@ -839,17 +791,14 @@ github.com/DataDog/datadog-agent/pkg/util/cgroups v0.79.0/go.mod h1:8Y2nQt0V18/i github.com/DataDog/datadog-agent/pkg/util/cgroups v0.82.0-rc.2/go.mod h1:xb/KqIvsrUSt0JiyhtDA0uWNqj1v1WmlHPkfkxVHzig= github.com/DataDog/datadog-agent/pkg/util/common v0.77.0 h1:vRlUjd3LCJ/tzhCv57V2g/Fx90s/mSI2Ia6p6X1/zAA= github.com/DataDog/datadog-agent/pkg/util/common v0.77.0/go.mod h1:kF/I1f6immce1C3vp7lBe7XHv3zn9leY5pKl0IHCGq8= -github.com/DataDog/datadog-agent/pkg/util/common v0.78.3 h1:sO5ugpUGIV6ECxvKDKhDPc0+DjgAtYEI0Jn4HYRtT1M= github.com/DataDog/datadog-agent/pkg/util/common v0.78.3/go.mod h1:6ot8QXfSwbPfb4TaAAmE1oSVckwmyufzuEfr3H2Jetg= github.com/DataDog/datadog-agent/pkg/util/common v0.78.4/go.mod h1:6ot8QXfSwbPfb4TaAAmE1oSVckwmyufzuEfr3H2Jetg= github.com/DataDog/datadog-agent/pkg/util/common v0.79.0/go.mod h1:W41/GAJETw4YhW7CpDPBc7fHbqIYXL/hRvgWBPZz87w= github.com/DataDog/datadog-agent/pkg/util/compression v0.77.0 h1:SPLNrH0smKyQymTNejKOtcGiWKP+708NjHSq1cyeIBg= github.com/DataDog/datadog-agent/pkg/util/compression v0.77.0/go.mod h1:SQw5TCkvjSE5fdTH1T8Jp0vz3fbRdUGfahKunTzgIlg= -github.com/DataDog/datadog-agent/pkg/util/compression v0.78.3 h1:YuLQJ1/I+OVWxuhOeG2O5DmTHzivJHlkeTCGg2lHG2s= github.com/DataDog/datadog-agent/pkg/util/compression v0.78.3/go.mod h1:sSt220DrQDGyVXs9GDuZ8sXDFfZ7wryNAftVQP4l0Tc= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.77.0 h1:YPI6ZwSLRxIU/MQWzC1HEM77l8HaK5tQe2KjV+6dOx4= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.77.0/go.mod h1:5U9K+nML/0SKR8xzjN32jqilO+Gkuzji3IuAll3Wgc4= -github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.78.3 h1:sbexeqgDSRQm1rssd2eIeRn0lAwSn3Rskrw7YTQKlZI= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.78.3/go.mod h1:15XTqryAado5YvVSG1v7wIzA9jr1WDtkbhaU5DFiu/k= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.78.4/go.mod h1:/fXMrm0sSNxTR4rBRxJHuQ+UZ7BYq6Yh8T/PyO9+6QM= github.com/DataDog/datadog-agent/pkg/util/defaultpaths v0.79.0/go.mod h1:OirWf0O3MJSDxr1K/5YvnPD0K/DLvMFUTKUHjkG7/hY= @@ -884,7 +833,6 @@ github.com/DataDog/datadog-agent/pkg/util/fxutil v0.79.0/go.mod h1:vdKVvGLOdevuo github.com/DataDog/datadog-agent/pkg/util/fxutil v0.82.0-rc.2/go.mod h1:fZlsRF/imjt0CNFAcb0vUoZE99PG8lRiW1SbVdsuuFg= github.com/DataDog/datadog-agent/pkg/util/grpc v0.77.0 h1:fMkOYt5oqMsC83cVFLhGawBnWXh6OP2mUJzExBFe0sU= github.com/DataDog/datadog-agent/pkg/util/grpc v0.77.0/go.mod h1:W24v7tFjikCuC1xjq45Of5Z9qa9VUbBddp6dz1qjt3c= -github.com/DataDog/datadog-agent/pkg/util/grpc v0.78.3 h1:xMoCEV5rSzI/y4vYsMi3ll25bzmff780dgaipQkkFy4= github.com/DataDog/datadog-agent/pkg/util/grpc v0.78.3/go.mod h1:/f44/yxnq/qyskH2O3CKXbDBn+PVX0s0oBbRI0W/5EA= github.com/DataDog/datadog-agent/pkg/util/grpc v0.78.4/go.mod h1:CPQAiWUNIkWtXfQm8jtkTWtzKXzNZ3psP1A9XqJjA8I= github.com/DataDog/datadog-agent/pkg/util/grpc v0.79.0/go.mod h1:P8EEyKeMgqRzZJ26ZlarfBgNtMCXaQ7u1UX9psh67rU= @@ -892,12 +840,10 @@ github.com/DataDog/datadog-agent/pkg/util/http v0.77.0 h1:8RwTJ4H47Hx+OGzBpL5gHl github.com/DataDog/datadog-agent/pkg/util/http v0.77.0/go.mod h1:Ay19xAifymmSpmx5S1mhFScfx6BMOMkmKiyqLBCRtQw= github.com/DataDog/datadog-agent/pkg/util/http v0.78.3/go.mod h1:pnUZnsbsnYzpoWZsKw0YbLiTjmcFMhon/rdbs8i2q4Q= github.com/DataDog/datadog-agent/pkg/util/http v0.78.4/go.mod h1:mUm0tLQNrAjNb/MgDKkVv7rSh/+ifWGIa9pig9Xi0YI= -github.com/DataDog/datadog-agent/pkg/util/http v0.79.0 h1:KqGgFOO8gjHE0+f2iXQvW230F26NNVnnMAehSIhUTaA= github.com/DataDog/datadog-agent/pkg/util/http v0.79.0/go.mod h1:Eo0p/3xf5aq8i3aErUJ39x1FKRWDYfOoDfPT3E1jU88= github.com/DataDog/datadog-agent/pkg/util/http v0.82.0-rc.2/go.mod h1:n4T55iPMQJSE8OwyQ8suKvknVVcve+D1EPNI0S7g2iA= github.com/DataDog/datadog-agent/pkg/util/json v0.77.0 h1:83v9K94M5tsLfq1KfXIkcQyH6a5hcqM3oradjknzKek= github.com/DataDog/datadog-agent/pkg/util/json v0.77.0/go.mod h1:ueb7RqbUfuxNVSlhjngH67bFnt4Sz8jw3T2dFCo4NPg= -github.com/DataDog/datadog-agent/pkg/util/json v0.78.3 h1:WQbfmLepl1dOXW+Fqy20dK2uwF+9z6326jFh9iJ2kU0= github.com/DataDog/datadog-agent/pkg/util/json v0.78.3/go.mod h1:iBHJDW0DrFVuADZEVTVq+eTjysTD8Yb/WlyR9XTejVY= github.com/DataDog/datadog-agent/pkg/util/kubernetes/apiserver/common/namespace v0.77.0 h1:96jy17lJrMGcM53TsUseeshC0N5I0ihE0DuJjGX+NF8= github.com/DataDog/datadog-agent/pkg/util/kubernetes/apiserver/common/namespace v0.77.0/go.mod h1:JRli2R7aoOM9HUhrPFWy8UGv5xfxQme9XpmRNt+HzZ0= @@ -913,7 +859,6 @@ github.com/DataDog/datadog-agent/pkg/util/log v0.79.0/go.mod h1:CAY0JEL1p/Zm3U03 github.com/DataDog/datadog-agent/pkg/util/log v0.82.0-rc.2/go.mod h1:CUtYeqtGe3lPh4F3zWkZ1deYiHoSttbSkzfkKgxKR0M= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.77.0 h1:QYefMr5grpo0+QKByZPmHLBl0Jn8kbwG36l3gVs/CAs= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.77.0/go.mod h1:AfvtDnaaPcype4uoKhpo4wT+r7gyBHvn3vO4hvxUCzU= -github.com/DataDog/datadog-agent/pkg/util/log/setup v0.78.3 h1:Ts20zpwycPs8ABJzIP+vaK7X1wWRnPO9WZiKyMXOpXc= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.78.3/go.mod h1:/5gAdX1mFR/wcXk288fpI8ek+eCZqqShha0F3Joe/40= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.78.4/go.mod h1:+52sqMfnavPo1GX69ZNh3cJsBht87Wbng2jRgB0g288= github.com/DataDog/datadog-agent/pkg/util/log/setup v0.79.0/go.mod h1:lFjsW0G4b445XZATb5ohyCGIvHsC6yNQK5tR6kuoqhA= @@ -933,7 +878,6 @@ github.com/DataDog/datadog-agent/pkg/util/pointer v0.79.0/go.mod h1:vZmAREnlaPyh github.com/DataDog/datadog-agent/pkg/util/pointer v0.82.0-rc.2/go.mod h1:8jYZQTNtBfJY0VnvOK3HjN83xJad5GfIDcOuAtEElnc= github.com/DataDog/datadog-agent/pkg/util/quantile v0.77.0 h1:YPziONVGNejkbwPy62IUE3DWf2F9hKph/Y+eRzR6j9Y= github.com/DataDog/datadog-agent/pkg/util/quantile v0.77.0/go.mod h1:9kbZYKlzYzTrDf93E+QLArzGWystLeLqsuEqhJJMldg= -github.com/DataDog/datadog-agent/pkg/util/quantile v0.78.3 h1:yigfS4kzITrkm3MP0DnKaSe0xLWzPRZQJg9suN4P4Y4= github.com/DataDog/datadog-agent/pkg/util/quantile v0.78.3/go.mod h1:52zEFnuN463FekTqydYlqbo+cAEq7XTzGR/2UboSrjI= github.com/DataDog/datadog-agent/pkg/util/scrubber v0.75.2/go.mod h1:EHbtirXEWLNY0PDr6ibaEmxSL3FFxGAOJd0Wv5tOYJg= github.com/DataDog/datadog-agent/pkg/util/scrubber v0.76.2/go.mod h1:/GvOF3H0meWMxBWGzSkh9t7aqlAxIEbeQSeaGk711Ho= @@ -944,7 +888,6 @@ github.com/DataDog/datadog-agent/pkg/util/scrubber v0.79.0/go.mod h1:1oGeiD/i554 github.com/DataDog/datadog-agent/pkg/util/scrubber v0.82.0-rc.2/go.mod h1:rRyQlilra12WIoyVPhPHI5daXPyht3ZPVpETe+S/qro= github.com/DataDog/datadog-agent/pkg/util/sort v0.77.0 h1:36jXEIiuGxT7wYB/yiYPctonkLWdoQBXrF8d1R+BoRM= github.com/DataDog/datadog-agent/pkg/util/sort v0.77.0/go.mod h1:FkUBvsOPjP+5Q8KgpdAnt42Hpy7bhhsGSSE2P+UJC3U= -github.com/DataDog/datadog-agent/pkg/util/sort v0.78.3 h1:hXE/wlNGo2j5YnNSYAw6YnhNxHbWKeIx2PlN3U5bGKs= github.com/DataDog/datadog-agent/pkg/util/sort v0.78.3/go.mod h1:zdbmBf4yUxiIHlcwsNMIY1w3QF27+CvzR8azQCYFX6w= github.com/DataDog/datadog-agent/pkg/util/sort v0.78.4/go.mod h1:zdbmBf4yUxiIHlcwsNMIY1w3QF27+CvzR8azQCYFX6w= github.com/DataDog/datadog-agent/pkg/util/sort v0.79.0/go.mod h1:GKgV7y9W6+KZnUp6W0GZ4mfkCjPH5kM2ME3ZaSoNWhA= @@ -982,7 +925,6 @@ github.com/DataDog/go-acl v1.0.1/go.mod h1:YJx333qSb3GUqCLIbqKeGaZS2pUYh2IYGI7+F github.com/DataDog/go-libddwaf/v4 v4.8.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= github.com/DataDog/go-libddwaf/v4 v4.9.0 h1:a788e37iuH7sR9uIYHkulvTnp2FkXTiZ3yY/kuaHgZE= github.com/DataDog/go-libddwaf/v4 v4.9.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= -github.com/DataDog/go-libddwaf/v4 v4.10.0 h1:e1kqR5yqqttLRuFXHb8FrrgLfMWTx5LnZICMwQwTDYM= github.com/DataDog/go-libddwaf/v4 v4.10.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= github.com/DataDog/go-sqllexer v0.1.10/go.mod h1:vOw7Ia7z+z6nl3zGZlLIZe0vQlPtCPR906WIPBJadxc= @@ -1119,7 +1061,6 @@ github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bits-and-blooms/bitset v1.24.0 h1:H4x4TuulnokZKvHLfzVRTHJfFfnHEeSYJizujEZvmAM= github.com/bits-and-blooms/bitset v1.24.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bits-and-blooms/bitset v1.24.4 h1:95H15Og1clikBrKr/DuzMXkQzECs1M6hhoGXLwLQOZE= github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -1147,13 +1088,11 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWs github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= -github.com/cilium/ebpf v0.16.0 h1:+BiEnHL6Z7lXnlGUsXQPPAE7+kenAd4ES8MQ5min0Ok= github.com/cilium/ebpf v0.16.0/go.mod h1:L7u2Blt2jMM/vLAVgjxluxtBKlz3/GWjB0dMOEngfwE= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/clipperhouse/displaywidth v0.9.0/go.mod h1:aCAAqTlh4GIVkhQnJpbL0T/WfcrJXHcj8C0yjYcjOZA= -github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/clipperhouse/uax29/v2 v2.5.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= @@ -1380,7 +1319,6 @@ github.com/googleapis/cloud-bigtable-clients-test v0.0.4/go.mod h1:NNHPqSxC2OBSL github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/enterprise-certificate-proxy v0.3.7/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/enterprise-certificate-proxy v0.3.11/go.mod h1:RFV7MUdlb7AgEq2v7FmMCfeSMCllAzWxFgRdusoGks8= -github.com/googleapis/enterprise-certificate-proxy v0.3.16/go.mod h1:9Yb0eAkH/Xqhvv3zbeKf/+wMJqCeocWc6KIhDvEAuYE= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= @@ -1388,8 +1326,6 @@ github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld github.com/googleapis/gax-go/v2 v2.16.0/go.mod h1:o1vfQjjNZn4+dPnRdl/4ZD7S9414Y4xA+a/6Icj6l14= github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= -github.com/googleapis/gax-go/v2 v2.21.0/go.mod h1:But/NJU6TnZsrLai/xBAQLLz+Hc7fHZJt/hsCz3Fih4= -github.com/googleapis/gax-go/v2 v2.22.0/go.mod h1:irWBbALSr0Sk3qlqb9SyJ1h68WjgeFuiOzI4Rqw5+aY= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -1550,7 +1486,6 @@ github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3/go.mod h1:autxFIv github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= -github.com/lyft/protoc-gen-star/v2 v2.0.4 h1:JDlNKttNIRd68AAIychs0AqEpO8/I/WYi01OQ7Raw6Q= github.com/lyft/protoc-gen-star/v2 v2.0.4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= @@ -1710,11 +1645,9 @@ github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+D github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 h1:hp2CYQUINdZMHdvTdXtPOY2ainKl4IoMcpAXEf2xj3Q= github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= @@ -1760,7 +1693,6 @@ github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhg github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad h1:W0LEBv82YCGEtcmPA3uNZBI33/qF//HAAs3MawDjRa0= github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad/go.mod h1:Hy8o65+MXnS6EwGElrSRjUzQDLXreJlzYLlWiHtt8hM= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= @@ -2147,7 +2079,6 @@ go.opentelemetry.io/collector/processor/processorhelper v0.150.0/go.mod h1:Z15Lj go.opentelemetry.io/collector/processor/processorhelper v0.155.0/go.mod h1:b4PlLl0sMXXhCUJcf4Qi6zHy5NELErMjOGqn66hc0tU= go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.145.0 h1:sj71PeiUvjwJpgPCA89DBggglUnMnHnVDj1p5mqopbU= go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.145.0/go.mod h1:eziJnPjzFuVntzgDuZTJhckjiavWYSoJG+kID45wJHU= -go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.147.0 h1:iHSXnNw0pnHnbx2p3RQws4+RhXccD/odYS76Qh/gC+w= go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.147.0/go.mod h1:AvFsKbfOvHsE4XfAvsHmwf1PCNvMcQRcCSSS3mb/mT8= go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.150.0/go.mod h1:EDYHe859rnTXTQbDLOzfWtIbX759nwB1AE5ry7NSHJM= go.opentelemetry.io/collector/processor/processortest v0.147.0/go.mod h1:JkeOS3E1BH6MUAcvTaVNIgUSXD+IGggi1pdvbRwMctE= @@ -2246,7 +2177,6 @@ go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9 go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw= go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE= -go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 h1:ojdSRDvjrnm30beHOmwsSvLpoRF40MlwNCA+Oo93kXU= go.opentelemetry.io/contrib/bridges/otelzap v0.10.0/go.mod h1:oTTm4g7NEtHSV2i/0FeVdPaPgUIZPfQkFbq0vbzqnv0= go.opentelemetry.io/contrib/bridges/otelzap v0.11.0/go.mod h1:pJPCLM8gzX4ASqLlyAXjHBEYxgbOQJ/9bidWxD6PEPQ= go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= @@ -2258,7 +2188,6 @@ go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPx go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= -go.opentelemetry.io/contrib/detectors/gcp v1.42.0 h1:kpt2PEJuOuqYkPcktfJqWWDjTEd/FNgrxcniL7kQrXQ= go.opentelemetry.io/contrib/detectors/gcp v1.42.0/go.mod h1:W9zQ439utxymRrXsUOzZbFX4JhLxXU4+ZnCt8GG7yA8= go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= @@ -2269,7 +2198,6 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1: go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg= go.opentelemetry.io/contrib/otelconf v0.18.0 h1:ciF2Gf00BWs0DnexKFZXcxg9kJ8r3SUW1LOzW3CsKA8= go.opentelemetry.io/contrib/otelconf v0.18.0/go.mod h1:FcP7k+JLwBLdOxS6qY6VQ/4b5VBntI6L6o80IMwhAeI= go.opentelemetry.io/contrib/otelconf v0.23.0 h1:s3C7KdMYiutf4rC8hKFA0WOIDG+gIru8ajjQKS59ir8= @@ -2467,7 +2395,6 @@ golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -2520,7 +2447,6 @@ golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= @@ -2652,7 +2578,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= @@ -2788,8 +2713,6 @@ google.golang.org/api v0.256.0/go.mod h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqc google.golang.org/api v0.258.0/go.mod h1:qhOMTQEZ6lUps63ZNq9jhODswwjkjYYguA7fA3TBFww= google.golang.org/api v0.259.0/go.mod h1:LC2ISWGWbRoyQVpxGntWwLWN/vLNxxKBK9KuJRI8Te4= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= -google.golang.org/api v0.274.0/go.mod h1:JbAt7mF+XVmWu6xNP8/+CTiGH30ofmCmk9nM8d8fHew= -google.golang.org/api v0.285.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -2866,7 +2789,6 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go. google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:vYFwMYFbmA8vl6Z/krj/h7+U/AqpHknwJX4Uqgfyc7I= google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0/go.mod h1:8ytArBbtOy2xfht+y2fqKd5DRDJRUQhqbyEnQ4bDChs= google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= @@ -2889,7 +2811,6 @@ google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go. google.golang.org/genproto/googleapis/api v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:etfGUgejTiadZAUaEP14NP97xi1RGeawqkjDARA/UOs= google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= -google.golang.org/genproto/googleapis/api v0.0.0-20260615183401-62b3387ff324/go.mod h1:Z4WJ5pJOYWFWcHEQUelD5QaZDknIQkpIL/+fyJOT9+A= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240325203815-454cdb8f5daa h1:wBkzraZsSqhj1M4L/nMrljUU6XasJkgHvUsq8oRGwF0= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:IN9OQUXZ0xT+26MDwZL8fJcYw+y99b0eYPA2U15Jt8o= google.golang.org/genproto/googleapis/bytestream v0.0.0-20241209162323-e6fa225c2576 h1:H8LrtQMZ6iQnV+zpgeb0YqwdByodQltmFqIhjuwexOI= @@ -2904,7 +2825,6 @@ google.golang.org/genproto/googleapis/bytestream v0.0.0-20251213004720-97cd9d5ae google.golang.org/genproto/googleapis/bytestream v0.0.0-20251213004720-97cd9d5aeac2/go.mod h1:G3Q0qS3k/oFEmVMddPsSYcFnm2+Mq2XRmxujrtu5hr0= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260319201613-d00831a3d3e7 h1:6jJ8xNMxB3mmH3HsxEMPjJU+WeFOiwBJ+cLm60OvSZs= google.golang.org/genproto/googleapis/bytestream v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:6TABGosqSqU2l1+fJ3jdvOYPPVryeKybxYF0cCZkTBE= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20260630182238-925bb5da69e7/go.mod h1:6TABGosqSqU2l1+fJ3jdvOYPPVryeKybxYF0cCZkTBE= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= @@ -2917,7 +2837,6 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= @@ -2940,15 +2859,12 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260401001100-f93e5f3e9f0f/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260406210006-6f92a3bedf2d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260504160031-60b97b32f348/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -3013,7 +2929,6 @@ gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/httprequest.v1 v1.2.1 h1:pEPLMdF/gjWHnKxLpuCYaHFjc8vAB2wrYjXrqDVC16E= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.67.2 h1:JtOSMb9OuaCZKr7h5D/h6iii14sK0hLbplTc6frx4Ss= gopkg.in/ini.v1 v1.67.2/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss= gopkg.in/jinzhu/gorm.v1 v1.9.2 h1:sTqyEcgrxG68jdeUXA9syQHNdeRhhfaYZ+vcL3x730I= gopkg.in/jinzhu/gorm.v1 v1.9.2/go.mod h1:56JJPUzbikvTVnoyP1nppSkbJ2L8sunqTBDY2fDrmFg= @@ -3025,7 +2940,6 @@ gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= diff --git a/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go index a5f4f6987fd..d9b92a4ee33 100644 --- a/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go @@ -77,7 +77,7 @@ func (b *adminBase) setup(ctx context.Context, t *testing.T) { } func (b *adminBase) projectPath() string { - return fmt.Sprintf("projects/%s", b.projectID) + return "projects/" + b.projectID } func (b *adminBase) topicPath(id string) string { diff --git a/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go index dd1d887dd9f..8320adbec1e 100644 --- a/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go @@ -76,7 +76,7 @@ func (b *adminBase) setup(ctx context.Context, t *testing.T) { } func (b *adminBase) projectPath() string { - return fmt.Sprintf("projects/%s", b.projectID) + return "projects/" + b.projectID } func (b *adminBase) topicPath(id string) string { From 2ce9ef1bd68f1b25eb71d2c9f61753112ec9e045 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 22 Jul 2026 09:19:07 -0400 Subject: [PATCH 32/33] apply copilot nits --- contrib/cloud.google.com/go/pubsub.v1/admin_test.go | 6 +++--- contrib/cloud.google.com/go/pubsub.v2/admin_test.go | 6 +++--- contrib/cloud.google.com/go/pubsubtrace/admin.go | 2 +- contrib/cloud.google.com/go/pubsubtrace/admin_v1.go | 2 +- contrib/cloud.google.com/go/pubsubtrace/tracing.go | 6 +++--- .../_integration/gcp_pubsub.v1/gcp_pubsub_admin.go | 2 +- .../_integration/gcp_pubsub.v2/gcp_pubsub_admin.go | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsub.v1/admin_test.go b/contrib/cloud.google.com/go/pubsub.v1/admin_test.go index 7d1756fd0d3..4e183b178d6 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/admin_test.go +++ b/contrib/cloud.google.com/go/pubsub.v1/admin_test.go @@ -246,7 +246,7 @@ func TestTraceAdminMissingResource(t *testing.T) { assert.Equal(t, "gcp.pubsub.request", spans[0].OperationName()) assert.Equal(t, "CreateTopic", spans[0].Tag(ext.ResourceName)) assert.Equal(t, "CreateTopic", spans[0].Tag("pubsub.method")) - assert.Nil(t, spans[0].Tag("gcloud.project_id")) + assert.Nil(t, spans[0].Tag(ext.GCPProjectID)) if createErr != nil { assert.Equal(t, createErr.Error(), spans[0].Tag(ext.ErrorMsg)) } @@ -254,7 +254,7 @@ func TestTraceAdminMissingResource(t *testing.T) { assert.Equal(t, "gcp.pubsub.request", spans[1].OperationName()) assert.Equal(t, "GetTopic", spans[1].Tag(ext.ResourceName)) assert.Equal(t, "GetTopic", spans[1].Tag("pubsub.method")) - assert.Nil(t, spans[1].Tag("gcloud.project_id")) + assert.Nil(t, spans[1].Tag(ext.GCPProjectID)) if getErr != nil { assert.Equal(t, getErr.Error(), spans[1].Tag(ext.ErrorMsg)) } @@ -297,6 +297,6 @@ func assertAdminSpan(t *testing.T, span *mocktracer.Span, method, resource strin assert.Equal(t, "cloud.google.com/go/pubsub.v1", span.Tag(ext.Component)) assert.Equal(t, ext.MessagingSystemGCPPubsub, span.Tag(ext.MessagingSystem)) assert.Equal(t, method, span.Tag("pubsub.method")) - assert.Equal(t, adminProjectID, span.Tag("gcloud.project_id")) + assert.Equal(t, adminProjectID, span.Tag(ext.GCPProjectID)) assert.Equal(t, "cloud.google.com/go/pubsub.v1", span.Integration()) } diff --git a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go index e6afc1d435d..f894d35d950 100644 --- a/contrib/cloud.google.com/go/pubsub.v2/admin_test.go +++ b/contrib/cloud.google.com/go/pubsub.v2/admin_test.go @@ -247,7 +247,7 @@ func TestTraceAdminMissingResource(t *testing.T) { assert.Equal(t, "gcp.pubsub.request", spans[0].OperationName()) assert.Equal(t, "CreateTopic", spans[0].Tag(ext.ResourceName)) assert.Equal(t, "CreateTopic", spans[0].Tag("pubsub.method")) - assert.Nil(t, spans[0].Tag("gcloud.project_id")) + assert.Nil(t, spans[0].Tag(ext.GCPProjectID)) if createErr != nil { assert.Equal(t, createErr.Error(), spans[0].Tag(ext.ErrorMsg)) } @@ -255,7 +255,7 @@ func TestTraceAdminMissingResource(t *testing.T) { assert.Equal(t, "gcp.pubsub.request", spans[1].OperationName()) assert.Equal(t, "GetTopic", spans[1].Tag(ext.ResourceName)) assert.Equal(t, "GetTopic", spans[1].Tag("pubsub.method")) - assert.Nil(t, spans[1].Tag("gcloud.project_id")) + assert.Nil(t, spans[1].Tag(ext.GCPProjectID)) if getErr != nil { assert.Equal(t, getErr.Error(), spans[1].Tag(ext.ErrorMsg)) } @@ -298,6 +298,6 @@ func assertAdminSpan(t *testing.T, span *mocktracer.Span, method, resource strin assert.Equal(t, "cloud.google.com/go/pubsub.v2", span.Tag(ext.Component)) assert.Equal(t, ext.MessagingSystemGCPPubsub, span.Tag(ext.MessagingSystem)) assert.Equal(t, method, span.Tag("pubsub.method")) - assert.Equal(t, adminProjectID, span.Tag("gcloud.project_id")) + assert.Equal(t, adminProjectID, span.Tag(ext.GCPProjectID)) assert.Equal(t, "cloud.google.com/go/pubsub.v2", span.Integration()) } diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin.go b/contrib/cloud.google.com/go/pubsubtrace/admin.go index 6c9554ff925..ec0eedabb47 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2025 Datadog, Inc. -// v2 admin request→resource mapping. Is implemented as a grpc unary client interceptor + // v2 admin request→resource mapping, implemented as a grpc unary client interceptor. // Uses cloud.google.com/go/pubsub/v2/apiv1/pubsubpb, which is distinct from v1's pubsubpb // (see admin_v1.go). diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go index b5b53505cc7..2f70a8d4fef 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin_v1.go @@ -4,7 +4,7 @@ // Copyright 2025 Datadog, Inc. // v1 admin request→resource mapping. Uses cloud.google.com/go/pubsub/apiv1/pubsubpb, -// which distinct from v2's pubsubpb (see admin.go). +// which is distinct from v2's pubsubpb (see admin.go). package pubsubtrace diff --git a/contrib/cloud.google.com/go/pubsubtrace/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go index e77149824f4..58405ad4513 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -200,7 +200,7 @@ func (tr *Tracer) TraceAdmin(ctx context.Context, method string, resourcePath st tracer.Measured(), } if projectID := projectIDFromResourceName(resourcePath); projectID != "" { - spanOpts = append(spanOpts, tracer.Tag("gcloud.project_id", projectID)) + spanOpts = append(spanOpts, tracer.Tag(ext.GCPProjectID, projectID)) } if cfg.serviceName != "" { spanOpts = append(spanOpts, instrumentation.ServiceNameWithSource(cfg.serviceName, cfg.serviceSource)) @@ -217,8 +217,8 @@ func (tr *Tracer) TraceAdmin(ctx context.Context, method string, resourcePath st return ctx, finish } -// extracts the GCP project ID from a Pubsub resource name of the form -// "projects/{project}/topics/{topic}" or "projects/{project}/subscriptions/{subscription}" +// extracts the GCP project ID from a Pubsub resource name starting with +// "projects/{project}. e.g. schemas, snapshots, topics and subscriptions func projectIDFromResourceName(name string) string { const prefix = "projects/" if !strings.HasPrefix(name, prefix) { diff --git a/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go index d9b92a4ee33..bb4dc07ad65 100644 --- a/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go @@ -120,7 +120,7 @@ func (b *adminBase) adminTrace(method, resourcePath string) *trace.Trace { "component": "cloud.google.com/go/pubsub.v1", "messaging.system": "googlepubsub", "pubsub.method": method, - "gcloud.project_id": adminProject, + ext.GCPProjectID: adminProject, }, } } diff --git a/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go index 8320adbec1e..cfaaa5362a4 100644 --- a/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go @@ -119,7 +119,7 @@ func (b *adminBase) adminTrace(method, resourcePath string) *trace.Trace { "component": "cloud.google.com/go/pubsub.v2", "messaging.system": "googlepubsub", "pubsub.method": method, - "gcloud.project_id": testProject, + ext.GCPProjectID: testProject, }, } } From afabbfa9c5533e773075036c11cc6832f401aff9 Mon Sep 17 00:00:00 2001 From: Olivier John Ndjike Nzia Date: Wed, 22 Jul 2026 11:28:53 -0400 Subject: [PATCH 33/33] pass ci --- contrib/cloud.google.com/go/pubsubtrace/admin.go | 2 +- .../_integration/gcp_pubsub.v1/gcp_pubsub_admin.go | 11 ++++++----- .../_integration/gcp_pubsub.v2/gcp_pubsub_admin.go | 11 ++++++----- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/contrib/cloud.google.com/go/pubsubtrace/admin.go b/contrib/cloud.google.com/go/pubsubtrace/admin.go index ec0eedabb47..6d4e0df4fcc 100644 --- a/contrib/cloud.google.com/go/pubsubtrace/admin.go +++ b/contrib/cloud.google.com/go/pubsubtrace/admin.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2025 Datadog, Inc. - // v2 admin request→resource mapping, implemented as a grpc unary client interceptor. +// v2 admin request→resource mapping, implemented as a grpc unary client interceptor. // Uses cloud.google.com/go/pubsub/v2/apiv1/pubsubpb, which is distinct from v1's pubsubpb // (see admin_v1.go). diff --git a/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go index bb4dc07ad65..8afe854e3e9 100644 --- a/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub_admin.go @@ -28,6 +28,7 @@ import ( "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" ) @@ -116,11 +117,11 @@ func (b *adminBase) adminTrace(method, resourcePath string) *trace.Trace { "service": "gcp_pubsub.v1.test", }, Meta: map[string]string{ - "span.kind": "client", - "component": "cloud.google.com/go/pubsub.v1", - "messaging.system": "googlepubsub", - "pubsub.method": method, - ext.GCPProjectID: adminProject, + "span.kind": "client", + "component": "cloud.google.com/go/pubsub.v1", + "messaging.system": "googlepubsub", + "pubsub.method": method, + ext.GCPProjectID: adminProject, }, } } diff --git a/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go index cfaaa5362a4..a939cb264df 100644 --- a/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go +++ b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub_admin.go @@ -28,6 +28,7 @@ import ( "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" ) @@ -115,11 +116,11 @@ func (b *adminBase) adminTrace(method, resourcePath string) *trace.Trace { "service": "gcp_pubsub.v2.test", }, Meta: map[string]string{ - "span.kind": "client", - "component": "cloud.google.com/go/pubsub.v2", - "messaging.system": "googlepubsub", - "pubsub.method": method, - ext.GCPProjectID: testProject, + "span.kind": "client", + "component": "cloud.google.com/go/pubsub.v2", + "messaging.system": "googlepubsub", + "pubsub.method": method, + ext.GCPProjectID: testProject, }, } }