Skip to content

taoensso/tufte

Folders and files

NameName
Last commit message
Last commit date

Latest commit

0615d50 · Apr 26, 2025
Apr 14, 2025
Aug 14, 2023
Aug 14, 2023
Apr 25, 2025
Apr 21, 2025
Apr 26, 2025
Apr 21, 2025
Apr 26, 2025
Aug 14, 2023
Apr 25, 2025
Aug 14, 2023
Aug 14, 2023
Apr 25, 2025
Jul 13, 2023
Jul 8, 2016
Apr 21, 2025

Repository files navigation

Taoensso open source
API | Wiki | Latest releases | Slack channel

Tufte

Simple performance monitoring library for Clojure/Script

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

Carte Figurative, one of Edward Tufte's favourite data visualizations.

Latest release/s

Main tests Graal tests

See here for earlier releases.

Why Tufte?

  • 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.).

Quick example

(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 >>>

Documentation

Funding

You can help support continued work on this project, thank you!! 🙏

License

Copyright © 2016-2025 Peter Taoussanis.
Licensed under EPL 1.0 (same as Clojure).