[new] Add explicit :extra-kvs to signals

I.e. groups together all user-level kvs for convenience.
This commit is contained in:
Peter Taoussanis 2024-03-14 12:49:46 +01:00
parent 04725e4a47
commit 50378146c0
4 changed files with 28 additions and 27 deletions

View file

@ -29,7 +29,7 @@ Default keys:
`:sample-rate` - ?rate ∈ℝ[0,1] for combined call AND handler sampling (0.75 => allow 75% of signals, nil => allow all)
<user-kvs> - Arb user-level ?kvs given to signal call
<extra-kvs> - Arb user-level ?kvs given to signal call
If anything is unclear, please ping me (@ptaoussanis) so that I can improve these docs!

View file

@ -25,7 +25,7 @@ Signal options (shared by `signal!`, `event!`, ...):
`:middleware` - ?[(fn [signal])=>modified-signal ...] call middleware
`:trace?` - Should tracing be enabled for `:run` form?
<user-kvs> - Arb user-level ?kvs to incl. in signal
<extra-kvs> - Arb user-level ?kvs to incl. in signal
If anything is unclear, please ping me (@ptaoussanis) so that I can improve these docs!

View file

@ -197,7 +197,7 @@
location ns line column file,
sample-rate, kind id level, ctx parent,
data msg_ error run-form run-val,
end-instant run-nsecs])
end-instant run-nsecs extra-kvs])
(deftype #_defrecord WrappedSignal
;; Internal type to implement `sigs/IFilterableSignal`,
@ -327,7 +327,7 @@
[instant uid,
location ns line column file,
sample-rate, kind id level, ctx parent,
user-opts data msg_,
extra-kvs data msg_,
run-form run-result error]
(let [signal
@ -349,15 +349,15 @@
sample-rate, kind id level, ctx parent,
data msg_,
run-err run-form run-val,
end-instant run-nsecs))
end-instant run-nsecs extra-kvs))
(Signal. 1 instant uid,
location ns line column file,
sample-rate, kind id level, ctx parent,
data msg_, error nil nil instant nil))]
data msg_, error nil nil instant nil extra-kvs))]
(if user-opts
(reduce-kv assoc signal user-opts)
(if extra-kvs
(reduce-kv assoc signal extra-kvs)
(do signal))))
(comment
@ -380,7 +380,7 @@
[#_defaults #_elide? #_allow? #_expansion-id, ; Undocumented
elidable? location instant uid middleware,
sample-rate kind ns id level when rate-limit,
ctx parent trace?, do let data msg error run & user-opts]}])
ctx parent trace?, do let data msg error run & extra-kvs]}])
:event! ; [id] [id level-or-opts] => allowed?
'([id ]
@ -390,7 +390,7 @@
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location instant uid middleware,
sample-rate kind ns id level when rate-limit,
ctx parent trace?, do let data msg error #_run & user-opts]}])
ctx parent trace?, do let data msg error #_run & extra-kvs]}])
:log! ; [msg] [level-or-opts msg] => allowed?
'([ msg]
@ -399,7 +399,7 @@
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location instant uid middleware,
sample-rate kind ns id level when rate-limit,
ctx parent trace?, do let data msg error #_run & user-opts]}
ctx parent trace?, do let data msg error #_run & extra-kvs]}
msg])
:error! ; [error] [id-or-opts error] => given error
@ -409,7 +409,7 @@
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location instant uid middleware,
sample-rate kind ns id level when rate-limit,
ctx parent trace?, do let data msg error #_run & user-opts]}
ctx parent trace?, do let data msg error #_run & extra-kvs]}
error])
(:trace! :spy!) ; [form] [id-or-opts form] => run result (value or throw)
@ -419,7 +419,7 @@
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location instant uid middleware,
sample-rate kind ns id level when rate-limit,
ctx parent trace?, do let data msg error run & user-opts]}
ctx parent trace?, do let data msg error run & extra-kvs]}
form])
:catch->error! ; [form] [id-or-opts form] => run result (value or throw)
@ -429,7 +429,7 @@
[#_defaults #_elide? #_allow? #_expansion-id, rethrow? catch-val,
elidable? location instant uid middleware,
sample-rate kind ns id level when rate-limit,
ctx parent trace?, do let data msg error #_run & user-opts]}
ctx parent trace?, do let data msg error #_run & extra-kvs]}
form])
:uncaught->error! ; [] [id-or-opts] => nil
@ -439,7 +439,7 @@
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location instant uid middleware,
sample-rate kind ns id level when rate-limit,
ctx parent trace?, do let data msg error #_run & user-opts]}])
ctx parent trace?, do let data msg error #_run & extra-kvs]}])
(enc/unexpected-arg! macro-id))))
@ -529,7 +529,7 @@
let-form (or let-form '[])
msg-form (parse-msg-form msg-form)
user-opts-form
extra-kvs-form
(not-empty
(dissoc opts
:elidable? :location :instant :uid :middleware,
@ -544,7 +544,7 @@
(new-signal ~'__instant ~'__uid
~location ~ns ~line ~column ~file,
~sample-rate-form, ~kind-form ~'__id ~level-form, ~ctx-form ~parent-form,
~user-opts-form ~data-form ~msg-form,
~extra-kvs-form ~data-form ~msg-form,
'~run-form ~'__run-result ~error-form))))]
#_ ; Sacrifice some perf to de-dupe (possibly large) `run-form`

