Skip to content

Commit 641fda9

Browse files
authored
Merge pull request #1 from carloshernandez2/feature/otlp-metrics
Add OTLP metrics
2 parents b9bd8e5 + be4cb06 commit 641fda9

4 files changed

Lines changed: 46 additions & 26 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- [#1](https://github.com/ericdallo/metrepl/pull/1) Enable exporting metrics from `otlp` exporter.
6+
57
## 0.4.2
68

79
- Bump nrepl to 1.5.0

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Available exporters:
4242

4343
- `stdout`: Export the metric to current nREPL process stdout, useful for debugging.
4444
- `file`: Export the metric to a file, appending each metric in a new line.
45-
- `otlp`: Export the metric via [OpenTelemetry](https://opentelemetry.io/) to what user configured.
45+
- `otlp`: Export metrics via [OpenTelemetry Protocol](https://opentelemetry.io/docs/specs/otlp/). Supports exporting as logs and/or metrics.
4646

4747
By default no exporter is enabled, you need to manually configure which one(s) you want to enable, example: `{:exporters {:stdout {:enabled? true}}}`.
4848

‎deps.edn‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
:extra-deps {nubank/matcher-combinators {:mvn/version "3.9.1"}
1010
lambdaisland/kaocha {:mvn/version "1.91.1392"}}
1111
:main-opts ["-m" "kaocha.runner"]}
12+
:repl {:extra-paths ["dev" "docs" "test"]
13+
:extra-deps {nubank/matcher-combinators {:mvn/version "3.9.1"}
14+
lambdaisland/kaocha {:mvn/version "1.91.1392"}}}
1215
:build {:deps {io.github.clojure/tools.build {:tag "v0.10.7" :sha "573711e"}
1316
slipset/deps-deploy {:mvn/version "0.2.2"}}
1417
:extra-paths ["resources"]

‎src/metrepl/exporters/otlp.clj‎

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,22 @@
33
[clojure.string :as string]
44
[metrepl.format :as format])
55
(:import
6-
[io.opentelemetry.api.common AttributeKey]
6+
[io.opentelemetry.api.common AttributeKey Attributes]
77
[io.opentelemetry.api.logs Severity]
8+
[io.opentelemetry.sdk OpenTelemetrySdk]
89
[io.opentelemetry.sdk.autoconfigure AutoConfiguredOpenTelemetrySdk]
9-
[io.opentelemetry.sdk.logs SdkLoggerProvider]
1010
[java.util.function Function]))
1111

1212
(set! *warn-on-reflection* true)
1313

14-
(defonce otlp-logger-provider* (atom nil))
14+
(defonce ^:private otlp-provider* (atom nil))
1515

16-
(defn ^:private setup-logger [otlp-config]
17-
(reset! otlp-logger-provider*
16+
(defn ^:private setup-sdk [otel-config]
17+
(reset! otlp-provider*
1818
(-> (AutoConfiguredOpenTelemetrySdk/builder)
19-
(.addPropertiesCustomizer (reify Function (apply [_ _]
20-
otlp-config)))
19+
(.addPropertiesCustomizer ^Function (constantly otel-config))
2120
(.build)
22-
.getOpenTelemetrySdk
23-
.getSdkLoggerProvider)))
21+
.getOpenTelemetrySdk)))
2422

2523
(defn ^:private ->severity [level]
2624
(case level
@@ -30,21 +28,38 @@
3028
:error Severity/ERROR
3129
Severity/INFO))
3230

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)))
3942

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*))
4452
(.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

Comments
 (0)