serverA.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package main
  2. import (
  3. "context"
  4. "log"
  5. "math/rand"
  6. "net/http"
  7. "time"
  8. "github.com/gin-gonic/gin"
  9. "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
  10. "go.opentelemetry.io/otel"
  11. "go.opentelemetry.io/otel/propagation"
  12. otel2 "standard/open_telemetry/otel"
  13. )
  14. const (
  15. name = "app2"
  16. addr = ":8081"
  17. otelTarget = "localhost:4317"
  18. )
  19. func main() {
  20. ctx := context.Background()
  21. serviceName := "ServiceA" // 服务名称
  22. jaegerEndpoint := "http://7162377c.r11.cpolar.top/api/v2/spans" // Jaeger 的 Collector Endpoint
  23. // 初始化 OpenTelemetry SDK
  24. shutdown, err := otel2.SetupOTelSDK(ctx, serviceName, jaegerEndpoint)
  25. if err != nil {
  26. log.Fatalf("Failed to setup OpenTelemetry SDK: %v", err)
  27. }
  28. defer shutdown(ctx)
  29. // Setup Gin router
  30. router := gin.Default()
  31. router.Use(otelgin.Middleware(name))
  32. router.GET("/work", work)
  33. // Start the server
  34. err = router.Run(addr)
  35. if err != nil {
  36. log.Panicf("Failed to start the server: %v", err)
  37. }
  38. }
  39. func work(c *gin.Context) {
  40. duration := time.Duration(rand.Intn(3)) * time.Second
  41. time.Sleep(duration)
  42. c.JSON(http.StatusOK, gin.H{
  43. "message": "Hello from app2!",
  44. "duration_second": duration.Seconds(),
  45. })
  46. }
  47. // callServiceB 调用 ServiceB 的 /serviceB 接口
  48. func callServiceB(ctx context.Context) {
  49. url := "http://localhost:8081/serviceB" // ServiceB 的地址
  50. req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
  51. if err != nil {
  52. log.Printf("Failed to create request: %v", err)
  53. return
  54. }
  55. // 将上下文中的追踪信息注入到请求头中,以便 ServiceB 可以继续追踪
  56. otel.GetTextMapPropagator().Inject(ctx, propagation.HeaderCarrier(req.Header))
  57. log.Printf("Request headers: %+v", req.Header)
  58. client := &http.Client{}
  59. resp, err := client.Do(req)
  60. if err != nil {
  61. log.Printf("Failed to call ServiceB: %v", err)
  62. return
  63. }
  64. defer resp.Body.Close()
  65. log.Println("Called ServiceB successfully")
  66. }