Skip to content

Commit da363e7

Browse files
authored
Merge pull request #21 from janwytze/fix/sentry-performance
Fix parent transaction linking, add more details to transactions and update to newest Sentry SDK
2 parents 5a998af + bb15dfc commit da363e7

File tree

4 files changed

+63
-30
lines changed

4 files changed

+63
-30
lines changed

client_interceptors.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,18 @@ func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor {
2929
operationName = o.OperationNameOverride
3030
}
3131

32-
span := sentry.StartSpan(ctx, operationName)
32+
span := sentry.StartSpan(ctx, operationName, sentry.WithDescription(method))
33+
span.SetData("grpc.request.method", method)
3334
ctx = span.Context()
3435
md, ok := metadata.FromOutgoingContext(ctx)
3536
if ok {
36-
md.Append("sentry-trace", span.ToSentryTrace())
37+
md.Append(sentry.SentryTraceHeader, span.ToSentryTrace())
38+
md.Append(sentry.SentryBaggageHeader, span.ToBaggage())
3739
} else {
38-
md = metadata.Pairs("sentry-trace", span.ToSentryTrace())
40+
md = metadata.Pairs(
41+
sentry.SentryTraceHeader, span.ToSentryTrace(),
42+
sentry.SentryBaggageHeader, span.ToBaggage(),
43+
)
3944
}
4045
ctx = metadata.NewOutgoingContext(ctx, md)
4146
defer span.Finish()
@@ -70,13 +75,16 @@ func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor {
7075
operationName = o.OperationNameOverride
7176
}
7277

73-
span := sentry.StartSpan(ctx, operationName)
78+
span := sentry.StartSpan(ctx, operationName, sentry.WithDescription(method))
79+
span.SetData("grpc.request.method", method)
7480
ctx = span.Context()
7581
md, ok := metadata.FromOutgoingContext(ctx)
7682
if ok {
77-
md.Append("sentry-trace", span.ToSentryTrace())
83+
md.Append(sentry.SentryTraceHeader, span.ToSentryTrace())
84+
md.Append(sentry.SentryBaggageHeader, span.ToBaggage())
7885
} else {
79-
md = metadata.Pairs("sentry-trace", span.ToSentryTrace())
86+
md = metadata.Pairs(sentry.SentryTraceHeader, span.ToSentryTrace())
87+
md = metadata.Pairs(sentry.SentryBaggageHeader, span.ToBaggage())
8088
}
8189
ctx = metadata.NewOutgoingContext(ctx, md)
8290
defer span.Finish()

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/johnbellone/grpc-middleware-sentry
33
go 1.17
44

55
require (
6-
github.com/getsentry/sentry-go v0.20.0
6+
github.com/getsentry/sentry-go v0.27.0
77
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0
88
google.golang.org/grpc v1.56.3
99
)

go.sum

+1
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,7 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
689689
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
690690
github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ=
691691
github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
692+
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
692693
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
693694
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
694695
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=

server_interceptors.go

+47-23
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,20 @@ func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor {
4747
}
4848

4949
md, _ := metadata.FromIncomingContext(ctx) // nil check in ContinueFromGrpcMetadata
50-
span := sentry.StartSpan(ctx, operationName, ContinueFromGrpcMetadata(md))
51-
ctx = span.Context()
52-
defer span.Finish()
50+
51+
// Use the FullMethod as transaction name and as description. This way the FullMethod will show up under
52+
// the span, and under the transaction.
53+
tx := sentry.StartTransaction(
54+
ctx,
55+
info.FullMethod,
56+
sentry.WithOpName(operationName),
57+
sentry.WithDescription(info.FullMethod),
58+
sentry.WithTransactionSource(sentry.SourceURL),
59+
ContinueFromGrpcMetadata(md),
60+
)
61+
tx.SetData("grpc.request.method", info.FullMethod)
62+
ctx = tx.Context()
63+
defer tx.Finish()
5364

5465
if o.CaptureRequestBody {
5566
// TODO: Perhaps makes sense to use SetRequestBody instead?
@@ -65,8 +76,11 @@ func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor {
6576
}
6677

6778
hub.CaptureException(err)
79+
80+
// Always sample when an error has occurred.
81+
tx.Sampled = sentry.SampledTrue
6882
}
69-
span.Status = toSpanStatus(status.Code(err))
83+
tx.Status = toSpanStatus(status.Code(err))
7084

7185
return resp, err
7286
}
@@ -92,9 +106,20 @@ func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor {
92106
}
93107

94108
md, _ := metadata.FromIncomingContext(ctx) // nil check in ContinueFromGrpcMetadata
95-
span := sentry.StartSpan(ctx, operationName, ContinueFromGrpcMetadata(md))
96-
ctx = span.Context()
97-
defer span.Finish()
109+
110+
// Use the FullMethod as transaction name and as description. This way the FullMethod will show up under
111+
// the span, and under the transaction.
112+
tx := sentry.StartTransaction(
113+
ctx,
114+
info.FullMethod,
115+
sentry.WithOpName(operationName),
116+
sentry.WithDescription(info.FullMethod),
117+
sentry.WithTransactionSource(sentry.SourceURL),
118+
ContinueFromGrpcMetadata(md),
119+
)
120+
tx.SetData("grpc.request.method", info.FullMethod)
121+
ctx = tx.Context()
122+
defer tx.Finish()
98123

99124
stream := grpc_middleware.WrapServerStream(ss)
100125
stream.WrappedContext = ctx
@@ -109,8 +134,11 @@ func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor {
109134
}
110135

111136
hub.CaptureException(err)
137+
138+
// Always sample when an error has occurred.
139+
tx.Sampled = sentry.SampledTrue
112140
}
113-
span.Status = toSpanStatus(status.Code(err))
141+
tx.Status = toSpanStatus(status.Code(err))
114142

115143
return err
116144
}
@@ -120,23 +148,19 @@ func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor {
120148
// an existing trace. If it cannot detect an existing trace in the request, the
121149
// span will be left unchanged.
122150
func ContinueFromGrpcMetadata(md metadata.MD) sentry.SpanOption {
123-
return func(s *sentry.Span) {
124-
if md == nil {
125-
return
126-
}
151+
if md == nil {
152+
return nil
153+
}
127154

128-
trace, ok := md["sentry-trace"]
129-
if !ok {
130-
return
131-
}
132-
if len(trace) != 1 {
133-
return
134-
}
135-
if trace[0] == "" {
136-
return
137-
}
138-
updateFromSentryTrace(s, []byte(trace[0]))
155+
var trace, baggage string
156+
if traceMetadata, ok := md[sentry.SentryTraceHeader]; ok && len(traceMetadata) > 0 {
157+
trace = traceMetadata[0]
139158
}
159+
if baggageMetadata, ok := md[sentry.SentryBaggageHeader]; ok && len(baggageMetadata) > 0 {
160+
baggage = baggageMetadata[0]
161+
}
162+
163+
return sentry.ContinueFromHeaders(trace, baggage)
140164
}
141165

142166
// Re-export of functions from tracing.go of sentry-go

0 commit comments

Comments
 (0)