|
3 | 3 | [clojure.string :as string] |
4 | 4 | [metrepl.format :as format]) |
5 | 5 | (:import |
6 | | - [io.opentelemetry.api.common AttributeKey] |
| 6 | + [io.opentelemetry.api.common AttributeKey Attributes] |
7 | 7 | [io.opentelemetry.api.logs Severity] |
| 8 | + [io.opentelemetry.sdk OpenTelemetrySdk] |
8 | 9 | [io.opentelemetry.sdk.autoconfigure AutoConfiguredOpenTelemetrySdk] |
9 | | - [io.opentelemetry.sdk.logs SdkLoggerProvider] |
10 | 10 | [java.util.function Function])) |
11 | 11 |
|
12 | 12 | (set! *warn-on-reflection* true) |
13 | 13 |
|
14 | | -(defonce otlp-logger-provider* (atom nil)) |
| 14 | +(defonce ^:private otlp-provider* (atom nil)) |
15 | 15 |
|
16 | | -(defn ^:private setup-logger [otlp-config] |
17 | | - (reset! otlp-logger-provider* |
| 16 | +(defn ^:private setup-sdk [otel-config] |
| 17 | + (reset! otlp-provider* |
18 | 18 | (-> (AutoConfiguredOpenTelemetrySdk/builder) |
19 | | - (.addPropertiesCustomizer (reify Function (apply [_ _] |
20 | | - otlp-config))) |
| 19 | + (.addPropertiesCustomizer ^Function (constantly otel-config)) |
21 | 20 | (.build) |
22 | | - .getOpenTelemetrySdk |
23 | | - .getSdkLoggerProvider))) |
| 21 | + .getOpenTelemetrySdk))) |
24 | 22 |
|
25 | 23 | (defn ^:private ->severity [level] |
26 | 24 | (case level |
|
30 | 28 | :error Severity/ERROR |
31 | 29 | Severity/INFO)) |
32 | 30 |
|
33 | | -(defn ^:private ->raw-value [value] |
34 | | - (cond |
35 | | - (keyword? value) (string/join "" (drop 1 (str value))) |
36 | | - (number? value) value |
37 | | - (boolean? value) value |
38 | | - :else (str value))) |
| 31 | +(defn ^:private ->attributes |
| 32 | + [m] |
| 33 | + (let [builder (Attributes/builder)] |
| 34 | + (doseq [[k v] m |
| 35 | + :let [value (cond |
| 36 | + (keyword? v) (string/join "" (drop 1 (str v))) |
| 37 | + (number? v) v |
| 38 | + (boolean? v) v |
| 39 | + :else (str v))]] |
| 40 | + (.put builder (AttributeKey/stringKey (name k)) value)) |
| 41 | + (.build builder))) |
39 | 42 |
|
40 | | -(defn export! [data _metric-cfg {:keys [config]}] |
41 | | - (when-not @otlp-logger-provider* |
42 | | - (setup-logger config)) |
43 | | - (let [log-record-builder (-> (.get ^SdkLoggerProvider @otlp-logger-provider* (str *ns*)) |
| 43 | +(defn export! |
| 44 | + [{:keys [payload level timestamp] :as data {:keys [op]} :payload} _metric-cfg {:keys [config]}] |
| 45 | + (when-not @otlp-provider* |
| 46 | + (setup-sdk config)) |
| 47 | + (let [^OpenTelemetrySdk sdk @otlp-provider* |
| 48 | + base-atrributes (dissoc data :timestamp :level :payload) |
| 49 | + log-attributes (->attributes base-atrributes) |
| 50 | + log-record-builder (-> (.getSdkLoggerProvider sdk) |
| 51 | + (.get (str *ns*)) |
44 | 52 | (.logRecordBuilder) |
45 | | - (.setBody (format/parse-data (:payload data) :json)) |
46 | | - (.setSeverity (->severity (:level data))) |
47 | | - (.setTimestamp (:timestamp data)))] |
48 | | - (doseq [[field value] (dissoc data :timestamp :level :payload)] |
49 | | - (.setAttribute log-record-builder (AttributeKey/stringKey (name field)) (->raw-value value))) |
50 | | - (.emit log-record-builder))) |
| 53 | + (.setBody (format/parse-data payload :json)) |
| 54 | + (.setSeverity (->severity level)) |
| 55 | + (.setTimestamp timestamp) |
| 56 | + (.setAllAttributes log-attributes)) |
| 57 | + long-counter (-> (.getSdkMeterProvider sdk) |
| 58 | + (.get (str *ns*)) |
| 59 | + (.counterBuilder "metrepl.events.total") |
| 60 | + (.setUnit "events") |
| 61 | + (.setDescription "Total number of REPL events") |
| 62 | + (.build)) |
| 63 | + metric-attributes (->attributes (cond-> base-atrributes op (assoc :operation op)))] |
| 64 | + (.emit log-record-builder) |
| 65 | + (.add long-counter 1 metric-attributes))) |
0 commit comments