telemere/wiki/3-Config.md
2024-08-07 11:37:00 +02:00

5.2 KiB

See below for config by topic-

Filtering

A signal will be provided to a handler iff ALL of the following are true:

    1. Signal creation is allowed by signal filters:
    • a. Compile time: sample rate, kind, ns, id, level, when form, rate limit
    • b. Runtime: sample rate, kind, ns, id, level, when form, rate limit
    1. Signal handling is allowed by handler filters:
    • a. Compile time: not applicable
    • b. Runtime: sample rate, kind, ns, id, level, when fn, rate limit
    1. Signal middleware (fn [signal]) => ?modified-signal does not return nil
    1. Handler middleware (fn [signal]) => ?modified-signal does not return nil

See help:filters for more about filtering.

Signal handlers

See section 4-Handlers.

Interop

tools.logging

tools.logging can use Telemere as its logging implementation (backend).

To do this:

  1. Ensure that you have the tools.logging dependency, and
  2. Call tools-logging->telemere!, or set the relevant environmental config as described in its docstring.

Verify successful intake with check-intakes:

(check-intakes) ; =>
{:tools-logging {:sending->telemere? true, :telemere-receiving? true}}

Java logging

SLF4J can use Telemere as its logging backend.

To do this, ensure that you have the following dependencies:

[org.slf4j/slf4j-api          "x.y.z"] ; >= 2.0.0 only!
[com.taoensso/slf4j-telemere  "x.y.z"]

Telemere needs SLF4J API version 2 or newer. If you're seeing Failed to load class "org.slf4j.impl.StaticLoggerBinder" it could be that your project is importing the older v1 API, check with lein deps :tree or equivalent.

When com.taoensso/slf4j-telemere is on your classpath AND no other SLF4J backends are, SLF4J will direct all its logging calls to Telemere.

Verify successful intake with check-intakes:

(check-intakes) ; =>
{:slf4j {:sending->telemere? true, :telemere-receiving? true}}

For other (non-SLF4J) logging like Log4j, java.util.logging (JUL), and Apache Commons Logging (JCL), use an appropriate SLF4J bridge and the normal SLF4J config as above.

In this case logging will be forwarded:

  1. From Log4j/JUL/JCL/etc. to SLF4J, and
  2. From SLF4J to Telemere

System streams

The JVM's System/out and/or System/err streams can be set to flush to Telemere signals.

To do this, call streams->telemere!.

Note that Clojure's *out*, *err* are not necessarily automatically affected.

Verify successful intake with check-intakes:

(check-intakes) ; =>
{:system/out {:sending->telemere? true, :telemere-receiving? true}
 :system/err {:sending->telemere? true, :telemere-receiving? true}}

OpenTelemetry

Telemere can send signals as LogRecords to OpenTelemetry.

To do this:

  1. Ensure that you have the OpenTelemetry Java dependency.
  2. Use handler:open-telemetry-logger to create an appropriately configured handler, and register it with add-handler!.

Tufte

Tufte is a simple performance monitoring library for Clojure/Script by the author of Telemere.

Telemere can easily incorporate Tufte performance data in its signals, just like any other data:

(let [[_ perf-data] (tufte/profiled <opts> <form>)]
  (t/log! "Performance data" {:perf-data perf-data}))

Telemere and Tufte work great together:

  • Their functionality is complementary.
  • The upcoming Tufte v4 will share the same core as Telemere and offer an identical API for managing filters and handlers.

Truss

Truss is an assertions micro-library for Clojure/Script by the author of Telemere.

Telemere can easily incorporate Truss assertion failure information in its signals, just like any other (error) data.

The catch->error! signal creator can be particularly convenient for this:

(t/catch->error! <form-with-truss-assertion/s>)