connectrpc.com/otelconnect
adds support for OpenTelemetry tracing and metrics collection to Connect servers and clients.
For more on Connect, OpenTelemetry, and otelconnect
, see the Connect announcement blog post and the observability documentation on connectrpc.com.
package main
import (
"context"
"fmt"
"log"
"net/http"
"connectrpc.com/connect"
"connectrpc.com/otelconnect"
// Generated from your protobuf schema by protoc-gen-go and
// protoc-gen-connect-go.
pingv1 "connectrpc.com/otelconnect/internal/gen/observability/ping/v1"
"connectrpc.com/otelconnect/internal/gen/observability/ping/v1/pingv1connect"
)
func main() {
mux := http.NewServeMux()
otelInterceptor, err := otelconnect.NewInterceptor()
if err != nil {
log.Fatal(err)
}
// otelconnect.NewInterceptor provides an interceptor that adds tracing and
// metrics to both clients and handlers. By default, it uses OpenTelemetry's
// global TracerProvider and MeterProvider, which you can configure by
// following the OpenTelemetry documentation. If you'd prefer to avoid
// globals, use otelconnect.WithTracerProvider and
// otelconnect.WithMeterProvider.
mux.Handle(pingv1connect.NewPingServiceHandler(
&pingv1connect.UnimplementedPingServiceHandler{},
connect.WithInterceptors(otelInterceptor),
))
http.ListenAndServe("localhost:8080", mux)
}
func makeRequest() {
otelInterceptor, err := otelconnect.NewInterceptor()
if err != nil {
log.Fatal(err)
}
client := pingv1connect.NewPingServiceClient(
http.DefaultClient,
"http://localhost:8080",
connect.WithInterceptors(otelInterceptor),
)
resp, err := client.Ping(
context.Background(),
connect.NewRequest(&pingv1.PingRequest{}),
)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp)
}
By default, instrumented servers are conservative and behave as though they're internet-facing. They don't trust any tracing information sent by the client, and will create new trace spans for each request. The new spans are linked to the remote span for reference (using OpenTelemetry's trace.Link
), but tracing UIs will display the request as a new top-level transaction.
If your server is deployed as an internal service, configure otelconnect
to trust the client's tracing information using otelconnect.WithTrustRemote
. With this option, servers will create child spans for each request.
By default, the OpenTelemetry RPC conventions produce high-cardinality server-side metric and tracing output. In particular, servers tag all metrics and trace data with the server's IP address and the remote port number. To drop these attributes, use otelconnect.WithoutServerPeerAttributes
. For more customizable attribute filtering, use otelconnect.WithFilter.
Unary | Streaming Client | Streaming Handler | |
---|---|---|---|
Metrics | ✅ | ✅ | ✅ |
Tracing | ✅ | ✅ | ✅ |
otelconnect
supports:
go.opentelemetry.io/otel
tracing and metrics SDK.Offered under the Apache 2 license.