Skip to content

Instantly share code, notes, and snippets.

@garthk
Last active February 21, 2022 22:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save garthk/59306f28340061972cb3d0bd0a413c3e to your computer and use it in GitHub Desktop.
Save garthk/59306f28340061972cb3d0bd0a413c3e to your computer and use it in GitHub Desktop.
Propagating OpenTelemetry trace context through the HTTP to GRPC gateway to the request handlers
package demo
import (
"context"
"net/http"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/propagation"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
// propagateTraceContext injects the trace context into the request metadata.
// You'll also need otelgrpc.UnaryServerInterceptor. See their example:
// https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/instrumentation/google.golang.org/grpc/otelgrpc/example
func propagateTraceContext(ctx context.Context, req *http.Request) metadata.MD {
carrier := propagation.MapCarrier{}
otel.GetTextMapPropagator().Inject(ctx, carrier)
return metadata.New(carrier)
}
func grpcServiceMux(ctx context.Context, endpoint string, opts ...grpc.DialOption) (http.Handler, error) {
mux := runtime.NewServeMux(runtime.WithMetadata(propagateTraceContext))
if err := RegisterMyServiceHandlerFromEndpoint(ctx, mux, endpoint, opts); err != nil {
return err
}
return otelhttp.NewHandler(mux, "HTTP"), nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment