Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: DataDog/dd-trace-go
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.49.0
Choose a base ref
...
head repository: DataDog/dd-trace-go
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.49.1
Choose a head ref
  • 3 commits
  • 3 files changed
  • 2 contributors

Commits on Apr 5, 2023

  1. contrib/google.golang.org/grpc: Add WithMetadataTags & WithRequestTag…

    …s to grpc server stream
    
    Co-authored-by: Marc Ruiz <radykal@radykal.com>
    ajgajg1134 and radykal-com authored Apr 5, 2023
    Copy the full SHA
    0a99b4f View commit details
  2. Copy the full SHA
    d9a329f View commit details
  3. internal/version: v1.49.1

    ajgajg1134 committed Apr 5, 2023
    Copy the full SHA
    2d31bd2 View commit details
Showing with 40 additions and 19 deletions.
  1. +10 −1 contrib/google.golang.org/grpc/grpc_test.go
  2. +29 −17 contrib/google.golang.org/grpc/server.go
  3. +1 −1 internal/version/version.go
11 changes: 10 additions & 1 deletion contrib/google.golang.org/grpc/grpc_test.go
Original file line number Diff line number Diff line change
@@ -343,7 +343,7 @@ func TestSpanTree(t *testing.T) {
mt := mocktracer.Start()
defer mt.Stop()

rig, err := newRig(true)
rig, err := newRig(true, WithRequestTags(), WithMetadataTags())
if err != nil {
t.Fatalf("error setting up rig: %s", err)
}
@@ -358,6 +358,7 @@ func TestSpanTree(t *testing.T) {
// -> server receive message -> server send message
// -> client receive message
ctx, cancel := context.WithCancel(ctx)
ctx = metadata.AppendToOutgoingContext(ctx, "custom_metadata_key", "custom_metadata_value")
stream, err := client.StreamPing(ctx)
assert.NoError(err)
err = stream.SendMsg(&FixtureRequest{Name: "break"})
@@ -402,13 +403,21 @@ func TestSpanTree(t *testing.T) {
assertSpan(t, clientStreamSpan, rootSpan, "grpc.client", "/grpc.Fixture/StreamPing")
assertSpan(t, serverStreamSpan, clientStreamSpan, "grpc.server", "/grpc.Fixture/StreamPing")
var clientSpans, serverSpans int
var reqMsgFound bool
for _, ms := range messageSpans {
if ms.ParentID() == clientStreamSpan.SpanID() {
assertSpan(t, ms, clientStreamSpan, "grpc.message", "/grpc.Fixture/StreamPing")
clientSpans++
} else {
assertSpan(t, ms, serverStreamSpan, "grpc.message", "/grpc.Fixture/StreamPing")
serverSpans++
if !reqMsgFound {
assert.Equal("{\"name\":\"break\"}", ms.Tag(tagRequest))
metadataTag := ms.Tag(tagMetadataPrefix + "custom_metadata_key").([]string)
assert.Len(metadataTag, 1)
assert.Equal("custom_metadata_value", metadataTag[0])
reqMsgFound = true
}
}
}
assert.Equal(2, clientSpans)
46 changes: 29 additions & 17 deletions contrib/google.golang.org/grpc/server.go
Original file line number Diff line number Diff line change
@@ -50,7 +50,11 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) {
ss.cfg.startSpanOptions(tracer.Measured())...,
)
span.SetTag(ext.Component, "google.golang.org/grpc")
defer func() { finishWithError(span, err, ss.cfg) }()
defer func() {
withMetadataTags(ss.ctx, ss.cfg, span)
withRequestTags(ss.cfg, m, span)
finishWithError(span, err, ss.cfg)
}()
}
err = ss.ServerStream.RecvMsg(m)
return err
@@ -147,22 +151,8 @@ func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor {
tracer.Tag(ext.SpanKind, ext.SpanKindServer))...,
)
span.SetTag(tagMethodKind, methodKindUnary)
if cfg.withMetadataTags {
md, _ := metadata.FromIncomingContext(ctx) // nil is ok
for k, v := range md {
if _, ok := cfg.ignoredMetadata[k]; !ok {
span.SetTag(tagMetadataPrefix+k, v)
}
}
}
if cfg.withRequestTags {
var m jsonpb.Marshaler
if p, ok := req.(proto.Message); ok {
if s, err := m.MarshalToString(p); err == nil {
span.SetTag(tagRequest, s)
}
}
}
withMetadataTags(ctx, cfg, span)
withRequestTags(cfg, req, span)
if appsec.Enabled() {
handler = appsecUnaryHandlerMiddleware(span, handler)
}
@@ -171,3 +161,25 @@ func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor {
return resp, err
}
}

func withMetadataTags(ctx context.Context, cfg *config, span ddtrace.Span) {
if cfg.withMetadataTags {
md, _ := metadata.FromIncomingContext(ctx) // nil is ok
for k, v := range md {
if _, ok := cfg.ignoredMetadata[k]; !ok {
span.SetTag(tagMetadataPrefix+k, v)
}
}
}
}

func withRequestTags(cfg *config, req interface{}, span ddtrace.Span) {
if cfg.withRequestTags {
var m jsonpb.Marshaler
if p, ok := req.(proto.Message); ok {
if s, err := m.MarshalToString(p); err == nil {
span.SetTag(tagRequest, s)
}
}
}
}
2 changes: 1 addition & 1 deletion internal/version/version.go
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@ import (
// Tag specifies the current release tag. It needs to be manually
// updated. A test checks that the value of Tag never points to a
// git tag that is older than HEAD.
const Tag = "v1.49.0"
const Tag = "v1.49.1"

// Dissected version number. Filled during init()
var (