diff --git a/CHANGELOG.md b/CHANGELOG.md index 87ce2652586..25073b7b422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## Changed +- The `go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc` package instrumentation no longer accepts a `Tracer` as an argument to the interceptor function. + Instead, a new `WithTracerProvider` option is added to configure the `TracerProvider` used when creating the `Tracer` for the instrumentation. (#373) - Remove `go.opentelemetry.io/otel/sdk` dependency from instrumentation. (#381) ### Fixed diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/benchmark_test.go b/instrumentation/google.golang.org/grpc/otelgrpc/benchmark_test.go index 4ec04c2b6cd..d15ee30256f 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/benchmark_test.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/benchmark_test.go @@ -28,12 +28,9 @@ import ( "go.opentelemetry.io/otel/api/trace/tracetest" ) -const ( - bufSize = 2048 - instName = "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" -) +const bufSize = 2048 -var tracer = tracetest.NewTracerProvider().Tracer(instName) +var tracerProvider = tracetest.NewTracerProvider() func benchmark(b *testing.B, cOpt []grpc.DialOption, sOpt []grpc.ServerOption) { l := bufconn.Listen(bufSize) @@ -85,24 +82,32 @@ func BenchmarkNoInstrumentation(b *testing.B) { func BenchmarkUnaryServerInterceptor(b *testing.B) { benchmark(b, nil, []grpc.ServerOption{ - grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor(tracer)), + grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor( + otelgrpc.WithTracerProvider(tracerProvider), + )), }) } func BenchmarkStreamServerInterceptor(b *testing.B) { benchmark(b, nil, []grpc.ServerOption{ - grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor(tracer)), + grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor( + otelgrpc.WithTracerProvider(tracerProvider), + )), }) } func BenchmarkUnaryClientInterceptor(b *testing.B) { benchmark(b, []grpc.DialOption{ - grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor(tracer)), + grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor( + otelgrpc.WithTracerProvider(tracerProvider), + )), }, nil) } func BenchmarkStreamClientInterceptor(b *testing.B) { benchmark(b, []grpc.DialOption{ - grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor(tracer)), + grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor( + otelgrpc.WithTracerProvider(tracerProvider), + )), }, nil) } diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/example/client/main.go b/instrumentation/google.golang.org/grpc/otelgrpc/example/client/main.go index a2e5112ba28..da0775dd66e 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/example/client/main.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/example/client/main.go @@ -22,7 +22,6 @@ import ( "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/example/api" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/example/config" - "go.opentelemetry.io/otel/api/global" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" @@ -35,8 +34,8 @@ func main() { var conn *grpc.ClientConn conn, err := grpc.Dial(":7777", grpc.WithInsecure(), - grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor(global.Tracer(""))), - grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor(global.Tracer(""))), + grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor()), + grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor()), ) if err != nil { diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/example/go.sum b/instrumentation/google.golang.org/grpc/otelgrpc/example/go.sum index 646d802a4c3..36ad04228da 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/example/go.sum +++ b/instrumentation/google.golang.org/grpc/otelgrpc/example/go.sum @@ -10,6 +10,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -33,12 +35,19 @@ github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +go.opentelemetry.io/contrib v0.12.0 h1:vLtYifaYQD8i9ncT07vLqUmo2RivECfpNJ2kv3YKnK0= +go.opentelemetry.io/contrib v0.12.0/go.mod h1:onlxH6TKFRkW2Xgc5IO37kPYz3v7wMzh/FrBxsQxCt4= go.opentelemetry.io/otel v0.12.0 h1:bwWaPd/h2q+U6KdKaAiOS5GLwOMd1LDt9iNaeyIoAI8= go.opentelemetry.io/otel v0.12.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY= go.opentelemetry.io/otel/exporters/stdout v0.12.0 h1:ji9VVPmKg+oONcqwULcO0AHZseGU6CFOIdvwKCxNZ9Y= @@ -96,6 +105,8 @@ google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyz google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/example/server/main.go b/instrumentation/google.golang.org/grpc/otelgrpc/example/server/main.go index 0682f399f99..cba5481146a 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/example/server/main.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/example/server/main.go @@ -24,7 +24,6 @@ import ( "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/example/api" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/example/config" - "go.opentelemetry.io/otel/api/global" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" @@ -118,8 +117,8 @@ func main() { } s := grpc.NewServer( - grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor(global.Tracer(""))), - grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor(global.Tracer(""))), + grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()), + grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor()), ) api.RegisterHelloServiceServer(s, &server{}) diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/example_interceptor_test.go b/instrumentation/google.golang.org/grpc/otelgrpc/example_interceptor_test.go index 8a0a1d55dd9..11c836ce030 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/example_interceptor_test.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/example_interceptor_test.go @@ -16,36 +16,20 @@ package otelgrpc import ( "google.golang.org/grpc" - - "go.opentelemetry.io/otel/api/global" ) func ExampleStreamClientInterceptor() { - tracer := global.Tracer("client-instrumentation") - _, _ = grpc.Dial( - "localhost", - grpc.WithStreamInterceptor(StreamClientInterceptor(tracer)), - ) + _, _ = grpc.Dial("localhost", grpc.WithStreamInterceptor(StreamClientInterceptor())) } func ExampleUnaryClientInterceptor() { - tracer := global.Tracer("client-instrumentation") - _, _ = grpc.Dial( - "localhost", - grpc.WithUnaryInterceptor(UnaryClientInterceptor(tracer)), - ) + _, _ = grpc.Dial("localhost", grpc.WithUnaryInterceptor(UnaryClientInterceptor())) } func ExampleStreamServerInterceptor() { - tracer := global.Tracer("server-instrumentation") - _ = grpc.NewServer( - grpc.StreamInterceptor(StreamServerInterceptor(tracer)), - ) + _ = grpc.NewServer(grpc.StreamInterceptor(StreamServerInterceptor())) } func ExampleUnaryServerInterceptor() { - tracer := global.Tracer("server-instrumentation") - _ = grpc.NewServer( - grpc.UnaryInterceptor(UnaryServerInterceptor(tracer)), - ) + _ = grpc.NewServer(grpc.UnaryInterceptor(UnaryServerInterceptor())) } diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/go.mod b/instrumentation/google.golang.org/grpc/otelgrpc/go.mod index 6a2c7314abb..4070dbb8751 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/go.mod +++ b/instrumentation/google.golang.org/grpc/otelgrpc/go.mod @@ -2,9 +2,12 @@ module go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgr go 1.14 +replace go.opentelemetry.io/contrib => ../../../../ + require ( github.com/golang/protobuf v1.4.2 github.com/stretchr/testify v1.6.1 + go.opentelemetry.io/contrib v0.12.0 go.opentelemetry.io/otel v0.12.0 google.golang.org/grpc v1.32.0 ) diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/go.sum b/instrumentation/google.golang.org/grpc/otelgrpc/go.sum index ee45773e987..709d44005e2 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/go.sum +++ b/instrumentation/google.golang.org/grpc/otelgrpc/go.sum @@ -6,6 +6,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -27,6 +29,11 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -81,6 +88,8 @@ google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyz google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/grpc_test.go b/instrumentation/google.golang.org/grpc/otelgrpc/grpc_test.go index d3e0bd42585..d63e4ecae1c 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/grpc_test.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/grpc_test.go @@ -27,7 +27,6 @@ import ( "google.golang.org/grpc/test/bufconn" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" - "go.opentelemetry.io/otel/api/trace" "go.opentelemetry.io/otel/api/trace/tracetest" "go.opentelemetry.io/otel/label" "go.opentelemetry.io/otel/semconv" @@ -73,51 +72,50 @@ func doCalls(cOpt []grpc.DialOption, sOpt []grpc.ServerOption) error { func TestInterceptors(t *testing.T) { clientUnarySR := new(tracetest.StandardSpanRecorder) - clientUnaryTracer := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(clientUnarySR)).Tracer("TestUnaryClientInterceptor") + clientUnaryTP := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(clientUnarySR)) clientStreamSR := new(tracetest.StandardSpanRecorder) - clientStreamTracer := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(clientStreamSR)).Tracer("TestStreamClientInterceptor") + clientStreamTP := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(clientStreamSR)) serverUnarySR := new(tracetest.StandardSpanRecorder) - serverUnaryTracer := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(serverUnarySR)).Tracer("TestUnaryServerInterceptor") + serverUnaryTP := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(serverUnarySR)) serverStreamSR := new(tracetest.StandardSpanRecorder) - serverStreamTracer := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(serverStreamSR)).Tracer("TestStreamServerInterceptor") + serverStreamTP := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(serverStreamSR)) assert.NoError(t, doCalls( []grpc.DialOption{ - grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor(clientUnaryTracer)), - grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor(clientStreamTracer)), + grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor(otelgrpc.WithTracerProvider(clientUnaryTP))), + grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor(otelgrpc.WithTracerProvider(clientStreamTP))), }, []grpc.ServerOption{ - grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor(serverUnaryTracer)), - grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor(serverStreamTracer)), + grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor(otelgrpc.WithTracerProvider(serverUnaryTP))), + grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor(otelgrpc.WithTracerProvider(serverStreamTP))), }, )) t.Run("UnaryClientSpans", func(t *testing.T) { - checkUnaryClientSpans(t, clientUnaryTracer, clientUnarySR.Completed()) + checkUnaryClientSpans(t, clientUnarySR.Completed()) }) t.Run("StreamClientSpans", func(t *testing.T) { - checkStreamClientSpans(t, clientStreamTracer, clientStreamSR.Completed()) + checkStreamClientSpans(t, clientStreamSR.Completed()) }) t.Run("UnaryServerSpans", func(t *testing.T) { - checkUnaryServerSpans(t, serverUnaryTracer, serverUnarySR.Completed()) + checkUnaryServerSpans(t, serverUnarySR.Completed()) }) t.Run("StreamServerSpans", func(t *testing.T) { - checkStreamServerSpans(t, serverStreamTracer, serverStreamSR.Completed()) + checkStreamServerSpans(t, serverStreamSR.Completed()) }) } -func checkUnaryClientSpans(t *testing.T, tracer trace.Tracer, spans []*tracetest.Span) { +func checkUnaryClientSpans(t *testing.T, spans []*tracetest.Span) { require.Len(t, spans, 2) emptySpan := spans[0] assert.True(t, emptySpan.Ended()) - assert.Equal(t, tracer, emptySpan.Tracer()) assert.Equal(t, "grpc.testing.TestService/EmptyCall", emptySpan.Name()) assert.Equal(t, []tracetest.Event{ { @@ -145,7 +143,6 @@ func checkUnaryClientSpans(t *testing.T, tracer trace.Tracer, spans []*tracetest largeSpan := spans[1] assert.True(t, largeSpan.Ended()) - assert.Equal(t, tracer, largeSpan.Tracer()) assert.Equal(t, "grpc.testing.TestService/UnaryCall", largeSpan.Name()) assert.Equal(t, []tracetest.Event{ { @@ -174,12 +171,11 @@ func checkUnaryClientSpans(t *testing.T, tracer trace.Tracer, spans []*tracetest }, largeSpan.Attributes()) } -func checkStreamClientSpans(t *testing.T, tracer trace.Tracer, spans []*tracetest.Span) { +func checkStreamClientSpans(t *testing.T, spans []*tracetest.Span) { require.Len(t, spans, 3) streamInput := spans[0] assert.True(t, streamInput.Ended()) - assert.Equal(t, tracer, streamInput.Tracer()) assert.Equal(t, "grpc.testing.TestService/StreamingInputCall", streamInput.Name()) // sizes from reqSizes in "google.golang.org/grpc/interop". assert.Equal(t, []tracetest.Event{ @@ -225,7 +221,6 @@ func checkStreamClientSpans(t *testing.T, tracer trace.Tracer, spans []*tracetes streamOutput := spans[1] assert.True(t, streamOutput.Ended()) - assert.Equal(t, tracer, streamOutput.Tracer()) assert.Equal(t, "grpc.testing.TestService/StreamingOutputCall", streamOutput.Name()) // sizes from respSizes in "google.golang.org/grpc/interop". assert.Equal(t, []tracetest.Event{ @@ -278,7 +273,6 @@ func checkStreamClientSpans(t *testing.T, tracer trace.Tracer, spans []*tracetes pingPong := spans[2] assert.True(t, pingPong.Ended()) - assert.Equal(t, tracer, pingPong.Tracer()) assert.Equal(t, "grpc.testing.TestService/FullDuplexCall", pingPong.Name()) assert.Equal(t, []tracetest.Event{ { @@ -353,12 +347,11 @@ func checkStreamClientSpans(t *testing.T, tracer trace.Tracer, spans []*tracetes }, pingPong.Attributes()) } -func checkStreamServerSpans(t *testing.T, tracer trace.Tracer, spans []*tracetest.Span) { +func checkStreamServerSpans(t *testing.T, spans []*tracetest.Span) { require.Len(t, spans, 3) streamInput := spans[0] assert.True(t, streamInput.Ended()) - assert.Equal(t, tracer, streamInput.Tracer()) assert.Equal(t, "grpc.testing.TestService/StreamingInputCall", streamInput.Name()) // sizes from reqSizes in "google.golang.org/grpc/interop". assert.Equal(t, []tracetest.Event{ @@ -411,7 +404,6 @@ func checkStreamServerSpans(t *testing.T, tracer trace.Tracer, spans []*tracetes streamOutput := spans[1] assert.True(t, streamOutput.Ended()) - assert.Equal(t, tracer, streamOutput.Tracer()) assert.Equal(t, "grpc.testing.TestService/StreamingOutputCall", streamOutput.Name()) // sizes from respSizes in "google.golang.org/grpc/interop". assert.Equal(t, []tracetest.Event{ @@ -464,7 +456,6 @@ func checkStreamServerSpans(t *testing.T, tracer trace.Tracer, spans []*tracetes pingPong := spans[2] assert.True(t, pingPong.Ended()) - assert.Equal(t, tracer, pingPong.Tracer()) assert.Equal(t, "grpc.testing.TestService/FullDuplexCall", pingPong.Name()) assert.Equal(t, []tracetest.Event{ { @@ -539,12 +530,11 @@ func checkStreamServerSpans(t *testing.T, tracer trace.Tracer, spans []*tracetes }, pingPong.Attributes()) } -func checkUnaryServerSpans(t *testing.T, tracer trace.Tracer, spans []*tracetest.Span) { +func checkUnaryServerSpans(t *testing.T, spans []*tracetest.Span) { require.Len(t, spans, 2) emptySpan := spans[0] assert.True(t, emptySpan.Ended()) - assert.Equal(t, tracer, emptySpan.Tracer()) assert.Equal(t, "grpc.testing.TestService/EmptyCall", emptySpan.Name()) assert.Equal(t, []tracetest.Event{ { @@ -572,7 +562,6 @@ func checkUnaryServerSpans(t *testing.T, tracer trace.Tracer, spans []*tracetest largeSpan := spans[1] assert.True(t, largeSpan.Ended()) - assert.Equal(t, tracer, largeSpan.Tracer()) assert.Equal(t, "grpc.testing.TestService/UnaryCall", largeSpan.Name()) assert.Equal(t, []tracetest.Event{ { diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/grpctrace.go b/instrumentation/google.golang.org/grpc/otelgrpc/grpctrace.go index 68d04e0cb00..ae8e7536aee 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/grpctrace.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/grpctrace.go @@ -26,27 +26,54 @@ import ( "go.opentelemetry.io/otel/label" ) -// Option is a function that allows configuration of the grpc Extract() -// and Inject() functions -type Option func(*config) +// instrumentationName is the name of this instrumentation package. +const instrumentationName = "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" +// config is a group of options for this instrumentation. type config struct { - propagators propagation.Propagators + Propagators propagation.Propagators + TracerProvider trace.TracerProvider } +// Option applies an option value for a config. +type Option interface { + Apply(*config) +} + +// newConfig returns a config configured with all the passed Options. func newConfig(opts []Option) *config { - c := &config{propagators: global.Propagators()} + c := &config{ + Propagators: global.Propagators(), + TracerProvider: global.TracerProvider(), + } for _, o := range opts { - o(c) + o.Apply(c) } return c } -// WithPropagators sets the propagators to use for Extraction and Injection -func WithPropagators(props propagation.Propagators) Option { - return func(c *config) { - c.propagators = props - } +type propagatorsOption struct{ p propagation.Propagators } + +func (o propagatorsOption) Apply(c *config) { + c.Propagators = o.p +} + +// WithPropagators returns an Option to use the Propagators when extracting +// and injecting trace context from requests. +func WithPropagators(p propagation.Propagators) Option { + return propagatorsOption{p: p} +} + +type tracerProviderOption struct{ tp trace.TracerProvider } + +func (o tracerProviderOption) Apply(c *config) { + c.TracerProvider = o.tp +} + +// WithTracerProvider returns an Option to use the TracerProvider when +// creating a Tracer. +func WithTracerProvider(tp trace.TracerProvider) Option { + return tracerProviderOption{tp: tp} } type metadataSupplier struct { @@ -70,7 +97,7 @@ func (s *metadataSupplier) Set(key string, value string) { // requests. func Inject(ctx context.Context, metadata *metadata.MD, opts ...Option) { c := newConfig(opts) - propagation.InjectHTTP(ctx, c.propagators, &metadataSupplier{ + propagation.InjectHTTP(ctx, c.Propagators, &metadataSupplier{ metadata: metadata, }) } @@ -80,7 +107,7 @@ func Inject(ctx context.Context, metadata *metadata.MD, opts ...Option) { // This function is meant to be used on incoming requests. func Extract(ctx context.Context, metadata *metadata.MD, opts ...Option) ([]label.KeyValue, trace.SpanContext) { c := newConfig(opts) - ctx = propagation.ExtractHTTP(ctx, c.propagators, &metadataSupplier{ + ctx = propagation.ExtractHTTP(ctx, c.Propagators, &metadataSupplier{ metadata: metadata, }) diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go b/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go index 3664d916d57..0f155ddf324 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go @@ -34,6 +34,8 @@ import ( "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/label" "go.opentelemetry.io/otel/semconv" + + otelcontrib "go.opentelemetry.io/contrib" ) type messageType label.KeyValue @@ -63,7 +65,7 @@ var ( // UnaryClientInterceptor returns a grpc.UnaryClientInterceptor suitable // for use in a grpc.Dial call. -func UnaryClientInterceptor(tracer trace.Tracer, opts ...Option) grpc.UnaryClientInterceptor { +func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor { return func( ctx context.Context, method string, @@ -75,6 +77,11 @@ func UnaryClientInterceptor(tracer trace.Tracer, opts ...Option) grpc.UnaryClien requestMetadata, _ := metadata.FromOutgoingContext(ctx) metadataCopy := requestMetadata.Copy() + tracer := newConfig(opts).TracerProvider.Tracer( + instrumentationName, + trace.WithInstrumentationVersion(otelcontrib.SemVersion()), + ) + name, attr := spanInfo(method, cc.Target()) var span trace.Span ctx, span = tracer.Start( @@ -236,7 +243,7 @@ func (w *clientStream) sendStreamEvent(eventType streamEventType, err error) { // StreamClientInterceptor returns a grpc.StreamClientInterceptor suitable // for use in a grpc.Dial call. -func StreamClientInterceptor(tracer trace.Tracer, opts ...Option) grpc.StreamClientInterceptor { +func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor { return func( ctx context.Context, desc *grpc.StreamDesc, @@ -248,6 +255,11 @@ func StreamClientInterceptor(tracer trace.Tracer, opts ...Option) grpc.StreamCli requestMetadata, _ := metadata.FromOutgoingContext(ctx) metadataCopy := requestMetadata.Copy() + tracer := newConfig(opts).TracerProvider.Tracer( + instrumentationName, + trace.WithInstrumentationVersion(otelcontrib.SemVersion()), + ) + name, attr := spanInfo(method, cc.Target()) var span trace.Span ctx, span = tracer.Start( @@ -282,7 +294,7 @@ func StreamClientInterceptor(tracer trace.Tracer, opts ...Option) grpc.StreamCli // UnaryServerInterceptor returns a grpc.UnaryServerInterceptor suitable // for use in a grpc.NewServer call. -func UnaryServerInterceptor(tracer trace.Tracer, opts ...Option) grpc.UnaryServerInterceptor { +func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor { return func( ctx context.Context, req interface{}, @@ -297,6 +309,11 @@ func UnaryServerInterceptor(tracer trace.Tracer, opts ...Option) grpc.UnaryServe MultiKV: entries, })) + tracer := newConfig(opts).TracerProvider.Tracer( + instrumentationName, + trace.WithInstrumentationVersion(otelcontrib.SemVersion()), + ) + name, attr := spanInfo(info.FullMethod, peerFromCtx(ctx)) ctx, span := tracer.Start( trace.ContextWithRemoteSpanContext(ctx, spanCtx), @@ -364,7 +381,7 @@ func wrapServerStream(ctx context.Context, ss grpc.ServerStream) *serverStream { // StreamServerInterceptor returns a grpc.StreamServerInterceptor suitable // for use in a grpc.NewServer call. -func StreamServerInterceptor(tracer trace.Tracer, opts ...Option) grpc.StreamServerInterceptor { +func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor { return func( srv interface{}, ss grpc.ServerStream, @@ -381,6 +398,11 @@ func StreamServerInterceptor(tracer trace.Tracer, opts ...Option) grpc.StreamSer MultiKV: entries, })) + tracer := newConfig(opts).TracerProvider.Tracer( + instrumentationName, + trace.WithInstrumentationVersion(otelcontrib.SemVersion()), + ) + name, attr := spanInfo(info.FullMethod, peerFromCtx(ctx)) ctx, span := tracer.Start( trace.ContextWithRemoteSpanContext(ctx, spanCtx), diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/interceptor_test.go b/instrumentation/google.golang.org/grpc/otelgrpc/interceptor_test.go index c75f017d59d..a78b151d57a 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/interceptor_test.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/interceptor_test.go @@ -89,8 +89,7 @@ func TestUnaryClientInterceptor(t *testing.T) { sr := NewSpanRecorder() tp := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(sr)) - tracer := tp.Tracer("grpc/client") - unaryInterceptor := UnaryClientInterceptor(tracer) + unaryInterceptor := UnaryClientInterceptor(WithTracerProvider(tp)) req := &mockProtoMessage{} reply := &mockProtoMessage{} @@ -259,8 +258,7 @@ func TestStreamClientInterceptor(t *testing.T) { // tracer sr := NewSpanRecorder() tp := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(sr)) - tracer := tp.Tracer("grpc/Server") - streamCI := StreamClientInterceptor(tracer) + streamCI := StreamClientInterceptor(WithTracerProvider(tp)) var mockClStr mockClientStream method := "/github.com.serviceName/bar" @@ -343,8 +341,7 @@ func TestStreamClientInterceptor(t *testing.T) { func TestServerInterceptorError(t *testing.T) { sr := NewSpanRecorder() tp := tracetest.NewTracerProvider(tracetest.WithSpanRecorder(sr)) - tracer := tp.Tracer("grpc/Server") - usi := UnaryServerInterceptor(tracer) + usi := UnaryServerInterceptor(WithTracerProvider(tp)) deniedErr := status.Error(codes.PermissionDenied, "PERMISSION_DENIED_TEXT") handler := func(_ context.Context, _ interface{}) (interface{}, error) { return nil, deniedErr