trace-tef: emit function name, if provided, as a metadata key/value pair

the key is "function". It is visible when selecting the span, typically.
This commit is contained in:
Simon Cruanes 2023-08-19 17:13:56 -04:00
parent b57f878072
commit 96fb44e6bb
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4
2 changed files with 20 additions and 8 deletions

View file

@ -8,9 +8,9 @@ module Meta_map = Meta_map
val enabled : unit -> bool val enabled : unit -> bool
(** Is there a collector? (** Is there a collector?
This is fast, so that the traced program can check it before creating This is fast, so that the traced program can check it before creating
any span or message *) any span or message. *)
val with_span : val with_span :
?__FUNCTION__:string -> ?__FUNCTION__:string ->

View file

@ -45,6 +45,7 @@ type event =
name: string; name: string;
time_us: float; time_us: float;
id: span; id: span;
fun_name: string option;
data: (string * user_data) list; data: (string * user_data) list;
} }
| E_exit_span of { | E_exit_span of {
@ -57,6 +58,7 @@ type event =
time_us: float; time_us: float;
id: int; id: int;
flavor: [ `Sync | `Async ] option; flavor: [ `Sync | `Async ] option;
fun_name: string option;
data: (string * user_data) list; data: (string * user_data) list;
} }
| E_exit_manual_span of { | E_exit_manual_span of {
@ -250,14 +252,22 @@ let bg_thread ~out (events : event B_queue.t) : unit =
let spans : span_info Span_tbl.t = Span_tbl.create 32 in let spans : span_info Span_tbl.t = Span_tbl.create 32 in
let local_q = Queue.create () in let local_q = Queue.create () in
(* add function name, if provided, to the metadata *)
let add_fun_name_ fun_name data : _ list =
match fun_name with
| None -> data
| Some f -> ("function", `String f) :: data
in
(* how to deal with an event *) (* how to deal with an event *)
let handle_ev (ev : event) : unit = let handle_ev (ev : event) : unit =
match ev with match ev with
| E_tick -> Writer.flush writer | E_tick -> Writer.flush writer
| E_message { tid; msg; time_us; data } -> | E_message { tid; msg; time_us; data } ->
Writer.emit_instant_event ~tid ~name:msg ~ts:time_us ~args:data writer Writer.emit_instant_event ~tid ~name:msg ~ts:time_us ~args:data writer
| E_define_span { tid; name; id; time_us; data } -> | E_define_span { tid; name; id; time_us; fun_name; data } ->
(* save the span so we find it at exit *) (* save the span so we find it at exit *)
let data = add_fun_name_ fun_name data in
Span_tbl.add spans id { tid; name; start_us = time_us; data } Span_tbl.add spans id { tid; name; start_us = time_us; data }
| E_exit_span { id; time_us = stop_us } -> | E_exit_span { id; time_us = stop_us } ->
(match Span_tbl.find_opt spans id with (match Span_tbl.find_opt spans id with
@ -266,7 +276,8 @@ let bg_thread ~out (events : event B_queue.t) : unit =
Span_tbl.remove spans id; Span_tbl.remove spans id;
Writer.emit_duration_event ~tid ~name ~start:start_us ~end_:stop_us Writer.emit_duration_event ~tid ~name ~start:start_us ~end_:stop_us
~args:data writer) ~args:data writer)
| E_enter_manual_span { tid; time_us; name; id; data; flavor } -> | E_enter_manual_span { tid; time_us; name; id; data; fun_name; flavor } ->
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 } ->
@ -339,12 +350,12 @@ let collector ~out () : collector =
else else
Thread.id (Thread.self ()) Thread.id (Thread.self ())
let with_span ~__FUNCTION__:_ ~__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 = 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
B_queue.push events B_queue.push events
(E_define_span { tid; name; time_us; id = span; data }); (E_define_span { tid; name; time_us; id = span; fun_name; data });
let finally () = let finally () =
let time_us = now_us () in let time_us = now_us () in
@ -354,7 +365,8 @@ let collector ~out () : collector =
Fun.protect ~finally (fun () -> f span) Fun.protect ~finally (fun () -> f span)
let enter_manual_span ~(parent : explicit_span option) ~flavor let enter_manual_span ~(parent : explicit_span option) ~flavor
~__FUNCTION__:_ ~__FILE__:_ ~__LINE__:_ ~data name : explicit_span = ~__FUNCTION__:fun_name ~__FILE__:_ ~__LINE__:_ ~data name :
explicit_span =
(* get the id, or make a new one *) (* get the id, or make a new one *)
let id = let id =
match parent with match parent with
@ -364,7 +376,7 @@ let collector ~out () : collector =
let time_us = now_us () in let time_us = now_us () in
B_queue.push events B_queue.push events
(E_enter_manual_span (E_enter_manual_span
{ id; time_us; tid = get_tid_ (); data; name; flavor }); { id; time_us; tid = get_tid_ (); data; name; fun_name; flavor });
{ {
span = 0L; span = 0L;
meta = meta =