add Emitter_sample

This commit is contained in:
Simon Cruanes 2026-01-12 20:42:36 -05:00
parent 843d10dae1
commit 4f6334dac0
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4
4 changed files with 28 additions and 24 deletions

View file

@ -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

View file

@ -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] *)

View file

@ -30,20 +30,3 @@ let accept (self : t) : bool =
if res then Atomic.incr self.n_accepted; if res then Atomic.incr self.n_accepted;
res 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 }

View file

@ -18,10 +18,3 @@ val proba_accept : t -> float
val actual_rate : t -> float val actual_rate : t -> float
(** The ratio of signals we actually accepted so far. This should asymptotically (** The ratio of signals we actually accepted so far. This should asymptotically
be equal to {!proba_accept} if the random generator is good. *) 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. *)