github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/23_proto_actor/jaegertracing/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "math/rand" 7 "time" 8 9 console "github.com/AsynkronIT/goconsole" 10 "github.com/AsynkronIT/protoactor-go/actor" 11 "github.com/AsynkronIT/protoactor-go/actor/middleware/opentracing" 12 "github.com/uber/jaeger-client-go" 13 jaegercfg "github.com/uber/jaeger-client-go/config" 14 jaegerlog "github.com/uber/jaeger-client-go/log" 15 "github.com/uber/jaeger-lib/metrics" 16 ) 17 18 func main() { 19 jaegerCloser := initJaeger() 20 defer jaegerCloser.Close() 21 22 rootContext := actor.NewRootContext(nil).WithSpawnMiddleware(opentracing.TracingMiddleware()) 23 24 pid := rootContext.SpawnPrefix(createProps(5), "root") 25 for i := 0; i < 3; i++ { 26 rootContext.RequestFuture(pid, &request{i}, 10*time.Second).Wait() 27 } 28 console.ReadLine() 29 } 30 31 func initJaeger() io.Closer { 32 // Sample configuration for testing. Use constant sampling to sample every trace 33 // and enable LogSpan to log every span via configured Logger. 34 cfg := jaegercfg.Configuration{ 35 Sampler: &jaegercfg.SamplerConfig{ 36 Type: jaeger.SamplerTypeConst, 37 Param: 1, 38 }, 39 Reporter: &jaegercfg.ReporterConfig{ 40 LogSpans: true, 41 }, 42 } 43 44 // Example logger and metrics factory. Use github.com/uber/jaeger-client-go/log 45 // and github.com/uber/jaeger-lib/metrics respectively to bind to real logging and metrics 46 // frameworks. 47 jLogger := jaegerlog.StdLogger 48 jMetricsFactory := metrics.NullFactory 49 50 // Initialize tracer with a logger and a metrics factory 51 closer, err := cfg.InitGlobalTracer( 52 "jaeger-test", 53 jaegercfg.Logger(jLogger), 54 jaegercfg.Metrics(jMetricsFactory), 55 ) 56 if err != nil { 57 //log.Printf("Could not initialize jaeger tracer: %s", err.Error()) 58 panic(fmt.Sprintf("Could not initialize jaeger tracer: %s", err.Error())) 59 } 60 return closer 61 } 62 63 func createProps(levels int) *actor.Props { 64 if levels <= 1 { 65 sleep := time.Duration(rand.Intn(5000)) 66 67 return actor.PropsFromFunc(func(c actor.Context) { 68 switch msg := c.Message().(type) { 69 case *request: 70 time.Sleep(sleep * time.Millisecond) 71 if c.Sender() != nil { 72 c.Respond(&response{i: msg.i}) 73 } 74 } 75 }) 76 } 77 78 var childs []*actor.PID 79 return actor.PropsFromFunc(func(c actor.Context) { 80 switch c.Message().(type) { 81 case *actor.Started: 82 for i := 0; i < 3; i++ { 83 childs = append(childs, c.Spawn(createProps(levels-1))) 84 } 85 case *request: 86 c.Forward(childs[rand.Intn(len(childs))]) 87 } 88 }) 89 } 90 91 type request struct { 92 i int 93 } 94 95 type response struct { 96 i int 97 }