Golang微服務:Micro Trace使用opentracing jaeger

trace

Micro經過Wrapper實現了三種trace接口,aswxray,opencensus,opentracing,這裏主要關注opentracing,opentracing已成爲行業標準。json

opentracing

要引入OpenTracing方案,只須要opentracing.NewClientWrapper加入Client或者Server便可。瀏覽器

func NewClientWrapper(ot opentracing.Tracer) client.Wrapper {
	return func(c client.Client) client.Client {
		return &otWrapper{ot, c}
	}
}

opentracing.NewClientWrapper方法入參是實現OpenTracing的接口opentracing.Tracer服務器

type Tracer interface {
    StartSpan(operationName string, opts ...StartSpanOption) Span
    Inject(sm SpanContext, format interface{}, carrier interface{}) error
    Extract(format interface{}, carrier interface{}) (SpanContext, error)
}

jaeger

部署一個測試的jaeger,服務器地址:192.168.8.144,Agent的默認端口是5775。app

/home/service/base/jaeger
[root@localhost jaeger]# ll
total 158444
-rwxr-xr-x 1 root root 14565068 Nov 16 19:35 example-hotrod
-rwxr-xr-x 1 root root 20387089 Nov 16 19:35 jaeger-agent
-rwxr-xr-x 1 root root 38456594 Nov 16 19:35 jaeger-all-in-one
-rwxr-xr-x 1 root root 29731462 Nov 16 19:35 jaeger-collector
-rwxr-xr-x 1 root root 25523281 Nov 16 19:35 jaeger-ingester
-rwxr-xr-x 1 root root 33563911 Nov 16 19:35 jaeger-query
-rwxr-xr-x 1 root root       43 Nov 16 19:36 run
-rw-r--r-- 1 root root     1939 Nov 16 19:36 x.log
[root@localhost jaeger]# cat run
nohup ./jaeger-all-in-one  >> x.log 2>&1 &

jaeger是一款分佈式的追蹤系統,實現了opentracingAPI標準,也是Go生態的,是CNCF成員。分佈式

func TestJaeger(t *testing.T) {
	cfg := config.Configuration{
		ServiceName: "MicroTestService",//自定義服務名稱
		Sampler: &config.SamplerConfig{
			Type:  "const",
			Param: 1,
		},
		Reporter: &config.ReporterConfig{
			LogSpans:            true,
			BufferFlushInterval: 1 * time.Second,
			LocalAgentHostPort:  "192.168.8.144:5775",//jaeger agent
		},
	}
	tracer, closer, err := cfg.NewTracer()
	if err != nil {
		t.Error(err)
		return
	}
	defer closer.Close()

	r := mock.NewRegistry()
	s := selector.NewSelector(selector.Registry(r))

	c := client.NewClient(
		// set the selector
		client.Selector(s),
		// add the trace wrapper
		client.Wrap(NewClientWrapper(tracer)),
	)

	req := c.NewRequest("test.service", "Test.Method", map[string]string{
		"foo": "bar",
	}, client.WithContentType("application/json"))

	var rsp map[string]interface{}
	c.Call(context.TODO(), req, rsp)
	t.Log(rsp)
}

瀏覽器訪問:http://192.168.8.144:16686/search能夠發現有服務MicroTestService的訪問追蹤了測試

相關文章
相關標籤/搜索