Use connectrpc.com/otelconnect to add OpenTelemetry support to your Connect-Go services. The primary way to achieve this is by creating an interceptor using otelconnect.NewInterceptor(). This interceptor can be applied to both Connect handlers (servers) and Connect clients.
By default, the interceptor uses the global OpenTelemetry TracerProvider and MeterProvider. If you need to use specific providers instead of globals, use the following options:
otelconnect.WithTracerProviderotelconnect.WithMeterProvider
package main
import (
"context"
"fmt"
"log"
"net/http"
"connectrpc.com/connect"
"connectrpc.com/otelconnect"
// Generated from your protobuf schema
pingv1 "connectrpc.com/otelconnect/internal/gen/observability/ping/v1"
"connectrpc.com/otelconnect/internal/gen/observability/ping/v1/pingv1connect"
)
func main() {
mux := http.NewServeMux()
// Create the interceptor
otelInterceptor, err := otelconnect.NewInterceptor()
if err != nil {
log.Fatal(err)
}
// Apply to a server handler
mux.Handle(pingv1connect.NewPingServiceHandler(
&pingv1connect.UnimplementedPingServiceHandler{},
connect.WithInterceptors(otelInterceptor),
))
http.ListenAndServe("localhost:8080", mux)
}
func makeRequest() {
// Create the interceptor
otelInterceptor, err := otelconnect.NewInterceptor()
if err != nil {
log.Fatal(err)
}
// Apply to a client
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)
}