API | Wiki | Latest releases | Slack channel
Tufte allows you to easily monitor the ongoing performance of your Clojure and ClojureScript applications in production and other environments.
It provides sensible application-level metrics, and gives them to you as Clojure data that can be easily analyzed programatically.
It works great with Telemere and Truss to help enable unique next-gen observability for Clojure and ClojureScript applications.
Carte Figurative, one of Edward Tufte's favourite data visualizations.
2025-04-21
v3.0.0-beta1
: (forthcoming) release info (shares filter + handler API with Telemere)2025-04-15
v2.7.0
: (stable) release info
See here for earlier releases.
- Small, fast, cross-platform Clojure/Script codebase.
- Sensible form-level profiling without the low-level JVM noise.
- Metrics as Clojure maps: easily aggregate, analyse, log, serialize to db, etc.
- Tiny, flexible API:
p
,profiled
,profile
. - Full support for thread-local and dynamic (multi-threaded) profiling.
- Rich filtering: conditional profiling by namespace, id pattern, level, level by namespace pattern, etc.
- Rich a/sync handling: with sampling, rate limiting, back-pressure monitoring, etc.
- Includes handlers for Telemere, Timbre, and consoles (
*out*
, etc.).
(require '[taoensso.tufte :as tufte)
;; Send `profile` signals to console
(tufte/add-handler! :my-console-handler (tufte/handler:console))
;;; Define a couple dummy fns to simulate doing some expensive work
(defn get-x [] (Thread/sleep 500) "x val")
(defn get-y [] (Thread/sleep (rand-int 1000)) "y val")
;; Let's check how these fns perform:
(tufte/profile ; Profile any `p` forms called during body execution
{:level :info} ; Rich set of filtering options available
(dotimes [_ 5]
(tufte/p :get-x (get-x))
(tufte/p :get-y (get-y))))
;; The following will be printed to *out*:
;; 2025-04-18T11:23:08.820786Z INFO MyHost readme-examples[15,1]
;; <<< pstats <<<
;; pId nCalls Min 50% ≤ 90% ≤ 95% ≤ 99% ≤ Max Mean MAD Clock Total
;;
;; :get-y 5 238ms 501ms 981ms 981ms 981ms 981ms 618ms ±42% 3.09s 55%
;; :get-x 5 501ms 502ms 505ms 505ms 505ms 505ms 503ms ±0% 2.51s 45%
;;
;; Accounted 5.60s 100%
;; Clock 5.60s 100%
;; >>> pstats >>>
- Wiki (getting started, usage, etc.)
- API reference via cljdoc
- Support via Slack channel or GitHub issues
You can help support continued work on this project, thank you!! 🙏
Copyright © 2016-2025 Peter Taoussanis.
Licensed under EPL 1.0 (same as Clojure).