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  }