mirror of
https://github.com/taoensso/telemere.git
synced 2026-02-16 08:15:15 +00:00
[new] OpenTelemetry handler: add :otel/context opt (undocumented)
This commit is contained in:
parent
ae7bb20ed0
commit
c62b8ab4af
1 changed files with 28 additions and 20 deletions
|
|
@ -11,6 +11,7 @@
|
||||||
[taoensso.telemere :as tel])
|
[taoensso.telemere :as tel])
|
||||||
|
|
||||||
(:import
|
(:import
|
||||||
|
[io.opentelemetry.context Context]
|
||||||
[io.opentelemetry.api.common AttributesBuilder Attributes]
|
[io.opentelemetry.api.common AttributesBuilder Attributes]
|
||||||
[io.opentelemetry.api.logs LoggerProvider Severity]
|
[io.opentelemetry.api.logs LoggerProvider Severity]
|
||||||
[io.opentelemetry.api.trace TracerProvider Tracer Span]
|
[io.opentelemetry.api.trace TracerProvider Tracer Span]
|
||||||
|
|
@ -165,19 +166,18 @@
|
||||||
|
|
||||||
(defn- start-span
|
(defn- start-span
|
||||||
"Returns new `io.opentelemetry.api.trace.Span` with random `traceId` and `spanId`."
|
"Returns new `io.opentelemetry.api.trace.Span` with random `traceId` and `spanId`."
|
||||||
^Span [^Tracer tracer ^String span-name ^java.time.Instant inst ?parent]
|
^Span
|
||||||
|
[^Tracer tracer ^Context context ^String span-name ^java.time.Instant inst ?parent]
|
||||||
(let [sb (.spanBuilder tracer span-name)]
|
(let [sb (.spanBuilder tracer span-name)]
|
||||||
(when-let [parent ?parent]
|
(when-let [parent ?parent]
|
||||||
(cond
|
(cond
|
||||||
;; Local parent span, etc.
|
;; Local parent span, etc.
|
||||||
(instance? Span parent)
|
(instance? Span parent) (.setParent sb (.with context ^Span parent))
|
||||||
(.setParent sb (.with (io.opentelemetry.context.Context/root) ^Span parent))
|
|
||||||
|
|
||||||
;; Remote parent context, etc.
|
;; Remote parent context, etc.
|
||||||
(instance? io.opentelemetry.api.trace.SpanContext parent)
|
(instance? io.opentelemetry.api.trace.SpanContext parent)
|
||||||
(.setParent sb
|
(.setParent sb
|
||||||
(.with
|
(.with context
|
||||||
(io.opentelemetry.context.Context/root)
|
|
||||||
(Span/wrap ^io.opentelemetry.api.trace.SpanContext parent)))
|
(Span/wrap ^io.opentelemetry.api.trace.SpanContext parent)))
|
||||||
|
|
||||||
:else
|
:else
|
||||||
|
|
@ -191,9 +191,9 @@
|
||||||
(.startSpan sb)))
|
(.startSpan sb)))
|
||||||
|
|
||||||
(comment
|
(comment
|
||||||
(let [inst (enc/now-inst)] (enc/qb 1e6 (start-span my-tr "id1" inst nil))) ; 142.33
|
(let [inst (enc/now-inst)] (enc/qb 1e6 (start-span my-tr (Context/current) "id1" inst nil))) ; 158.09
|
||||||
(start-span my-tr "id1" (enc/now-inst) (start-span my-tr "id2" (enc/now-inst) nil))
|
(start-span my-tr (Context/current) "id1" (enc/now-inst) (start-span my-tr (Context/current) "id2" (enc/now-inst) nil))
|
||||||
(start-span my-tr "id1" (enc/now-inst)
|
(start-span my-tr (Context/current) "id1" (enc/now-inst)
|
||||||
(remote-span-context "c5b856d919f65e39a202bfb3034d65d8" "1111111111111111" false nil)))
|
(remote-span-context "c5b856d919f65e39a202bfb3034d65d8" "1111111111111111" false nil)))
|
||||||
|
|
||||||
(let [ak-uid (io.opentelemetry.api.common.AttributeKey/stringKey "uid")
|
(let [ak-uid (io.opentelemetry.api.common.AttributeKey/stringKey "uid")
|
||||||
|
|
@ -236,7 +236,7 @@
|
||||||
- `end-buffer_` - latom: #{[<uid> <end-inst>]}
|
- `end-buffer_` - latom: #{[<uid> <end-inst>]}
|
||||||
- `gc-buffer_` - latom: #{<uid>}"
|
- `gc-buffer_` - latom: #{<uid>}"
|
||||||
|
|
||||||
[tracer spans_ end-buffer_ gc-buffer_ gc-latch_ signal]
|
[tracer context spans_ end-buffer_ gc-buffer_ gc-latch_ signal]
|
||||||
|
|
||||||
;; Notes:
|
;; Notes:
|
||||||
;; - Spans go to `SpanExporter` after `.end` call, ~random order okay
|
;; - Spans go to `SpanExporter` after `.end` call, ~random order okay
|
||||||
|
|
@ -262,7 +262,7 @@
|
||||||
(or old
|
(or old
|
||||||
(delay
|
(delay
|
||||||
;; TODO Support remote-span-context parent and/or span links?
|
;; TODO Support remote-span-context parent and/or span links?
|
||||||
(start-span tracer (span-name root-id)
|
(start-span tracer context (span-name root-id)
|
||||||
root-inst nil)))))))))]
|
root-inst nil)))))))))]
|
||||||
|
|
||||||
(let [?parent-span ; May be identical to root-span
|
(let [?parent-span ; May be identical to root-span
|
||||||
|
|
@ -278,7 +278,7 @@
|
||||||
(fn [old]
|
(fn [old]
|
||||||
(or old
|
(or old
|
||||||
(delay
|
(delay
|
||||||
(start-span tracer (span-name parent-id)
|
(start-span tracer context (span-name parent-id)
|
||||||
parent-inst root-span)))))))))))
|
parent-inst root-span)))))))))))
|
||||||
|
|
||||||
{this-uid :uid, this-end-inst :end-inst} signal]
|
{this-uid :uid, this-end-inst :end-inst} signal]
|
||||||
|
|
@ -306,7 +306,7 @@
|
||||||
(fn [old]
|
(fn [old]
|
||||||
(or old
|
(or old
|
||||||
(delay
|
(delay
|
||||||
(start-span tracer (span-name this-id)
|
(start-span tracer context (span-name this-id)
|
||||||
this-inst (or ?parent-span root-span))))))))))]
|
this-inst (or ?parent-span root-span))))))))))]
|
||||||
|
|
||||||
(do
|
(do
|
||||||
|
|
@ -471,7 +471,7 @@
|
||||||
;; Notes:
|
;; Notes:
|
||||||
;; - Multi-threaded handlers may see signals ~out of order
|
;; - Multi-threaded handlers may see signals ~out of order
|
||||||
;; - Sampling means that root/parent/child signals may never be handled
|
;; - Sampling means that root/parent/child signals may never be handled
|
||||||
;; - `:otel/attrs` currently undocumented
|
;; - `:otel/attrs`, `:otel/context` currently undocumented
|
||||||
|
|
||||||
([] (handler:open-telemetry-logger nil))
|
([] (handler:open-telemetry-logger nil))
|
||||||
([{:keys [logger-provider tracer-provider max-span-msecs]
|
([{:keys [logger-provider tracer-provider max-span-msecs]
|
||||||
|
|
@ -493,7 +493,6 @@
|
||||||
(.get p "Telemere"))
|
(.get p "Telemere"))
|
||||||
|
|
||||||
;;; Tracing state
|
;;; Tracing state
|
||||||
root-context (when ?tracer (io.opentelemetry.context.Context/root))
|
|
||||||
spans_ (when ?tracer (enc/latom {})) ; {<uid> <Span_>}
|
spans_ (when ?tracer (enc/latom {})) ; {<uid> <Span_>}
|
||||||
end-buffer1_ (when ?tracer (enc/latom #{})) ; #{[<uid> <end-inst>]}
|
end-buffer1_ (when ?tracer (enc/latom #{})) ; #{[<uid> <end-inst>]}
|
||||||
sgc-buffer1_ (when ?tracer (enc/latom #{})) ; #{<uid>} ; Slow GC
|
sgc-buffer1_ (when ?tracer (enc/latom #{})) ; #{<uid>} ; Slow GC
|
||||||
|
|
@ -591,9 +590,19 @@
|
||||||
(fn a-handler:open-telemetry-logger
|
(fn a-handler:open-telemetry-logger
|
||||||
([ ] (stop-tracing!))
|
([ ] (stop-tracing!))
|
||||||
([signal]
|
([signal]
|
||||||
(let [?span
|
(let [?context
|
||||||
(when-let [^io.opentelemetry.api.trace.Tracer tracer ?tracer]
|
(enc/when-let
|
||||||
(handle-tracing! tracer spans_ end-buffer1_ sgc-buffer1_ gc-latch_ signal))]
|
[^Tracer tracer ?tracer
|
||||||
|
^Context context
|
||||||
|
(enc/get* signal :otel/context ; Undocumented
|
||||||
|
#_(io.opentelemetry.context.Context/root)
|
||||||
|
(io.opentelemetry.context.Context/current))
|
||||||
|
|
||||||
|
^Span span
|
||||||
|
(handle-tracing! tracer context
|
||||||
|
spans_ end-buffer1_ sgc-buffer1_ gc-latch_ signal)]
|
||||||
|
|
||||||
|
(.storeInContext span context))]
|
||||||
|
|
||||||
(when-let [^io.opentelemetry.api.logs.LoggerProvider logger-provider ?logger-provider]
|
(when-let [^io.opentelemetry.api.logs.LoggerProvider logger-provider ?logger-provider]
|
||||||
(let [{:keys [ns inst level msg_]} signal
|
(let [{:keys [ns inst level msg_]} signal
|
||||||
|
|
@ -604,9 +613,8 @@
|
||||||
(.setSeverity lrb (level->severity level))
|
(.setSeverity lrb (level->severity level))
|
||||||
(.setAllAttributes lrb (signal->attrs signal))
|
(.setAllAttributes lrb (signal->attrs signal))
|
||||||
|
|
||||||
(when-let [^Span span ?span] ; Incl. traceId, SpanId, etc.
|
(when-let [^Context context ?context] ; Incl. traceId, SpanId, etc.
|
||||||
(let [span-in-context (.storeInContext span root-context)]
|
(.setContext lrb context))
|
||||||
(.setContext lrb span-in-context)))
|
|
||||||
|
|
||||||
(when-let [body
|
(when-let [body
|
||||||
(or
|
(or
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue