Skip to content

Commit f689401

Browse files
committed
[new] Add shared signal API
1 parent c51bd16 commit f689401

File tree

3 files changed

+119
-15
lines changed

3 files changed

+119
-15
lines changed

src/taoensso/tufte.cljc

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@
2626
to programmatic monitoring."
2727

2828
{:author "Peter Taoussanis (@ptaoussanis)"}
29-
29+
(:refer-clojure :exclude [newline])
3030
(:require
31-
[taoensso.truss :as truss]
32-
[taoensso.encore :as enc]
33-
[taoensso.encore.stats :as stats]
34-
[taoensso.tufte.impl :as impl #?@(:cljs [:refer [PStats HandlerVal]])])
35-
36-
#?(:clj (:import [taoensso.tufte.impl PStats HandlerVal]))
31+
[taoensso.truss :as truss]
32+
[taoensso.encore :as enc]
33+
[taoensso.encore.stats :as stats]
34+
[taoensso.encore.signals :as sigs]
35+
[taoensso.tufte.impl :as impl
36+
#?@(:cljs [:refer [PStats HandlerVal PSignal WrappedPSignal]])])
37+
38+
#?(:clj (:import [taoensso.tufte.impl PStats HandlerVal PSignal WrappedPSignal]))
3739
#?(:cljs (:require-macros [taoensso.tufte :refer [profiled]])))
3840

3941
(comment
@@ -42,6 +44,55 @@
4244

4345
(enc/assert-min-encore-version [3 142 0])
4446

47+
;;;; Shared signal API
48+
49+
(declare ; Needed to avoid `clj-kondo` "Unresolved var" warnings
50+
level-aliases
51+
help:filters help:handler help:handler-dispatch-options
52+
get-filters get-min-levels get-handlers get-handlers-stats
53+
54+
#?(:clj without-filters)
55+
set-kind-filter! #?(:clj with-kind-filter)
56+
set-ns-filter! #?(:clj with-ns-filter)
57+
set-id-filter! #?(:clj with-id-filter)
58+
set-min-level! #?(:clj with-min-level)
59+
60+
#?(:clj with-handler) #?(:clj with-handler+)
61+
add-handler! remove-handler! stop-handlers!
62+
63+
^:dynamic *ctx* set-ctx! #?(:clj with-ctx) #?(:clj with-ctx+)
64+
^:dynamic *xfn* set-xfn! #?(:clj with-xfn) #?(:clj with-xfn+))
65+
66+
(sigs/def-api
67+
{:sf-arity 3
68+
:ct-call-filter impl/ct-call-filter
69+
:*rt-call-filter* impl/*rt-call-filter*
70+
:*sig-handlers* impl/*sig-handlers*
71+
:lib-dispatch-opts
72+
(assoc sigs/default-handler-dispatch-opts
73+
:convey-bindings? false ; Handled manually
74+
)})
75+
76+
;;;; Aliases
77+
78+
(enc/defaliases
79+
;; Encore
80+
#?(:clj enc/set-var-root!)
81+
#?(:clj enc/update-var-root!)
82+
#?(:clj enc/get-env)
83+
#?(:clj enc/call-on-shutdown!)
84+
enc/chance
85+
enc/rate-limiter
86+
enc/newline
87+
sigs/comp-xfn
88+
sigs/default-handler-dispatch-opts
89+
#?(:clj truss/keep-callsite))
90+
91+
;;;; Help
92+
93+
(def help:signal-content "TODO")
94+
(def help:environmental-config "TODO")
95+
4596
;;;; Level filtering
4697
;; Terminology note: we distinguish between call/form and min levels to ensure
4798
;; that it's always possible to set min-level > any call-level to disable profiling.

src/taoensso/tufte/impl.cljc

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
[clojure.string :as str]
1414
[taoensso.truss :as truss]
1515
[taoensso.encore :as enc]
16-
[taoensso.encore.stats :as stats])
16+
[taoensso.encore.stats :as stats]
17+
[taoensso.encore.signals :as sigs])
1718

1819
#?(:cljs
1920
(:require-macros
@@ -638,6 +639,60 @@
638639
(map (fn [id] (str id sep (format-pstats (get m id) format-pstats-opts))))
639640
sorted-profiling-ids)))))
640641

642+
;;;; Profiling Signals
643+
;; - Filtering relevant for `profiled`, `profile`
644+
;; - Handlers relevant for `profiled` only
645+
646+
(enc/defonce ^:dynamic *sig-handlers* "?[<wrapped-handler-fn>]" nil)
647+
648+
(defrecord PSignal
649+
;; Based on `taoensso.telemere.impl/Signal`
650+
[schema inst, ns coords, id level, #?@(:clj [host thread]),
651+
sample ctx data, body-val, pstats format-pstats-fn]
652+
653+
Object (toString [this] (str "taoensso.tufte.PSignal" (enc/pr-edn* (into {} this)))))
654+
655+
;; Verbose constructors for readability + to support extra keys
656+
(do (enc/def-print-impl [x PSignal] (str "#taoensso.tufte.PSignal" (enc/pr-edn* (into {} x)))))
657+
#?(:clj (enc/def-print-dup [x PSignal] (str "#taoensso.tufte.impl.PSignal" (enc/pr-edn* (into {} x)))))
658+
659+
(defn psignal? #?(:cljs {:tag 'boolean}) [x] (instance? PSignal x))
660+
661+
(defrecord WrappedPSignal [ns id level signal-value_]
662+
sigs/ISignalHandling
663+
(allow-signal? [_ spec-filter] (spec-filter ns id level))
664+
(signal-debug [_] {:ns ns, :id id, :level level})
665+
(signal-value [_ handler-sample-rate]
666+
(sigs/signal-with-combined-sample-rate handler-sample-rate
667+
(force signal-value_))))
668+
669+
#?(:clj
670+
(let [base (enc/get-env {:as :edn} [:taoensso.tufte/ct-filters<.platform><.edn>])
671+
ns-filter (enc/get-env {:as :edn} [:taoensso.tufte/ct-ns-filter<.platform><.edn> :taoensso.tufte/ns-pattern])
672+
id-filter (enc/get-env {:as :edn} [:taoensso.tufte/ct-id-filter<.platform><.edn>])
673+
min-level (enc/get-env {:as :edn} [:taoensso.tufte/ct-min-level<.platform><.edn> :taoensso.tufte/min-level])]
674+
675+
(enc/defonce ct-call-filter
676+
"`SpecFilter` used for compile-time elision, or nil."
677+
(sigs/spec-filter
678+
{:ns-filter (or ns-filter (get base :ns-filter))
679+
:id-filter (or id-filter (get base :id-filter))
680+
:min-level (or min-level (get base :min-level))}))))
681+
682+
(let [base (enc/get-env {:as :edn} [:taoensso.tufte/rt-filters<.platform><.edn>])
683+
ns-filter (enc/get-env {:as :edn} [:taoensso.tufte/rt-ns-filter<.platform><.edn>])
684+
id-filter (enc/get-env {:as :edn} [:taoensso.tufte/rt-id-filter<.platform><.edn>])
685+
min-level (enc/get-env {:as :edn} [:taoensso.tufte/rt-min-level<.platform><.edn>])]
686+
687+
(enc/defonce ^:dynamic *rt-call-filter*
688+
"`SpecFilter` used for runtime filtering, or nil."
689+
(sigs/spec-filter
690+
{:ns-filter (or ns-filter (get base :ns-filter))
691+
:id-filter (or id-filter (get base :id-filter))
692+
:min-level (or min-level (get base :min-level))})))
693+
694+
(comment (enc/get-env {:as :edn, :return :explain} :taoensso.tufte/rt-filters<.platform><.edn>))
695+
641696
;;;; Handlers
642697

643698
(defrecord HandlerVal [ns-str level ?id ?data pstats pstats-str_ ?file ?line]
@@ -647,8 +702,6 @@
647702
(do (enc/def-print-impl [x HandlerVal] (str "#taoensso.tufte.HandlerVal" (enc/pr-edn* (into {} x)))))
648703
#?(:clj (enc/def-print-dup [x HandlerVal] (str "#taoensso.tufte.impl.HandlerVal" (enc/pr-edn* (into {} x)))))
649704

650-
(defn handler-val? #?(:cljs {:tag 'boolean}) [x] (instance? HandlerVal x))
651-
652705
(enc/defonce handlers_ "{<hid> <handler-fn>}" (atom nil))
653706

654707
#?(:clj

test/taoensso/tufte_tests.cljc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -377,11 +377,11 @@
377377
(is (every? #(= nested-reference @%) (doall (repeatedly 100 (fn [] (future (Thread/sleep 10) (nested-profiled true false)))))) "(dynamic (local ...))")]))])
378378

379379
(deftest printing
380-
[#?(:clj (is (impl/handler-val? (read-string (binding [*print-dup* true] (pr-str (impl/map->HandlerVal {})))))))
381-
#?(:clj (is (impl/handler-val? (read-string (binding [*print-dup* true] (pr-str (assoc (impl/map->HandlerVal {}) :k :v)))))))
382-
(is (enc/str-starts-with? (binding [*print-dup* true] (str (assoc (impl/map->HandlerVal {}) :k :v))) "taoensso.tufte.HandlerVal{"))
383-
(is (enc/str-starts-with? (pr-str (assoc (impl/map->HandlerVal {}) :k :v)) "#taoensso.tufte.HandlerVal{"))
384-
(is (enc/str-starts-with? (str (assoc (impl/map->HandlerVal {}) :k :v)) "taoensso.tufte.HandlerVal{"))])
380+
[#?(:clj (is (impl/psignal? (read-string (binding [*print-dup* true] (pr-str (impl/map->PSignal {})))))))
381+
#?(:clj (is (impl/psignal? (read-string (binding [*print-dup* true] (pr-str (assoc (impl/map->PSignal {}) :k :v)))))))
382+
(is (enc/str-starts-with? (binding [*print-dup* true] (str (assoc (impl/map->PSignal {}) :k :v))) "taoensso.tufte.PSignal{"))
383+
(is (enc/str-starts-with? (pr-str (assoc (impl/map->PSignal {}) :k :v)) "#taoensso.tufte.PSignal{"))
384+
(is (enc/str-starts-with? (str (assoc (impl/map->PSignal {}) :k :v)) "taoensso.tufte.PSignal{"))])
385385

386386
(deftest advanced
387387
(testing "Advanced"

0 commit comments

Comments
 (0)