agent.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package opentelemetry
  2. import (
  3. "sync"
  4. "github.com/tal-tech/go-zero/core/logx"
  5. "github.com/tal-tech/go-zero/core/syncx"
  6. "go.opentelemetry.io/otel"
  7. "go.opentelemetry.io/otel/exporters/jaeger"
  8. "go.opentelemetry.io/otel/propagation"
  9. "go.opentelemetry.io/otel/sdk/resource"
  10. tracesdk "go.opentelemetry.io/otel/sdk/trace"
  11. semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
  12. )
  13. var (
  14. once sync.Once
  15. enabled syncx.AtomicBool
  16. )
  17. // Enabled returns if opentelemetry is enabled.
  18. func Enabled() bool {
  19. return enabled.True()
  20. }
  21. // StartAgent starts a opentelemetry agent.
  22. func StartAgent(c Config) {
  23. once.Do(func() {
  24. if len(c.Endpoint) == 0 {
  25. return
  26. }
  27. // Just support jaeger now
  28. if c.Batcher != "jaeger" {
  29. return
  30. }
  31. exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(c.Endpoint)))
  32. if err != nil {
  33. logx.Error(err)
  34. return
  35. }
  36. tp := tracesdk.NewTracerProvider(
  37. // Set the sampling rate based on the parent span to 100%
  38. tracesdk.WithSampler(tracesdk.ParentBased(tracesdk.TraceIDRatioBased(c.Sampler))),
  39. // Always be sure to batch in production.
  40. tracesdk.WithBatcher(exp),
  41. // Record information about this application in an Resource.
  42. tracesdk.WithResource(resource.NewSchemaless(semconv.ServiceNameKey.String(c.Name))),
  43. )
  44. otel.SetTracerProvider(tp)
  45. otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
  46. otel.SetErrorHandler(otelErrHandler{})
  47. enabled.Set(true)
  48. })
  49. }
  50. // errHandler handing otel errors.
  51. type otelErrHandler struct{}
  52. var _ otel.ErrorHandler = otelErrHandler{}
  53. func (o otelErrHandler) Handle(err error) {
  54. logx.Errorf("[otel] error: %v", err)
  55. }