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
的訪問追蹤了測試