serverB.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package main
  2. import (
  3. "context"
  4. "log"
  5. "net/http"
  6. "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
  7. "go.opentelemetry.io/otel"
  8. "go.opentelemetry.io/otel/propagation"
  9. otel2 "standard/open_telemetry/otel"
  10. )
  11. func main() {
  12. ctx := context.Background()
  13. serviceName := "ServiceB" // 服务名称
  14. jaegerEndpoint := "http://7162377c.r11.cpolar.top//api/v2/spans" // Jaeger 的 Collector Endpoint
  15. // 初始化 OpenTelemetry SDK
  16. shutdown, err := otel2.SetupOTelSDK(ctx, serviceName, jaegerEndpoint)
  17. if err != nil {
  18. log.Fatalf("Failed to setup OpenTelemetry SDK: %v", err)
  19. }
  20. defer shutdown(ctx)
  21. // 注册 /serviceB 路由
  22. http.HandleFunc("/serviceB", func(w http.ResponseWriter, r *http.Request) {
  23. ctx, span := otel.Tracer(serviceName).Start(r.Context(), "ServiceB.serviceB") // 创建一个 Span
  24. defer span.End()
  25. // 调用 ServiceC
  26. callServiceC(ctx)
  27. })
  28. log.Println("Starting ServiceB on :8081")
  29. log.Fatal(http.ListenAndServe(":8081", otelhttp.NewHandler(http.DefaultServeMux, serviceName)))
  30. }
  31. // callServiceC 调用 ServiceC 的 /serviceC 接口
  32. func callServiceC(ctx context.Context) {
  33. url := "http://localhost:8082/serviceC" // ServiceC 的地址
  34. req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
  35. if err != nil {
  36. log.Printf("Failed to create request: %v", err)
  37. return
  38. }
  39. // 将上下文中的追踪信息注入到请求头中,以便 ServiceC 可以继续追踪
  40. otel.GetTextMapPropagator().Inject(ctx, propagation.HeaderCarrier(req.Header))
  41. log.Printf("Request headers: %+v", req.Header)
  42. client := &http.Client{}
  43. resp, err := client.Do(req)
  44. if err != nil {
  45. log.Printf("Failed to call ServiceC: %v", err)
  46. return
  47. }
  48. defer resp.Body.Close()
  49. log.Println("Called ServiceC successfully")
  50. }