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  }