add enabled to the collector

this way we can have collectors that only accept some levels
This commit is contained in:
Simon Cruanes 2026-02-06 13:14:19 -05:00
parent a4144ff3d1
commit c9cd56d0b5
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4
4 changed files with 23 additions and 10 deletions

View file

@ -30,6 +30,9 @@ module Callbacks = struct
(** Exit a span. Must be called exactly once per span. Additional (** Exit a span. Must be called exactly once per span. Additional
constraints on nesting, threads, etc. vary per collector. *) constraints on nesting, threads, etc. vary per collector. *)
add_data_to_span: 'st -> span -> (string * user_data) list -> unit; add_data_to_span: 'st -> span -> (string * user_data) list -> unit;
enabled: 'st -> Level.t -> bool;
(** Is the collector accepting spans/messages/metrics with this level?
*)
message: message:
'st -> 'st ->
level:Level.t -> level:Level.t ->
@ -58,13 +61,14 @@ module Callbacks = struct
(** Callbacks taking a state ['st] *) (** Callbacks taking a state ['st] *)
(** Helper to create backends in a future-proof way *) (** Helper to create backends in a future-proof way *)
let make ~enter_span ~exit_span ~add_data_to_span ~message ~metric let make ?(enabled = fun _ _ -> true) ~enter_span ~exit_span ~add_data_to_span
?(extension = fun _ ~level:_ _ -> ()) ?(init = ignore) ~message ~metric ?(extension = fun _ ~level:_ _ -> ()) ?(init = ignore)
?(shutdown = ignore) () : _ t = ?(shutdown = ignore) () : _ t =
{ {
enter_span; enter_span;
exit_span; exit_span;
add_data_to_span; add_data_to_span;
enabled;
message; message;
metric; metric;
extension; extension;

View file

@ -24,8 +24,8 @@ let[@inline] set_default_level l = A.set default_level_ l
let[@inline] set_current_level l = A.set current_level_ l let[@inline] set_current_level l = A.set current_level_ l
let[@inline] get_current_level () = A.get current_level_ let[@inline] get_current_level () = A.get current_level_
let[@inline] check_level_ ~level () : bool = let[@inline] check_level_ ~level st (cbs : _ Collector.Callbacks.t) : bool =
Level.leq level (A.get current_level_) Level.leq level (A.get current_level_) && cbs.enabled st level
let parent_of_span_opt_opt = function let parent_of_span_opt_opt = function
| None -> P_unknown | None -> P_unknown
@ -58,7 +58,7 @@ let with_span_collector_ st (cbs : _ Collector.Callbacks.t) ?__FUNCTION__
let[@inline] with_span ?(level = A.get default_level_) ?__FUNCTION__ ~__FILE__ let[@inline] with_span ?(level = A.get default_level_) ?__FUNCTION__ ~__FILE__
~__LINE__ ?parent ?params ?data name f = ~__LINE__ ?parent ?params ?data name f =
match A.get collector with match A.get collector with
| C_some (st, cbs) when check_level_ ~level () -> | C_some (st, cbs) when check_level_ ~level st cbs ->
with_span_collector_ st cbs ?__FUNCTION__ ~__FILE__ ~__LINE__ ~level ?parent with_span_collector_ st cbs ?__FUNCTION__ ~__FILE__ ~__LINE__ ~level ?parent
?params ?data name f ?params ?data name f
| _ -> | _ ->
@ -68,7 +68,7 @@ let[@inline] with_span ?(level = A.get default_level_) ?__FUNCTION__ ~__FILE__
let[@inline] enter_span ?(level = A.get default_level_) ?__FUNCTION__ ~__FILE__ let[@inline] enter_span ?(level = A.get default_level_) ?__FUNCTION__ ~__FILE__
~__LINE__ ?flavor ?parent ?(params = []) ?data name : span = ~__LINE__ ?flavor ?parent ?(params = []) ?data name : span =
match A.get collector with match A.get collector with
| C_some (st, cbs) when check_level_ ~level () -> | C_some (st, cbs) when check_level_ ~level st cbs ->
let params = let params =
match flavor with match flavor with
| None -> params | None -> params
@ -98,13 +98,13 @@ let message_collector_ st (cbs : _ Collector.Callbacks.t) ~level ?span
let[@inline] message ?(level = A.get default_level_) ?span ?params ?data msg : let[@inline] message ?(level = A.get default_level_) ?span ?params ?data msg :
unit = unit =
match A.get collector with match A.get collector with
| C_some (st, cbs) when check_level_ ~level () -> | C_some (st, cbs) when check_level_ ~level st cbs ->
(message_collector_ [@inlined never]) st cbs ~level ?span ?params ?data msg (message_collector_ [@inlined never]) st cbs ~level ?span ?params ?data msg
| _ -> () | _ -> ()
let messagef ?(level = A.get default_level_) ?span ?params ?data k = let messagef ?(level = A.get default_level_) ?span ?params ?data k =
match A.get collector with match A.get collector with
| C_some (st, cbs) when check_level_ ~level () -> | C_some (st, cbs) when check_level_ ~level st cbs ->
k (fun fmt -> k (fun fmt ->
Format.kasprintf Format.kasprintf
(fun str -> message_collector_ st cbs ~level ?span ?params ?data str) (fun str -> message_collector_ st cbs ~level ?span ?params ?data str)
@ -114,7 +114,7 @@ let messagef ?(level = A.get default_level_) ?span ?params ?data k =
let metric ?(level = A.get default_level_) ?(params = []) let metric ?(level = A.get default_level_) ?(params = [])
?(data = data_empty_build_) name m : unit = ?(data = data_empty_build_) name m : unit =
match A.get collector with match A.get collector with
| C_some (st, cbs) when check_level_ ~level () -> | C_some (st, cbs) when check_level_ ~level st cbs ->
let data = data () in let data = data () in
cbs.metric st ~level ~params ~data name m cbs.metric st ~level ~params ~data name m
| _ -> () | _ -> ()
@ -153,7 +153,8 @@ type extension_event = Types.extension_event = ..
let[@inline] extension_event ?(level = A.get default_level_) ev : unit = let[@inline] extension_event ?(level = A.get default_level_) ev : unit =
match A.get collector with match A.get collector with
| C_some (st, cbs) when check_level_ ~level () -> cbs.extension st ~level ev | C_some (st, cbs) when check_level_ ~level st cbs ->
cbs.extension st ~level ev
| _ -> () | _ -> ()
let set_thread_name name : unit = let set_thread_name name : unit =

View file

@ -119,6 +119,7 @@ open struct
let metric self ~level ~params ~data name v = let metric self ~level ~params ~data name v =
self.cbs.metric self.state ~level ~params ~data name v self.cbs.metric self.state ~level ~params ~data name v
let enabled _ _ = true
let init (self : _ st) = self.cbs.init self.state let init (self : _ st) = self.cbs.init self.state
let shutdown (self : _ st) : unit = let shutdown (self : _ st) : unit =
@ -132,6 +133,7 @@ open struct
enter_span; enter_span;
exit_span; exit_span;
add_data_to_span; add_data_to_span;
enabled;
message; message;
metric; metric;
init; init;

View file

@ -73,11 +73,17 @@ open struct
done done
[@ocaml.warning "-8"] [@ocaml.warning "-8"]
let enabled st level : bool =
Array.exists
(fun (Collector.C_some (st, cb)) -> cb.enabled st level)
st [@ocaml.warning "-8"]
let combine_cb : st Collector.Callbacks.t = let combine_cb : st Collector.Callbacks.t =
{ {
Collector.Callbacks.init; Collector.Callbacks.init;
enter_span; enter_span;
exit_span; exit_span;
enabled;
message; message;
add_data_to_span; add_data_to_span;
metric; metric;