tracing.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package tracing
  2. import (
  3. "io"
  4. "strings"
  5. "github.com/grafana/grafana/pkg/log"
  6. "github.com/grafana/grafana/pkg/setting"
  7. opentracing "github.com/opentracing/opentracing-go"
  8. jaegercfg "github.com/uber/jaeger-client-go/config"
  9. ini "gopkg.in/ini.v1"
  10. )
  11. var (
  12. logger log.Logger = log.New("tracing")
  13. )
  14. type TracingSettings struct {
  15. Enabled bool
  16. Address string
  17. CustomTags map[string]string
  18. SamplerType string
  19. SamplerParam float64
  20. }
  21. func Init(file *ini.File) (io.Closer, error) {
  22. settings := parseSettings(file)
  23. return internalInit(settings)
  24. }
  25. func parseSettings(file *ini.File) *TracingSettings {
  26. settings := &TracingSettings{}
  27. var section, err = setting.Cfg.GetSection("tracing.jaeger")
  28. if err != nil {
  29. return settings
  30. }
  31. settings.Address = section.Key("address").MustString("")
  32. if settings.Address != "" {
  33. settings.Enabled = true
  34. }
  35. settings.CustomTags = splitTagSettings(section.Key("always_included_tag").MustString(""))
  36. settings.SamplerType = section.Key("sampler_type").MustString("")
  37. settings.SamplerParam = section.Key("sampler_param").MustFloat64(1)
  38. return settings
  39. }
  40. func internalInit(settings *TracingSettings) (io.Closer, error) {
  41. if !settings.Enabled {
  42. return &nullCloser{}, nil
  43. }
  44. cfg := jaegercfg.Configuration{
  45. Disabled: !settings.Enabled,
  46. Sampler: &jaegercfg.SamplerConfig{
  47. Type: settings.SamplerType,
  48. Param: settings.SamplerParam,
  49. },
  50. Reporter: &jaegercfg.ReporterConfig{
  51. LogSpans: false,
  52. LocalAgentHostPort: settings.Address,
  53. },
  54. }
  55. jLogger := &jaegerLogWrapper{logger: log.New("jaeger")}
  56. options := []jaegercfg.Option{}
  57. options = append(options, jaegercfg.Logger(jLogger))
  58. for tag, value := range settings.CustomTags {
  59. options = append(options, jaegercfg.Tag(tag, value))
  60. }
  61. tracer, closer, err := cfg.New("grafana", options...)
  62. if err != nil {
  63. return nil, err
  64. }
  65. opentracing.InitGlobalTracer(tracer)
  66. logger.Info("Initializing Jaeger tracer", "address", settings.Address)
  67. return closer, nil
  68. }
  69. func splitTagSettings(input string) map[string]string {
  70. res := map[string]string{}
  71. tags := strings.Split(input, ",")
  72. for _, v := range tags {
  73. kv := strings.Split(v, ":")
  74. if len(kv) > 1 {
  75. res[kv[0]] = kv[1]
  76. }
  77. }
  78. return res
  79. }
  80. type jaegerLogWrapper struct {
  81. logger log.Logger
  82. }
  83. func (jlw *jaegerLogWrapper) Error(msg string) {
  84. jlw.logger.Error(msg)
  85. }
  86. func (jlw *jaegerLogWrapper) Infof(msg string, args ...interface{}) {
  87. jlw.logger.Info(msg, args)
  88. }
  89. type nullCloser struct{}
  90. func (*nullCloser) Close() error { return nil }