[mod] Signal options: drop :location, add :coords

This is the input-side change related to [1], and only
affects folks who've been providing custom callsite info to
Telemere signals (usually in the context of wrapper macros).

To provide custom callsite info BEFORE this commit:
  (tel/signal! {:location {:ns "my-ns", :line 10, :column 20}})

To provide custom callsite info AFTER this commit:
  (tel/signal! {:ns "my-ns", :coords [10 20]})

Motivation for the new override API:

  - It's shorter and cleaner.
  - It's less likely to cause confusion since it avoids the
    redundant signal keys (signals previously contained callsite
    info in 2 duplicate places).
  - The underlying implementation is simpler.
  - The util for manually getting coords is easier to use and doesn't
    require macro-time environment info, making it easier for folks
    to write wrapper macros that include line + column info.
  - When embedded, the new callsite info is shorter and easier for
    Cljs advanced compilation to de-duplicate (so helps reduce .js
    build size).

[1] Commit 1f99f7186b
This commit is contained in:
Peter Taoussanis 2025-02-26 19:08:44 +01:00
parent 1f99f7186b
commit fda22ce80c
10 changed files with 141 additions and 129 deletions

View file

@ -10,8 +10,7 @@
:scm {:name "git" :url "https://github.com/taoensso/telemere"}
:dependencies
[[com.taoensso/truss "2.0.0-SNAPSHOT"]
[com.taoensso/encore "3.132.0"]]
[[com.taoensso/encore "3.135.0-SNAPSHOT"]]
:test-paths ["test" #_"src"]

View file

@ -18,10 +18,12 @@ All options are available for all signal creators:
`:parent` ------ Custom ?{:keys [id uid]} to override auto (dynamic) parent signal tracing info
`:root` -------- Custom ?{:keys [id uid]} to override auto (dynamic) root signal tracing info
`:location` ---- Custom ?{:keys [ns line column file]} to override auto signal creator callsite location
`:ctx` --------- Custom ?val to override auto (dynamic `*ctx*`) in signal, as per `with-ctx`
`:ctx+` -------- Custom ?val to update auto (dynamic `*ctx*`) in signal, as per `with-ctx+`
`:ns` ---------- Custom ?str namespace to override auto signal creator callsite
`:coords` ------ Custom ?[line column] to override auto signal creator callsite
`:elidable?` --- Should signal be subject to compile-time elision? (Default: true)
`:sample-rate` - ?rate ∈ℝ[0,1] for signal sampling (0.75 => allow 75% of signals, nil => allow all)
`:when` -------- Arb ?form; when present, form must return truthy to allow signal

View file

@ -31,15 +31,15 @@
(remove-ns (symbol (str *ns*)))
(:api (enc/interns-overview)))
(enc/assert-min-encore-version [3 132 0])
(enc/assert-min-encore-version [3 135 0])
;;;; Shared signal API
(sigs/def-api
{:sf-arity 4
:ct-sig-filter impl/ct-sig-filter
:*rt-sig-filter* impl/*rt-sig-filter*
:*sig-handlers* impl/*sig-handlers*
:ct-call-filter impl/ct-call-filter
:*rt-call-filter* impl/*rt-call-filter*
:*sig-handlers* impl/*sig-handlers*
:lib-dispatch-opts
(assoc sigs/default-handler-dispatch-opts
:convey-bindings? false ; Handled manually
@ -209,8 +209,8 @@
;; - uncaught->error! - ?id => nil
#?(:clj
(defn- merge-or-assoc-opts [m &form &env k v]
(let [m (assoc m :location* (enc/get-source &form &env))]
(defn- merge-or-assoc-opts [m macro-form k v]
(let [m (assoc m :coords (truss/callsite-coords macro-form))]
(if (map? v)
(merge m v)
(assoc m k v)))))
@ -221,8 +221,8 @@
"id + ?level => allowed? Note unique arg order: [x opts] rather than [opts x]!"
{:doc (impl/signal-docstring :event!)
:arglists (impl/signal-arglists :event!)}
([ opts-or-id] `(impl/signal! ~(merge-or-assoc-opts base-opts &form &env :id opts-or-id)))
([id opts-or-level] `(impl/signal! ~(assoc (merge-or-assoc-opts base-opts &form &env :level opts-or-level) :id id))))))
([ opts-or-id] `(impl/signal! ~(merge-or-assoc-opts base-opts &form :id opts-or-id)))
([id opts-or-level] `(impl/signal! ~(assoc (merge-or-assoc-opts base-opts &form :level opts-or-level) :id id))))))
(comment (with-signal (event! ::my-id :info)))
@ -232,8 +232,8 @@
"?level + msg => allowed?"
{:doc (impl/signal-docstring :log!)
:arglists (impl/signal-arglists :log!)}
([opts-or-msg ] `(impl/signal! ~(merge-or-assoc-opts base-opts &form &env :msg opts-or-msg)))
([opts-or-level msg] `(impl/signal! ~(assoc (merge-or-assoc-opts base-opts &form &env :level opts-or-level) :msg msg))))))
([opts-or-msg ] `(impl/signal! ~(merge-or-assoc-opts base-opts &form :msg opts-or-msg)))
([opts-or-level msg] `(impl/signal! ~(assoc (merge-or-assoc-opts base-opts &form :level opts-or-level) :msg msg))))))
(comment (with-signal (log! :info "My msg")))
@ -243,8 +243,8 @@
"?id + run => unconditional run result (value or throw)."
{:doc (impl/signal-docstring :trace!)
:arglists (impl/signal-arglists :trace!)}
([opts-or-run] `(impl/signal! ~(merge-or-assoc-opts base-opts &form &env :run opts-or-run)))
([opts-or-id run] `(impl/signal! ~(assoc (merge-or-assoc-opts base-opts &form &env :id opts-or-id) :run run))))))
([opts-or-run] `(impl/signal! ~(merge-or-assoc-opts base-opts &form :run opts-or-run)))
([opts-or-id run] `(impl/signal! ~(assoc (merge-or-assoc-opts base-opts &form :id opts-or-id) :run run))))))
(comment (with-signal (trace! ::my-id (+ 1 2))))
@ -254,8 +254,8 @@
"?level + run => unconditional run result (value or throw)."
{:doc (impl/signal-docstring :spy!)
:arglists (impl/signal-arglists :spy!)}
([opts-or-run] `(impl/signal! ~(merge-or-assoc-opts base-opts &form &env :run opts-or-run)))
([opts-or-level run] `(impl/signal! ~(assoc (merge-or-assoc-opts base-opts &form &env :level opts-or-level) :run run))))))
([opts-or-run] `(impl/signal! ~(merge-or-assoc-opts base-opts &form :run opts-or-run)))
([opts-or-level run] `(impl/signal! ~(assoc (merge-or-assoc-opts base-opts &form :level opts-or-level) :run run))))))
(comment (with-signals (spy! :info (+ 1 2))))
@ -265,9 +265,9 @@
"?id + error => unconditional given error."
{:doc (impl/signal-docstring :error!)
:arglists (impl/signal-arglists :error!)}
([opts-or-id error] `(error! ~(assoc (merge-or-assoc-opts base-opts &form &env :id opts-or-id) :error error)))
([opts-or-id error] `(error! ~(assoc (merge-or-assoc-opts base-opts &form :id opts-or-id) :error error)))
([opts-or-error]
(let [opts (merge-or-assoc-opts base-opts &form &env :error opts-or-error)
(let [opts (merge-or-assoc-opts base-opts &form :error opts-or-error)
gs-error (gensym "error")]
`(let [~gs-error ~(get opts :error)]
(impl/signal! ~(assoc opts :error gs-error))
@ -281,9 +281,9 @@
"?id + run => unconditional run value or ?catch-val."
{:doc (impl/signal-docstring :catch->error!)
:arglists (impl/signal-arglists :catch->error!)}
([opts-or-id run] `(catch->error! ~(assoc (merge-or-assoc-opts base-opts &form &env :id opts-or-id) :run run)))
([opts-or-id run] `(catch->error! ~(assoc (merge-or-assoc-opts base-opts &form :id opts-or-id) :run run)))
([opts-or-run]
(let [opts (merge-or-assoc-opts base-opts &form &env :run opts-or-run)
(let [opts (merge-or-assoc-opts base-opts &form :run opts-or-run)
rethrow? (not (contains? opts :catch-val))
catch-val (get opts :catch-val)
run-form (get opts :run)
@ -325,7 +325,7 @@
{:arglists (impl/signal-arglists :uncaught->error!)}
([ ] (enc/keep-callsite `(uncaught->error! {})))
([opts-or-id]
(let [opts (merge-or-assoc-opts base-opts &form &env :id opts-or-id)]
(let [opts (merge-or-assoc-opts base-opts &form :id opts-or-id)]
`(uncaught->handler!
(fn [~'__thread-arg ~'__throwable-arg]
(impl/signal! ~opts))))))))
@ -381,23 +381,23 @@
(enc/set-var-root! sigs/*default-handler-error-fn*
(fn [{:keys [error] :as m}]
(impl/signal!
{:kind :error
:level :error
:error error
:location {:ns "taoensso.encore.signals"}
:id :taoensso.encore.signals/handler-error
:msg "Error executing wrapped handler fn"
:data (dissoc m :error)})))
{:kind :error
:level :error
:error error
:ns "taoensso.encore.signals"
:id :taoensso.encore.signals/handler-error
:msg "Error executing wrapped handler fn"
:data (dissoc m :error)})))
(enc/set-var-root! sigs/*default-handler-backp-fn*
(fn [data]
(impl/signal!
{:kind :event
:level :warn
:location {:ns "taoensso.encore.signals"}
:id :taoensso.encore.signals/handler-back-pressure
:msg "Back pressure on wrapped handler fn"
:data data})))
{:kind :event
:level :warn
:ns "taoensso.encore.signals"
:id :taoensso.encore.signals/handler-back-pressure
:msg "Back pressure on wrapped handler fn"
:data data})))
(add-handler! :default/console (handler:console))

View file

@ -52,9 +52,9 @@
id-filter (enc/get-env {:as :edn} :taoensso.telemere/ct-id-filter<.platform><.edn>)
min-level (enc/get-env {:as :edn} :taoensso.telemere/ct-min-level<.platform><.edn>)]
(enc/defonce ct-sig-filter
"`SigFilter` used for compile-time elision, or nil."
(sigs/sig-filter
(enc/defonce ct-call-filter
"`SpecFilter` used for compile-time elision, or nil."
(sigs/spec-filter
{:kind-filter (or kind-filter (get base :kind-filter))
:ns-filter (or ns-filter (get base :ns-filter))
:id-filter (or id-filter (get base :id-filter))
@ -66,9 +66,9 @@
id-filter (enc/get-env {:as :edn} :taoensso.telemere/rt-id-filter<.platform><.edn>)
min-level (enc/get-env {:as :edn, :default :info} :taoensso.telemere/rt-min-level<.platform><.edn>)]
(enc/defonce ^:dynamic *rt-sig-filter*
"`SigFilter` used for runtime filtering, or nil."
(sigs/sig-filter
(enc/defonce ^:dynamic *rt-call-filter*
"`SpecFilter` used for runtime filtering, or nil."
(sigs/spec-filter
{:kind-filter (or kind-filter (get base :kind-filter))
:ns-filter (or ns-filter (get base :ns-filter))
:id-filter (or id-filter (get base :id-filter))
@ -276,11 +276,9 @@
(pr-str (assoc (MyRec. :x) :y :y)))))
(deftype #_defrecord WrappedSignal
;; Internal type to implement `sigs/IFilterableSignal`,
;; incl. lazy + cached `signal-value_` field.
[kind ns id level signal-value_]
sigs/IFilterableSignal
(allow-signal? [_ sig-filter] (sig-filter kind ns id level))
sigs/ISignalHandling
(allow-signal? [_ spec-filter] (spec-filter kind ns id level))
(signal-debug [_] {:kind kind, :ns ns, :id id, :level level})
(signal-value [_ handler-sample-rate]
(sigs/signal-with-combined-sample-rate handler-sample-rate
@ -396,16 +394,16 @@
:signal! ; opts => allowed? / unconditional run result (value or throw)
'( [& opts-kvs]
[{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id, ; Undocumented
elidable? location #_location* inst uid middleware middleware+,
[#_defaults #_elide? #_allow? #_callsite-id, ; Undocumented
elidable? coords inst uid middleware middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
ctx ctx+ parent root trace?, do let data msg error run & kvs]}])
:signal-allowed? ; opts => allowed?
'( [& opts-kvs]
[{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id, ; Undocumented
elidable? location #_location* #_inst #_uid #_middleware #_middleware+,
[#_defaults #_elide? #_allow? #_callsite-id, ; Undocumented
elidable? coords #_inst #_uid #_middleware #_middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
#_ctx #_ctx+ #_parent #_root #_trace?, #_do #_let #_data #_msg #_error #_run #_& #_kvs]}])
@ -414,8 +412,8 @@
[id level]
[id
{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location #_location* inst uid middleware middleware+,
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? coords inst uid middleware middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
ctx ctx+ parent root trace?, do let data msg error #_run & kvs]}])
@ -423,8 +421,8 @@
'([opts-or-msg]
[level msg]
[{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location #_location* inst uid middleware middleware+,
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? coords inst uid middleware middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
ctx ctx+ parent root trace?, do let data msg error #_run & kvs]}
msg])
@ -433,8 +431,8 @@
'([opts-or-run]
[id run]
[{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location #_location* inst uid middleware middleware+,
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? coords inst uid middleware middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
ctx ctx+ parent root trace?, do let data msg error run & kvs]}
run])
@ -443,8 +441,8 @@
'([opts-or-run]
[level run]
[{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location #_location* inst uid middleware middleware+,
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? coords inst uid middleware middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
ctx ctx+ parent root trace?, do let data msg error run & kvs]}
run])
@ -453,8 +451,8 @@
'([opts-or-error]
[id error]
[{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location #_location* inst uid middleware middleware+,
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? coords inst uid middleware middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
ctx ctx+ parent root trace?, do let data msg error #_run & kvs]}
error])
@ -463,8 +461,8 @@
'([opts-or-run]
[id run]
[{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id, catch-val,
elidable? location #_location* inst uid middleware middleware+,
[#_defaults #_elide? #_allow? #_callsite-id, catch-val,
elidable? coords inst uid middleware middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
ctx ctx+ parent root trace?, do let data msg error #_run & kvs]}
run])
@ -473,8 +471,8 @@
'([]
[opts-or-id]
[{:as opts-map :keys
[#_defaults #_elide? #_allow? #_expansion-id,
elidable? location #_location* inst uid middleware middleware+,
[#_defaults #_elide? #_allow? #_callsite-id,
elidable? coords inst uid middleware middleware+,
sample-rate kind ns id level when rate-limit rate-limit-by,
ctx ctx+ parent root trace?, do let data msg error #_run & kvs]}])
@ -524,6 +522,9 @@
clj? (not cljs?)
{run-form :run} opts
ns-form* (get opts :ns :auto)
ns-form (auto-> ns-form* (str *ns*))
show-run-val (get opts :run-val '_run-val)
show-run-form
(when run-form
@ -535,15 +536,16 @@
(list (first run-form) '...)
(do run-form))))
{:keys [#_expansion-id location elide? allow?]}
(sigs/filterable-expansion
{:sf-arity 4
:ct-sig-filter ct-sig-filter
:*rt-sig-filter* `*rt-sig-filter*}
{:keys [#_callsite-id elide? allow?]}
(sigs/filter-call
{:cljs? cljs?
:sf-arity 4
:ct-call-filter ct-call-filter
:*rt-call-filter* `*rt-call-filter*}
(assoc opts
:location* (get opts :location* (enc/get-source &form &env))
:bound-forms
:ns ns-form
:local-forms
{:kind '__kind
:ns '__ns
:id '__id
@ -551,12 +553,11 @@
(if elide?
run-form
(let [{ns-form :ns
line-form :line
column-form :column
file-form :file} location
coords (when line-form [line-form column-form])
(let [coords
(get opts :coords
(when (= ns-form* :auto)
;; Auto coords iff auto ns
(truss/callsite-coords &form)))
{inst-form :inst
level-form :level
@ -605,10 +606,10 @@
kvs-form
(not-empty
(dissoc opts
:elidable? :location :location* :inst :uid :middleware :middleware+,
:elidable? :coords :inst :uid :middleware :middleware+,
:sample-rate :ns :kind :id :level :filter :when #_:rate-limit #_:rate-limit-by,
:ctx :ctx+ :parent #_:trace?, :do :let :data :msg :error,
:run :run-form :run-val, :elide? :allow? #_:expansion-id :otel/context))
:run :run-form :run-val, :elide? :allow? #_:callsite-id :otel/context))
_ ; Compile-time validation
(do
@ -616,7 +617,8 @@
(truss/ex-info! "Signals cannot have both `:run` and `:error` opts at the same time"
{:run-form run-form
:error-form error-form
:location location
:ns ns-form
:coords coords
:other-opts (dissoc opts :run :error)}))
(when-let [e (find opts :msg_)] ; Common typo/confusion
@ -782,13 +784,14 @@
defaults (get opts :defaults)
opts (merge defaults (dissoc opts :defaults))
{:keys [#_expansion-id #_location elide? allow?]}
(sigs/filterable-expansion
{:sf-arity 4
:ct-sig-filter ct-sig-filter
:*rt-sig-filter* `*rt-sig-filter*}
(assoc opts :location*
(get opts :location* (enc/get-source &form &env))))]
{:keys [#_callsite-id elide? allow?]}
(sigs/filter-call
{:cljs? (boolean (:ns &env))
:sf-arity 4
:ct-call-filter ct-call-filter
:*rt-call-filter* `*rt-call-filter*}
(assoc opts :ns
(get opts :ns (str *ns*))))]
(if elide? false `(if ~allow? true false)))))
@ -825,7 +828,7 @@
(defn test-interop! [msg test-fn]
(let [msg (str "Interop test: " msg " (" (enc/uuid-str) ")")
signal
(binding [*rt-sig-filter* nil] ; Without runtime filters
(binding [*rt-call-filter* nil] ; Without runtime filters
(with-signal :raw :trap (test-fn msg)))]
(= (force (get signal :msg_)) msg)))))

View file

@ -35,12 +35,11 @@
*err* (or prev-*err* orig-*err*)]
(impl/signal!
{:location nil
:ns nil
:kind kind
:level level
:id id
:msg msg})))))))]
{:ns nil
:kind kind
:level level
:id id
:msg msg})))))))]
(java.io.PrintStream. baos true ; Auto flush
java.nio.charset.StandardCharsets/UTF_8)))

View file

@ -118,21 +118,24 @@
([ form] (enc/keep-callsite `(spy :debug nil ~form)))
([level form] (enc/keep-callsite `(spy ~level nil ~form)))
([level form-name form]
(let [location* (enc/get-source &form &env)
(let [ns (str *ns*)
coords (truss/callsite-coords &form)
msg
(if form-name
`(fn [_form# value# error# nsecs#] (impl/default-trace-msg ~form-name value# error# nsecs#))
`(fn [_form# value# error# nsecs#] (impl/default-trace-msg '~form value# error# nsecs#)))]
`(tel/spy!
{:location* ~location*
:id shim-id
:level ~level
:msg ~msg}
{:ns ~ns
:coords ~coords
:id shim-id
:level ~level
:msg ~msg}
(tel/catch->error!
{:location* ~location*
:id shim-id}
{:ns ~ns
:coords ~coords
:id shim-id}
~form))))))
(comment

View file

@ -21,19 +21,19 @@
(enabled? [_ level]
(when-debug (println [:tools-logging/enabled? level logger-name]))
(impl/signal-allowed?
{:location {:ns logger-name}
:kind :tools-logging
:level level}))
{:ns logger-name
:kind :tools-logging
:level level}))
(write! [_ level throwable message]
(when-debug (println [:tools-logging/write! level logger-name]))
(impl/signal!
{:allow? true ; Pre-filtered by `enabled?` call
:location {:ns logger-name}
:kind :tools-logging
:level level
:error throwable
:msg message})
{:allow? true ; Pre-filtered by `enabled?` call
:ns logger-name
:kind :tools-logging
:level level
:error throwable
:msg message})
nil))
(deftype TelemereLoggerFactory []

View file

@ -602,11 +602,11 @@
(when (and parent (not= parent root)) (af " parent: " (vf (format-parent ns parent)))) ; {:keys [id uid]}
(when root (af " root: " (vf (format-parent ns root)))) ; {:keys [id uid]}
#?(:clj (when (enc/and* host incl-host?) (af " host: " (vf host)))) ; {:keys [ name ip]}
#?(:clj (when (enc/and* thread incl-thread?) (af " thread: " (vf thread)))) ; {:keys [group name id]}
#?(:clj (when (enc/and? host incl-host?) (af " host: " (vf host)))) ; {:keys [ name ip]}
#?(:clj (when (enc/and? thread incl-thread?) (af " thread: " (vf thread)))) ; {:keys [group name id]}
(when (enc/not-empty-coll data) (af " data: " (vf data)))
(when (enc/not-empty-coll ctx) (af " ctx: " (vf ctx)))
(when (enc/and* kvs incl-kvs?) (af " kvs: " (vf kvs))))
(when (enc/and? kvs incl-kvs?) (af " kvs: " (vf kvs))))
(let [{:keys [run-form error]} signal]
(when run-form

View file

@ -40,22 +40,22 @@
(defn ex1! [] (throw ex1))
(defn ex1? [x] (= (truss/ex-root x) ex1)))
(let [rt-sig-filter_ (atom nil)
sig-handlers_ (atom nil)]
(let [rt-call-filter_ (atom nil)
sig-handlers_ (atom nil)]
(test/use-fixtures :once
(enc/test-fixtures
{:before
(fn []
(reset! rt-sig-filter_ impl/*rt-sig-filter*)
(reset! sig-handlers_ impl/*sig-handlers*)
(enc/set-var-root! impl/*sig-handlers* nil)
(enc/set-var-root! impl/*rt-sig-filter* nil))
(reset! rt-call-filter_ impl/*rt-call-filter*)
(reset! sig-handlers_ impl/*sig-handlers*)
(enc/set-var-root! impl/*sig-handlers* nil)
(enc/set-var-root! impl/*rt-call-filter* nil))
:after
(fn []
(enc/set-var-root! impl/*rt-sig-filter* @rt-sig-filter_)
(enc/set-var-root! impl/*sig-handlers* @sig-handlers_))})))
(enc/set-var-root! impl/*rt-call-filter* @rt-call-filter_)
(enc/set-var-root! impl/*sig-handlers* @sig-handlers_))})))
;;;;
@ -125,6 +125,12 @@
(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 "Callsite overrides"
[(is (sm? (with-sig (sig! { })) {:ns "taoensso.telemere-tests", :coords coords?}))
(is (sm? (with-sig (sig! {:ns "custom-ns" })) {:ns "custom-ns", :coords nil}) "Custom ns clears coords")
(is (sm? (with-sig (sig! { :coords [1 2]})) {:ns "taoensso.telemere-tests", :coords [1 2]}) "Custom coords")
(is (sm? (with-sig (sig! {:ns "custom-ns", :coords [1 2]})) {:ns "custom-ns", :coords [1 2]}) "Custom ns + coords")])
(testing "Support arb extra user kvs"
(let [sv (with-sig (sig! {:level :info, :my-k1 "v1", :my-k2 "v2"}))]
(is (sm? sv {:level :info, :my-k1 "v1", :my-k2 "v2"

View file

@ -108,20 +108,20 @@
[logger-name level]
(when-debug (println [:slf4j/allowed? (sig-level level) logger-name]))
(impl/signal-allowed?
{:location {:ns logger-name} ; Typically source class name
:kind :slf4j
:level (sig-level level)}))
{:ns logger-name ; Typically source class name
:kind :slf4j
:level (sig-level level)}))
(defn- normalized-log!
[logger-name level inst error msg-pattern args marker-names kvs]
(when-debug (println [:slf4j/normalized-log! (sig-level level) logger-name]))
(impl/signal!
{:allow? true ; Pre-filtered by `allowed?` call
:location {:ns logger-name} ; Typically source class name
:kind :slf4j
:level (sig-level level)
:inst inst
:error error
{:allow? true ; Pre-filtered by `allowed?` call
:ns logger-name ; Typically source class name
:kind :slf4j
:level (sig-level level)
:inst inst
:error error
:ctx
(when-let [hmap (org.slf4j.MDC/getCopyOfContextMap)]