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 (v3 shares a common filter and handler API with Telemere)2025-04-15
v2.7.0
: (stable) release infoSee here for earlier releases.
p
, profiled
, profile
.*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 >>>
You can help support continued work on this project, thank you!! 🙏
Copyright © 2016-2025 Peter Taoussanis.
Licensed under EPL 1.0 (same as Clojure).
Can you improve this documentation? These fine people already did:
Peter Taoussanis, r6eve & Ivar RefsdalEdit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close