diff --git a/src/lib/logger.ml b/src/lib/logger.ml index 33b890e2..a3617562 100644 --- a/src/lib/logger.ml +++ b/src/lib/logger.ml @@ -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 diff --git a/src/lib/metrics_callbacks.ml b/src/lib/metrics_callbacks.ml index 4fd78c4a..ef4e1ba9 100644 --- a/src/lib/metrics_callbacks.ml +++ b/src/lib/metrics_callbacks.ml @@ -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 diff --git a/src/lib/metrics_callbacks.mli b/src/lib/metrics_callbacks.mli index 040d668f..b9db7b66 100644 --- a/src/lib/metrics_callbacks.mli +++ b/src/lib/metrics_callbacks.mli @@ -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 diff --git a/src/lib/metrics_emitter.ml b/src/lib/metrics_emitter.ml index 4a075f4f..2203ba86 100644 --- a/src/lib/metrics_emitter.ml +++ b/src/lib/metrics_emitter.ml @@ -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"] diff --git a/src/lib/opentelemetry.ml b/src/lib/opentelemetry.ml index 5e6cafb0..2e3e32d3 100644 --- a/src/lib/opentelemetry.ml +++ b/src/lib/opentelemetry.ml @@ -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 diff --git a/src/lib/tracer.ml b/src/lib/tracer.ml index 15ab1e97..4e42c7dd 100644 --- a/src/lib/tracer.ml +++ b/src/lib/tracer.ml @@ -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