example/trace/http/server/server.go (62 lines of code) (raw):

// Copyright 2019 OpenTelemetry Authors // Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "fmt" "io" "log" "net/http" "os" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/propagation" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/trace" cloudtrace "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace" gcppropagator "github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator" ) func initTracer() (func(), error) { projectID := os.Getenv("PROJECT_ID") // Create Google Cloud Trace exporter to be able to retrieve // the collected spans. exporter, err := cloudtrace.New(cloudtrace.WithProjectID(projectID)) if err != nil { return nil, err } tp := sdktrace.NewTracerProvider( // For this example code we use sdktrace.AlwaysSample sampler to sample all traces. // In a production application, use sdktrace.ProbabilitySampler with a desired probability. sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithBatcher(exporter)) otel.SetTracerProvider(tp) return func() { err := tp.Shutdown(context.Background()) if err != nil { fmt.Printf("error shutting down trace provider: %+v", err) } }, nil } func installPropagators() { otel.SetTextMapPropagator( propagation.NewCompositeTextMapPropagator( // Putting the CloudTraceOneWayPropagator first means the TraceContext propagator // takes precedence if both the traceparent and the XCTC headers exist. gcppropagator.CloudTraceOneWayPropagator{}, propagation.TraceContext{}, propagation.Baggage{}, )) } func main() { installPropagators() shutdown, err := initTracer() if err != nil { log.Fatal(err) } defer shutdown() helloHandler := func(w http.ResponseWriter, req *http.Request) { ctx := req.Context() span := trace.SpanFromContext(ctx) span.SetAttributes(attribute.String("server", "handling this...")) _, _ = io.WriteString(w, "Hello, world!\n") } otelHandler := otelhttp.NewHandler(http.HandlerFunc(helloHandler), "Hello") http.Handle("/hello", otelHandler) err = http.ListenAndServe(":7777", nil) if err != nil { panic(err) } }