agent.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package trace
  2. import (
  3. "fmt"
  4. "sync"
  5. "github.com/tal-tech/go-zero/core/logx"
  6. "go.opentelemetry.io/otel"
  7. "go.opentelemetry.io/otel/exporters/jaeger"
  8. "go.opentelemetry.io/otel/exporters/zipkin"
  9. "go.opentelemetry.io/otel/propagation"
  10. "go.opentelemetry.io/otel/sdk/resource"
  11. sdktrace "go.opentelemetry.io/otel/sdk/trace"
  12. semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
  13. )
  14. const (
  15. kindJaeger = "jaeger"
  16. kindZipkin = "zipkin"
  17. )
  18. var once sync.Once
  19. // StartAgent starts a opentelemetry agent.
  20. func StartAgent(c Config) {
  21. once.Do(func() {
  22. startAgent(c)
  23. })
  24. }
  25. func createExporter(c Config) (sdktrace.SpanExporter, error) {
  26. // Just support jaeger now, more for later
  27. switch c.Batcher {
  28. case kindJaeger:
  29. return jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(c.Endpoint)))
  30. case kindZipkin:
  31. return zipkin.New(c.Endpoint)
  32. default:
  33. return nil, fmt.Errorf("unknown exporter: %s", c.Batcher)
  34. }
  35. }
  36. func startAgent(c Config) {
  37. opts := []sdktrace.TracerProviderOption{
  38. // Set the sampling rate based on the parent span to 100%
  39. sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(c.Sampler))),
  40. // Record information about this application in an Resource.
  41. sdktrace.WithResource(resource.NewSchemaless(semconv.ServiceNameKey.String(c.Name))),
  42. }
  43. if len(c.Endpoint) > 0 {
  44. exp, err := createExporter(c)
  45. if err != nil {
  46. logx.Error(err)
  47. return
  48. }
  49. // Always be sure to batch in production.
  50. opts = append(opts, sdktrace.WithBatcher(exp))
  51. }
  52. tp := sdktrace.NewTracerProvider(opts...)
  53. otel.SetTracerProvider(tp)
  54. otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
  55. propagation.TraceContext{}, propagation.Baggage{}))
  56. otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
  57. logx.Errorf("[otel] error: %v", err)
  58. }))
  59. }