{"id":13850036,"url":"https://github.com/taoensso/tufte","last_synced_at":"2025-10-22T02:25:50.409Z","repository":{"id":44945054,"uuid":"62775933","full_name":"taoensso/tufte","owner":"taoensso","description":"Simple performance monitoring library for Clojure/Script","archived":false,"fork":false,"pushed_at":"2024-04-11T13:28:30.000Z","size":699,"stargazers_count":529,"open_issues_count":2,"forks_count":22,"subscribers_count":13,"default_branch":"master","last_synced_at":"2024-05-01T21:41:21.153Z","etag":null,"topics":["benchmarking","clojure","clojurescript","epl","performance-monitoring","profiling","taoensso"],"latest_commit_sha":null,"homepage":"https://www.taoensso.com/tufte","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"epl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/taoensso.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":"FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"ptaoussanis","custom":"https://www.taoensso.com/clojure"}},"created_at":"2016-07-07T04:50:01.000Z","updated_at":"2024-06-12T15:42:45.732Z","dependencies_parsed_at":"2023-09-23T13:01:36.344Z","dependency_job_id":"df421aa6-ab3b-40b1-ba4d-6136a92c9193","html_url":"https://github.com/taoensso/tufte","commit_stats":{"total_commits":203,"total_committers":10,"mean_commits":20.3,"dds":0.4778325123152709,"last_synced_commit":"0960a2211bb750409fe526c1eb50096f22e4d7f4"},"previous_names":["taoensso/tufte","ptaoussanis/tufte"],"tags_count":41,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftufte","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftufte/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftufte/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftufte/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taoensso","download_url":"https://codeload.github.com/taoensso/tufte/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225839485,"owners_count":17532305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["benchmarking","clojure","clojurescript","epl","performance-monitoring","profiling","taoensso"],"created_at":"2024-08-04T20:00:56.824Z","updated_at":"2025-10-22T02:25:50.324Z","avatar_url":"https://github.com/taoensso.png","language":"Clojure","funding_links":["https://github.com/sponsors/ptaoussanis","https://www.taoensso.com/clojure"],"categories":["Clojure"],"sub_categories":[],"readme":"\u003ca href=\"https://www.taoensso.com/clojure\" title=\"More stuff by @ptaoussanis at www.taoensso.com\"\u003e\u003cimg src=\"https://www.taoensso.com/open-source.png\" alt=\"Taoensso open source\" width=\"340\"/\u003e\u003c/a\u003e  \n[**API**][cljdoc] | [**Wiki**][GitHub wiki] | [Latest releases](#latest-releases) | [Slack channel][]\n\n# Tufte\n\n### Simple performance monitoring library for Clojure/Script\n\n**Tufte** allows you to **easily monitor the ongoing performance** of your Clojure and ClojureScript applications in production and other environments.\n\nIt provides **sensible application-level metrics**, and gives them to you as **Clojure data** that can be easily analyzed programatically.\n\nUse it alone, or as part of a suite of complementary **observability tools** for modern Clojure/Script applications:\n\n- [Telemere](https://www.taoensso.com/telemere) for logging, tracing, and general telemetry\n- [Tufte](https://www.taoensso.com/tufte) for performance monitoring\n- [Truss](https://www.taoensso.com/truss) for  assertions and error handling\n- [Trove](https://www.taoensso.com/trove) for library authors that want to do structured logging\n\n\u003cimg width=\"600\" src=\"../../raw/master/hero.png\" alt=\"Carte Figurative\"/\u003e\n\n\u003e [Carte Figurative](https://en.wikipedia.org/wiki/Charles_Joseph_Minard#The_map_of_Napoleon's_Russian_campaign), one of [Edward Tufte](https://en.wikipedia.org/wiki/Edward_Tufte)'s favourite data visualizations.\n\n## Latest release/s\n\n- `2025-06-23` `v3.0.0`: [release info](../../releases/tag/v3.0.0)\n\n[![Clj tests][Clj tests SVG]][Clj tests URL]\n[![Cljs tests][Cljs tests SVG]][Cljs tests URL]\n[![Graal tests][Graal tests SVG]][Graal tests URL]\n\nSee [here][GitHub releases] for earlier releases.\n\n## Why Tufte?\n\n- Small, **fast**, cross-platform Clojure/Script codebase.\n- Sensible **form-level** profiling without the low-level JVM noise.\n- **Metrics as Clojure maps**: easily aggregate, **analyse**, log, serialize to db, etc.\n- **Tiny**, flexible API: [`p`](https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte#p), [`profiled`](https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte#profiled), [`profile`](https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte#profile).\n- Full support for **thread-local** and dynamic (**multi-threaded**) profiling.\n- Rich [filtering](https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte#help:filters): **conditional profiling** by namespace, id pattern, level, level by namespace pattern, etc.\n- Rich a/sync [handling](https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte#help:handler-dispatch-options): with sampling, rate limiting, back-pressure monitoring, etc.\n- Includes handlers for [Telemere](https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte.telemere#handler:telemere), [Timbre](https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte.timbre#handler:timbre), and [consoles](https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte#handler:console) (`*out*`, etc.).\n\n## Quick example\n\nUsing Tufte v3:\n\n```clojure\n(require '[taoensso.tufte :as tufte])\n\n;; Send `profile` signals to console\n(tufte/add-handler! :my-console-handler (tufte/handler:console))\n\n;;; Define a couple dummy fns to simulate doing some expensive work\n(defn get-x [] (Thread/sleep 500)             \"x val\")\n(defn get-y [] (Thread/sleep (rand-int 1000)) \"y val\")\n\n;; Let's check how these fns perform:\n(tufte/profile   ; Profile any `p` forms called during body execution\n  {:level :info} ; Rich set of filtering options available\n  (dotimes [_ 5]\n    (tufte/p :get-x (get-x))\n    (tufte/p :get-y (get-y))))\n\n;; The following will be printed to *out*:\n;; 2025-04-18T11:23:08.820786Z INFO MyHost readme-examples[15,1] Tufte pstats\n;; pId           nCalls        Min      50% ≤      90% ≤      95% ≤      99% ≤        Max       Mean   MAD      Clock  Total\n;;\n;; :get-y             5      238ms      501ms      981ms      981ms      981ms      981ms      618ms  ±42%      3.09s    55%\n;; :get-x             5      501ms      502ms      505ms      505ms      505ms      505ms      503ms   ±0%      2.51s    45%\n;;\n;; Accounted                                                                                                    5.60s   100%\n;; Clock                                                                                                        5.60s   100%\n```\n\n## Documentation\n\n- [Wiki][GitHub wiki] (getting started, usage, etc.)\n- API reference via [cljdoc][cljdoc]\n- Support via [Slack channel][] or [GitHub issues][]\n\n## Funding\n\nYou can [help support][sponsor] continued work on this project, thank you!! 🙏\n\n## License\n\nCopyright \u0026copy; 2016-2025 [Peter Taoussanis][].  \nLicensed under [EPL 1.0](LICENSE.txt) (same as Clojure).\n\n\u003c!-- Common --\u003e\n\n[GitHub releases]: ../../releases\n[GitHub issues]:   ../../issues\n[GitHub wiki]:     ../../wiki\n[Slack channel]: https://www.taoensso.com/tufte/slack\n\n[Peter Taoussanis]: https://www.taoensso.com\n[sponsor]:          https://www.taoensso.com/sponsor\n\n\u003c!-- Project --\u003e\n\n[cljdoc]: https://cljdoc.org/d/com.taoensso/tufte/CURRENT/api/taoensso.tufte\n\n[Clojars SVG]: https://img.shields.io/clojars/v/com.taoensso/tufte.svg\n[Clojars URL]: https://clojars.org/com.taoensso/tufte\n\n[Clj tests SVG]:  https://github.com/taoensso/tufte/actions/workflows/clj-tests.yml/badge.svg\n[Clj tests URL]:  https://github.com/taoensso/tufte/actions/workflows/clj-tests.yml\n[Cljs tests SVG]:  https://github.com/taoensso/tufte/actions/workflows/cljs-tests.yml/badge.svg\n[Cljs tests URL]:  https://github.com/taoensso/tufte/actions/workflows/cljs-tests.yml\n[Graal tests SVG]: https://github.com/taoensso/tufte/actions/workflows/graal-tests.yml/badge.svg\n[Graal tests URL]: https://github.com/taoensso/tufte/actions/workflows/graal-tests.yml\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaoensso%2Ftufte","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaoensso%2Ftufte","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaoensso%2Ftufte/lists"}