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}
the spec} *)
open Common_
open Opentelemetry_emitter
(** A logger object *)
class type t = object
method is_enabled : Log_record.severity -> bool
type t = Log_record.t Emitter.t
method emit : Log_record.t list -> unit
end
let dummy () : t = Emitter.dummy ()
(** Dummy logger, always disabled *)
let dummy : t =
object
method is_enabled _ = false
let enabled = Emitter.enabled
method emit _ = ()
end
let emit = Emitter.emit
class simple (exp : #Exporter.t) : t =
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 ()
let of_exporter (exp : Exporter.t) : t = exp.emit_logs

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 add_to_exporter (exp : #Exporter.t) (self : t) =
let add_to_exporter (exp : Exporter.t) (self : t) =
let on_tick () =
(* collect all metrics *)
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
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 *)
module Main_set : sig

View file

@ -1,32 +1,19 @@
open Common_
open Opentelemetry_emitter
class type t = object
method is_enabled : unit -> bool
type t = Metrics.t Emitter.t
method emit : Metrics.t list -> unit
end
let dummy () : t = Emitter.dummy ()
class dummy : t =
object
method is_enabled () = false
let enabled = Emitter.enabled
method emit _ = ()
end
let emit = Emitter.emit
class simple (exp : #Exporter.t) : t =
object
method is_enabled () = true
method emit l = if l <> [] then exp#send_metrics l
end
let of_exporter (exp : Exporter.t) : t = exp.emit_metrics
(** Emit some metrics to the collector (sync). This blocks until the backend has
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. *)
pushed the metrics into some internal queue, or discarded them. *)
let emit ?attrs:_ (l : Metrics.t list) : unit =
match Exporter.Main_exporter.get () with
| None -> ()
| Some exp -> exp#send_metrics l
| Some exp -> Exporter.send_metrics exp l
[@@deprecated "use an explicit Metrics_emitter.t"]

View file

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

View file

@ -6,44 +6,36 @@
open Common_
open Proto.Trace
open Opentelemetry_emitter
type span = Span.t
type t = Span.t Emitter.t
(** A 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 *)
let dummy : t =
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
let dummy () : t = Emitter.dummy ()
(** A tracer that uses {!Exporter.Main_exporter} *)
let simple_main_exporter : t =
object
method is_enabled () = Exporter.Main_exporter.present ()
method emit spans =
let enabled () = Exporter.Main_exporter.present () in
let closed () = not (enabled ()) in
let flush_and_close () = () in
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
| None -> ()
| Some exp -> exp#send_trace spans
end
| Some exp -> Exporter.send_trace exp spans
)
in
{ Emitter.enabled; closed; emit; tick; flush_and_close }
(** 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 ->
match Exporter.Main_exporter.get () with
| 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
@ -107,7 +99,7 @@ let with_thunk_and_finally ?(tracer = simple_main_exporter)
in
Span.set_status span status));
tracer#emit [ span ]
Emitter.emit tracer [ span ]
in
let thunk () = Ambient_span.with_ambient span (fun () -> cb span) in
thunk, finally