tef: carry additional data for manual spans in the explicit_span's map

the span opening has been emitted already, so we'll emit the metadata at
exit time. We don't need side storage since we already have a hmap.
This commit is contained in:
Simon Cruanes 2023-08-30 13:00:48 -04:00
parent 567386908e
commit 4fc81d4ca2
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4

View file

@ -58,10 +58,6 @@ type event =
tid: int; tid: int;
data: (string * user_data) list; data: (string * user_data) list;
} }
| E_add_data_to_span of {
id: span;
data: (string * user_data) list;
}
| E_enter_manual_span of { | E_enter_manual_span of {
tid: int; tid: int;
name: string; name: string;
@ -76,6 +72,7 @@ type event =
name: string; name: string;
time_us: float; time_us: float;
flavor: [ `Sync | `Async ] option; flavor: [ `Sync | `Async ] option;
data: (string * user_data) list;
id: int; id: int;
} }
| E_counter of { | E_counter of {
@ -116,6 +113,9 @@ let key_async_id : int Meta_map.Key.t = Meta_map.Key.create ()
let key_async_data : (string * [ `Sync | `Async ] option) Meta_map.Key.t = let key_async_data : (string * [ `Sync | `Async ] option) Meta_map.Key.t =
Meta_map.Key.create () Meta_map.Key.create ()
let key_data : (string * user_data) list ref Meta_map.Key.t =
Meta_map.Key.create ()
(** Writer: knows how to write entries to a file in TEF format *) (** Writer: knows how to write entries to a file in TEF format *)
module Writer = struct module Writer = struct
type t = { type t = {
@ -223,14 +223,16 @@ module Writer = struct
args; args;
() ()
let emit_manual_end ~tid ~name ~id ~ts ~flavor (self : t) : unit = let emit_manual_end ~tid ~name ~id ~ts ~flavor ~args (self : t) : unit =
emit_sep_ self; emit_sep_ self;
Printf.fprintf self.oc Printf.fprintf self.oc
{json|{"pid":%d,"cat":"trace","id":%d,"tid": %d,"ts": %.2f,"name":%a,"ph":"%c"}|json} {json|{"pid":%d,"cat":"trace","id":%d,"tid": %d,"ts": %.2f,"name":%a,"ph":"%c"%a}|json}
self.pid id tid ts str_val name self.pid id tid ts str_val name
(match flavor with (match flavor with
| None | Some `Async -> 'e' | None | Some `Async -> 'e'
| Some `Sync -> 'E'); | Some `Sync -> 'E')
(emit_args_o_ pp_user_data_)
args;
() ()
@ -315,16 +317,13 @@ let bg_thread ~out (events : event B_queue.t) : unit =
!on_tracing_error !on_tracing_error
(Printf.sprintf "cannot find ambient span for thread %d" tid) (Printf.sprintf "cannot find ambient span for thread %d" tid)
| Some info -> info.data <- List.rev_append data info.data) | Some info -> info.data <- List.rev_append data info.data)
| E_add_data_to_span { id; data } ->
(match Span_tbl.find_opt spans id with
| None -> !on_tracing_error (Printf.sprintf "cannot find span %Ld" id)
| Some span_info -> span_info.data <- List.rev_append data span_info.data)
| E_enter_manual_span { tid; time_us; name; id; data; fun_name; flavor } -> | E_enter_manual_span { tid; time_us; name; id; data; fun_name; flavor } ->
let data = add_fun_name_ fun_name data in let data = add_fun_name_ fun_name data in
Writer.emit_manual_begin ~tid ~name ~id ~ts:time_us ~args:data ~flavor Writer.emit_manual_begin ~tid ~name ~id ~ts:time_us ~args:data ~flavor
writer writer
| E_exit_manual_span { tid; time_us; name; id; flavor } -> | E_exit_manual_span { tid; time_us; name; id; flavor; data } ->
Writer.emit_manual_end ~tid ~name ~id ~ts:time_us ~flavor writer Writer.emit_manual_end ~tid ~name ~id ~ts:time_us ~flavor ~args:data
writer
| E_counter { tid; name; time_us; n } -> | E_counter { tid; name; time_us; n } ->
Writer.emit_counter ~name ~tid ~ts:time_us writer n Writer.emit_counter ~name ~tid ~ts:time_us writer n
| E_name_process { name } -> Writer.emit_name_process ~name writer | E_name_process { name } -> Writer.emit_name_process ~name writer
@ -440,14 +439,24 @@ let collector ~out () : collector =
let exit_manual_span (es : explicit_span) : unit = let exit_manual_span (es : explicit_span) : unit =
let id = Meta_map.find_exn key_async_id es.meta in let id = Meta_map.find_exn key_async_id es.meta in
let name, flavor = Meta_map.find_exn key_async_data es.meta in let name, flavor = Meta_map.find_exn key_async_data es.meta in
let data =
try !(Meta_map.find_exn key_data es.meta) with Not_found -> []
in
let time_us = now_us () in let time_us = now_us () in
let tid = get_tid_ () in let tid = get_tid_ () in
B_queue.push events B_queue.push events
(E_exit_manual_span { tid; id; name; time_us; flavor }) (E_exit_manual_span { tid; id; name; time_us; data; flavor })
let add_data_to_manual_span (es : explicit_span) data = let add_data_to_manual_span (es : explicit_span) data =
if data <> [] then if data <> [] then (
B_queue.push events (E_add_data_to_span { id = es.span; data }) let data_ref, add =
try Meta_map.find_exn key_data es.meta, false
with Not_found -> ref [], true
in
let new_data = List.rev_append data !data_ref in
data_ref := new_data;
if add then es.meta <- Meta_map.add key_data data_ref es.meta
)
let message ?span:_ ~data msg : unit = let message ?span:_ ~data msg : unit =
let time_us = now_us () in let time_us = now_us () in