diff --git a/examples/features/opentelemetry/README.md b/examples/features/opentelemetry/README.md index 14ef9794e..49be86625 100644 --- a/examples/features/opentelemetry/README.md +++ b/examples/features/opentelemetry/README.md @@ -1,7 +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. +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 0b392d8df..44b7e96e7 100644 --- a/examples/features/opentelemetry/client/main.go +++ b/examples/features/opentelemetry/client/main.go @@ -62,9 +62,18 @@ 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}, - TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}, + MetricsOptions: opentelemetry.MetricsOptions{ + MeterProvider: meterProvider, + Metrics: opentelemetry.DefaultMetrics().Add( + "grpc.lb.wrr.rr_fallback", + "grpc.xds_client.connected", + ), + }, + 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..5de7d57f6 100644 --- a/examples/features/opentelemetry/server/main.go +++ b/examples/features/opentelemetry/server/main.go @@ -70,9 +70,18 @@ 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}, - TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}}) + MetricsOptions: opentelemetry.MetricsOptions{ + MeterProvider: meterProvider, + Metrics: opentelemetry.DefaultMetrics().Add( + "grpc.lb.wrr.rr_fallback", + "grpc.xds_client.connected", + ), + }, + 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..53bae19dd 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_methodFilter() { reader := metric.NewManualReader() provider := metric.NewMeterProvider(metric.WithReader(reader)) opts := opentelemetry.Options{ @@ -128,3 +128,27 @@ func ExampleMetrics_enableSome() { } defer cc.Close() } + +func ExampleOptions_addExperimentalMetrics() { + 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() +}