share code for implicit spans

This commit is contained in:
Simon Cruanes 2023-12-22 20:15:25 -05:00
parent ef15941936
commit b387729081
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4

View file

@ -386,8 +386,7 @@ let collector ~out () : collector =
else else
Thread.id (Thread.self ()) Thread.id (Thread.self ())
let enter_span ~__FUNCTION__:fun_name ~__FILE__:_ ~__LINE__:_ ~data name : let[@inline] enter_span_ ~fun_name ~data name : span =
span =
let span = Int64.of_int (A.fetch_and_add span_id_gen_ 1) in let span = Int64.of_int (A.fetch_and_add span_id_gen_ 1) in
let tid = get_tid_ () in let tid = get_tid_ () in
let time_us = now_us () in let time_us = now_us () in
@ -395,23 +394,26 @@ let collector ~out () : collector =
(E_define_span { tid; name; time_us; id = span; fun_name; data }); (E_define_span { tid; name; time_us; id = span; fun_name; data });
span span
let enter_span ~__FUNCTION__:fun_name ~__FILE__:_ ~__LINE__:_ ~data name :
span =
enter_span_ ~fun_name ~data name
let exit_span span : unit = let exit_span span : unit =
let time_us = now_us () in let time_us = now_us () in
B_queue.push events (E_exit_span { id = span; time_us }) B_queue.push events (E_exit_span { id = span; time_us })
(* re-raise exception with its backtrace *)
external reraise : exn -> 'a = "%reraise"
let with_span ~__FUNCTION__:fun_name ~__FILE__:_ ~__LINE__:_ ~data name f = let with_span ~__FUNCTION__:fun_name ~__FILE__:_ ~__LINE__:_ ~data name f =
let span = Int64.of_int (A.fetch_and_add span_id_gen_ 1) in let span = enter_span_ ~fun_name ~data name in
let tid = get_tid_ () in try
let time_us = now_us () in let x = f span in
B_queue.push events exit_span span;
(E_define_span { tid; name; time_us; id = span; fun_name; data }); x
with exn ->
let finally () = exit_span span;
let time_us = now_us () in reraise exn
B_queue.push events (E_exit_span { id = span; time_us })
in
Fun.protect ~finally (fun () -> f span)
let add_data_to_span span data = let add_data_to_span span data =
if data <> [] then B_queue.push events (E_add_data { id = span; data }) if data <> [] then B_queue.push events (E_add_data { id = span; data })