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  }