tracing.go 2.3 KB

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