From 3dc0400deb34870da5e89113c4761c000ee2a15d Mon Sep 17 00:00:00 2001 From: dmathieu Date: Mon, 28 Aug 2023 11:00:42 +0200 Subject: [PATCH 1/7] initialize meter provider in otel-collector example --- example/otel-collector/go.mod | 4 ++ example/otel-collector/go.sum | 8 ++++ example/otel-collector/main.go | 71 +++++++++++++++++++++++++++------- 3 files changed, 69 insertions(+), 14 deletions(-) diff --git a/example/otel-collector/go.mod b/example/otel-collector/go.mod index c2d967bda81..c59caef538d 100644 --- a/example/otel-collector/go.mod +++ b/example/otel-collector/go.mod @@ -9,8 +9,10 @@ replace ( require ( go.opentelemetry.io/otel v1.16.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 go.opentelemetry.io/otel/sdk v1.16.0 + go.opentelemetry.io/otel/sdk/metric v0.39.0 go.opentelemetry.io/otel/trace v1.16.0 google.golang.org/grpc v1.57.0 ) @@ -21,6 +23,8 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect go.opentelemetry.io/otel/metric v1.16.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect diff --git a/example/otel-collector/go.sum b/example/otel-collector/go.sum index 9d85029550d..a25bfad03c3 100644 --- a/example/otel-collector/go.sum +++ b/example/otel-collector/go.sum @@ -16,6 +16,14 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rH github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0 h1:f6BwB2OACc3FCbYVznctQ9V6KK7Vq6CjmYXJ7DeSs4E= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0/go.mod h1:UqL5mZ3qs6XYhDnZaW1Ps4upD+PX6LipH40AoeuIlwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0 h1:rm+Fizi7lTM2UefJ1TO347fSRcwmIsUAaZmYmIGBRAo= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0/go.mod h1:sWFbI3jJ+6JdjOVepA5blpv/TJ20Hw+26561iMbWcwU= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= diff --git a/example/otel-collector/main.go b/example/otel-collector/main.go index 21b68d8122e..27ab66086c8 100644 --- a/example/otel-collector/main.go +++ b/example/otel-collector/main.go @@ -30,29 +30,21 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.21.0" "go.opentelemetry.io/otel/trace" ) -// Initializes an OTLP exporter, and configures the corresponding trace and -// metric providers. -func initProvider() (func(context.Context) error, error) { +// Initialize a gRPC connection to be used by both the tracer and meter +// providers +func initConn() (*grpc.ClientConn, error) { ctx := context.Background() - res, err := resource.New(ctx, - resource.WithAttributes( - // the service name used to display traces in backends - semconv.ServiceName("test-service"), - ), - ) - if err != nil { - return nil, fmt.Errorf("failed to create resource: %w", err) - } - // If the OpenTelemetry Collector is running on a local cluster (minikube or // microk8s), it should be accessible through the NodePort service at the // `localhost:30080` endpoint. Otherwise, replace `localhost` with the @@ -69,6 +61,24 @@ func initProvider() (func(context.Context) error, error) { return nil, fmt.Errorf("failed to create gRPC connection to collector: %w", err) } + return conn, err +} + +// Initializes an OTLP exporter, and configures the corresponding trace +// provider. +func initTracerProvider(conn *grpc.ClientConn) (func(context.Context) error, error) { + ctx := context.Background() + + res, err := resource.New(ctx, + resource.WithAttributes( + // the service name used to display traces in backends + semconv.ServiceName("test-service"), + ), + ) + if err != nil { + return nil, fmt.Errorf("failed to create resource: %w", err) + } + // Set up a trace exporter traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn)) if err != nil { @@ -92,13 +102,36 @@ func initProvider() (func(context.Context) error, error) { return tracerProvider.Shutdown, nil } +// Initializes an OTLP exporter, and configures the corresponding meter +// provider. +func initMeterProvider(conn *grpc.ClientConn) (func(context.Context) error, error) { + ctx := context.Background() + + metricExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithGRPCConn(conn)) + if err != nil { + return nil, fmt.Errorf("failed to create metrics exporter: %w", err) + } + + meterProvider := metric.NewMeterProvider( + metric.WithReader(metric.NewPeriodicReader(metricExporter)), + ) + otel.SetMeterProvider(meterProvider) + + return meterProvider.Shutdown, nil +} + func main() { log.Printf("Waiting for connection...") ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) defer cancel() - shutdown, err := initProvider() + conn, err := initConn() + if err != nil { + log.Fatal(err) + } + + shutdown, err := initTracerProvider(conn) if err != nil { log.Fatal(err) } @@ -108,6 +141,16 @@ func main() { } }() + shutdown, err = initMeterProvider(conn) + if err != nil { + log.Fatal(err) + } + defer func() { + if err := shutdown(ctx); err != nil { + log.Fatal("failed to shutdown MeterProvider: %w", err) + } + }() + tracer := otel.Tracer("test-tracer") // Attributes represent additional key-value descriptors that can be bound From 0435da865214cc2583a0a15cf676a3b6f3a8771e Mon Sep 17 00:00:00 2001 From: dmathieu Date: Mon, 28 Aug 2023 11:06:29 +0200 Subject: [PATCH 2/7] add a counter metric --- example/otel-collector/main.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/example/otel-collector/main.go b/example/otel-collector/main.go index 27ab66086c8..e8f5a531d57 100644 --- a/example/otel-collector/main.go +++ b/example/otel-collector/main.go @@ -32,8 +32,9 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/metric" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.21.0" @@ -112,8 +113,8 @@ func initMeterProvider(conn *grpc.ClientConn) (func(context.Context) error, erro return nil, fmt.Errorf("failed to create metrics exporter: %w", err) } - meterProvider := metric.NewMeterProvider( - metric.WithReader(metric.NewPeriodicReader(metricExporter)), + meterProvider := sdkmetric.NewMeterProvider( + sdkmetric.WithReader(sdkmetric.NewPeriodicReader(metricExporter)), ) otel.SetMeterProvider(meterProvider) @@ -152,6 +153,7 @@ func main() { }() tracer := otel.Tracer("test-tracer") + meter := otel.Meter("test-meter") // Attributes represent additional key-value descriptors that can be bound // to a metric observer or recorder. @@ -161,6 +163,8 @@ func main() { attribute.String("attrC", "vanilla"), } + runCount, err := meter.Int64Counter("run", metric.WithDescription("The number of times the iteration ran")) + // work begins ctx, span := tracer.Start( ctx, @@ -169,6 +173,7 @@ func main() { defer span.End() for i := 0; i < 10; i++ { _, iSpan := tracer.Start(ctx, fmt.Sprintf("Sample-%d", i)) + runCount.Add(ctx, 5, metric.WithAttributes(commonAttrs...)) log.Printf("Doing really hard work (%d / 10)\n", i+1) <-time.After(time.Second) From 460250aeef0ef2c7964784a5b42abf716cefc4a3 Mon Sep 17 00:00:00 2001 From: dmathieu Date: Mon, 28 Aug 2023 12:11:20 +0200 Subject: [PATCH 3/7] switch otlp port to the official one --- example/otel-collector/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/otel-collector/main.go b/example/otel-collector/main.go index e8f5a531d57..fb379dd4d5c 100644 --- a/example/otel-collector/main.go +++ b/example/otel-collector/main.go @@ -48,12 +48,12 @@ func initConn() (*grpc.ClientConn, error) { // If the OpenTelemetry Collector is running on a local cluster (minikube or // microk8s), it should be accessible through the NodePort service at the - // `localhost:30080` endpoint. Otherwise, replace `localhost` with the + // `localhost:4317` endpoint. Otherwise, replace `localhost` with the // endpoint of your cluster. If you run the app inside k8s, then you can // probably connect directly to the service through dns. ctx, cancel := context.WithTimeout(ctx, time.Second) defer cancel() - conn, err := grpc.DialContext(ctx, "localhost:30080", + conn, err := grpc.DialContext(ctx, "localhost:4317", // Note the use of insecure transport here. TLS is recommended in production. grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock(), From a7a11a5e7e8ba1b5586cc01e6d5b7370661758cc Mon Sep 17 00:00:00 2001 From: dmathieu Date: Mon, 28 Aug 2023 12:15:46 +0200 Subject: [PATCH 4/7] add resource to metrics --- example/otel-collector/main.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/example/otel-collector/main.go b/example/otel-collector/main.go index fb379dd4d5c..114dac84479 100644 --- a/example/otel-collector/main.go +++ b/example/otel-collector/main.go @@ -108,6 +108,16 @@ func initTracerProvider(conn *grpc.ClientConn) (func(context.Context) error, err func initMeterProvider(conn *grpc.ClientConn) (func(context.Context) error, error) { ctx := context.Background() + res, err := resource.New(ctx, + resource.WithAttributes( + // the service name used to display traces in backends + semconv.ServiceName("test-service"), + ), + ) + if err != nil { + return nil, fmt.Errorf("failed to create resource: %w", err) + } + metricExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithGRPCConn(conn)) if err != nil { return nil, fmt.Errorf("failed to create metrics exporter: %w", err) @@ -115,6 +125,7 @@ func initMeterProvider(conn *grpc.ClientConn) (func(context.Context) error, erro meterProvider := sdkmetric.NewMeterProvider( sdkmetric.WithReader(sdkmetric.NewPeriodicReader(metricExporter)), + sdkmetric.WithResource(res), ) otel.SetMeterProvider(meterProvider) From c1f7f6165a3a7c9073bb4747889805b94d66c033 Mon Sep 17 00:00:00 2001 From: dmathieu Date: Mon, 28 Aug 2023 12:20:08 +0200 Subject: [PATCH 5/7] fix lint --- example/otel-collector/go.mod | 11 +++++++++-- example/otel-collector/go.sum | 8 -------- example/otel-collector/main.go | 5 ++++- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/example/otel-collector/go.mod b/example/otel-collector/go.mod index c59caef538d..6306fd4a31d 100644 --- a/example/otel-collector/go.mod +++ b/example/otel-collector/go.mod @@ -11,6 +11,7 @@ require ( go.opentelemetry.io/otel v1.16.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 + go.opentelemetry.io/otel/metric v1.16.0 go.opentelemetry.io/otel/sdk v1.16.0 go.opentelemetry.io/otel/sdk/metric v0.39.0 go.opentelemetry.io/otel/trace v1.16.0 @@ -23,10 +24,8 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/sys v0.11.0 // indirect @@ -43,3 +42,11 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../../exporters/otl replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => ../../exporters/otlp/otlptrace/otlptracegrpc replace go.opentelemetry.io/otel/metric => ../../metric + +replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc => ../../exporters/otlp/otlpmetric/otlpmetricgrpc + +replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric => ../../exporters/otlp/otlpmetric + +replace go.opentelemetry.io/otel/sdk/metric => ../../sdk/metric + +replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry diff --git a/example/otel-collector/go.sum b/example/otel-collector/go.sum index a25bfad03c3..9d85029550d 100644 --- a/example/otel-collector/go.sum +++ b/example/otel-collector/go.sum @@ -16,14 +16,6 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rH github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0 h1:f6BwB2OACc3FCbYVznctQ9V6KK7Vq6CjmYXJ7DeSs4E= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.39.0/go.mod h1:UqL5mZ3qs6XYhDnZaW1Ps4upD+PX6LipH40AoeuIlwU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0 h1:rm+Fizi7lTM2UefJ1TO347fSRcwmIsUAaZmYmIGBRAo= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.39.0/go.mod h1:sWFbI3jJ+6JdjOVepA5blpv/TJ20Hw+26561iMbWcwU= -go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= -go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= diff --git a/example/otel-collector/main.go b/example/otel-collector/main.go index 114dac84479..fd0d405b422 100644 --- a/example/otel-collector/main.go +++ b/example/otel-collector/main.go @@ -42,7 +42,7 @@ import ( ) // Initialize a gRPC connection to be used by both the tracer and meter -// providers +// providers. func initConn() (*grpc.ClientConn, error) { ctx := context.Background() @@ -175,6 +175,9 @@ func main() { } runCount, err := meter.Int64Counter("run", metric.WithDescription("The number of times the iteration ran")) + if err != nil { + log.Fatal(err) + } // work begins ctx, span := tracer.Start( From 0ec596457ee60f5c1132415660c2f0e2e137e1cf Mon Sep 17 00:00:00 2001 From: Damien Mathieu <42@dmathieu.com> Date: Mon, 28 Aug 2023 20:40:11 +0200 Subject: [PATCH 6/7] Update example/otel-collector/main.go Co-authored-by: Tyler Yahn --- example/otel-collector/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/otel-collector/main.go b/example/otel-collector/main.go index fd0d405b422..37986a49abe 100644 --- a/example/otel-collector/main.go +++ b/example/otel-collector/main.go @@ -187,7 +187,7 @@ func main() { defer span.End() for i := 0; i < 10; i++ { _, iSpan := tracer.Start(ctx, fmt.Sprintf("Sample-%d", i)) - runCount.Add(ctx, 5, metric.WithAttributes(commonAttrs...)) + runCount.Add(ctx, 1, metric.WithAttributes(commonAttrs...)) log.Printf("Doing really hard work (%d / 10)\n", i+1) <-time.After(time.Second) From 15b4db5edd0825b1d0bdcd80a1b5b4dc434ec5b6 Mon Sep 17 00:00:00 2001 From: dmathieu Date: Fri, 1 Sep 2023 12:15:34 +0200 Subject: [PATCH 7/7] run make lint --- example/otel-collector/go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/example/otel-collector/go.mod b/example/otel-collector/go.mod index f62ba475426..43c54832627 100644 --- a/example/otel-collector/go.mod +++ b/example/otel-collector/go.mod @@ -48,5 +48,3 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc => ../ replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric => ../../exporters/otlp/otlpmetric replace go.opentelemetry.io/otel/sdk/metric => ../../sdk/metric - -replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../exporters/otlp/internal/retry