Skip to content

examples/features/opentelemetry: demonstrate tracing using OpenTelemetry plugin #8056

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 75 commits into from
Apr 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
7ddbe46
replace dial with newclient
janardhankrishna-sai Dec 23, 2024
0486355
Merge branch 'master' of https://github.com/janardhanvissa/grpc-go
janardhankrishna-sai Jan 1, 2025
53fa9cd
Merge branch 'grpc:master' into master
janardhanvissa Jan 8, 2025
4435b8a
Merge branch 'grpc:master' into master
janardhanvissa Jan 13, 2025
a413555
Merge branch 'grpc:master' into master
janardhanvissa Jan 20, 2025
4e203c3
Merge branch 'grpc:master' into master
janardhanvissa Jan 30, 2025
e9ad552
Merge branch 'grpc:master' into master
janardhanvissa Jan 30, 2025
61e15e3
adding opentelemetry tracing for client-server
janardhankrishna-sai Jan 30, 2025
4a988a6
adding opentelemetry tracing for client-server
janardhankrishna-sai Jan 30, 2025
58451b6
addressing review comments
janardhankrishna-sai Feb 6, 2025
9ac7ce3
reverting Newclient changes
janardhankrishna-sai Feb 6, 2025
c0e8885
reverting Newclient changes
janardhankrishna-sai Feb 6, 2025
0b4231a
adding dependency files
janardhankrishna-sai Feb 6, 2025
b8c0ef5
removing unused ctx
janardhankrishna-sai Feb 6, 2025
a33cc4b
fixing vet issue
janardhankrishna-sai Feb 6, 2025
6215e98
adding trace to client/server
janardhankrishna-sai Feb 10, 2025
c68e570
fix vet issue
janardhankrishna-sai Feb 10, 2025
02d9139
fixing vet issue
janardhankrishna-sai Feb 10, 2025
9db8ad6
removing empty lines
janardhankrishna-sai Feb 14, 2025
26017c7
using otlptracer exporter for the otel example
janardhankrishna-sai Feb 20, 2025
fd4c632
Merge branch 'master' into tracing-otel
janardhanvissa Feb 20, 2025
e8a9e48
updating go.sum
janardhankrishna-sai Feb 21, 2025
5f849ae
removing loggers
janardhankrishna-sai Feb 21, 2025
1c55841
creating cancelable context and declaring var for hardcoded endpoints
janardhankrishna-sai Feb 21, 2025
ebe37f3
explicit naming for traces and metrics
janardhankrishna-sai Feb 24, 2025
99cc7d7
Merge branch 'master' into tracing-otel
janardhanvissa Feb 27, 2025
b10de6e
putting link in go.mod for examples and updating dependencies
janardhankrishna-sai Feb 27, 2025
8664e40
document for trace visualization
janardhankrishna-sai Feb 27, 2025
8fcfc33
updating readme
janardhankrishna-sai Feb 27, 2025
0ef715a
updating README.md
janardhankrishna-sai Feb 28, 2025
a2fd0c0
fixing vet issue
janardhankrishna-sai Feb 28, 2025
737c458
fixing vet issue
janardhankrishna-sai Feb 28, 2025
ad5c177
updating readme file and removing links from go.mod file
janardhankrishna-sai Feb 28, 2025
5e1d020
fixing vet issue
janardhankrishna-sai Feb 28, 2025
11f0d89
fixing vet issue
janardhankrishna-sai Feb 28, 2025
10821bb
adding new line for fixing vet issue
janardhankrishna-sai Feb 28, 2025
c027805
updating readme and creating separate collector-config and adding com…
janardhankrishna-sai Mar 4, 2025
1bb9bd4
fixing vet issue
janardhankrishna-sai Mar 4, 2025
23e0ff5
update readme
janardhankrishna-sai Mar 4, 2025
dcd525a
adding two separate ports for server and client collector and separat…
janardhankrishna-sai Mar 4, 2025
8693ecc
adding the command to execute the collector
janardhankrishna-sai Mar 4, 2025
c5a1dcf
updating config and dependencies
janardhankrishna-sai Mar 7, 2025
87e4352
Revert "updating config and dependencies"
janardhankrishna-sai Mar 7, 2025
545bf03
updating config files
janardhankrishna-sai Mar 7, 2025
06f4309
fixing vet issue
janardhankrishna-sai Mar 7, 2025
1ed2c6b
adding comments, using alias for import, deleting config files and us…
janardhankrishna-sai Mar 11, 2025
b6035d5
adding comments, using alias for import and using single endpoint for…
janardhankrishna-sai Mar 11, 2025
ba00736
updating go.mod and go.sum
janardhankrishna-sai Mar 11, 2025
3fdcf97
fixing vet issue
janardhankrishna-sai Mar 11, 2025
e5a6a9e
fixing vet issue
janardhankrishna-sai Mar 11, 2025
3cfa4a9
using 2 different endpoints for otlp client and server and updating r…
janardhankrishna-sai Mar 19, 2025
9db8e81
updating deps
janardhankrishna-sai Mar 19, 2025
fd85029
deps
janardhankrishna-sai Mar 19, 2025
e00b308
Merge branch 'master' into tracing-otel
janardhanvissa Mar 19, 2025
e9e7796
updating readme and logger
janardhankrishna-sai Mar 20, 2025
932feb2
updating readme
janardhankrishna-sai Mar 20, 2025
5c27cd0
updating readme
janardhankrishna-sai Mar 20, 2025
86ce88b
updating readme for opentelemtry
janardhankrishna-sai Mar 24, 2025
d12b4f3
addressing review comments
janardhankrishna-sai Mar 25, 2025
2ef0356
rebase push
janardhankrishna-sai Mar 25, 2025
95398e1
fixing vet issue
janardhankrishna-sai Mar 25, 2025
e861fbe
updating exporter from otlp to stdouttrace
janardhankrishna-sai Mar 27, 2025
1a36d58
updating readme
janardhankrishna-sai Mar 27, 2025
f63f1f6
updating readme
janardhankrishna-sai Mar 27, 2025
8c99dce
updating readme
janardhankrishna-sai Mar 27, 2025
881f0e5
addressing review comments
janardhankrishna-sai Mar 28, 2025
b129fa0
fixing vet issue
janardhankrishna-sai Mar 28, 2025
3855e04
updating readme by wraping 80col perline and removing comment for cli…
janardhankrishna-sai Apr 1, 2025
7f2636c
small tweak
janardhankrishna-sai Apr 1, 2025
2e59ff7
small tweak
janardhankrishna-sai Apr 1, 2025
56cf9ef
Update README.md
janardhanvissa Apr 1, 2025
b24b2fb
addressing review comments
janardhankrishna-sai Apr 3, 2025
85c095b
Merge branch 'master' into tracing-otel
janardhanvissa Apr 4, 2025
f5828d3
deps
janardhankrishna-sai Apr 4, 2025
ab19f69
addressing review comments
janardhankrishna-sai Apr 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions examples/features/opentelemetry/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 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 RPC's.
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.

