in observability/distributed-tracing/main.go [58:96]
func main() {
ctx := context.Background()
// Set up the Cloud Trace exporter.
exporter, err := cloudtrace.New()
if err != nil {
log.Fatalf("cloudtrace.New: %v", err)
}
// Identify your application using resource detection.
res, err := resource.New(ctx,
// Use the GCP resource detector to detect information about the GKE Cluster.
resource.WithDetectors(gcp.NewDetector()),
resource.WithTelemetrySDK(),
)
if err != nil {
log.Fatalf("resource.New: %v", err)
}
tp := trace.NewTracerProvider(
trace.WithBatcher(exporter),
trace.WithResource(res),
)
// Set the global TracerProvider which is used by otelhttp to record spans.
otel.SetTracerProvider(tp)
// Flush any pending spans on shutdown.
defer tp.ForceFlush(ctx)
// Set the global Propagators which is used by otelhttp to propagate
// context using the w3c traceparent and baggage formats.
otel.SetTextMapPropagator(autoprop.NewTextMapPropagator())
// Handle incoming request.
r := mux.NewRouter()
r.HandleFunc("/", mainHandler)
var handler http.Handler = r
// Use otelhttp to create spans and extract context for incoming http
// requests.
handler = otelhttp.NewHandler(handler, "server")
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%v", os.Getenv("PORT")), handler))
}