lightstep / lightstep-tracer-go

The Lightstep distributed tracing library for Go
https://lightstep.com
MIT License
98 stars 54 forks source link

Support for Initializing Span with a Previously Started Context #233

Open dm03514 opened 4 years ago

dm03514 commented 4 years ago

👋 Hello, I was wondering if there was any way you'd be open to allowing a span to be created with an already existing SpanContext? I have a unique use case where I need to save an in-progress span and ship it out of memory, and then later reload it into memory and finish the span. I was wondering if you'd be open to supporting this feature in the lightstep go client?

I was able to add support for this in the jaeger client, and was hoping to use the same functionality with LightStep:

https://github.com/jaegertracing/jaeger-client-go/issues/397

The strategy we took for jaeger was to add a SelfRef type that bhs proposed:

https://github.com/opentracing/specification/issues/81#issuecomment-321150358

If you're interested I would be happy to contribute this!


I was imagining the same API and approach as the jaeger library:

span := tracer.StartSpan(
    "continued_span",
    lightstep.SelfRef(aSpanContext),
)

Which would require:

I think this is everything needed to then export a context:

spanCtx := span.Context()
saveContext(key, spanCtx, spanCtx.Tags())
...

Then starting a span with a previously started context:

span := tracer.StartSpan(
    "continued_span",
    lightstep.SelfRef(getPreviousContext(key)),
)

I really appreciate your time! Thank you

Danny

dm03514 commented 4 years ago

Closing as I don't have a very good idea of the problem yet, just learning this library!

dm03514 commented 4 years ago

The strategy I took was to make SpanImpl public and allow callers to access the RawSpan through SpanImpl.Raw().

Then when creating a span there is an option to StartSpan with an already established RawSpan:

        span := tracer.StartSpan(
            rawSpan.Operation,
            lightstep.SetRawSpan(rawSpan),
        )

Would love if there was any way this could be in main but understand if it's too big of change.

Thank you again, danny