tracing.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package tracing
  2. import (
  3. "context"
  4. "io"
  5. "strings"
  6. "github.com/grafana/grafana/pkg/infra/log"
  7. "github.com/grafana/grafana/pkg/registry"
  8. "github.com/grafana/grafana/pkg/setting"
  9. opentracing "github.com/opentracing/opentracing-go"
  10. jaegercfg "github.com/uber/jaeger-client-go/config"
  11. )
  12. func init() {
  13. registry.RegisterService(&TracingService{})
  14. }
  15. type TracingService struct {
  16. enabled bool
  17. address string
  18. customTags map[string]string
  19. samplerType string
  20. samplerParam float64
  21. log log.Logger
  22. closer io.Closer
  23. Cfg *setting.Cfg `inject:""`
  24. }
  25. func (ts *TracingService) Init() error {
  26. ts.log = log.New("tracing")
  27. ts.parseSettings()
  28. if ts.enabled {
  29. ts.initGlobalTracer()
  30. }
  31. return nil
  32. }
  33. func (ts *TracingService) parseSettings() {
  34. var section, err = ts.Cfg.Raw.GetSection("tracing.jaeger")
  35. if err != nil {
  36. return
  37. }
  38. ts.address = section.Key("address").MustString("")
  39. if ts.address != "" {
  40. ts.enabled = true
  41. }
  42. ts.customTags = splitTagSettings(section.Key("always_included_tag").MustString(""))
  43. ts.samplerType = section.Key("sampler_type").MustString("")
  44. ts.samplerParam = section.Key("sampler_param").MustFloat64(1)
  45. }
  46. func (ts *TracingService) initGlobalTracer() error {
  47. cfg := jaegercfg.Configuration{
  48. ServiceName: "grafana",
  49. Disabled: !ts.enabled,
  50. Sampler: &jaegercfg.SamplerConfig{
  51. Type: ts.samplerType,
  52. Param: ts.samplerParam,
  53. },
  54. Reporter: &jaegercfg.ReporterConfig{
  55. LogSpans: false,
  56. LocalAgentHostPort: ts.address,
  57. },
  58. }
  59. jLogger := &jaegerLogWrapper{logger: log.New("jaeger")}
  60. options := []jaegercfg.Option{}
  61. options = append(options, jaegercfg.Logger(jLogger))
  62. for tag, value := range ts.customTags {
  63. options = append(options, jaegercfg.Tag(tag, value))
  64. }
  65. tracer, closer, err := cfg.NewTracer(options...)
  66. if err != nil {
  67. return err
  68. }
  69. opentracing.InitGlobalTracer(tracer)
  70. ts.closer = closer
  71. return nil
  72. }
  73. func (ts *TracingService) Run(ctx context.Context) error {
  74. <-ctx.Done()
  75. if ts.closer != nil {
  76. ts.log.Info("Closing tracing")
  77. ts.closer.Close()
  78. }
  79. return nil
  80. }
  81. func splitTagSettings(input string) map[string]string {
  82. res := map[string]string{}
  83. tags := strings.Split(input, ",")
  84. for _, v := range tags {
  85. kv := strings.Split(v, ":")
  86. if len(kv) > 1 {
  87. res[kv[0]] = kv[1]
  88. }
  89. }
  90. return res
  91. }
  92. type jaegerLogWrapper struct {
  93. logger log.Logger
  94. }
  95. func (jlw *jaegerLogWrapper) Error(msg string) {
  96. jlw.logger.Error(msg)
  97. }
  98. func (jlw *jaegerLogWrapper) Infof(msg string, args ...interface{}) {
  99. jlw.logger.Info(msg, args)
  100. }