mirror of
https://github.com/taoensso/telemere.git
synced 2026-02-22 18:19:09 +00:00
Compare commits
4 commits
e95937401d
...
a6fc4adf6a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6fc4adf6a | ||
|
|
6155713fde | ||
|
|
a883df3c41 | ||
|
|
e6ce33dd4e |
4 changed files with 72 additions and 64 deletions
|
|
@ -38,7 +38,10 @@
|
|||
(def enabled:otel-tracing?
|
||||
"Documented at `taoensso.telemere/otel-tracing?`."
|
||||
(enc/get-env {:as :bool, :default present:otel?}
|
||||
:taoensso.telemere/otel-tracing<.platform>))))
|
||||
:taoensso.telemere/otel-tracing<.platform>))
|
||||
|
||||
(def enabled:incl-host-info? "Include `:host` info in signals by default?" (enc/get-env {:as :bool, :default true} :taoensso.telemere/incl-host-info))
|
||||
(def enabled:incl-thread-info? "Include `:thread` info in signals by default?" (enc/get-env {:as :bool, :default true} :taoensso.telemere/incl-thread-info))))
|
||||
|
||||
(def uid-kind
|
||||
"Documented at `taoensso.telemere/*uid-fn*`."
|
||||
|
|
@ -573,9 +576,9 @@
|
|||
(str "Signal needs compile-time `:trace?` value at "
|
||||
(sigs/format-callsite ns-form coords))))
|
||||
|
||||
host-form (auto-> (get opts :host :auto) (when clj? `(enc/host-info)))
|
||||
thread-form (auto-> (get opts :thread :auto) (when clj? `(enc/thread-info)))
|
||||
inst-form (auto-> (get opts :inst :auto) `(enc/now-inst*))
|
||||
host-form (auto-> (get opts :host :auto) (when (and clj? enabled:incl-host-info?) `(enc/host-info)))
|
||||
thread-form (auto-> (get opts :thread :auto) (when (and clj? enabled:incl-thread-info?) `(enc/thread-info)))
|
||||
inst-form (auto-> (get opts :inst :auto) `(enc/now-inst*))
|
||||
|
||||
parent-form (get opts :parent `*trace-parent*)
|
||||
root-form0 (get opts :root `*trace-root*)
|
||||
|
|
@ -609,7 +612,7 @@
|
|||
(dissoc opts
|
||||
:elidable? :coords :inst :uid :xfn :xfn+ :kvs+,
|
||||
:sample :ns :kind :id :level :filter :when #_:limit #_:limit-by,
|
||||
:ctx :ctx+ :parent #_:trace?, :do :let :data :msg :error,
|
||||
:ctx :ctx+ :parent :trace?, :do :let :data :msg :error,
|
||||
:run :run-form :run-val, :elide? :allow? #_:callsite-id,
|
||||
:host :thread :otel/context))]
|
||||
|
||||
|
|
@ -635,10 +638,10 @@
|
|||
(let [record-form
|
||||
(let [clause [(if run-form? :run :no-run) (if clj? :clj :cljs)]]
|
||||
(case clause
|
||||
[:run :clj ] `(Signal. 1 ~'__inst ~'__uid, ~'__ns ~coords ~host-form ~'__thread ~'__otel-context1, ~sample-form, ~'__kind ~'__id ~'__level, ~ctx-form ~parent-form ~'__root1, ~data-form ~kvs-form ~'_msg_, ~'_run-err '~show-run-form ~show-run-val ~'_end-inst ~'_run-nsecs)
|
||||
[:run :cljs] `(Signal. 1 ~'__inst ~'__uid, ~'__ns ~coords ~sample-form, ~'__kind ~'__id ~'__level, ~ctx-form ~parent-form ~'__root1, ~data-form ~kvs-form ~'_msg_, ~'_run-err '~show-run-form ~show-run-val ~'_end-inst ~'_run-nsecs)
|
||||
[:no-run :clj ] `(Signal. 1 ~'__inst ~'__uid, ~'__ns ~coords ~host-form ~'__thread ~'__otel-context1, ~sample-form, ~'__kind ~'__id ~'__level, ~ctx-form ~parent-form ~'__root1, ~data-form ~kvs-form ~msg-form, ~error-form nil nil nil nil)
|
||||
[:no-run :cljs] `(Signal. 1 ~'__inst ~'__uid, ~'__ns ~coords ~sample-form, ~'__kind ~'__id ~'__level, ~ctx-form ~parent-form ~'__root1, ~data-form ~kvs-form ~msg-form, ~error-form nil nil nil nil)
|
||||
[:run :clj ] `(Signal. 1 ~'__inst ~'__uid, ~'__ns ~coords ~host-form ~'__thread ~'__otel-context, ~sample-form, ~'__kind ~'__id ~'__level, ~ctx-form ~parent-form ~'__root1, ~data-form ~kvs-form ~'_msg_, ~'_run-err '~show-run-form ~show-run-val ~'_end-inst ~'_run-nsecs)
|
||||
[:run :cljs] `(Signal. 1 ~'__inst ~'__uid, ~'__ns ~coords ~sample-form, ~'__kind ~'__id ~'__level, ~ctx-form ~parent-form ~'__root1, ~data-form ~kvs-form ~'_msg_, ~'_run-err '~show-run-form ~show-run-val ~'_end-inst ~'_run-nsecs)
|
||||
[:no-run :clj ] `(Signal. 1 ~'__inst ~'__uid, ~'__ns ~coords ~host-form ~'__thread ~'__otel-context, ~sample-form, ~'__kind ~'__id ~'__level, ~ctx-form ~parent-form ~'__root1, ~data-form ~kvs-form ~msg-form, ~error-form nil nil nil nil)
|
||||
[:no-run :cljs] `(Signal. 1 ~'__inst ~'__uid, ~'__ns ~coords ~sample-form, ~'__kind ~'__id ~'__level, ~ctx-form ~parent-form ~'__root1, ~data-form ~kvs-form ~msg-form, ~error-form nil nil nil nil)
|
||||
(truss/ex-info!
|
||||
(str "Unexpected signal constructor args at "
|
||||
(sigs/format-callsite ns-form coords)))))
|
||||
|
|
@ -679,12 +682,26 @@
|
|||
run-fn-form (when run-form? `(fn [] ~run-form))
|
||||
run-form* (when run-form? `(~'__run-fn-form))
|
||||
|
||||
into-let-form
|
||||
binds-form-base
|
||||
`[~'__inst ~inst-form
|
||||
~'__thread ~thread-form
|
||||
~'__root0 ~root-form0 ; ?{:keys [id uid]}
|
||||
|
||||
~'__otel-context
|
||||
~(when (and clj? enabled:otel-tracing?)
|
||||
(if run-form?
|
||||
`(otel-context+span ~'__id ~'__inst ~(get opts :otel/context `(otel-context)) ~(get opts :otel/span-kind))
|
||||
(do (get opts :otel/context `(otel-context)))))
|
||||
|
||||
~'__uid
|
||||
~(if (and clj? enabled:otel-tracing? trace?)
|
||||
(auto-> uid-form `(or (otel-span-id ~'__otel-context) (com.taoensso.encore.Ids/genHexId16)))
|
||||
(auto-> uid-form `(taoensso.telemere/*uid-fn* (if ~'__root0 false true))))]
|
||||
|
||||
binds-form-more
|
||||
(enc/cond!
|
||||
(not trace?) ; Don't trace
|
||||
`[~'__otel-context1 nil
|
||||
~'__uid ~(auto-> uid-form `(taoensso.telemere/*uid-fn* (if ~'__root0 false true)))
|
||||
~'__root1 ~'__root0 ; Retain, but don't establish
|
||||
(not trace?) ; Non-tracing signal
|
||||
`[~'__root1 ~'__root0 ; Retain, but don't establish
|
||||
~'__run-result
|
||||
~(when run-form?
|
||||
`(let [t0# (enc/now-nano*)]
|
||||
|
|
@ -694,9 +711,7 @@
|
|||
|
||||
;; Trace without OpenTelemetry
|
||||
(or cljs? (not enabled:otel-tracing?))
|
||||
`[~'__otel-context1 nil
|
||||
~'__uid ~(auto-> uid-form `(taoensso.telemere/*uid-fn* (if ~'__root0 false true)))
|
||||
~'__root1 (or ~'__root0 ~(when trace? `{:id ~'__id, :uid ~'__uid}))
|
||||
`[~'__root1 (or ~'__root0 ~(when trace? `{:id ~'__id, :uid ~'__uid}))
|
||||
~'__run-result
|
||||
~(when run-form?
|
||||
`(binding [*trace-root* ~'__root1
|
||||
|
|
@ -708,20 +723,17 @@
|
|||
|
||||
;; Trace with OpenTelemetry
|
||||
(and clj? enabled:otel-tracing?)
|
||||
`[~'__otel-context0 ~(get opts :otel/context `(otel-context)) ; Context
|
||||
~'__otel-context1 ~(if run-form? `(otel-context+span ~'__id ~'__inst ~'__otel-context0 ~(get opts :otel/span-kind)) ~'__otel-context0)
|
||||
~'__uid ~(auto-> uid-form `(or (otel-span-id ~'__otel-context1) (com.taoensso.encore.Ids/genHexId16)))
|
||||
~'__root1
|
||||
`[~'__root1
|
||||
(or ~'__root0
|
||||
~(when trace?
|
||||
`{:id ~'__id, :uid (or (otel-trace-id ~'__otel-context1) (com.taoensso.encore.Ids/genHexId32))}))
|
||||
`{:id ~'__id, :uid (or (otel-trace-id ~'__otel-context) (com.taoensso.encore.Ids/genHexId32))}))
|
||||
|
||||
~'__run-result
|
||||
~(when run-form?
|
||||
`(binding [*otel-context* ~'__otel-context1
|
||||
`(binding [*otel-context* ~'__otel-context
|
||||
*trace-root* ~'__root1
|
||||
*trace-parent* {:id ~'__id, :uid ~'__uid}]
|
||||
(let [otel-scope# (.makeCurrent ~'__otel-context1)
|
||||
(let [otel-scope# (.makeCurrent ~'__otel-context)
|
||||
t0# (enc/now-nano*)]
|
||||
(truss/try*
|
||||
(do (RunResult. ~run-form* nil (- (enc/now-nano*) t0#)))
|
||||
|
|
@ -738,11 +750,8 @@
|
|||
|
||||
(enc/if-not ~allow?
|
||||
~run-form*
|
||||
(let [~'__inst ~inst-form
|
||||
~'__thread ~thread-form
|
||||
~'__root0 ~root-form0 ; ?{:keys [id uid]}
|
||||
|
||||
~@into-let-form ; Inject conditional bindings
|
||||
(let [~@binds-form-base
|
||||
~@binds-form-more
|
||||
signal# ~signal-delay-form]
|
||||
|
||||
(dispatch-signal!
|
||||
|
|
|
|||
|
|
@ -219,15 +219,15 @@
|
|||
|
||||
(if (or common-attrs trace-attrs)
|
||||
(let [ab (Attributes/builder)]
|
||||
(when-let [ns (get signal :ns)] (.put ab "ns" (str ns)))
|
||||
(when-let [line (get signal :line)] (.put ab "line" (long line)))
|
||||
(when-let [ns (get signal :ns)] (.put ab "ns" (str ns)))
|
||||
(when-let [line (enc/get-in* signal [:coords 0])] (.put ab "line" (long line)))
|
||||
(when-let [attrs common-attrs] (put-attrs! ab attrs))
|
||||
(when-let [attrs trace-attrs] (put-attrs! ab attrs))
|
||||
(.build ab))
|
||||
|
||||
;; Common case
|
||||
(when-let [ns (get signal :ns)]
|
||||
(if-let [line (get signal :line)]
|
||||
(when-let [ns (get signal :ns)]
|
||||
(if-let [line (enc/get-in* signal [:coords 0])]
|
||||
(Attributes/of ak-ns ns, ak-line (long line))
|
||||
(Attributes/of ak-ns ns)))))))
|
||||
|
||||
|
|
|
|||
|
|
@ -727,7 +727,7 @@
|
|||
(is (sm? (with-sig (-> (.atWarn sl) (.log "Hello"))) {:level :warn, :ns "my.class", :kind :slf4j, :msg_ "Hello", :inst enc/inst?}) "Fluent API: warn basics")])
|
||||
|
||||
(testing "Message formatting"
|
||||
(let [msgp "x={},y={}", expected {:msg_ "x=1,y=2", :data {:slf4j/args ["1" "2"]}}]
|
||||
(let [msgp "x={},y={}", expected {:msg_ "x=1,y=2", :slf4j/args (fn [objs] (= (vec objs) ["1" "2"]))}]
|
||||
[(is (sm? (with-sig (.info sl msgp "1" "2")) expected) "Legacy API: formatted message, raw args")
|
||||
(is (sm? (with-sig (-> (.atInfo sl) (.setMessage msgp) (.addArgument "1") (.addArgument "2") (.log))) expected) "Fluent API: formatted message, raw args")]))
|
||||
|
||||
|
|
@ -738,8 +738,8 @@
|
|||
m2 (#'slf4j/est-marker! "M2")
|
||||
cm (#'slf4j/est-marker! "Compound" "M1" "M2")]
|
||||
|
||||
[(is (sm? (with-sig (.info sl cm "Hello")) {:data {:slf4j/marker-names #{"Compound" "M1" "M2"}}}) "Legacy API: markers")
|
||||
(is (sm? (with-sig (-> (.atInfo sl) (.addMarker m1) (.addMarker cm) (.log))) {:data {:slf4j/marker-names #{"Compound" "M1" "M2"}}}) "Fluent API: markers")]))
|
||||
[(is (sm? (with-sig (.info sl cm "Hello")) {:slf4j/markers #{"Compound" "M1" "M2"}}) "Legacy API: markers")
|
||||
(is (sm? (with-sig (-> (.atInfo sl) (.addMarker m1) (.addMarker cm) (.log))) {:slf4j/markers #{"Compound" "M1" "M2"}}) "Fluent API: markers")]))
|
||||
|
||||
(testing "Errors"
|
||||
[(is (sm? (with-sig (.warn sl "An error" ^Throwable ex1)) {:level :warn, :error ex1}) "Legacy API: errors")
|
||||
|
|
|
|||
|
|
@ -63,13 +63,13 @@
|
|||
|
||||
(comment [(est-marker! "a1" "a2") (get-marker "a1") (= (get-marker "a1") (get-marker "a1"))])
|
||||
|
||||
(def ^:private marker-names
|
||||
(def ^:private get-marker-names
|
||||
"Returns #{<MarkerName>}. Cached => assumes markers NOT modified after creation."
|
||||
;; We use `BasicMarkerFactory` so:
|
||||
;; 1. Our markers are just labels (no other content besides their name).
|
||||
;; 2. Markers with the same name are identical (enabling caching).
|
||||
(enc/fmemoize
|
||||
(fn marker-names [marker-or-markers]
|
||||
(fn get-marker-names [marker-or-markers]
|
||||
(if (instance? org.slf4j.Marker marker-or-markers)
|
||||
|
||||
;; Single marker
|
||||
|
|
@ -79,15 +79,15 @@
|
|||
(if-not (.hasReferences m)
|
||||
acc
|
||||
(enc/reduce-iterator!
|
||||
(fn [acc ^org.slf4j.Marker in]
|
||||
(if-not (.hasReferences in)
|
||||
(conj acc (.getName in))
|
||||
(into acc (marker-names in))))
|
||||
(fn [acc ^org.slf4j.Marker in]
|
||||
(if-not (.hasReferences in)
|
||||
(conj acc (.getName in))
|
||||
(into acc (get-marker-names in))))
|
||||
acc (.iterator m))))
|
||||
|
||||
;; Vector of markers
|
||||
(reduce
|
||||
(fn [acc in] (into acc (marker-names in)))
|
||||
(fn [acc in] (into acc (get-marker-names in)))
|
||||
#{} (truss/have vector? marker-or-markers))))))
|
||||
|
||||
(comment
|
||||
|
|
@ -97,9 +97,9 @@
|
|||
ms [m1 m2]]
|
||||
|
||||
(enc/qb 1e6 ; [45.52 47.48 44.85]
|
||||
(marker-names m1)
|
||||
(marker-names cm)
|
||||
(marker-names ms))))
|
||||
(get-marker-names m1)
|
||||
(get-marker-names cm)
|
||||
(get-marker-names ms))))
|
||||
|
||||
;;;; Interop fns (called by `TelemereLogger`)
|
||||
|
||||
|
|
@ -132,11 +132,10 @@
|
|||
(org.slf4j.helpers.MessageFormatter/basicArrayFormat
|
||||
msg-pattern args))
|
||||
|
||||
:data
|
||||
(enc/assoc-some nil
|
||||
:slf4j/marker-names marker-names
|
||||
:slf4j/args (when args (vec args))
|
||||
:slf4j/kvs kvs)})
|
||||
:slf4j/args args ; Object[]
|
||||
:slf4j/markers marker-names ; Usu. used for routing, filtering, xfns, etc.
|
||||
:data (when kvs {:slf4j/kvs kvs})})
|
||||
|
||||
nil)
|
||||
|
||||
(defn- log!
|
||||
|
|
@ -144,24 +143,24 @@
|
|||
|
||||
;; Modern "fluent" API calls
|
||||
([logger-name ^org.slf4j.event.LoggingEvent event]
|
||||
(let [inst (or (when-let [ts (.getTimeStamp event)] (java.time.Instant/ofEpochMilli ts)) (enc/now-inst*))
|
||||
level (.getLevel event)
|
||||
error (.getThrowable event)
|
||||
msg-pattern (.getMessage event)
|
||||
args (when-let [args (.getArgumentArray event)] args)
|
||||
markers (when-let [markers (.getMarkers event)] (marker-names (vec markers)))
|
||||
kvs (when-let [kvps (.getKeyValuePairs event)]
|
||||
(reduce
|
||||
(fn [acc ^org.slf4j.event.KeyValuePair kvp]
|
||||
(assoc acc (.-key kvp) (.-value kvp)))
|
||||
nil kvps))]
|
||||
(let [inst (or (when-let [ts (.getTimeStamp event)] (java.time.Instant/ofEpochMilli ts)) (enc/now-inst*))
|
||||
level (.getLevel event)
|
||||
error (.getThrowable event)
|
||||
msg-pattern (.getMessage event)
|
||||
args (when-let [args (.getArgumentArray event)] args)
|
||||
marker-names (when-let [markers (.getMarkers event)] (get-marker-names (vec markers)))
|
||||
kvs (when-let [kvps (.getKeyValuePairs event)]
|
||||
(reduce
|
||||
(fn [acc ^org.slf4j.event.KeyValuePair kvp]
|
||||
(assoc acc (.-key kvp) (.-value kvp)))
|
||||
nil kvps))]
|
||||
|
||||
(when-debug (println [:slf4j/fluent-log-call (sig-level level) logger-name]))
|
||||
(normalized-log! logger-name level inst error msg-pattern args markers kvs)))
|
||||
(normalized-log! logger-name level inst error msg-pattern args marker-names kvs)))
|
||||
|
||||
;; Legacy API calls
|
||||
([logger-name ^org.slf4j.event.Level level error msg-pattern args marker]
|
||||
(let [marker-names (when marker (marker-names marker))]
|
||||
(let [marker-names (when marker (get-marker-names marker))]
|
||||
(when-debug (println [:slf4j/legacy-log-call (sig-level level) logger-name]))
|
||||
(normalized-log! logger-name level (enc/now-inst*) error msg-pattern args marker-names nil))))
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue