/
carrier.clj
85 lines (69 loc) · 2.66 KB
/
carrier.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
(ns naphthalimide.alpha.carrier
(:require [naphthalimide.alpha.span :as span]
[naphthalimide.alpha.tracer :as tracer])
(:import (io.opentracing Span SpanContext Tracer)
(io.opentracing.propagation Format Format$Builtin)
(java.nio ByteBuffer)
))
(defonce FORMATS
(atom {}))
(defn register-carrier-format!
([carrier-format-name format new-carrier]
(register-carrier-format!
carrier-format-name format new-carrier identity))
([carrier-format-name format new-carrier carrier-final]
(assert (instance? Format format)
(format "Format '%s' must implement io.opentracing.propagation.Format"
(str format)))
(swap! FORMATS assoc carrier-format-name
{:format format
:init new-carrier
:final carrier-final})
carrier-format-name))
(defn carrier-format
[carrier-format-name]
(@FORMATS carrier-format-name))
(defn ^io.opentracing.propagation.TextMap fresh-text-map
([]
(fresh-text-map {}))
([init]
(let [state (atom
(zipmap
(map name (keys init))
(map str (vals init))))]
(reify clojure.lang.IDeref
(deref [_] @state)
io.opentracing.propagation.TextMap
(iterator [_]
(.iterator ^clojure.lang.IPersistentMap (deref state)))
(put [_ k v]
(swap! state assoc k v))))))
(defn fresh-byte-buffer
([] (ByteBuffer/allocate 0))
([bytes] (ByteBuffer/wrap bytes)))
(register-carrier-format! :binary
Format$Builtin/BINARY
fresh-byte-buffer)
(register-carrier-format! :text-map
Format$Builtin/TEXT_MAP
fresh-text-map
deref)
(defn injectable-context
([carrier-format-name]
(injectable-context carrier-format-name
(tracer/global-tracer)))
([carrier-format-name tracer]
(injectable-context carrier-format-name
tracer
(span/active tracer)))
([carrier-format-name ^Tracer tracer ^Span span]
(when-some [{:keys [format init final]} (carrier-format carrier-format-name)]
(let [carrier (init)]
(.inject tracer (span/context span) format carrier)
(final carrier)))))
(defn ^SpanContext extract-context
([carrier-format-name carrier]
(extract-context carrier-format-name carrier (tracer/global-tracer)))
([carrier-format-name carrier ^Tracer tracer]
(when-some [{:keys [format init]} (carrier-format carrier-format-name)]
(.extract tracer format (init carrier)))))