package main import ( "context" "log" "net/http" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/propagation" otel2 "standard/open_telemetry/otel" ) func main() { ctx := context.Background() serviceName := "ServiceB" // 服务名称 jaegerEndpoint := "http://7162377c.r11.cpolar.top//api/v2/spans" // Jaeger 的 Collector Endpoint // 初始化 OpenTelemetry SDK shutdown, err := otel2.SetupOTelSDK(ctx, serviceName, jaegerEndpoint) if err != nil { log.Fatalf("Failed to setup OpenTelemetry SDK: %v", err) } defer shutdown(ctx) // 注册 /serviceB 路由 http.HandleFunc("/serviceB", func(w http.ResponseWriter, r *http.Request) { ctx, span := otel.Tracer(serviceName).Start(r.Context(), "ServiceB.serviceB") // 创建一个 Span defer span.End() // 调用 ServiceC callServiceC(ctx) }) log.Println("Starting ServiceB on :8081") log.Fatal(http.ListenAndServe(":8081", otelhttp.NewHandler(http.DefaultServeMux, serviceName))) } // callServiceC 调用 ServiceC 的 /serviceC 接口 func callServiceC(ctx context.Context) { url := "http://localhost:8082/serviceC" // ServiceC 的地址 req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { log.Printf("Failed to create request: %v", err) return } // 将上下文中的追踪信息注入到请求头中,以便 ServiceC 可以继续追踪 otel.GetTextMapPropagator().Inject(ctx, propagation.HeaderCarrier(req.Header)) log.Printf("Request headers: %+v", req.Header) client := &http.Client{} resp, err := client.Do(req) if err != nil { log.Printf("Failed to call ServiceC: %v", err) return } defer resp.Body.Close() log.Println("Called ServiceC successfully") }