diff --git a/src/metrepl/metrics.clj b/src/metrepl/metrics.clj index cb65fea..d91f300 100644 --- a/src/metrepl/metrics.clj +++ b/src/metrepl/metrics.clj @@ -5,15 +5,14 @@ [clojure.string :as string] [metrepl.config :as config] [metrepl.exporters :as exporters] - [metrepl.transport :as m.transport] - [nrepl.middleware.dynamic-loader :as nrepl.dynamic-loader]) + [metrepl.transport :as m.transport]) (:import [java.lang.management ManagementFactory] [java.util.jar JarFile])) (defonce first-load-file?* (atom true)) -(defn ^:private msg->payload [{:keys [op] :as msg}] +(defn ^:private msg->initial-payload [{:keys [op] :as msg}] (merge {:op op} (case op "clone" (select-keys msg [:client-name :client-version]) @@ -24,6 +23,15 @@ "close" {:session-time-ms (.getUptime (ManagementFactory/getRuntimeMXBean))} nil))) +(defn ^:private initial-payload->final-payload [initial-payload response end-time] + (cond-> initial-payload + + (and (= "describe" (:op initial-payload)) (get response :middleware)) + (assoc :middleware (vec (get response :middleware))) + + :always + (assoc :time-ms end-time))) + (defn metrify* [metric content-fn] (try (exporters/export! {:metric metric @@ -40,8 +48,8 @@ (metrify* metric (constantly content))) (defn metrify-op-task [msg] - (let [payload (msg->payload msg) - _ (metrify :event/op-requested payload) + (let [initial-payload (msg->initial-payload msg) + _ (metrify :event/op-requested initial-payload) start-time (System/currentTimeMillis)] (when (and (= "load-file" (:op msg)) @first-load-file?*) @@ -51,8 +59,9 @@ {:on-before-send (fn [response] (when (contains? (:status response) :done) - (let [end-time (- (System/currentTimeMillis) start-time)] - (metrify :event/op-completed (assoc payload :time-ms end-time)))))}))) + (let [end-time (- (System/currentTimeMillis) start-time) + final-payload (initial-payload->final-payload initial-payload response end-time)] + (metrify :event/op-completed final-payload))))}))) (def ^:private type-by-file {"project.clj" "lein" @@ -78,5 +87,4 @@ (classpath/classpath-jarfiles))] {:startup-time-ms startup-time-ms :project-types project-types - :middlewares (some->> nrepl.dynamic-loader/*state* deref :stack (mapv #(subs (str %) 2))) :dependencies dependencies})))) diff --git a/test/metrepl/metrics_test.clj b/test/metrepl/metrics_test.clj index 0e0cbf9..390f1bb 100644 --- a/test/metrepl/metrics_test.clj +++ b/test/metrepl/metrics_test.clj @@ -134,7 +134,25 @@ metric))))] (-> (metrics/metrify-op-task {:op "close" :transport mock-transport}) :transport - (.send {:status #{:done}}))))) + (.send {:status #{:done}})))) + (testing "describe op" + (with-redefs [exporters/export! (fn [metric] + (case (:metric metric) + :event/op-requested + (is (match? {:metric :event/op-requested + :payload {:op "describe"}} + metric)) + :event/op-completed + (is (match? {:metric :event/op-completed + :payload {:op "describe" + :middleware ["some-middleware"] + :time-ms int?}} + metric))))] + (-> (metrics/metrify-op-task {:op "describe" + :transport mock-transport}) + :transport + (.send {:status #{:done} + :middleware ["some-middleware"]}))))) (deftest metrify-repl-ready-test (with-redefs [nrepl.dynamic-loader/*state* (atom {:stack [#'op-metrics/wrap-op-metrics]}) @@ -143,7 +161,6 @@ :info/repl-ready (is (match? {:metric :info/repl-ready :payload {:startup-time-ms 123 - :project-types (matchers/in-any-order ["deps" "babashka"]) - :middlewares (matchers/embeds ["metrepl.middleware.op-metrics/wrap-op-metrics"])}} + :project-types (matchers/in-any-order ["deps" "babashka"])}} metric))))] (metrics/metrify-repl-ready 123)))