rust-zipkin
rust-zipkin copied to clipboard
provide examples
I'm reading the structure of this crate to understand the pieces but I feel like I'm missing parts. It may be helpful to provide some cargo /examples application to demonstrate how these pieces fit together
Sure - I think a little toy HTTP server would make sense as a decent example.
In particular I'm wanting to see how to transfer contexts across threads. Since CurrentGuard can't be Send, I'm missing what the pattern in practice looks like
If you have an OpenSpan and want to fully transfer it to the other thread, you can use the detach and attach methods:
let span = my_tracer.next_span()
.with_name("background-thingy")
.detach();
thread::spawn(move || {
let span = span.attach();
// do stuff...
});
If you don't have an OpenSpan (or have one but don't want to transfer ownership), you can just grab the context from it and send that to the other thread:
let context = current_guard.context();
thread::spawn(move || {
let current_guard = tracer.set_current(context);
// do stuff...
});
In that first example, does the span information associated with "background-thing" get discarded when detaching? It seems the both detach/attach operations discard any built up span state. When attaching, it seems all operations on the open span would have no effect. I'm I understanding this right?
No, attaching and detaching doesn't discard any state. The only thing it changes is if the OpenSpan acts as a CurrentGuard in addition.
I'm looking to understand the use of mem::replace here
Detach consumes the old OpenSpan by value and returns a new one with the span's state.
Ah I see. Thanks!