github.com/pslzym/go-ethereum@v1.8.17-0.20180926104442-4b6824e07b1b/swarm/tracing/tracing.go (about) 1 package tracing 2 3 import ( 4 "io" 5 "os" 6 "strings" 7 "time" 8 9 "github.com/ethereum/go-ethereum/log" 10 jaeger "github.com/uber/jaeger-client-go" 11 jaegercfg "github.com/uber/jaeger-client-go/config" 12 jaegerlog "github.com/uber/jaeger-client-go/log" 13 cli "gopkg.in/urfave/cli.v1" 14 ) 15 16 var Enabled bool = false 17 18 // TracingEnabledFlag is the CLI flag name to use to enable trace collections. 19 const TracingEnabledFlag = "tracing" 20 21 var ( 22 Closer io.Closer 23 ) 24 25 var ( 26 TracingFlag = cli.BoolFlag{ 27 Name: TracingEnabledFlag, 28 Usage: "Enable tracing", 29 } 30 TracingEndpointFlag = cli.StringFlag{ 31 Name: "tracing.endpoint", 32 Usage: "Tracing endpoint", 33 Value: "0.0.0.0:6831", 34 } 35 TracingSvcFlag = cli.StringFlag{ 36 Name: "tracing.svc", 37 Usage: "Tracing service name", 38 Value: "swarm", 39 } 40 ) 41 42 // Flags holds all command-line flags required for tracing collection. 43 var Flags = []cli.Flag{ 44 TracingFlag, 45 TracingEndpointFlag, 46 TracingSvcFlag, 47 } 48 49 // Init enables or disables the open tracing system. 50 func init() { 51 for _, arg := range os.Args { 52 if flag := strings.TrimLeft(arg, "-"); flag == TracingEnabledFlag { 53 Enabled = true 54 } 55 } 56 } 57 58 func Setup(ctx *cli.Context) { 59 if Enabled { 60 log.Info("Enabling opentracing") 61 var ( 62 endpoint = ctx.GlobalString(TracingEndpointFlag.Name) 63 svc = ctx.GlobalString(TracingSvcFlag.Name) 64 ) 65 66 Closer = initTracer(endpoint, svc) 67 } 68 } 69 70 func initTracer(endpoint, svc string) (closer io.Closer) { 71 // Sample configuration for testing. Use constant sampling to sample every trace 72 // and enable LogSpan to log every span via configured Logger. 73 cfg := jaegercfg.Configuration{ 74 Sampler: &jaegercfg.SamplerConfig{ 75 Type: jaeger.SamplerTypeConst, 76 Param: 1, 77 }, 78 Reporter: &jaegercfg.ReporterConfig{ 79 LogSpans: true, 80 BufferFlushInterval: 1 * time.Second, 81 LocalAgentHostPort: endpoint, 82 }, 83 } 84 85 // Example logger and metrics factory. Use github.com/uber/jaeger-client-go/log 86 // and github.com/uber/jaeger-lib/metrics respectively to bind to real logging and metrics 87 // frameworks. 88 jLogger := jaegerlog.StdLogger 89 //jMetricsFactory := metrics.NullFactory 90 91 // Initialize tracer with a logger and a metrics factory 92 closer, err := cfg.InitGlobalTracer( 93 svc, 94 jaegercfg.Logger(jLogger), 95 //jaegercfg.Metrics(jMetricsFactory), 96 //jaegercfg.Observer(rpcmetrics.NewObserver(jMetricsFactory, rpcmetrics.DefaultNameNormalizer)), 97 ) 98 if err != nil { 99 log.Error("Could not initialize Jaeger tracer", "err", err) 100 } 101 102 return closer 103 }