Source file dynamic_enricher.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(** Hooks to add attributes to every span or log *)

type t = unit -> Key_value.t list
(** A dynamic enricher is a callback that produces high-cardinality attributes
    at span/log-record creation time. This enables "wide events". *)

open struct
  let enrichers_ : t Alist.t = Alist.make ()
end

let add (f : t) : unit = Alist.add enrichers_ f

let collect () : Key_value.t list =
  let acc = ref [] in
  List.iter
    (fun f ->
      match f () with
      | kvs -> acc := List.rev_append kvs !acc
      | exception exn ->
        let bt = Printexc.get_raw_backtrace () in
        Self_debug.log Warning (fun () ->
            Printf.sprintf "dynamic_enricher raised %s\n%s"
              (Printexc.to_string exn)
              (Printexc.raw_backtrace_to_string bt)))
    (Alist.get enrichers_);
  !acc