* swarm: propagate ctx, enable opentracing * swarm/tracing: log error when tracing is misconfigured
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package tracing
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/ethereum/go-ethereum/log"
 | |
| 	jaeger "github.com/uber/jaeger-client-go"
 | |
| 	jaegercfg "github.com/uber/jaeger-client-go/config"
 | |
| 	jaegerlog "github.com/uber/jaeger-client-go/log"
 | |
| 	cli "gopkg.in/urfave/cli.v1"
 | |
| )
 | |
| 
 | |
| var Enabled bool = false
 | |
| 
 | |
| // TracingEnabledFlag is the CLI flag name to use to enable trace collections.
 | |
| const TracingEnabledFlag = "tracing"
 | |
| 
 | |
| var (
 | |
| 	Closer io.Closer
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	TracingFlag = cli.BoolFlag{
 | |
| 		Name:  TracingEnabledFlag,
 | |
| 		Usage: "Enable tracing",
 | |
| 	}
 | |
| 	TracingEndpointFlag = cli.StringFlag{
 | |
| 		Name:  "tracing.endpoint",
 | |
| 		Usage: "Tracing endpoint",
 | |
| 		Value: "0.0.0.0:6831",
 | |
| 	}
 | |
| 	TracingSvcFlag = cli.StringFlag{
 | |
| 		Name:  "tracing.svc",
 | |
| 		Usage: "Tracing service name",
 | |
| 		Value: "swarm",
 | |
| 	}
 | |
| )
 | |
| 
 | |
| // Flags holds all command-line flags required for tracing collection.
 | |
| var Flags = []cli.Flag{
 | |
| 	TracingFlag,
 | |
| 	TracingEndpointFlag,
 | |
| 	TracingSvcFlag,
 | |
| }
 | |
| 
 | |
| // Init enables or disables the open tracing system.
 | |
| func init() {
 | |
| 	for _, arg := range os.Args {
 | |
| 		if flag := strings.TrimLeft(arg, "-"); flag == TracingEnabledFlag {
 | |
| 			Enabled = true
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func Setup(ctx *cli.Context) {
 | |
| 	if Enabled {
 | |
| 		log.Info("Enabling opentracing")
 | |
| 		var (
 | |
| 			endpoint = ctx.GlobalString(TracingEndpointFlag.Name)
 | |
| 			svc      = ctx.GlobalString(TracingSvcFlag.Name)
 | |
| 		)
 | |
| 
 | |
| 		Closer = initTracer(endpoint, svc)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func initTracer(endpoint, svc string) (closer io.Closer) {
 | |
| 	// Sample configuration for testing. Use constant sampling to sample every trace
 | |
| 	// and enable LogSpan to log every span via configured Logger.
 | |
| 	cfg := jaegercfg.Configuration{
 | |
| 		Sampler: &jaegercfg.SamplerConfig{
 | |
| 			Type:  jaeger.SamplerTypeConst,
 | |
| 			Param: 1,
 | |
| 		},
 | |
| 		Reporter: &jaegercfg.ReporterConfig{
 | |
| 			LogSpans:            true,
 | |
| 			BufferFlushInterval: 1 * time.Second,
 | |
| 			LocalAgentHostPort:  endpoint,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	// Example logger and metrics factory. Use github.com/uber/jaeger-client-go/log
 | |
| 	// and github.com/uber/jaeger-lib/metrics respectively to bind to real logging and metrics
 | |
| 	// frameworks.
 | |
| 	jLogger := jaegerlog.StdLogger
 | |
| 	//jMetricsFactory := metrics.NullFactory
 | |
| 
 | |
| 	// Initialize tracer with a logger and a metrics factory
 | |
| 	closer, err := cfg.InitGlobalTracer(
 | |
| 		svc,
 | |
| 		jaegercfg.Logger(jLogger),
 | |
| 		//jaegercfg.Metrics(jMetricsFactory),
 | |
| 		//jaegercfg.Observer(rpcmetrics.NewObserver(jMetricsFactory, rpcmetrics.DefaultNameNormalizer)),
 | |
| 	)
 | |
| 	if err != nil {
 | |
| 		log.Error("Could not initialize Jaeger tracer", "err", err)
 | |
| 	}
 | |
| 
 | |
| 	return closer
 | |
| }
 |