7c9314f231
* 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
|
|
}
|