diff --git a/amqptracer/tracer.go b/amqptracer/tracer.go index 8e02c16..24cd5a5 100644 --- a/amqptracer/tracer.go +++ b/amqptracer/tracer.go @@ -1,6 +1,7 @@ package amqptracer import ( + "errors" opentracing "github.com/opentracing/opentracing-go" "github.com/streadway/amqp" ) @@ -55,3 +56,30 @@ func Extract(hdrs amqp.Table) (opentracing.SpanContext, error) { c := amqpHeadersCarrier(hdrs) return opentracing.GlobalTracer().Extract(opentracing.TextMap, c) } + +// Extract extracts the span context out of the AMQP header. +// +// Example: +// +// func ConsumeMessage(ctx context.Context, msg *amqp.Delivery) error { +// // Extract the span context out of the AMQP header. +// spCtx, _ := amqptracer.ExtractWithTracer(msg.Headers, tracer) +// sp := opentracing.StartSpan( +// "ConsumeMessage", +// opentracing.FollowsFrom(spCtx), +// ) +// defer sp.Finish() +// +// // Update the context with the span for the subsequent reference. +// ctx = opentracing.ContextWithSpan(ctx, sp) +// +// // Actual message processing. +// return ProcessMessage(ctx, msg) +// } +func ExtractWithTracer(hdrs amqp.Table, tracer opentracing.Tracer) (opentracing.SpanContext, error) { + if tracer == nil { + return nil, errors.New("tracer is nil") + } + c := amqpHeadersCarrier(hdrs) + return tracer.Extract(opentracing.TextMap, c) +} diff --git a/amqptracer/tracer_test.go b/amqptracer/tracer_test.go index d0bb80d..7a641d6 100644 --- a/amqptracer/tracer_test.go +++ b/amqptracer/tracer_test.go @@ -48,3 +48,19 @@ func TestExtract(t *testing.T) { t.Errorf("Failed to read testprefix-fakeid correctly") } } + +func TestExtractWithTracer(t *testing.T) { + h := map[string]interface{}{} + h["NotOT"] = "blah" + h["opname"] = "AlsoNotOT" + h["testprefix-fakeid"] = "42" + + // Extract the tracing span out from the AMQP header + ctx, err := ExtractWithTracer(h, testTracer{}) + if err != nil { + t.Fatal(err) + } + if ctx.(testSpanContext).FakeID != 42 { + t.Errorf("Failed to read testprefix-fakeid correctly") + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0ecad45 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module github.com/opentracing-contrib/go-amqp + +go 1.13 + +require ( + github.com/opentracing/opentracing-go v1.1.0 + github.com/streadway/amqp v0.0.0-20200108173154-1c71cc93ed71 + github.com/stretchr/testify v1.5.1 // indirect +)