feat: tracer, logger, etc are regular emitters now

This commit is contained in:
Simon Cruanes 2025-12-04 10:57:32 -05:00
parent 9dd15d109a
commit cf39d2a699
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4
6 changed files with 36 additions and 76 deletions

View file

@ -4,34 +4,14 @@
{{:https://opentelemetry.io/docs/reference/specification/overview/#log-signal} {{:https://opentelemetry.io/docs/reference/specification/overview/#log-signal}
the spec} *) the spec} *)
open Common_ open Opentelemetry_emitter
(** A logger object *) type t = Log_record.t Emitter.t
class type t = object
method is_enabled : Log_record.severity -> bool
method emit : Log_record.t list -> unit let dummy () : t = Emitter.dummy ()
end
(** Dummy logger, always disabled *) let enabled = Emitter.enabled
let dummy : t =
object
method is_enabled _ = false
method emit _ = () let emit = Emitter.emit
end
class simple (exp : #Exporter.t) : t = let of_exporter (exp : Exporter.t) : t = exp.emit_logs
object
method is_enabled _ = true
method emit logs = if logs <> [] then exp#send_logs logs
end
let emit ?service_name:_ ?attrs:_ (l : Log_record.t list) : unit =
match Exporter.Main_exporter.get () with
| None -> ()
| Some e -> e#send_logs l
[@@deprecated "use an explicit Logger"]
let k_logger : t Context.key = Context.new_key ()

View file

@ -6,7 +6,7 @@ let create () : t = { cbs = Alist.make () }
let[@inline] add_metrics_cb (self : t) f = Alist.add self.cbs f let[@inline] add_metrics_cb (self : t) f = Alist.add self.cbs f
let add_to_exporter (exp : #Exporter.t) (self : t) = let add_to_exporter (exp : Exporter.t) (self : t) =
let on_tick () = let on_tick () =
(* collect all metrics *) (* collect all metrics *)
let res = ref [] in let res = ref [] in

View file

@ -16,7 +16,7 @@ val add_metrics_cb : t -> (unit -> Metrics.t list) -> unit
metrics. It might be called regularly by the backend, in particular (but not metrics. It might be called regularly by the backend, in particular (but not
only) when {!Exporter.tick} is called. *) only) when {!Exporter.tick} is called. *)
val add_to_exporter : #Exporter.t -> t -> unit val add_to_exporter : Exporter.t -> t -> unit
(** Make sure we export metrics at every [tick] of the exporter *) (** Make sure we export metrics at every [tick] of the exporter *)
module Main_set : sig module Main_set : sig

View file

@ -1,32 +1,19 @@
open Common_ open Opentelemetry_emitter
class type t = object type t = Metrics.t Emitter.t
method is_enabled : unit -> bool
method emit : Metrics.t list -> unit let dummy () : t = Emitter.dummy ()
end
class dummy : t = let enabled = Emitter.enabled
object
method is_enabled () = false
method emit _ = () let emit = Emitter.emit
end
class simple (exp : #Exporter.t) : t = let of_exporter (exp : Exporter.t) : t = exp.emit_metrics
object
method is_enabled () = true
method emit l = if l <> [] then exp#send_metrics l
end
(** Emit some metrics to the collector (sync). This blocks until the backend has (** Emit some metrics to the collector (sync). This blocks until the backend has
pushed the metrics into some internal queue, or discarded them. pushed the metrics into some internal queue, or discarded them. *)
{b NOTE} be careful not to call this inside a Gc alarm, as it can cause
deadlocks. *)
let emit ?attrs:_ (l : Metrics.t list) : unit = let emit ?attrs:_ (l : Metrics.t list) : unit =
match Exporter.Main_exporter.get () with match Exporter.Main_exporter.get () with
| None -> () | None -> ()
| Some exp -> exp#send_metrics l | Some exp -> Exporter.send_metrics exp l
[@@deprecated "use an explicit Metrics_emitter.t"] [@@deprecated "use an explicit Metrics_emitter.t"]

View file

@ -75,6 +75,7 @@ module Logs = Logger [@@deprecated "use Logger"]
(** {2 Utils} *) (** {2 Utils} *)
module Any_signal = Any_signal
module Trace_context = Trace_context module Trace_context = Trace_context
module Gc_metrics = Gc_metrics module Gc_metrics = Gc_metrics

View file

@ -6,44 +6,36 @@
open Common_ open Common_
open Proto.Trace open Proto.Trace
open Opentelemetry_emitter
type span = Span.t type span = Span.t
type t = Span.t Emitter.t
(** A tracer. (** A tracer.
https://opentelemetry.io/docs/specs/otel/trace/api/#tracer *) https://opentelemetry.io/docs/specs/otel/trace/api/#tracer *)
class type t = object
method is_enabled : unit -> bool
method emit : span list -> unit
end
(** Dummy tracer, always disabled *) (** Dummy tracer, always disabled *)
let dummy : t = let dummy () : t = Emitter.dummy ()
object
method is_enabled () = false
method emit _ = ()
end
(** A simple exporter that directly calls the exporter. *)
class simple (exp : #Exporter.t) : t =
object
method is_enabled () = true
method emit spans = if spans <> [] then Exporter.send_trace exp spans
end
(** A tracer that uses {!Exporter.Main_exporter} *) (** A tracer that uses {!Exporter.Main_exporter} *)
let simple_main_exporter : t = let simple_main_exporter : t =
object let enabled () = Exporter.Main_exporter.present () in
method is_enabled () = Exporter.Main_exporter.present () let closed () = not (enabled ()) in
let flush_and_close () = () in
method emit spans = let tick ~now:_ =
match Exporter.Main_exporter.get () with
| None -> ()
| Some exp -> Exporter.tick exp
in
let emit spans =
if spans <> [] then (
match Exporter.Main_exporter.get () with match Exporter.Main_exporter.get () with
| None -> () | None -> ()
| Some exp -> exp#send_trace spans | Some exp -> Exporter.send_trace exp spans
end )
in
{ Emitter.enabled; closed; emit; tick; flush_and_close }
(** Directly emit to the main exporter. (** Directly emit to the main exporter.
@ -53,7 +45,7 @@ let (emit [@deprecated "use an explicit tracer"]) =
fun ?service_name:_ ?attrs:_ (spans : span list) : unit -> fun ?service_name:_ ?attrs:_ (spans : span list) : unit ->
match Exporter.Main_exporter.get () with match Exporter.Main_exporter.get () with
| None -> () | None -> ()
| Some exp -> exp#send_trace spans | Some exp -> Exporter.send_trace exp spans
let (add_event [@deprecated "use Span.add_event"]) = Span.add_event let (add_event [@deprecated "use Span.add_event"]) = Span.add_event
@ -107,7 +99,7 @@ let with_thunk_and_finally ?(tracer = simple_main_exporter)
in in
Span.set_status span status)); Span.set_status span status));
tracer#emit [ span ] Emitter.emit tracer [ span ]
in in
let thunk () = Ambient_span.with_ambient span (fun () -> cb span) in let thunk () = Ambient_span.with_ambient span (fun () -> cb span) in
thunk, finally thunk, finally