{"id":15017937,"url":"https://github.com/taoensso/telemere","last_synced_at":"2025-05-15T10:06:09.530Z","repository":{"id":191155412,"uuid":"684033142","full_name":"taoensso/telemere","owner":"taoensso","description":"Structured logs and telemetry for Clojure/Script","archived":false,"fork":false,"pushed_at":"2025-05-13T17:37:35.000Z","size":2233,"stargazers_count":243,"open_issues_count":4,"forks_count":8,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-05-13T18:43:12.107Z","etag":null,"topics":["clojure","clojurescript","epl","instrumentation","logging","metrics","monitoring","observability","open-telemetry","opentelemetry","taoensso","telemetry","tracing"],"latest_commit_sha":null,"homepage":"https://www.taoensso.com/telemere","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":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"ptaoussanis","custom":"https://www.taoensso.com/clojure"}},"created_at":"2023-08-28T10:06:36.000Z","updated_at":"2025-05-13T17:37:38.000Z","dependencies_parsed_at":null,"dependency_job_id":"e0a9ef50-c475-4336-8b19-a97f10ffd97b","html_url":"https://github.com/taoensso/telemere","commit_stats":{"total_commits":268,"total_committers":2,"mean_commits":134.0,"dds":0.003731343283582045,"last_synced_commit":"f219d4813d8f8a47988a622b5d18976c688d8abf"},"previous_names":["taoensso/telemere"],"tags_count":40,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftelemere","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftelemere/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftelemere/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoensso%2Ftelemere/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taoensso","download_url":"https://codeload.github.com/taoensso/telemere/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254319718,"owners_count":22051072,"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":["clojure","clojurescript","epl","instrumentation","logging","metrics","monitoring","observability","open-telemetry","opentelemetry","taoensso","telemetry","tracing"],"created_at":"2024-09-24T19:51:13.426Z","updated_at":"2025-05-15T10:06:09.490Z","avatar_url":"https://github.com/taoensso.png","language":"Clojure","funding_links":["https://github.com/sponsors/ptaoussanis","https://www.taoensso.com/clojure"],"categories":["日志库"],"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# \u003cimg src=\"https://raw.githubusercontent.com/taoensso/telemere/master/imgs/telemere-logo.svg\" alt=\"Telemere logo\" width=\"360\"/\u003e\n\n### Structured logs and telemetry for Clojure/Script\n\n**Telemere** is a **pure Clojure/Script library** that offers an elegant and simple **unified API** to cover:\n\n- **Traditional logging** (string messages)\n- **Structured logging** (rich Clojure data types and structures)\n- **Events** (named thing happened, with optional data)\n- **Tracing** (nested flow tracking, with optional data)\n- Basic **performance monitoring** (nested form runtimes)\n- Any combination of the above\n\nIt's small, super fast, easy to learn, easy to use, and **absurdly flexible**.\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\nTogether these help enable Clojure/Script systems that are **robust**, **fast**, and **easily debugged**.\n\nSee [here](../../wiki/1-Getting-started) for **full introduction** (concepts, terminology, getting started).\n\n## Latest release/s\n\n- `2025-04-30` `v1.0.0`: [release info](../../releases/tag/v1.0.0)\n\n[![Main tests][Main tests SVG]][Main tests URL]\n[![Graal tests][Graal tests SVG]][Graal tests URL]\n\n\u003c!--See [here][GitHub releases] for earlier releases.--\u003e\n\n## Next-gen observability\n\nA key hurdle in building **observable systems** is that it's often inconvenient and costly to get out the kind of **detailed info** that we need when debugging.\n\nTelemere's strategy to address this is to:\n\n1. Provide **lean, low-fuss syntax** to let you conveniently convey program state.\n2. Use the unique power of **Lisp macros** to let you **dynamically filter costs as you filter signals** (pay only for what you need, when you need it).\n3. For those signals that *do* pass filtering: move costs from the callsite to a/sync handlers with explicit [threading and back-pressure semantics](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:handler-dispatch-options) and  [performance monitoring](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#get-handlers-stats).\n\nThe effect is more than impressive micro-benchmarks. This approach enables a fundamental (qualitative) change in one's approach to observability.\n\nIt enables you to write code that is **information-verbose by default**.\n\n## Quick examples\n\n\u003e (Or see [examples.cljc](https://github.com/taoensso/telemere/blob/master/examples.cljc) for REPL-ready snippets)\n\n\u003cdetails open\u003e\u003csummary\u003eCreate signals\u003c/summary\u003e\u003cbr/\u003e\n\n```clojure\n(require '[taoensso.telemere :as t])\n\n;; (Just works / no config necessary for typical use cases)\n\n;; Without structured data\n(t/log! :info \"Hello world!\") ; %\u003e Basic log   signal (has message)\n(t/event! ::my-id :debug)     ; %\u003e Basic event signal (just id)\n\n;; With structured data\n(t/log! {:level :info, :data {...}} \"Hello again!\")\n(t/event! ::my-id {:level :debug, :data {...}})\n\n;; Trace (can interop with OpenTelemetry)\n;; Tracks form runtime, return value, and (nested) parent tree\n(t/trace! {:id ::my-id :data {...}}\n  (do-some-work))\n\n;; Check resulting signal content for debug/tests\n(t/with-signal (t/event! ::my-id)) ; =\u003e {:keys [ns level id data msg_ ...]}\n\n;; Getting fancy (all costs are conditional!)\n(t/log!\n  {:level    :debug\n   :sample   0.75 ; 75% sampling (noop 25% of the time)\n   :when     (my-conditional)\n   :limit    {\"1 per sec\" [1  1000]\n              \"5 per min\" [5 60000]} ; Rate limit\n   :limit-by my-user-ip-address      ; Rate limit scope\n\n   :do (inc-my-metric!)\n   :let\n   [diagnostics (my-expensive-diagnostics)\n    formatted   (my-expensive-format diagnostics)]\n\n   :data\n   {:diagnostics diagnostics\n    :formatted   formatted\n    :local-state *my-dynamic-context*}}\n\n  ;; Message string or vector to join as string\n  [\"Something interesting happened!\" formatted])\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eFilter signals\u003c/summary\u003e\u003cbr/\u003e\n\n```clojure\n;; Set minimum level\n(t/set-min-level!       :warn) ; For all    signals\n(t/set-min-level! :log :debug) ; For `log!` signals only\n\n;; Set id and namespace filters\n(t/set-id-filter! {:allow #{::my-particular-id \"my-app/*\"}})\n(t/set-ns-filter! {:disallow \"taoensso.*\" :allow \"taoensso.sente.*\"})\n\n;; SLF4J signals will have their `:ns` key set to the logger's name\n;; (typically a source class)\n(t/set-ns-filter! {:disallow \"com.noisy.java.package.*\"})\n\n;; Set minimum level for `event!` signals for particular ns pattern\n(t/set-min-level! :event \"taoensso.sente.*\" :warn)\n\n;; Use transforms (xfns) to filter and/or arbitrarily modify signals\n;; by signal data/content/etc.\n\n(t/set-xfn!\n  (fn [signal]\n    (if (-\u003e signal :data :skip-me?)\n      nil ; Filter signal (don't handle)\n      (assoc signal :transformed? true))))\n\n(t/with-signal (t/event! ::my-id {:data {:skip-me? true}}))  ; =\u003e nil\n(t/with-signal (t/event! ::my-id {:data {:skip-me? false}})) ; =\u003e {...}\n\n;; See `t/help:filters` docstring for more filtering options\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eAdd handlers\u003c/summary\u003e\u003cbr/\u003e\n\n```clojure\n;; Add your own signal handler\n(t/add-handler! :my-handler\n  (fn\n    ([signal] (println signal))\n    ([] (println \"Handler has shut down\"))))\n\n;; Use `add-handler!` to set handler-level filtering and back-pressure\n(t/add-handler! :my-handler\n  (fn\n    ([signal] (println signal))\n    ([] (println \"Handler has shut down\")))\n\n  {:async {:mode :dropping, :buffer-size 1024, :n-threads 1}\n   :priority  100\n   :sample    0.5\n   :min-level :info\n   :ns-filter {:disallow \"taoensso.*\"}\n   :limit     {\"1 per sec\" [1 1000]}\n   ;; See `t/help:handler-dispatch-options` for more\n   })\n\n;; See current handlers\n(t/get-handlers) ; =\u003e {\u003chandler-id\u003e {:keys [handler-fn handler-stats_ dispatch-opts]}}\n\n;; Add console handler to print signals as human-readable text\n(t/add-handler! :my-handler\n  (t/handler:console\n    {:output-fn (t/format-signal-fn {})}))\n\n;; Add console handler to print signals as edn\n(t/add-handler! :my-handler\n  (t/handler:console\n    {:output-fn (t/pr-signal-fn {:pr-fn :edn})}))\n\n;; Add console handler to print signals as JSON\n;; Ref.  \u003chttps://github.com/metosin/jsonista\u003e (or any alt JSON lib)\n#?(:clj (require '[jsonista.core :as jsonista]))\n(t/add-handler! :my-handler\n  (t/handler:console\n    {:output-fn\n     #?(:cljs :json ; Use js/JSON.stringify\n        :clj   jsonista/write-value-as-string)}))\n```\n\n\u003c/details\u003e\n\n## Why Telemere?\n\n### Ergonomics\n\n- Elegant, lightweight API that's **easy to use**, **easy to configure**, and **deeply flexible**.\n- **Sensible defaults** to make getting started **fast and easy**.\n- Extensive **beginner-oriented** [documentation][GitHub wiki], [docstrings](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere), and error messages.\n\n### Interop\n\n- 1st-class **out-the-box interop** with [tools.logging](../../wiki/3-Config#toolslogging), [Java logging via SLF4J v2](../../wiki/3-Config#java-logging), [OpenTelemetry](../../wiki/3-Config#opentelemetry), and [Tufte](../../wiki/3-Config#tufte).\n- Included [shim](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere.timbre) for easy/gradual [migration from Timbre](../../wiki/5-Migrating).\n- Extensive set of [handlers](../../wiki/4-Handlers#included-handlers) included out-the-box.\n\n### Scaling\n\n- Hyper-optimized and **blazing fast**, see [performance](#performance).\n- An API that **scales comfortably** from the smallest disposable code, to the most massive and complex real-world production environments.\n- Auto [handler stats](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#get-handlers-stats) for debugging performance and other issues at scale.\n\n### Flexibility\n\n- Config via plain **Clojure vals and fns** for easy customization, composition, and REPL debugging.\n- Unmatched [environmental config](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:environmental-config) support: JVM properties, environment variables, or classpath resources. Per platform, or cross-platform.\n- Unmatched [filtering](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:filters) support: by namespace, id pattern, level, level by namespace pattern, etc. At runtime and compile-time.\n- Fully [configurable](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:handler-dispatch-options) **a/sync dispatch support**: blocking, dropping, sliding, etc.\n- Turn-key **sampling**, **rate limiting**, and **back-pressure monitoring** with sensible defaults.\n\n## Comparisons\n\n- Telemere [compared](../../wiki/5-Migrating#from-timbre) to [Timbre](https://www.taoensso.com/timbre) (Telemere's predecessor)\n- Telemere [compared](../../wiki/6-FAQ#how-does-telemere-compare-to-mulog) to [Mulog](https://github.com/BrunoBonacci/mulog) (structured micro-logging library)\n\n## Videos\n\n### Lightning intro (7 mins):\n\n\u003ca href=\"https://www.youtube.com/watch?v=lOaZ0SgPVu4\" target=\"_blank\"\u003e\n \u003cimg src=\"https://img.youtube.com/vi/lOaZ0SgPVu4/maxresdefault.jpg\" alt=\"Telemere lightning intro\" width=\"480\" border=\"0\" /\u003e\n\u003c/a\u003e\n\n### REPL demo (24 mins):\n\n\u003ca href=\"https://www.youtube.com/watch?v=-L9irDG8ysM\" target=\"_blank\"\u003e\n \u003cimg src=\"https://img.youtube.com/vi/-L9irDG8ysM/maxresdefault.jpg\" alt=\"Telemere demo video\" width=\"480\" border=\"0\" /\u003e\n\u003c/a\u003e\n\n## API overview\n\nSee relevant docstrings (links below) for usage info-\n\n### Creating signals\n\n| Name                                                                                                        | Kind       | Args             | Returns                      |\n| :---------------------------------------------------------------------------------------------------------- | :--------- | :--------------- | :--------------------------- |\n| [`log!`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#log!)                     | `:log`     | `?level` + `msg` | nil                          |\n| [`event!`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#event!)                 | `:event`   | `id` + `?level`  | nil                          |\n| [`trace!`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#trace!)                 | `:trace`   | `?id` + `run`    | Form result                  |\n| [`spy!`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#spy!)                     | `:spy`     | `?level` + `run` | Form result                  |\n| [`error!`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#error!)                 | `:error`   | `?id` + `error`  | Given error                  |\n| [`catch-\u003eerror!`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#catch-%3Eerror!) | `:error`   | `?id`            | Form value or given fallback |\n| [`signal!`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#signal!)               | `:generic` | `opts`           | Depends on opts              |\n\n### Internal help\n\nDetailed help is available without leaving your IDE:\n\n| Var                                                                                                                                       | Help with                                                                |\n| :---------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- |\n| [`help:signal-creators`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:signal-creators)                   | Creating signals                                                         |\n| [`help:signal-options`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:signal-options)                     | Options when creating signals                                            |\n| [`help:signal-content`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:signal-content)                     | Signal content (map given to transforms/handlers)                        |\n| [`help:filters`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:filters)                                   | Signal filtering and transformation                                      |\n| [`help:handlers`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:handlers)                                 | Signal handler management                                                |\n| [`help:handler-dispatch-options`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:handler-dispatch-options) | Signal handler dispatch options                                          |\n| [`help:environmental-config`](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:environmental-config)         | Config via JVM properties, environment variables, or classpath resources |\n\n## Performance\n\nTelemere is **highly optimized** and offers great performance at any scale, handling up to **4.2 million filtered signals/sec** on a 2020 Macbook Pro M1.\n\nSignal call benchmarks (per thread):\n\n| Compile-time filtering? | Runtime filtering? | Profile? | Trace? | nsecs / call |\n| :---------------------: | :----------------: | :------: | :----: | -----------: |\n|        ✓ (elide)        |         -          |    -     |   -    |            0 |\n|            -            |         ✓          |    -     |   -    |          350 |\n|            -            |         ✓          |    ✓     |   -    |          450 |\n|            -            |         ✓          |    ✓     |   ✓    |         1000 |\n\n- Nanoseconds per signal call ~ **milliseconds per 1e6 calls**\n- Times exclude [handler runtime](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#get-handlers-stats) (which depends on handler/s, is usually async)\n- Benched on a 2020 Macbook Pro M1, running Clojure v1.12 and OpenJDK v22\n\n### Performance philosophy\n\nTelemere is optimized for *real-world* performance. This means **prioritizing flexibility** and realistic usage over synthetic micro-benchmarks.\n\nLarge applications can produce absolute *heaps* of data, not all equally valuable. Quickly processing infinite streams of unmanageable junk is an anti-pattern. As scale and complexity increase, it becomes more important to **strategically plan** what data to collect, when, in what quantities, and how to manage it.\n\nTelemere is designed to help with all that. It offers [rich data](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:signal-content) and unmatched [filtering](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:filters) support - including per-signal and per-handler **sampling** and **rate limiting**, and zero cost compile-time filtering.\n\nUse these to ensure that you're not capturing useless/low-value/high-noise information in production! With appropriate planning, Telemere is designed to scale to systems of any size and complexity. \n\nSee [here](../../wiki/7-Tips) for detailed tips on real-world usage.\n\n## Included handlers\n\nSee ✅ links below for **features and usage**,  \nSee ❤️ links below to **vote on future handlers**:\n\n| Target (↓)                                     |                                                         Clj                                                         |                                               Cljs                                                |\n| :--------------------------------------------- | :-----------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------: |\n| [Apache Kafka](https://kafka.apache.org/)      |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                                                 -                                                 |\n| [AWS Kinesis](https://aws.amazon.com/kinesis/) |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                                                 -                                                 |\n| Console                                        |            [✅](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#handler:console)            |   [✅](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#handler:console)   |\n| Console (raw)                                  |                                                          -                                                          | [✅](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#handler:console-raw) |\n| [Datadog](https://www.datadoghq.com/)          |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                        [❤️](https://github.com/taoensso/roadmap/issues/12)                        |\n| Email                                          |         [✅](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere.postal#handler:postal)         |                                                 -                                                 |\n| [Graylog](https://graylog.org/)                |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                                                 -                                                 |\n| [Jaeger](https://www.jaegertracing.io/)        |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                                                 -                                                 |\n| [Logstash](https://www.elastic.co/logstash)    |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                                                 -                                                 |\n| [OpenTelemetry](https://opentelemetry.io/)     | [✅](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere.open-telemetry#handler:open-telemetry) |                        [❤️](https://github.com/taoensso/roadmap/issues/12)                        |\n| [Redis](https://redis.io/)                     |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                                                 -                                                 |\n| SQL                                            |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                                                 -                                                 |\n| [Slack](https://slack.com/)                    |          [✅](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere.slack#handler:slack)          |                                                 -                                                 |\n| TCP socket                                     |      [✅](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere.sockets#handler:tcp-socket)       |                                                 -                                                 |\n| UDP socket                                     |      [✅](https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere.sockets#handler:udp-socket)       |                                                 -                                                 |\n| [Zipkin](https://zipkin.io/)                   |                                 [❤️](https://github.com/taoensso/roadmap/issues/12)                                 |                                                 -                                                 |\n\nYou can also easily [write your own handlers](../../wiki/4-Handlers#writing-handlers).\n\n## Community\n\nMy plan for Telemere is to offer a **stable core of limited scope**, then to focus on making it as easy for the **community** to write additional stuff like handlers, transforms, and utils.\n\nSee [here](../../wiki/8-Community) for community resources.\n\n## Documentation\n\n- [Wiki][GitHub wiki] (getting started, usage, etc.)\n- API reference via [cljdoc][cljdoc]\n- Extensive [internal help](#internal-help) (no need to leave your IDE)\n- Support via [Slack channel][] or [GitHub issues][]\n- [General observability tips](../../wiki/7-Tips) (advice on building and maintaining observable Clojure/Script systems, and getting the most out of Telemere)\n\n## Funding\n\nYou can [help support][sponsor] continued work on this project, thank you!! 🙏\n\n## License\n\nCopyright \u0026copy; 2023-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/telemere/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/telemere/CURRENT/api/taoensso.telemere\n\n[Clojars SVG]: https://img.shields.io/clojars/v/com.taoensso/telemere.svg\n[Clojars URL]: https://clojars.org/com.taoensso/telemere\n\n[Main tests SVG]:  https://github.com/taoensso/telemere/actions/workflows/main-tests.yml/badge.svg\n[Main tests URL]:  https://github.com/taoensso/telemere/actions/workflows/main-tests.yml\n[Graal tests SVG]: https://github.com/taoensso/telemere/actions/workflows/graal-tests.yml/badge.svg\n[Graal tests URL]: https://github.com/taoensso/telemere/actions/workflows/graal-tests.yml\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaoensso%2Ftelemere","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaoensso%2Ftelemere","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaoensso%2Ftelemere/lists"}