@@ -27,38 +27,55 @@ import (
27
27
"net/http"
28
28
"time"
29
29
30
+ "github.com/prometheus/client_golang/prometheus/promhttp"
31
+ "go.opentelemetry.io/otel/exporters/prometheus"
32
+ otelstdouttrace "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
33
+ otelpropagation "go.opentelemetry.io/otel/propagation"
34
+ otelmetric "go.opentelemetry.io/otel/sdk/metric"
35
+ otelresource "go.opentelemetry.io/otel/sdk/resource"
36
+ sdktrace "go.opentelemetry.io/otel/sdk/trace"
37
+ semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
30
38
"google.golang.org/grpc"
31
39
"google.golang.org/grpc/credentials/insecure"
32
40
"google.golang.org/grpc/examples/features/proto/echo"
41
+ oteltracing "google.golang.org/grpc/experimental/opentelemetry"
33
42
"google.golang.org/grpc/stats/opentelemetry"
34
-
35
- "github.com/prometheus/client_golang/prometheus/promhttp"
36
- "go.opentelemetry.io/otel/exporters/prometheus"
37
- "go.opentelemetry.io/otel/sdk/metric"
38
43
)
39
44
40
45
var (
41
46
addr = flag .String ("addr" , ":50051" , "the server address to connect to" )
42
- prometheusEndpoint = flag .String ("prometheus_endpoint" , ":9465" , "the Prometheus exporter endpoint" )
47
+ prometheusEndpoint = flag .String ("prometheus_endpoint" , ":9465" , "the Prometheus exporter endpoint for metrics " )
43
48
)
44
49
45
50
func main () {
46
51
exporter , err := prometheus .New ()
47
52
if err != nil {
48
53
log .Fatalf ("Failed to start prometheus exporter: %v" , err )
49
54
}
50
- provider := metric .NewMeterProvider (metric .WithReader (exporter ))
51
- go http .ListenAndServe (* prometheusEndpoint , promhttp .Handler ())
55
+ // Configure meter provider for metrics
56
+ meterProvider := otelmetric .NewMeterProvider (otelmetric .WithReader (exporter ))
57
+ // Configure exporter for traces
58
+ traceExporter , err := otelstdouttrace .New (otelstdouttrace .WithPrettyPrint ())
59
+ if err != nil {
60
+ log .Fatalf ("Failed to create stdouttrace exporter: %v" , err )
61
+ }
62
+ traceProvider := sdktrace .NewTracerProvider (sdktrace .WithBatcher (traceExporter ), sdktrace .WithResource (otelresource .NewWithAttributes (semconv .SchemaURL , semconv .ServiceName ("grpc-client" ))))
63
+ // Configure W3C Trace Context Propagator for traces
64
+ textMapPropagator := otelpropagation.TraceContext {}
65
+ do := opentelemetry .DialOption (opentelemetry.Options {
66
+ MetricsOptions : opentelemetry.MetricsOptions {MeterProvider : meterProvider },
67
+ TraceOptions : oteltracing.TraceOptions {TracerProvider : traceProvider , TextMapPropagator : textMapPropagator },
68
+ })
52
69
53
- ctx := context .Background ()
54
- do := opentelemetry .DialOption (opentelemetry.Options {MetricsOptions : opentelemetry.MetricsOptions {MeterProvider : provider }})
70
+ go http .ListenAndServe (* prometheusEndpoint , promhttp .Handler ())
55
71
56
72
cc , err := grpc .NewClient (* addr , grpc .WithTransportCredentials (insecure .NewCredentials ()), do )
57
73
if err != nil {
58
- log .Fatalf ("Failed to start NewClient: %v" , err )
74
+ log .Fatalf ("grpc. NewClient() failed : %v" , err )
59
75
}
60
76
defer cc .Close ()
61
77
c := echo .NewEchoClient (cc )
78
+ ctx := context .Background ()
62
79
63
80
// Make an RPC every second. This should trigger telemetry to be emitted from
64
81
// the client and the server.
0 commit comments