Trace ID to link before and after events#589
Conversation
🤖 Code FormattingYour PR still has some code formatting issues. I've updated PR #590 with the necessary formatting changes. You can merge that PR into this branch to fix the code style check. Alternatively, you can run |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## release-6 #589 +/- ##
============================================
Coverage ? 80.74%
============================================
Files ? 212
Lines ? 6462
Branches ? 0
============================================
Hits ? 5218
Misses ? 1244
Partials ? 0 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
I think storing the |
|
I would strongly not suggest doing the Also we discussed that a bit in the corresponding RxInferBoard discussion and reached the conclusion that the tracing system should be dead-simple linear and should not have a notion of a span by itself. Spans are OpenTelemetry related and do not exist in TensorBoard for example. So ReactiveMP should not inherently create those spans but it should make it easy to recover those spans (e.g. with extra fields like |
|
The current solution is not bad either btw, so I don't have a strong preference of this implementation over the |
|
I only want to make sure that this extra field does not have performance implications in a sense that if there are no callbacks, Julia compile should be able to remove both callsites. Can you write a test for that to make sure that is what is happening (with the |
🤖 Code FormattingYour PR still has some code formatting issues. I've updated PR #590 with the necessary formatting changes. You can merge that PR into this branch to fix the code style check. Alternatively, you can run |
wouterwln
left a comment
There was a problem hiding this comment.
Super nice, I like this a lot
|
It seems that Julia v1.10 isn't that smart :( I'm ok with just guarding the test with |
|
OR - it might also happening because |
🤖 Code FormattingYour PR still has some code formatting issues. I've updated PR #590 with the necessary formatting changes. You can merge that PR into this branch to fix the code style check. Alternatively, you can run |
🤖 Code FormattingYour PR still has some code formatting issues. I've updated PR #590 with the necessary formatting changes. You can merge that PR into this branch to fix the code style check. Alternatively, you can run |
|
I'll work through the CI Julia 1.10 and then I merge 👍 |
|
For future reference, here is a function that matches traces based on their ID: function find_spans(trace_events::Vector{TracedEvent})
# Found spans
spans = Tuple{TracedEvent,TracedEvent}[]
# Currently waiting to be matched
lonely = OrderedDict{Base.UUID, Any}()
# No match possible
not_matched = TracedEvent[]
for te in trace_events
event = te.event
if hasfield(typeof(event), :trace_id)
tid = event.trace_id
friend = get(lonely, tid, nothing)
if !isnothing(friend)
delete!(lonely, tid)
push!(spans, (friend, te))
else
lonely[tid] = te
end
else
push!(not_matched, te)
end
end
push!(not_matched, values(lonely)...)
return (; spans, not_matched )
end |
* add Changelog * Implement event handler system for message passing and callbacks (#587) * feat: add event handler system for message passing procedure Introduce a new event handler mechanism that allows users to hook into the message passing procedure via `Event`, `handle_event`, and `broadcast_event` functions. Events are broadcast before and after message rule calls, enabling debugging and monitoring capabilities. Key changes: - Add `event_handler.jl` with event types and handler interfaces - Extend `MessageMapping` to include an event handler parameter - Support both custom handler types and NamedTuple-based handlers - Add documentation for the events system - Include comprehensive tests for event handler functionality * type in docstring * inject the event handler in the factor node activation options * make format * document the existing events better * rename event handler to callbacks to better match RxInfer * update docs * use make format * fix typo * allow to merge callbacks * allow reduce the result of the callbacks * add per-event callback reducer * make format * remove test method * start reimplement of the product of two messages this is required to inject the callbacks properly, plus we do the breaking release already. Could break (and improve) more things as well then * fix initial integration with RxInfer.jl * fix Aqua tests * caught a small bug in RxInfer tests * caught another bug from RxInfer.jl tests * merge stricter formatting * Refactor the variables, add docstrings, add labels - `compute_product_of_messages` now accepts the `AbstractVariable`, makes it easier to identify the variable inside the callback * fix documentation build * 2prev * add before/after product of two messages callbacks * fix failing tests * add before/after product of messages callbacks. add before/after form constraints * add before/after marginal compute callbacks * add error hint in case of wrong passed callbacks * fix test * temporary fix for the logscale switch rule * support Dict as callback handler * fix warnings in the tests * make format * refactor to use an abstract Event{E} structure * add new method for event_name * use mutable fields instead * update CHANGELOG * Trace ID to link before and after events (#589) * Trace ID to link before and after events * Add allocations test * disable some allocation tests on old julia versions * Change sqrt to + and remove version check * only check on julia 1.12 again * Better trace ids (#595) * create IDs only if callbacks are set * fix one failing test * make format * Refactor addon system to annotations (#596) * save plan * update * refine the plan * refine plan 2 * implement post_product/post_rule annotations infrastructure * reimplement the memory addon, remove old implementation * commit new file * make format * update plan * refactor the message.jl and message_tests.jl * update marginals.jl and marginal_tests.jl * remove old bridge functions * refactor the rule macro and the rule generating expression * refactor the nodes and tests * fix remaining places where addons were used * fix a lot of tests by hand * fix more tests by hand * update the plan * finish the refactor, update the documentation with migration guide, update CHANGELOG * fix from RxInfer * fix bugs caught in RxInfer * fix documentation build * add pretty output for input argument records * 🤖 Auto-format Julia code (#597) Co-authored-by: bvdmitri <6557701+bvdmitri@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: bvdmitri <6557701+bvdmitri@users.noreply.github.com> * checkpoint * checkpoint * checkpoint * make format * fix some tests by hand * fix more tests by hand * local update * fix more tests * rename vague messagein/messageout * make format * major documentation upgrade * update the CHANGELOG and migration guide * structural documentation update, add concepts * improve documentation for existing pages about specific nodes * update helpers documentation * add concepts pages * finish the documentation overhaul * update the docs * update the version to 6.0.0 * rename pipeline to stream postprocessors * update the scheduler to use stream postprocessors instead * add postprocess marginal stream * simplify API even further * update docs * make format * fix typo in mixture nodes * update * add pre_rule_annotations * add logo, update README.md * make logo half the size in README --------- Co-authored-by: Fons van der Plas <fonsvdplas@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: bvdmitri <6557701+bvdmitri@users.noreply.github.com>
I think it is useful to link before and after events. Here is one implementation, using a field
trace_idadded to events. This also needs to be done to the events defined in RxInfer.jl.It works, but maybe we can do better?
Alternative 1:
beforefield inAfterSomethingeventsWe can add a field
.beforethat stores the counterpart of anAfterSomethingevent. Instead oftrace_id. (Then the 'before' objectID functions the trace ID.)Aternative 2:
Before{...}andAfter{...}typesWe could change the types to eg:
The
Aftertype can have a.resultfield.Then we can replace this:
with: