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