example/trace/http/client/client.go (84 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/baggage" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/propagation" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.24.0" "go.opentelemetry.io/otel/trace" texporter "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 := texporter.New(texporter.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() tr := otel.Tracer("cloudtrace/example/client") client := http.Client{Transport: otelhttp.NewTransport(http.DefaultTransport)} member, err := baggage.NewMember("username", "donuts") if err != nil { panic(err) } b, err := baggage.New(member) if err != nil { panic(err) } ctx := baggage.ContextWithBaggage(context.Background(), b) var body []byte err = func(ctx context.Context) error { ctx, span := tr.Start(ctx, "say hello", trace.WithAttributes(semconv.PeerServiceKey.String("ExampleService"))) defer span.End() req, _ := http.NewRequestWithContext(ctx, "GET", "http://localhost:7777/hello", nil) fmt.Printf("Sending request...\n") var res *http.Response res, err = client.Do(req) if err != nil { panic(err) } body, err = io.ReadAll(res.Body) _ = res.Body.Close() span.SetStatus(codes.Ok, "") return err }(ctx) if err != nil { panic(err) } fmt.Printf("Response Received: %s\n\n\n", body) fmt.Printf("Waiting to export spans ...\n\n") }