View file

@ -101,9 +101,10 @@
(is (> (inst-ms end) (inst-ms start)) "End instant is start + run-nsecs")
(is (< (inst-ms end) 1e6) "End instant is start + run-nsecs")])]))
(testing "User opts assoced directly to signal"
(let [[rv [sv]] (ws (sig! {:level :info, :my-opt1 "v1", :my-opt2 "v2"}))]
(is (sm? sv {:level :info, :my-opt1 "v1", :my-opt2 "v2"}))))
(testing "Support arb extra user kvs"
(let [[rv [sv]] (ws (sig! {:level :info, :my-k1 "v1", :my-k2 "v2"}))]
(is (sm? sv {:level :info, :my-k1 "v1", :my-k2 "v2"
:extra-kvs {:my-k1 "v1", :my-k2 "v2"}}))))
(testing "`:msg` basics"
(let [c (enc/counter)
@ -122,7 +123,7 @@
(testing "`:data` basics"
(vec
(for [dk [:data :my-opt]] ; User opts share same behaviour as data
(for [dk [:data :my-k1]] ; User kvs share same behaviour as data
(let [c (enc/counter)
[rv1 [sv1]] (ws (sig! {:level :info, :run (c), dk {:c1 (c)}}))
[rv2 [sv2]] (ws (sig! {:level :info, :run (c), dk (delay {:c2 (c)})}))
@ -165,9 +166,9 @@
(is (= rv5 9)) (is (= (:msg_ sv5) nil))
(is (= @c 12) "5x run + 4x let (1x suppressed) + 3x msg (1x suppressed)")]))
(testing "`:do` + `:let` + `:data`/`:my-opt`"
(testing "`:do` + `:let` + `:data`/`:my-k1`"
(vec
(for [dk [:data :my-opt]]
(for [dk [:data :my-k1]]
(let [c (enc/counter)
[rv1 [sv1]] (ws (sig! {:level :info, :run (c), :do (c), :let [n (c)], dk {:n n, :c1 (c)}}))
[rv2 [sv2]] (ws (sig! {:level :info, :run (c), :do (c), :let [n (c)], dk (delay {:n n, :c2 (c)})}))
@ -184,9 +185,9 @@
(is (= rv6 13)) (is (= (force (get sv6 dk)) [:n 15, :c6 17]))
(is (= @c 18) "6x run + 4x do (2x suppressed) + 4x let (2x suppressed) + 4x data (2x suppressed)")]))))
(testing "Manual `let` (unconditional) + `:data`/`:my-opt`"
(testing "Manual `let` (unconditional) + `:data`/`:my-k1`"
(vec
(for [dk [:data :my-opt]]
(for [dk [:data :my-k1]]
(let [c (enc/counter)
[rv1 [sv1]] (ws (let [n (c)] (sig! {:level :info, :run (c), dk {:n n, :c1 (c)}})))
[rv2 [sv2]] (ws (let [n (c)] (sig! {:level :info, :run (c), dk (delay {:n n, :c2 (c)})})))
@ -318,9 +319,9 @@
(is (= @sv_ :nx))
(is (sm? @error_ {:handler-id :hid1, :error ex1-pred}))])
(testing "Throwing user opt"
(testing "Throwing user kv"
(reset-state!)
[(is (true? (sig! {:level :info, :my-opt (ex1!)})))
[(is (true? (sig! {:level :info, :my-k1 (ex1!)})))
(is (= @sv_ :nx))
(is (sm? @error_ {:handler-id :hid1, :error ex1-pred}))])])])))