## Try it

Expand All @@ -20,13 +20,18 @@ curl localhost:9465/metrics

## Explanation

The client continuously makes RPC's to a server. The client and server both
The client continuously makes RPCs to a server. The client and server both
expose a prometheus exporter to listen and provide metrics. This defaults to
:9464 for the server and :9465 for the client.
:9464 for the server and :9465 for the client. The client and server are also
configured to output traces directly to their standard output streams using
`stdouttrace`.

OpenTelemetry is configured on both the client and the server, and exports to
the Prometheus exporter. The exporter exposes metrics on the Prometheus ports
described above.
described above. OpenTelemetry exports traces using the `stdouttrace` exporter,
which prints structured trace data to the console output of both the client and
server. Each RPC call produces trace information that captures the execution
flow and timing of operations.

Curling to the exposed Prometheus ports outputs the metrics recorded on the
client and server.
37 changes: 27 additions & 10 deletions examples/features/opentelemetry/client/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,38 +27,55 @@ import (
"net/http"
"time"

"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel/exporters/prometheus"
otelstdouttrace "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
otelpropagation "go.opentelemetry.io/otel/propagation"
otelmetric "go.opentelemetry.io/otel/sdk/metric"
otelresource "go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/examples/features/proto/echo"
oteltracing "google.golang.org/grpc/experimental/opentelemetry"
"google.golang.org/grpc/stats/opentelemetry"

"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel/exporters/prometheus"
"go.opentelemetry.io/otel/sdk/metric"
)

var (
addr = flag.String("addr", ":50051", "the server address to connect to")
prometheusEndpoint = flag.String("prometheus_endpoint", ":9465", "the Prometheus exporter endpoint")
prometheusEndpoint = flag.String("prometheus_endpoint", ":9465", "the Prometheus exporter endpoint for metrics")
)

func main() {
exporter, err := prometheus.New()
if err != nil {
log.Fatalf("Failed to start prometheus exporter: %v", err)
}
provider := metric.NewMeterProvider(metric.WithReader(exporter))
go http.ListenAndServe(*prometheusEndpoint, promhttp.Handler())
// Configure meter provider for metrics
meterProvider := otelmetric.NewMeterProvider(otelmetric.WithReader(exporter))
// Configure exporter for traces
traceExporter, err := otelstdouttrace.New(otelstdouttrace.WithPrettyPrint())
if err != nil {
log.Fatalf("Failed to create stdouttrace exporter: %v", err)
}
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{}
do := opentelemetry.DialOption(opentelemetry.Options{
MetricsOptions: opentelemetry.MetricsOptions{MeterProvider: meterProvider},
TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator},
})

ctx := context.Background()
do := opentelemetry.DialOption(opentelemetry.Options{MetricsOptions: opentelemetry.MetricsOptions{MeterProvider: provider}})
go http.ListenAndServe(*prometheusEndpoint, promhttp.Handler())

cc, err := grpc.NewClient(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()), do)
if err != nil {
log.Fatalf("Failed to start NewClient: %v", err)
log.Fatalf("grpc.NewClient() failed: %v", err)
}
defer cc.Close()
c := echo.NewEchoClient(cc)
ctx := context.Background()

// Make an RPC every second. This should trigger telemetry to be emitted from
// the client and the server.
Expand Down
32 changes: 24 additions & 8 deletions examples/features/opentelemetry/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,23 @@ import (
"net"
"net/http"

"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel/exporters/prometheus"
otelstdouttrace "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
otelpropagation "go.opentelemetry.io/otel/propagation"
otelmetric "go.opentelemetry.io/otel/sdk/metric"
otelresource "go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/features/proto/echo"
oteltracing "google.golang.org/grpc/experimental/opentelemetry"
"google.golang.org/grpc/stats/opentelemetry"

"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel/exporters/prometheus"
"go.opentelemetry.io/otel/sdk/metric"
)

var (
addr = flag.String("addr", ":50051", "the server address to connect to")
prometheusEndpoint = flag.String("prometheus_endpoint", ":9464", "the Prometheus exporter endpoint")
prometheusEndpoint = flag.String("prometheus_endpoint", ":9464", "the Prometheus exporter endpoint for metrics")
)

type echoServer struct {
Expand All @@ -55,10 +60,21 @@ func main() {
if err != nil {
log.Fatalf("Failed to start prometheus exporter: %v", err)
}
provider := metric.NewMeterProvider(metric.WithReader(exporter))
go http.ListenAndServe(*prometheusEndpoint, promhttp.Handler())
// Configure meter provider for metrics
meterProvider := otelmetric.NewMeterProvider(otelmetric.WithReader(exporter))
// Configure exporter for traces
traceExporter, err := otelstdouttrace.New(otelstdouttrace.WithPrettyPrint())
if err != nil {
log.Fatalf("Failed to create stdouttrace exporter: %v", err)
}
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{}
so := opentelemetry.ServerOption(opentelemetry.Options{
MetricsOptions: opentelemetry.MetricsOptions{MeterProvider: meterProvider},
TraceOptions: oteltracing.TraceOptions{TracerProvider: traceProvider, TextMapPropagator: textMapPropagator}})

so := opentelemetry.ServerOption(opentelemetry.Options{MetricsOptions: opentelemetry.MetricsOptions{MeterProvider: provider}})
go http.ListenAndServe(*prometheusEndpoint, promhttp.Handler())

lis, err := net.Listen("tcp", *addr)
if err != nil {
Expand Down
5 changes: 3 additions & 2 deletions examples/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ go 1.23.0
require (
github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f
github.com/prometheus/client_golang v1.21.1
go.opentelemetry.io/otel v1.35.0
go.opentelemetry.io/otel/exporters/prometheus v0.57.0
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0
go.opentelemetry.io/otel/sdk v1.35.0
go.opentelemetry.io/otel/sdk/metric v1.35.0
golang.org/x/oauth2 v0.28.0
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463
Expand Down Expand Up @@ -68,9 +71,7 @@ require (
go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/sdk v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
golang.org/x/crypto v0.36.0 // indirect
golang.org/x/net v0.38.0 // indirect
Expand Down
3 changes: 3 additions & 0 deletions examples/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1151,6 +1151,8 @@ go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/exporters/prometheus v0.57.0 h1:AHh/lAP1BHrY5gBwk8ncc25FXWm/gmmY3BX258z5nuk=
go.opentelemetry.io/otel/exporters/prometheus v0.57.0/go.mod h1:QpFWz1QxqevfjwzYdbMb4Y1NnlJvqSGwyuU0B4iuc9c=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0 h1:T0Ec2E+3YZf5bgTNQVet8iTDW7oIk03tXHq+wkwIDnE=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0/go.mod h1:30v2gqH+vYGJsesLWFov8u47EpYTcIQcBjKpI6pJThg=
go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
Expand All @@ -1165,6 +1167,7 @@ go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqe
go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
Expand Down