diff --git a/conf/defaults.ini b/conf/defaults.ini index 715ddb7513c..bf60d4300c0 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -452,6 +452,11 @@ url = https://grafana.com [grafana_com] url = https://grafana.com +#################################### Distributed tracing ############ +[tracing.jaeger] +# jaeger destination (ex localhost:5775) +address = + #################################### External Image Storage ############## [external_image_storage] # You can choose between (s3, webdav, gcs) diff --git a/conf/sample.ini b/conf/sample.ini index 8947a05b0a4..706ede8899f 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -391,6 +391,11 @@ ;address = ;prefix = prod.grafana.%(instance_name)s. +#################################### Distributed tracing ############ +[tracing.jaeger] +# Enable by setting the address sending traces to jaeger (ex localhost:5775) +;address = localhost:5775 + #################################### Grafana.com integration ########################## # Url used to to import dashboards directly from Grafana.com [grafana_com] diff --git a/pkg/cmd/grafana-server/server.go b/pkg/cmd/grafana-server/server.go index 7692719084a..f6a94ac6ef0 100644 --- a/pkg/cmd/grafana-server/server.go +++ b/pkg/cmd/grafana-server/server.go @@ -24,10 +24,7 @@ import ( "github.com/grafana/grafana/pkg/services/search" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/social" - opentracing "github.com/opentracing/opentracing-go" - jaeger "github.com/uber/jaeger-client-go" - jaegercfg "github.com/uber/jaeger-client-go/config" - jaegerlog "github.com/uber/jaeger-client-go/log" + "github.com/grafana/grafana/pkg/tracing" ) func NewGrafanaServer() models.GrafanaServer { @@ -65,33 +62,12 @@ func (g *GrafanaServerImpl) Start() { eventpublisher.Init() plugins.Init() - //localhost:5775 - - cfg := jaegercfg.Configuration{ - Disabled: false, - Sampler: &jaegercfg.SamplerConfig{ - Type: jaeger.SamplerTypeConst, - Param: 1, - }, - Reporter: &jaegercfg.ReporterConfig{ - LogSpans: false, - LocalAgentHostPort: "localhost:5775", - }, - } - - jLogger := jaegerlog.StdLogger - - tracer, closer, err := cfg.New( - "grafana", - jaegercfg.Logger(jLogger), - ) + closer, err := tracing.Init(setting.Cfg) if err != nil { - g.log.Error("tracing", "error", err) + g.log.Error("Tracing settings is not valid", "error", err) g.Shutdown(1, "Startup failed") return } - - opentracing.InitGlobalTracer(tracer) defer closer.Close() // init alerting @@ -104,7 +80,7 @@ func (g *GrafanaServerImpl) Start() { cleanUpService := cleanup.NewCleanUpService() g.childRoutines.Go(func() error { return cleanUpService.Run(g.context) }) - if err := notifications.Init(); err != nil { + if err = notifications.Init(); err != nil { g.log.Error("Notification service failed to initialize", "error", err) g.Shutdown(1, "Startup failed") return diff --git a/pkg/tracing/tracing.go b/pkg/tracing/tracing.go new file mode 100644 index 00000000000..b5caf36c91a --- /dev/null +++ b/pkg/tracing/tracing.go @@ -0,0 +1,77 @@ +package tracing + +import ( + "io" + "io/ioutil" + + "github.com/grafana/grafana/pkg/log" + "github.com/grafana/grafana/pkg/setting" + + opentracing "github.com/opentracing/opentracing-go" + jaeger "github.com/uber/jaeger-client-go" + jaegercfg "github.com/uber/jaeger-client-go/config" + jaegerlog "github.com/uber/jaeger-client-go/log" + ini "gopkg.in/ini.v1" +) + +var ( + logger log.Logger = log.New("tracing") +) + +type TracingSettings struct { + Enabled bool + Address string +} + +func Init(file *ini.File) (io.Closer, error) { + settings := parseSettings(file) + return internalInit(settings) +} + +func parseSettings(file *ini.File) *TracingSettings { + settings := &TracingSettings{} + + var section, err = setting.Cfg.GetSection("tracing.jaeger") + if err != nil { + return settings + } + + settings.Address = section.Key("address").MustString("") + if settings.Address != "" { + settings.Enabled = true + } + + return settings +} + +func internalInit(settings *TracingSettings) (io.Closer, error) { + if !settings.Enabled { + return ioutil.NopCloser(nil), nil + } + + cfg := jaegercfg.Configuration{ + Disabled: !settings.Enabled, + Sampler: &jaegercfg.SamplerConfig{ + Type: jaeger.SamplerTypeConst, + Param: 1, + }, + Reporter: &jaegercfg.ReporterConfig{ + LogSpans: false, + LocalAgentHostPort: settings.Address, + }, + } + + jLogger := jaegerlog.StdLogger + + tracer, closer, err := cfg.New( + "grafana", + jaegercfg.Logger(jLogger), + ) + if err != nil { + return nil, err + } + + logger.Info("Initialized jaeger tracer", "address", settings.Address) + opentracing.InitGlobalTracer(tracer) + return closer, nil +}