tracing.go 2.4 KB

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