package main import ( "context" "log" "math/rand" "net/http" "time" "github.com/gin-gonic/gin" "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/propagation" otel2 "standard/open_telemetry/otel" ) const ( name = "app2" addr = ":8081" otelTarget = "localhost:4317" ) func main() { ctx := context.Background() serviceName := "ServiceA" // 服务名称 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) // Setup Gin router router := gin.Default() router.Use(otelgin.Middleware(name)) router.GET("/work", work) // Start the server err = router.Run(addr) if err != nil { log.Panicf("Failed to start the server: %v", err) } } func work(c *gin.Context) { duration := time.Duration(rand.Intn(3)) * time.Second time.Sleep(duration) c.JSON(http.StatusOK, gin.H{ "message": "Hello from app2!", "duration_second": duration.Seconds(), }) } // callServiceB 调用 ServiceB 的 /serviceB 接口 func callServiceB(ctx context.Context) { url := "http://localhost:8081/serviceB" // ServiceB 的地址 req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { log.Printf("Failed to create request: %v", err) return } // 将上下文中的追踪信息注入到请求头中,以便 ServiceB 可以继续追踪 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 ServiceB: %v", err) return } defer resp.Body.Close() log.Println("Called ServiceB successfully") }