Skip to content

Commit 277e791

Browse files
committed
add metrics ns
1 parent af73c5e commit 277e791

File tree

5 files changed

+83
-68
lines changed

5 files changed

+83
-68
lines changed

src/eca/db.clj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
[cognitect.transit :as transit]
77
[eca.config :as config :refer [get-env get-property]]
88
[eca.logger :as logger]
9+
[eca.metrics :as metrics]
910
[eca.shared :as shared])
1011
(:import
1112
[java.io OutputStream]))
@@ -76,7 +77,7 @@
7677

7778
(defn ^:private read-cache [cache-file]
7879
(try
79-
(logger/logging-task
80+
(metrics/task
8081
:db/read-cache
8182
(if (fs/exists? cache-file)
8283
(let [cache (with-open [is (io/input-stream cache-file)]
@@ -89,7 +90,7 @@
8990

9091
(defn ^:private upsert-cache! [cache cache-file]
9192
(try
92-
(logger/logging-task
93+
(metrics/task
9394
:db/upsert-cache
9495
(io/make-parents cache-file)
9596
;; https://github.com/cognitect/transit-clj/issues/43

src/eca/handlers.clj

Lines changed: 49 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
[eca.features.tools.mcp :as f.mcp]
99
[eca.logger :as logger]
1010
[eca.messenger :as messenger]
11+
[eca.metrics :as metrics]
1112
[eca.models :as models]
1213
[eca.shared :as shared]))
1314

1415
(set! *warn-on-reflection* true)
1516

1617
(defn initialize [{:keys [db*]} params]
17-
(logger/logging-task
18+
(metrics/task
1819
:eca/initialize
1920
(reset! config/initialization-config* (shared/map->camel-cased-map (:initialization-options params)))
2021
(let [config (config/all @db*)]
@@ -42,33 +43,36 @@
4243
(:welcomeMessage config))}))))
4344

4445
(defn initialized [{:keys [db* messenger config]}]
45-
(let [sync-models-and-notify! (fn [config]
46-
(let [new-providers-hash (hash (:providers config))]
47-
(when (not= (:providers-config-hash @db*) new-providers-hash)
48-
(swap! db* assoc :providers-config-hash new-providers-hash)
49-
(models/sync-models! db* config (fn [models]
50-
(let [db @db*]
51-
(config/notify-fields-changed-only!
52-
{:chat
53-
{:models (sort (keys models))
54-
:behaviors (distinct (keys (:behavior config)))
55-
:select-model (f.chat/default-model db config)
56-
:select-behavior (config/validate-behavior-name
57-
(or (:defaultBehavior (:chat config)) ;;legacy
58-
(:defaultBehavior config))
59-
config)
60-
:welcome-message (or (:welcomeMessage (:chat config)) ;;legacy
61-
(:welcomeMessage config))
62-
;; Deprecated, remove after changing emacs, vscode and intellij.
63-
:default-model (f.chat/default-model db config)
64-
:default-behavior (config/validate-behavior-name
65-
(or (:defaultBehavior (:chat config)) ;;legacy
66-
(:defaultBehavior config))
67-
config)}}
68-
messenger
69-
db*)))))))]
70-
(swap! db* assoc-in [:config-updated-fns :sync-models] #(sync-models-and-notify! %))
71-
(sync-models-and-notify! config))
46+
(metrics/task
47+
:eca/initialized
48+
(let [sync-models-and-notify!
49+
(fn [config]
50+
(let [new-providers-hash (hash (:providers config))]
51+
(when (not= (:providers-config-hash @db*) new-providers-hash)
52+
(swap! db* assoc :providers-config-hash new-providers-hash)
53+
(models/sync-models! db* config (fn [models]
54+
(let [db @db*]
55+
(config/notify-fields-changed-only!
56+
{:chat
57+
{:models (sort (keys models))
58+
:behaviors (distinct (keys (:behavior config)))
59+
:select-model (f.chat/default-model db config)
60+
:select-behavior (config/validate-behavior-name
61+
(or (:defaultBehavior (:chat config)) ;;legacy
62+
(:defaultBehavior config))
63+
config)
64+
:welcome-message (or (:welcomeMessage (:chat config)) ;;legacy
65+
(:welcomeMessage config))
66+
;; Deprecated, remove after changing emacs, vscode and intellij.
67+
:default-model (f.chat/default-model db config)
68+
:default-behavior (config/validate-behavior-name
69+
(or (:defaultBehavior (:chat config)) ;;legacy
70+
(:defaultBehavior config))
71+
config)}}
72+
messenger
73+
db*)))))))]
74+
(swap! db* assoc-in [:config-updated-fns :sync-models] #(sync-models-and-notify! %))
75+
(sync-models-and-notify! config)))
7276
(future
7377
(Thread/sleep 1000) ;; wait chat window is open in some editors.
7478
(when-let [error (config/validation-error)]
@@ -83,57 +87,57 @@
8387
(f.tools/init-servers! db* messenger config)))
8488

8589
(defn shutdown [{:keys [db*]}]
86-
(logger/logging-task
90+
(metrics/task
8791
:eca/shutdown
8892
(f.mcp/shutdown! db*)
8993
(swap! db* assoc :stopping true)
9094
nil))
9195

9296
(defn chat-prompt [{:keys [messenger db* config]} params]
93-
(logger/logging-task
97+
(metrics/task
9498
:eca/chat-prompt
9599
(case (get-in @db* [:chats (:chat-id params) :status])
96100
:login (f.login/handle-step params db* messenger config)
97101
(f.chat/prompt params db* messenger config))))
98102

99103
(defn chat-query-context [{:keys [db* config]} params]
100-
(logger/logging-task
104+
(metrics/task
101105
:eca/chat-query-context
102106
(f.chat/query-context params db* config)))
103107

104108
(defn chat-query-commands [{:keys [db* config]} params]
105-
(logger/logging-task
109+
(metrics/task
106110
:eca/chat-query-commands
107111
(f.chat/query-commands params db* config)))
108112

109113
(defn chat-tool-call-approve [{:keys [messenger db*]} params]
110-
(logger/logging-task
114+
(metrics/task
111115
:eca/chat-tool-call-approve
112116
(f.chat/tool-call-approve params db* messenger)))
113117

114118
(defn chat-tool-call-reject [{:keys [messenger db*]} params]
115-
(logger/logging-task
119+
(metrics/task
116120
:eca/chat-tool-call-reject
117121
(f.chat/tool-call-reject params db* messenger)))
118122

119123
(defn chat-prompt-stop [{:keys [db* messenger]} params]
120-
(logger/logging-task
124+
(metrics/task
121125
:eca/chat-prompt-stop
122126
(f.chat/prompt-stop params db* messenger)))
123127

124128
(defn chat-delete [{:keys [db*]} params]
125-
(logger/logging-task
129+
(metrics/task
126130
:eca/chat-delete
127131
(f.chat/delete-chat params db*)
128132
{}))
129133

130134
(defn mcp-stop-server [{:keys [db* messenger config]} params]
131-
(logger/logging-task
135+
(metrics/task
132136
:eca/mcp-stop-server
133137
(f.tools/stop-server! (:name params) db* messenger config)))
134138

135139
(defn mcp-start-server [{:keys [db* messenger config]} params]
136-
(logger/logging-task
140+
(metrics/task
137141
:eca/mcp-start-server
138142
(f.tools/start-server! (:name params) db* messenger config)))
139143

@@ -151,8 +155,10 @@
151155
"Switches model to the one defined in custom-behavior or to the default-one
152156
and updates tool status for the new behavior"
153157
[{:keys [db* messenger config]} {:keys [behavior]}]
154-
(let [validated-behavior (config/validate-behavior-name behavior config)
155-
behavior-config (get-in config [:behavior validated-behavior])
156-
tool-status-fn (f.tools/make-tool-status-fn config validated-behavior)]
157-
(update-behavior-model! behavior-config config messenger db*)
158-
(f.tools/refresh-tool-servers! tool-status-fn db* messenger config)))
158+
(metrics/task
159+
:eca/chat-selected-behavior-changed
160+
(let [validated-behavior (config/validate-behavior-name behavior config)
161+
behavior-config (get-in config [:behavior validated-behavior])
162+
tool-status-fn (f.tools/make-tool-status-fn config validated-behavior)]
163+
(update-behavior-model! behavior-config config messenger db*)
164+
(f.tools/refresh-tool-servers! tool-status-fn db* messenger config))))

src/eca/logger.clj

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,3 @@
2626

2727
(defn debug [& args]
2828
(apply stderr-print :debug args))
29-
30-
(defn format-time-delta-ms [start-time end-time]
31-
(format "%.0fms" (float (/ (- end-time start-time) 1000000))))
32-
33-
(defn start-time->end-time-ms [start-time]
34-
(format-time-delta-ms start-time (System/nanoTime)))
35-
36-
(defmacro logging-time
37-
"Executes `body` logging `message` formatted with the time spent
38-
from body."
39-
[message & body]
40-
(let [start-sym (gensym "start-time")]
41-
`(let [~start-sym (System/nanoTime)
42-
result# (do ~@body)]
43-
~(with-meta
44-
`(info (format ~message (start-time->end-time-ms ~start-sym)))
45-
(meta &form))
46-
result#)))
47-
48-
(defmacro logging-task [task-id & body]
49-
(with-meta `(logging-time (str ~task-id " %s") ~@body)
50-
(meta &form)))

src/eca/metrics.clj

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
(ns eca.metrics
2+
(:require
3+
[eca.logger :as logger]))
4+
5+
(defn format-time-delta-ms [start-time end-time]
6+
(format "%.0fms" (float (/ (- end-time start-time) 1000000))))
7+
8+
(defn start-time->end-time-ms [start-time]
9+
(format-time-delta-ms start-time (System/nanoTime)))
10+
11+
(defn metrify-task [{:keys [task-id time]}]
12+
(logger/info (str task-id " " time)))
13+
14+
(defmacro task*
15+
"Executes `body` logging `message` formatted with the time spent
16+
from body."
17+
[task-id & body]
18+
(let [start-sym (gensym "start-time")]
19+
`(let [~start-sym (System/nanoTime)
20+
result# (do ~@body)]
21+
~(with-meta
22+
`(metrify-task {:task-id ~task-id
23+
:time (start-time->end-time-ms ~start-sym)})
24+
(meta &form))
25+
result#)))
26+
27+
(defmacro task [task-id & body]
28+
(with-meta `(task* ~task-id ~@body)
29+
(meta &form)))

src/eca/server.clj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
[eca.handlers :as handlers]
77
[eca.logger :as logger]
88
[eca.messenger :as messenger]
9+
[eca.metrics :as metrics]
910
[eca.nrepl :as nrepl]
1011
[eca.shared :as shared :refer [assoc-some]]
1112
[jsonrpc4clj.io-server :as io-server]
@@ -19,7 +20,7 @@
1920
(apply logger/info args))
2021

2122
(defn ^:private exit [server]
22-
(logger/logging-task
23+
(metrics/task
2324
:eca/exit
2425
(jsonrpc.server/shutdown server) ;; blocks, waiting up to 10s for previously received messages to be processed
2526
(shutdown-agents)

0 commit comments

Comments
 (0)