diff --git a/src/emitter/dune b/src/emitter/dune new file mode 100644 index 00000000..76f79dee --- /dev/null +++ b/src/emitter/dune @@ -0,0 +1,5 @@ +(library + (name opentelemetry_emitter) + (public_name opentelemetry.emitter) + (libraries mtime mtime.clock.os) + (synopsis "Modular emitters for a single signal at a time")) diff --git a/src/emitter/emitter.ml b/src/emitter/emitter.ml new file mode 100644 index 00000000..54999bd4 --- /dev/null +++ b/src/emitter/emitter.ml @@ -0,0 +1,30 @@ +(** Emitters *) + +exception Closed + +type 'a t = { + emit: 'a list -> unit; + (** Emit signals. @raise Closed if the emitter is closed. *) + tick: now:Mtime.t -> unit; + (** Call regularly to ensure background work is done *) + closed: unit -> bool; (** True if the emitter was closed *) + flush_and_close: unit -> unit; + (** Flush internal buffered signals, then close *) +} +(** An emitter for values of type ['a]. *) + +let[@inline] emit (self : _ t) l : unit = if l <> [] then self.emit l + +let[@inline] tick (self : _ t) ~now : unit = self.tick ~now + +let[@inline] closed self : bool = self.closed () + +let[@inline] flush_and_close (self : _ t) : unit = self.flush_and_close () + +let map (f : 'a -> 'b) (self : 'b t) : 'a t = + { self with emit = (fun l -> self.emit (List.map f l)) } + +(* TODO: batching, either regular or sharded to reduce contention *) +(* TODO: sampling *) + +(* TODO: use in Opentelemetry, and also for Tracer, Logger, etc. *)