agent.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. sdktrace "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 := sdktrace.NewTracerProvider(
  37. // Set the sampling rate based on the parent span to 100%
  38. sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(c.Sampler))),
  39. // Always be sure to batch in production.
  40. sdktrace.WithBatcher(exp),
  41. // Record information about this application in an Resource.
  42. sdktrace.WithResource(resource.NewSchemaless(semconv.ServiceNameKey.String(c.Name))),
  43. )
  44. otel.SetTracerProvider(tp)
  45. otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
  46. propagation.TraceContext{}, propagation.Baggage{}))
  47. otel.SetErrorHandler(otel.ErrorHandlerFunc(func(e error) {
  48. logx.Errorf("[otel] error: %v", err)
  49. }))
  50. enabled.Set(true)
  51. })
  52. }