mirror of
https://github.com/ocaml-tracing/ocaml-trace.git
synced 2026-03-08 20:07:55 -04:00
feat(trace.subscriber): add Span_tbl, and a depopt on picos_aux
This commit is contained in:
parent
7cc16bc0b8
commit
76703461ea
13 changed files with 125 additions and 1 deletions
3
.github/workflows/main.yml
vendored
3
.github/workflows/main.yml
vendored
|
|
@ -51,6 +51,9 @@ jobs:
|
||||||
- run: opam install hmap
|
- run: opam install hmap
|
||||||
- run: opam exec -- dune build '@install' -p trace,trace-tef,trace-fuchsia
|
- run: opam exec -- dune build '@install' -p trace,trace-tef,trace-fuchsia
|
||||||
|
|
||||||
|
- run: opam install picos_aux
|
||||||
|
- run: opam exec -- dune build '@install' -p trace,trace-tef,trace-fuchsia
|
||||||
|
|
||||||
- run: opam install mtime
|
- run: opam install mtime
|
||||||
- run: opam exec -- dune build '@install' -p trace,trace-tef,trace-fuchsia
|
- run: opam exec -- dune build '@install' -p trace,trace-tef,trace-fuchsia
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
(depopts
|
(depopts
|
||||||
hmap
|
hmap
|
||||||
unix
|
unix
|
||||||
|
(picos_aux (>= 0.6))
|
||||||
(mtime
|
(mtime
|
||||||
(>= 2.0)))
|
(>= 2.0)))
|
||||||
(tags
|
(tags
|
||||||
|
|
|
||||||
|
|
@ -121,7 +121,16 @@ type 'st t = (module S with type st = 'st)
|
||||||
|
|
||||||
(** Dummy callbacks. It can be useful to reuse some of these functions in a real
|
(** Dummy callbacks. It can be useful to reuse some of these functions in a real
|
||||||
subscriber that doesn't want to handle {b all} events, but only some of
|
subscriber that doesn't want to handle {b all} events, but only some of
|
||||||
them. *)
|
them.
|
||||||
|
|
||||||
|
To write a subscriber that only supports some callbacks, this can be handy:
|
||||||
|
{[
|
||||||
|
module My_callbacks = struct
|
||||||
|
type st = my_own_state
|
||||||
|
include Callbacks.Dummy
|
||||||
|
let on_counter (st:st) ~time_ns ~tid ~data ~name v : unit = ...
|
||||||
|
end
|
||||||
|
]} *)
|
||||||
module Dummy = struct
|
module Dummy = struct
|
||||||
let on_init _ ~time_ns:_ = ()
|
let on_init _ ~time_ns:_ = ()
|
||||||
let on_shutdown _ ~time_ns:_ = ()
|
let on_shutdown _ ~time_ns:_ = ()
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
(library
|
(library
|
||||||
(name trace_subscriber)
|
(name trace_subscriber)
|
||||||
(public_name trace.subscriber)
|
(public_name trace.subscriber)
|
||||||
|
(private_modules time_ thread_ tbl_)
|
||||||
(libraries
|
(libraries
|
||||||
(re_export trace.core)
|
(re_export trace.core)
|
||||||
(select
|
(select
|
||||||
|
|
@ -8,6 +9,12 @@
|
||||||
from
|
from
|
||||||
(threads -> thread_.real.ml)
|
(threads -> thread_.real.ml)
|
||||||
(-> thread_.dummy.ml))
|
(-> thread_.dummy.ml))
|
||||||
|
(select
|
||||||
|
tbl_.ml
|
||||||
|
from
|
||||||
|
(picos_aux.htbl -> tbl_.picos.ml)
|
||||||
|
(threads -> tbl_.thread.ml)
|
||||||
|
(-> tbl_.basic.ml))
|
||||||
(select
|
(select
|
||||||
time_.ml
|
time_.ml
|
||||||
from
|
from
|
||||||
|
|
|
||||||
1
src/subscriber/span_tbl.ml
Normal file
1
src/subscriber/span_tbl.ml
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
include Tbl_
|
||||||
21
src/subscriber/span_tbl.mli
Normal file
21
src/subscriber/span_tbl.mli
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
(** A table that can be used to remember information about spans.
|
||||||
|
|
||||||
|
This is convenient when we want to rememner information from a span begin,
|
||||||
|
when dealing with the corresponding span end.
|
||||||
|
|
||||||
|
{b NOTE}: this is thread safe when threads are enabled. *)
|
||||||
|
|
||||||
|
open Trace_core
|
||||||
|
|
||||||
|
type 'v t
|
||||||
|
|
||||||
|
val create : unit -> 'v t
|
||||||
|
val add : 'v t -> span -> 'v -> unit
|
||||||
|
|
||||||
|
val find_exn : 'v t -> span -> 'v
|
||||||
|
(** @raise Not_found if information isn't found *)
|
||||||
|
|
||||||
|
val remove : _ t -> span -> unit
|
||||||
|
(** Remove the span if present *)
|
||||||
|
|
||||||
|
val to_list : 'v t -> (span * 'v) list
|
||||||
13
src/subscriber/tbl_.basic.ml
Normal file
13
src/subscriber/tbl_.basic.ml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
module T = Hashtbl.Make (struct
|
||||||
|
include Int64
|
||||||
|
|
||||||
|
let hash = Hashtbl.hash
|
||||||
|
end)
|
||||||
|
|
||||||
|
type 'v t = 'v T.t
|
||||||
|
|
||||||
|
let create () : _ t = T.create 32
|
||||||
|
let find_exn = T.find
|
||||||
|
let remove = T.remove
|
||||||
|
let add = T.replace
|
||||||
|
let to_list self : _ list = T.fold (fun k v l -> (k, v) :: l) self []
|
||||||
7
src/subscriber/tbl_.mli
Normal file
7
src/subscriber/tbl_.mli
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
type 'v t
|
||||||
|
|
||||||
|
val create : unit -> 'v t
|
||||||
|
val add : 'v t -> int64 -> 'v -> unit
|
||||||
|
val find_exn : 'v t -> int64 -> 'v
|
||||||
|
val remove : _ t -> int64 -> unit
|
||||||
|
val to_list : 'v t -> (int64 * 'v) list
|
||||||
18
src/subscriber/tbl_.picos.ml
Normal file
18
src/subscriber/tbl_.picos.ml
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
module H = Picos_aux_htbl
|
||||||
|
|
||||||
|
module Key = struct
|
||||||
|
include Int64
|
||||||
|
|
||||||
|
let hash = Hashtbl.hash
|
||||||
|
end
|
||||||
|
|
||||||
|
type 'v t = (int64, 'v) H.t
|
||||||
|
|
||||||
|
let create () : _ t = H.create ~hashed_type:(module Key) ()
|
||||||
|
let find_exn = H.find_exn
|
||||||
|
let[@inline] remove self k = ignore (H.try_remove self k : bool)
|
||||||
|
|
||||||
|
let[@inline] add self k v =
|
||||||
|
if not (H.try_add self k v) then ignore (H.try_set self k v)
|
||||||
|
|
||||||
|
let[@inline] to_list self = H.to_seq self |> List.of_seq
|
||||||
38
src/subscriber/tbl_.thread.ml
Normal file
38
src/subscriber/tbl_.thread.ml
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
module T = Hashtbl.Make (struct
|
||||||
|
include Int64
|
||||||
|
|
||||||
|
let hash = Hashtbl.hash
|
||||||
|
end)
|
||||||
|
|
||||||
|
type 'v t = {
|
||||||
|
tbl: 'v T.t;
|
||||||
|
lock: Mutex.t;
|
||||||
|
}
|
||||||
|
|
||||||
|
let create () : _ t = { tbl = T.create 32; lock = Mutex.create () }
|
||||||
|
|
||||||
|
let find_exn self k =
|
||||||
|
Mutex.lock self.lock;
|
||||||
|
try
|
||||||
|
let v = T.find self.tbl k in
|
||||||
|
Mutex.unlock self.lock;
|
||||||
|
v
|
||||||
|
with e ->
|
||||||
|
Mutex.unlock self.lock;
|
||||||
|
raise e
|
||||||
|
|
||||||
|
let remove self k =
|
||||||
|
Mutex.lock self.lock;
|
||||||
|
T.remove self.tbl k;
|
||||||
|
Mutex.unlock self.lock
|
||||||
|
|
||||||
|
let add self k v =
|
||||||
|
Mutex.lock self.lock;
|
||||||
|
T.replace self.tbl k v;
|
||||||
|
Mutex.unlock self.lock
|
||||||
|
|
||||||
|
let to_list self : _ list =
|
||||||
|
Mutex.lock self.lock;
|
||||||
|
let l = T.fold (fun k v l -> (k, v) :: l) self.tbl [] in
|
||||||
|
Mutex.unlock self.lock;
|
||||||
|
l
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
open Trace_core
|
open Trace_core
|
||||||
module Callbacks = Callbacks
|
module Callbacks = Callbacks
|
||||||
module Subscriber = Subscriber
|
module Subscriber = Subscriber
|
||||||
|
module Span_tbl = Span_tbl
|
||||||
include Types
|
include Types
|
||||||
|
|
||||||
type t = Subscriber.t
|
type t = Subscriber.t
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,14 @@
|
||||||
trace event. It also defines a collector that needs to be installed for the
|
trace event. It also defines a collector that needs to be installed for the
|
||||||
subscriber(s) to be called.
|
subscriber(s) to be called.
|
||||||
|
|
||||||
|
Thanks to {!Subscriber.tee_l} it's possible to combine multiple subscribers
|
||||||
|
into a single collector.
|
||||||
|
|
||||||
@since 0.8 *)
|
@since 0.8 *)
|
||||||
|
|
||||||
module Callbacks = Callbacks
|
module Callbacks = Callbacks
|
||||||
module Subscriber = Subscriber
|
module Subscriber = Subscriber
|
||||||
|
module Span_tbl = Span_tbl
|
||||||
|
|
||||||
include module type of struct
|
include module type of struct
|
||||||
include Types
|
include Types
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ depends: [
|
||||||
depopts: [
|
depopts: [
|
||||||
"hmap"
|
"hmap"
|
||||||
"unix"
|
"unix"
|
||||||
|
"picos_aux" {>= "0.6"}
|
||||||
"mtime" {>= "2.0"}
|
"mtime" {>= "2.0"}
|
||||||
]
|
]
|
||||||
build: [
|
build: [
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue