diff --git a/src/client/emitter_sample.ml b/src/client/emitter_sample.ml new file mode 100644 index 00000000..a655d03b --- /dev/null +++ b/src/client/emitter_sample.ml @@ -0,0 +1,18 @@ +open Opentelemetry_emitter + +let add_sampler (self : Sampler.t) (e : _ Emitter.t) : _ Emitter.t = + let enabled () = e.enabled () in + let closed () = Emitter.closed e in + let flush_and_close () = Emitter.flush_and_close e in + let tick ~mtime = Emitter.tick e ~mtime in + + let emit l = + if l <> [] && e.enabled () then ( + let accepted = List.filter (fun _x -> Sampler.accept self) l in + if accepted <> [] then Emitter.emit e accepted + ) + in + + { Emitter.closed; enabled; flush_and_close; tick; emit } + +let sample ~proba_accept e = add_sampler (Sampler.create ~proba_accept ()) e diff --git a/src/client/emitter_sample.mli b/src/client/emitter_sample.mli new file mode 100644 index 00000000..6a0d295f --- /dev/null +++ b/src/client/emitter_sample.mli @@ -0,0 +1,10 @@ +open Opentelemetry_emitter + +val add_sampler : Sampler.t -> 'a Emitter.t -> 'a Emitter.t +(** [add_sampler sampler e] is a new emitter that uses the [sampler] on each + individual signal before passing them to [e]. This means only + [Sampler.proba_accept sampler] of the signals will actually be emitted. *) + +val sample : proba_accept:float -> 'a Emitter.t -> 'a Emitter.t +(** [sample ~proba_accept e] is + [add_sampler (Sampler.create ~proba_accept ()) e] *) diff --git a/src/client/sampler.ml b/src/client/sampler.ml index 671eaf81..e9b2fc34 100644 --- a/src/client/sampler.ml +++ b/src/client/sampler.ml @@ -30,20 +30,3 @@ let accept (self : t) : bool = if res then Atomic.incr self.n_accepted; res - -open Opentelemetry_emitter - -let wrap_emitter (self : t) (e : _ Emitter.t) : _ Emitter.t = - let enabled () = e.enabled () in - let closed () = Emitter.closed e in - let flush_and_close () = Emitter.flush_and_close e in - let tick ~mtime = Emitter.tick e ~mtime in - - let emit l = - if l <> [] && e.enabled () then ( - let accepted = List.filter (fun _x -> accept self) l in - if accepted <> [] then Emitter.emit e accepted - ) - in - - { Emitter.closed; enabled; flush_and_close; tick; emit } diff --git a/src/client/sampler.mli b/src/client/sampler.mli index b66b75f0..ac45eab8 100644 --- a/src/client/sampler.mli +++ b/src/client/sampler.mli @@ -18,10 +18,3 @@ val proba_accept : t -> float val actual_rate : t -> float (** The ratio of signals we actually accepted so far. This should asymptotically be equal to {!proba_accept} if the random generator is good. *) - -open Opentelemetry_emitter - -val wrap_emitter : t -> 'a Emitter.t -> 'a Emitter.t -(** [wrap_emitter sampler e] is a new emitter that uses the [sampler] on each - individual signal before passing them to [e]. This means only [proba_accept] - of the signals will actually be emitted. *)