// JoinOrNew creates a new Span joined to the provided DelegatingCarrier or // creates Span from the given tracer. func JoinOrNew(tr opentracing.Tracer, carrier *Span, opName string) (opentracing.Span, error) { if carrier != nil { sp, err := tr.Join(opName, basictracer.Delegator, carrier) switch err { case nil: sp.LogEvent(opName) return sp, nil case opentracing.ErrTraceNotFound: default: return nil, err } } return tr.StartSpan(opName), nil }
func TestTracer(t *testing.T) { log.SetFlags(0) var tracer ot.Tracer tracer = &Tracer{} ot.InitGlobalTracer(tracer) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { serverSpan, err := tracer.Join( "serverSpan", ot.TextMap, ot.HTTPHeaderTextMapCarrier(r.Header)) if err != nil { panic(err) } time.Sleep(time.Second * 1) serverSpan.Finish() fmt.Fprintln(w, "Hello, client") })) defer ts.Close() span, nctx := ot.StartSpanFromContext(context.TODO(), "main_test") defer span.Finish() foo(nctx, "bar", 0) httpClient := &http.Client{} httpReq, _ := http.NewRequest("GET", ts.URL, nil) // Transmit the span's TraceContext as HTTP headers on our // outbound request. tracer.Inject( span, ot.TextMap, ot.HTTPHeaderTextMapCarrier(httpReq.Header)) if _, err := httpClient.Do(httpReq); err != nil { panic(err) } }