| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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")
- }
|