From 17a007623a40c3ed0c58b479fa4f0456ce688f9b Mon Sep 17 00:00:00 2001 From: Vinothkumar Date: Mon, 9 Jun 2025 12:12:04 +0000 Subject: [PATCH 1/2] Added experimental gRPC metrics for example --- examples/features/opentelemetry/README.md | 4 +++ .../features/opentelemetry/client/main.go | 20 +++++++++-- .../features/opentelemetry/server/main.go | 20 +++++++++-- stats/opentelemetry/example_test.go | 34 ++++++++++++++++--- 4 files changed, 69 insertions(+), 9 deletions(-) diff --git a/examples/features/opentelemetry/README.md b/examples/features/opentelemetry/README.md index 14ef9794e..cf8c661ea 100644 --- a/examples/features/opentelemetry/README.md +++ b/examples/features/opentelemetry/README.md @@ -3,6 +3,10 @@ This example shows how to configure OpenTelemetry on a client and server, and shows what type of telemetry data it can produce for certain RPCs. +## Experimental Metrics + +This example now includes **experimental gRPC metrics** such as Weighted Round Robin (WRR), Pick First, and XDSClient metrics. These metrics are not enabled by default and must be explicitly added to both the client and server configurations. + ## Try it ``` diff --git a/examples/features/opentelemetry/client/main.go b/examples/features/opentelemetry/client/main.go index 0b392d8df..739804a4c 100644 --- a/examples/features/opentelemetry/client/main.go +++ b/examples/features/opentelemetry/client/main.go @@ -63,8 +63,24 @@ func main() { // Configure W3C Trace Context Propagator for traces textMapPropagator := otelpropagation.TraceContext{} do := opentelemetry.DialOption(opentelemetry.Options{ - MetricsOptions: opentelemetry.MetricsOptions{MeterProvider: meterProvider}, - TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}, + MetricsOptions: opentelemetry.MetricsOptions{ + MeterProvider: meterProvider, + Metrics: opentelemetry.DefaultMetrics().Add( + "grpc.lb.wrr.rr_fallback", + "grpc.lb.wrr.endpoint_weight_not_yet_usable", + "grpc.lb.wrr.endpoint_weight_stale", + "grpc.lb.wrr.endpoint_weights", + "grpc.lb.pick_first.disconnections", + "grpc.lb.pick_first.connection_attempts_succeeded", + "grpc.lb.pick_first.connection_attempts_failed", + "grpc.xds_client.connected", + "grpc.xds_client.server_failure", + "grpc.xds_client.resource_updates_valid", + "grpc.xds_client.resource_updates_invalid", + "grpc.xds_client.resources", + ), + }, + TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}, }) go http.ListenAndServe(*prometheusEndpoint, promhttp.Handler()) diff --git a/examples/features/opentelemetry/server/main.go b/examples/features/opentelemetry/server/main.go index 3c5c03466..54b1dff08 100644 --- a/examples/features/opentelemetry/server/main.go +++ b/examples/features/opentelemetry/server/main.go @@ -71,8 +71,24 @@ func main() { // Configure W3C Trace Context Propagator for traces textMapPropagator := otelpropagation.TraceContext{} so := opentelemetry.ServerOption(opentelemetry.Options{ - MetricsOptions: opentelemetry.MetricsOptions{MeterProvider: meterProvider}, - TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}}) + MetricsOptions: opentelemetry.MetricsOptions{ + MeterProvider: meterProvider, + Metrics: opentelemetry.DefaultMetrics().Add( + "grpc.lb.wrr.rr_fallback", + "grpc.lb.wrr.endpoint_weight_not_yet_usable", + "grpc.lb.wrr.endpoint_weight_stale", + "grpc.lb.wrr.endpoint_weights", + "grpc.lb.pick_first.disconnections", + "grpc.lb.pick_first.connection_attempts_succeeded", + "grpc.lb.pick_first.connection_attempts_failed", + "grpc.xds_client.connected", + "grpc.xds_client.server_failure", + "grpc.xds_client.resource_updates_valid", + "grpc.xds_client.resource_updates_invalid", + "grpc.xds_client.resources", + ), + }, + TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}}) go http.ListenAndServe(*prometheusEndpoint, promhttp.Handler()) diff --git a/stats/opentelemetry/example_test.go b/stats/opentelemetry/example_test.go index e87e4ebb6..c1f840df8 100644 --- a/stats/opentelemetry/example_test.go +++ b/stats/opentelemetry/example_test.go @@ -25,7 +25,7 @@ import ( "go.opentelemetry.io/otel/sdk/metric" ) -func Example_dialOption() { +func ExampleDialOption_basic() { // This is setting default bounds for a view. Setting these bounds through // meter provider from SDK is recommended, as API calls in this module // provide default bounds, but these calls are not guaranteed to be stable @@ -64,7 +64,7 @@ func Example_dialOption() { defer cc.Close() } -func Example_serverOption() { +func ExampleServerOption_filterMethod() { reader := metric.NewManualReader() provider := metric.NewMeterProvider(metric.WithReader(reader)) opts := opentelemetry.Options{ @@ -84,7 +84,7 @@ func Example_serverOption() { defer cc.Close() } -func ExampleMetrics_excludeSome() { +func ExampleOptions_excludeSomeMetrics() { // To exclude specific metrics, initialize Options as follows: opts := opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ @@ -99,7 +99,7 @@ func ExampleMetrics_excludeSome() { defer cc.Close() } -func ExampleMetrics_disableAll() { +func ExampleOptions_disableAllMetrics() { // To disable all metrics, initialize Options as follows: opts := opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ @@ -114,7 +114,7 @@ func ExampleMetrics_disableAll() { defer cc.Close() } -func ExampleMetrics_enableSome() { +func ExampleOptions_enableSomeMetrics() { // To only create specific metrics, initialize Options as follows: opts := opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ @@ -128,3 +128,27 @@ func ExampleMetrics_enableSome() { } defer cc.Close() } + +func ExampleOptions_addMetrics() { + opts := opentelemetry.Options{ + MetricsOptions: opentelemetry.MetricsOptions{ + Metrics: opentelemetry.DefaultMetrics().Add( + "grpc.lb.wrr.rr_fallback", + "grpc.lb.wrr.endpoint_weight_not_yet_usable", + "grpc.lb.wrr.endpoint_weight_stale", + "grpc.lb.wrr.endpoint_weights", + "grpc.xds_client.connected", + "grpc.xds_client.server_failure", + "grpc.xds_client.resource_updates_valid", + "grpc.xds_client.resource_updates_invalid", + "grpc.xds_client.resources", + ), + }, + } + do := opentelemetry.DialOption(opts) + cc, err := grpc.NewClient("", do, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + // Handle error. + } + defer cc.Close() +} From c6168a0528290d43098c432145df70b18d333802 Mon Sep 17 00:00:00 2001 From: Vinothkumar Date: Mon, 16 Jun 2025 17:03:27 +0000 Subject: [PATCH 2/2] Fixed review changes --- examples/features/opentelemetry/README.md | 8 +++----- examples/features/opentelemetry/client/main.go | 13 +++---------- examples/features/opentelemetry/server/main.go | 13 +++---------- stats/opentelemetry/example_test.go | 10 +++++----- 4 files changed, 14 insertions(+), 30 deletions(-) diff --git a/examples/features/opentelemetry/README.md b/examples/features/opentelemetry/README.md index cf8c661ea..49be86625 100644 --- a/examples/features/opentelemetry/README.md +++ b/examples/features/opentelemetry/README.md @@ -1,11 +1,9 @@ # OpenTelemetry This example shows how to configure OpenTelemetry on a client and server, and -shows what type of telemetry data it can produce for certain RPCs. - -## Experimental Metrics - -This example now includes **experimental gRPC metrics** such as Weighted Round Robin (WRR), Pick First, and XDSClient metrics. These metrics are not enabled by default and must be explicitly added to both the client and server configurations. +shows what type of telemetry data it can produce for certain RPCs, +and demonstrates how to enable experimental gRPC metrics, which are disabled +by default and must be explicitly configured on the client and/or server. ## Try it diff --git a/examples/features/opentelemetry/client/main.go b/examples/features/opentelemetry/client/main.go index 739804a4c..44b7e96e7 100644 --- a/examples/features/opentelemetry/client/main.go +++ b/examples/features/opentelemetry/client/main.go @@ -62,22 +62,15 @@ func main() { traceProvider := sdktrace.NewTracerProvider(sdktrace.WithBatcher(traceExporter), sdktrace.WithResource(otelresource.NewWithAttributes(semconv.SchemaURL, semconv.ServiceName("grpc-client")))) // Configure W3C Trace Context Propagator for traces textMapPropagator := otelpropagation.TraceContext{} + // These are example experimental gRPC metrics, which are disabled by default + // and must be explicitly enabled. For the full, up-to-date list of metrics, + // see: https://grpc.io/docs/guides/opentelemetry-metrics/#instruments do := opentelemetry.DialOption(opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ MeterProvider: meterProvider, Metrics: opentelemetry.DefaultMetrics().Add( "grpc.lb.wrr.rr_fallback", - "grpc.lb.wrr.endpoint_weight_not_yet_usable", - "grpc.lb.wrr.endpoint_weight_stale", - "grpc.lb.wrr.endpoint_weights", - "grpc.lb.pick_first.disconnections", - "grpc.lb.pick_first.connection_attempts_succeeded", - "grpc.lb.pick_first.connection_attempts_failed", "grpc.xds_client.connected", - "grpc.xds_client.server_failure", - "grpc.xds_client.resource_updates_valid", - "grpc.xds_client.resource_updates_invalid", - "grpc.xds_client.resources", ), }, TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}, diff --git a/examples/features/opentelemetry/server/main.go b/examples/features/opentelemetry/server/main.go index 54b1dff08..5de7d57f6 100644 --- a/examples/features/opentelemetry/server/main.go +++ b/examples/features/opentelemetry/server/main.go @@ -70,22 +70,15 @@ func main() { traceProvider := sdktrace.NewTracerProvider(sdktrace.WithBatcher(traceExporter), sdktrace.WithResource(otelresource.NewWithAttributes(semconv.SchemaURL, semconv.ServiceName("grpc-server")))) // Configure W3C Trace Context Propagator for traces textMapPropagator := otelpropagation.TraceContext{} + // These are example experimental gRPC metrics, which are disabled by default + // and must be explicitly enabled. For the full, up-to-date list of metrics, + // see: https://grpc.io/docs/guides/opentelemetry-metrics/#instruments so := opentelemetry.ServerOption(opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ MeterProvider: meterProvider, Metrics: opentelemetry.DefaultMetrics().Add( "grpc.lb.wrr.rr_fallback", - "grpc.lb.wrr.endpoint_weight_not_yet_usable", - "grpc.lb.wrr.endpoint_weight_stale", - "grpc.lb.wrr.endpoint_weights", - "grpc.lb.pick_first.disconnections", - "grpc.lb.pick_first.connection_attempts_succeeded", - "grpc.lb.pick_first.connection_attempts_failed", "grpc.xds_client.connected", - "grpc.xds_client.server_failure", - "grpc.xds_client.resource_updates_valid", - "grpc.xds_client.resource_updates_invalid", - "grpc.xds_client.resources", ), }, TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}}) diff --git a/stats/opentelemetry/example_test.go b/stats/opentelemetry/example_test.go index c1f840df8..53bae19dd 100644 --- a/stats/opentelemetry/example_test.go +++ b/stats/opentelemetry/example_test.go @@ -64,7 +64,7 @@ func ExampleDialOption_basic() { defer cc.Close() } -func ExampleServerOption_filterMethod() { +func ExampleServerOption_methodFilter() { reader := metric.NewManualReader() provider := metric.NewMeterProvider(metric.WithReader(reader)) opts := opentelemetry.Options{ @@ -84,7 +84,7 @@ func ExampleServerOption_filterMethod() { defer cc.Close() } -func ExampleOptions_excludeSomeMetrics() { +func ExampleMetrics_excludeSome() { // To exclude specific metrics, initialize Options as follows: opts := opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ @@ -99,7 +99,7 @@ func ExampleOptions_excludeSomeMetrics() { defer cc.Close() } -func ExampleOptions_disableAllMetrics() { +func ExampleMetrics_disableAll() { // To disable all metrics, initialize Options as follows: opts := opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ @@ -114,7 +114,7 @@ func ExampleOptions_disableAllMetrics() { defer cc.Close() } -func ExampleOptions_enableSomeMetrics() { +func ExampleMetrics_enableSome() { // To only create specific metrics, initialize Options as follows: opts := opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ @@ -129,7 +129,7 @@ func ExampleOptions_enableSomeMetrics() { defer cc.Close() } -func ExampleOptions_addMetrics() { +func ExampleOptions_addExperimentalMetrics() { opts := opentelemetry.Options{ MetricsOptions: opentelemetry.MetricsOptions{ Metrics: opentelemetry.DefaultMetrics().Add(