Skip to content

Commit

Permalink
optimize otelgrpc, avoid unnecessary allocations and copies
Browse files Browse the repository at this point in the history
Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
  • Loading branch information
bogdandrutu committed Oct 6, 2022
1 parent 1b75ca9 commit dce2b48
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 31 deletions.
32 changes: 24 additions & 8 deletions instrumentation/google.golang.org/grpc/otelgrpc/grpctrace.go
Expand Up @@ -135,29 +135,45 @@ func (s *metadataSupplier) Keys() []string {
// Inject injects correlation context and span context into the gRPC
// metadata object. This function is meant to be used on outgoing
// requests.
// Deprecated: Unnecessary public func.
func Inject(ctx context.Context, md *metadata.MD, opts ...Option) {
c := newConfig(opts)
inject(ctx, md, c.Propagators)
c.Propagators.Inject(ctx, &metadataSupplier{
metadata: md,
})
}

func inject(ctx context.Context, md *metadata.MD, propagators propagation.TextMapPropagator) {
func inject(ctx context.Context, propagators propagation.TextMapPropagator) context.Context {
md, ok := metadata.FromOutgoingContext(ctx)
if !ok {
md = metadata.MD{}
}
propagators.Inject(ctx, &metadataSupplier{
metadata: md,
metadata: &md,
})
return metadata.NewOutgoingContext(ctx, md)
}

// Extract returns the correlation context and span context that
// another service encoded in the gRPC metadata object with Inject.
// This function is meant to be used on incoming requests.
// Deprecated: Unnecessary public func.
func Extract(ctx context.Context, md *metadata.MD, opts ...Option) (baggage.Baggage, trace.SpanContext) {
c := newConfig(opts)
return extract(ctx, md, c.Propagators)
}

func extract(ctx context.Context, md *metadata.MD, propagators propagation.TextMapPropagator) (baggage.Baggage, trace.SpanContext) {
ctx = propagators.Extract(ctx, &metadataSupplier{
ctx = c.Propagators.Extract(ctx, &metadataSupplier{
metadata: md,
})

return baggage.FromContext(ctx), trace.SpanContextFromContext(ctx)
}

func extract(ctx context.Context, propagators propagation.TextMapPropagator) context.Context {
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
md = metadata.MD{}
}

return propagators.Extract(ctx, &metadataSupplier{
metadata: &md,
})
}
29 changes: 6 additions & 23 deletions instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go
Expand Up @@ -31,7 +31,6 @@ import (

"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/baggage"
"go.opentelemetry.io/otel/codes"
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
"go.opentelemetry.io/otel/trace"
Expand Down Expand Up @@ -87,9 +86,6 @@ func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor {
return invoker(ctx, method, req, reply, cc, callOpts...)
}

requestMetadata, _ := metadata.FromOutgoingContext(ctx)
metadataCopy := requestMetadata.Copy()

name, attr := spanInfo(method, cc.Target())
var span trace.Span
ctx, span = tracer.Start(
Expand All @@ -100,8 +96,7 @@ func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor {
)
defer span.End()

inject(ctx, &metadataCopy, cfg.Propagators)
ctx = metadata.NewOutgoingContext(ctx, metadataCopy)
ctx = inject(ctx, cfg.Propagators)

messageSent.Event(ctx, 1, req)

Expand Down Expand Up @@ -266,9 +261,6 @@ func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor {
return streamer(ctx, desc, cc, method, callOpts...)
}

requestMetadata, _ := metadata.FromOutgoingContext(ctx)
metadataCopy := requestMetadata.Copy()

name, attr := spanInfo(method, cc.Target())
var span trace.Span
ctx, span = tracer.Start(
Expand All @@ -278,8 +270,7 @@ func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor {
trace.WithAttributes(attr...),
)

inject(ctx, &metadataCopy, cfg.Propagators)
ctx = metadata.NewOutgoingContext(ctx, metadataCopy)
ctx = inject(ctx, cfg.Propagators)

s, err := streamer(ctx, desc, cc, method, callOpts...)
if err != nil {
Expand Down Expand Up @@ -332,15 +323,11 @@ func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor {
return handler(ctx, req)
}

requestMetadata, _ := metadata.FromIncomingContext(ctx)
metadataCopy := requestMetadata.Copy()

bags, spanCtx := Extract(ctx, &metadataCopy, opts...)
ctx = baggage.ContextWithBaggage(ctx, bags)
ctx = extract(ctx, cfg.Propagators)

name, attr := spanInfo(info.FullMethod, peerFromCtx(ctx))
ctx, span := tracer.Start(
trace.ContextWithRemoteSpanContext(ctx, spanCtx),
trace.ContextWithRemoteSpanContext(ctx, trace.SpanContextFromContext(ctx)),
name,
trace.WithSpanKind(trace.SpanKindServer),
trace.WithAttributes(attr...),
Expand Down Expand Up @@ -429,15 +416,11 @@ func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor {
return handler(srv, wrapServerStream(ctx, ss))
}

requestMetadata, _ := metadata.FromIncomingContext(ctx)
metadataCopy := requestMetadata.Copy()

bags, spanCtx := Extract(ctx, &metadataCopy, opts...)
ctx = baggage.ContextWithBaggage(ctx, bags)
ctx = extract(ctx, cfg.Propagators)

name, attr := spanInfo(info.FullMethod, peerFromCtx(ctx))
ctx, span := tracer.Start(
trace.ContextWithRemoteSpanContext(ctx, spanCtx),
trace.ContextWithRemoteSpanContext(ctx, trace.SpanContextFromContext(ctx)),
name,
trace.WithSpanKind(trace.SpanKindServer),
trace.WithAttributes(attr...),
Expand Down

0 comments on commit dce2b48

Please sign in to comment.