mirror of
https://github.com/penpot/penpot.git
synced 2025-05-17 17:36:12 +02:00
🎉 Add profile activity registry logger.
This commit is contained in:
parent
c40d9d9a7c
commit
8daf6e822e
6 changed files with 70 additions and 56 deletions
|
@ -32,6 +32,10 @@
|
||||||
<AppenderRef ref="main" level="trace" />
|
<AppenderRef ref="main" level="trace" />
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="penpot" level="fatal" additivity="false">
|
||||||
|
<AppenderRef ref="main" level="fatal" />
|
||||||
|
</Logger>
|
||||||
|
|
||||||
<Logger name="user" level="trace" additivity="false">
|
<Logger name="user" level="trace" additivity="false">
|
||||||
<AppenderRef ref="main" level="trace" />
|
<AppenderRef ref="main" level="trace" />
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
|
@ -14,6 +14,10 @@
|
||||||
<AppenderRef ref="console" />
|
<AppenderRef ref="console" />
|
||||||
</Logger>
|
</Logger>
|
||||||
|
|
||||||
|
<Logger name="penpot" level="fatal" additivity="false">
|
||||||
|
<AppenderRef ref="console" />
|
||||||
|
</Logger>
|
||||||
|
|
||||||
<Root level="info">
|
<Root level="info">
|
||||||
<AppenderRef ref="console" />
|
<AppenderRef ref="console" />
|
||||||
</Root>
|
</Root>
|
||||||
|
|
|
@ -127,7 +127,10 @@
|
||||||
(rr/router
|
(rr/router
|
||||||
[["/metrics" {:get (:handler metrics)}]
|
[["/metrics" {:get (:handler metrics)}]
|
||||||
["/assets" {:middleware [[middleware/format-response-body]
|
["/assets" {:middleware [[middleware/format-response-body]
|
||||||
[middleware/errors errors/handle]]}
|
[middleware/errors errors/handle]
|
||||||
|
[middleware/cookies]
|
||||||
|
(:middleware session)
|
||||||
|
middleware/activity-logger]}
|
||||||
["/by-id/:id" {:get (:objects-handler assets)}]
|
["/by-id/:id" {:get (:objects-handler assets)}]
|
||||||
["/by-file-media-id/:id" {:get (:file-objects-handler assets)}]
|
["/by-file-media-id/:id" {:get (:file-objects-handler assets)}]
|
||||||
["/by-file-media-id/:id/thumbnail" {:get (:file-thumbnails-handler assets)}]]
|
["/by-file-media-id/:id/thumbnail" {:get (:file-thumbnails-handler assets)}]]
|
||||||
|
@ -161,6 +164,8 @@
|
||||||
["/github" {:post (get-in oauth [:github :handler])}]
|
["/github" {:post (get-in oauth [:github :handler])}]
|
||||||
["/github/callback" {:get (get-in oauth [:github :callback-handler])}]]
|
["/github/callback" {:get (get-in oauth [:github :callback-handler])}]]
|
||||||
|
|
||||||
["/rpc" {:middleware [(:middleware session)]}
|
["/rpc" {:middleware [(:middleware session)
|
||||||
|
middleware/activity-logger]}
|
||||||
|
|
||||||
["/query/:type" {:get (:query-handler rpc)}]
|
["/query/:type" {:get (:query-handler rpc)}]
|
||||||
["/mutation/:type" {:post (:mutation-handler rpc)}]]]]))
|
["/mutation/:type" {:post (:mutation-handler rpc)}]]]]))
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
(:require
|
(:require
|
||||||
[app.metrics :as mtx]
|
[app.metrics :as mtx]
|
||||||
[app.util.json :as json]
|
[app.util.json :as json]
|
||||||
|
[app.util.logging :as l]
|
||||||
[app.util.transit :as t]
|
[app.util.transit :as t]
|
||||||
[buddy.core.codecs :as bc]
|
[buddy.core.codecs :as bc]
|
||||||
[buddy.core.hash :as bh]
|
[buddy.core.hash :as bh]
|
||||||
|
@ -165,3 +166,18 @@
|
||||||
(def etag
|
(def etag
|
||||||
{:name ::etag
|
{:name ::etag
|
||||||
:compile (constantly wrap-etag)})
|
:compile (constantly wrap-etag)})
|
||||||
|
|
||||||
|
(defn activity-logger
|
||||||
|
[handler]
|
||||||
|
(let [logger "penpot.profile-activity"]
|
||||||
|
(fn [{:keys [headers] :as request}]
|
||||||
|
(let [ip-addr (get headers "x-forwarded-for")
|
||||||
|
profile-id (:profile-id request)
|
||||||
|
qstring (:query-string request)]
|
||||||
|
(l/info ::l/async true
|
||||||
|
::l/logger logger
|
||||||
|
:ip-addr ip-addr
|
||||||
|
:profile-id profile-id
|
||||||
|
:uri (str (:uri request) (if qstring (str "?" qstring)))
|
||||||
|
:method (name (:request-method request)))
|
||||||
|
(handler request)))))
|
||||||
|
|
|
@ -65,8 +65,8 @@
|
||||||
[cfg handler]
|
[cfg handler]
|
||||||
(fn [request]
|
(fn [request]
|
||||||
(if-let [{:keys [id profile-id] :as session} (retrieve-from-request cfg request)]
|
(if-let [{:keys [id profile-id] :as session} (retrieve-from-request cfg request)]
|
||||||
(let [ech (::events-ch cfg)]
|
(let [events-ch (::events-ch cfg)]
|
||||||
(a/>!! ech id)
|
(a/>!! events-ch id)
|
||||||
(l/update-thread-context! {:profile-id profile-id})
|
(l/update-thread-context! {:profile-id profile-id})
|
||||||
(handler (assoc request :profile-id profile-id)))
|
(handler (assoc request :profile-id profile-id)))
|
||||||
(handler request))))
|
(handler request))))
|
||||||
|
@ -109,6 +109,7 @@
|
||||||
[_ data]
|
[_ data]
|
||||||
(a/close! (::events-ch data)))
|
(a/close! (::events-ch data)))
|
||||||
|
|
||||||
|
|
||||||
;; --- STATE INIT: SESSION UPDATER
|
;; --- STATE INIT: SESSION UPDATER
|
||||||
|
|
||||||
(declare batch-events)
|
(declare batch-events)
|
||||||
|
@ -145,10 +146,10 @@
|
||||||
(let [result (a/<! (update-sessions cfg batch))]
|
(let [result (a/<! (update-sessions cfg batch))]
|
||||||
(mcnt :inc)
|
(mcnt :inc)
|
||||||
(if (ex/exception? result)
|
(if (ex/exception? result)
|
||||||
(l/error :mod "updater"
|
(l/error :task "updater"
|
||||||
:hint "unexpected error on update sessions"
|
:hint "unexpected error on update sessions"
|
||||||
:cause result)
|
:cause result)
|
||||||
(l/debug :mod "updater"
|
(l/debug :task "updater"
|
||||||
:action "update sessions"
|
:action "update sessions"
|
||||||
:reason (name reason)
|
:reason (name reason)
|
||||||
:count result))
|
:count result))
|
||||||
|
@ -213,7 +214,7 @@
|
||||||
(let [interval (db/interval max-age)
|
(let [interval (db/interval max-age)
|
||||||
result (db/exec-one! conn [sql:delete-expired interval])
|
result (db/exec-one! conn [sql:delete-expired interval])
|
||||||
result (:next.jdbc/update-count result)]
|
result (:next.jdbc/update-count result)]
|
||||||
(l/debug :mod "gc-task"
|
(l/debug :task "gc"
|
||||||
:action "clean http sessions"
|
:action "clean http sessions"
|
||||||
:count result)
|
:count result)
|
||||||
result))))
|
result))))
|
||||||
|
|
|
@ -90,10 +90,9 @@
|
||||||
|
|
||||||
(defmethod ig/init-key ::worker
|
(defmethod ig/init-key ::worker
|
||||||
[_ {:keys [pool poll-interval name queue] :as cfg}]
|
[_ {:keys [pool poll-interval name queue] :as cfg}]
|
||||||
(l/log :level :info
|
(l/info :action "start worker"
|
||||||
:msg "start"
|
:name (d/name name)
|
||||||
:name (d/name name)
|
:queue (d/name queue))
|
||||||
:queue (d/name queue))
|
|
||||||
(let [close-ch (a/chan 1)
|
(let [close-ch (a/chan 1)
|
||||||
poll-ms (inst-ms poll-interval)]
|
poll-ms (inst-ms poll-interval)]
|
||||||
(a/go-loop []
|
(a/go-loop []
|
||||||
|
@ -102,32 +101,31 @@
|
||||||
;; Terminate the loop if close channel is closed or
|
;; Terminate the loop if close channel is closed or
|
||||||
;; event-loop-fn returns nil.
|
;; event-loop-fn returns nil.
|
||||||
(or (= port close-ch) (nil? val))
|
(or (= port close-ch) (nil? val))
|
||||||
(l/log :level :debug :msg "stop condition found")
|
(l/debug :msg "stop condition found")
|
||||||
|
|
||||||
(db/pool-closed? pool)
|
(db/pool-closed? pool)
|
||||||
(do
|
(do
|
||||||
(l/log :level :debug :msg "eventloop aboirted because pool is closed")
|
(l/debug :msg "eventloop aborted because pool is closed")
|
||||||
(a/close! close-ch))
|
(a/close! close-ch))
|
||||||
|
|
||||||
(and (instance? java.sql.SQLException val)
|
(and (instance? java.sql.SQLException val)
|
||||||
(contains? #{"08003" "08006" "08001" "08004"} (.getSQLState ^java.sql.SQLException val)))
|
(contains? #{"08003" "08006" "08001" "08004"} (.getSQLState ^java.sql.SQLException val)))
|
||||||
(do
|
(do
|
||||||
(l/log :level :error :hint "connection error, trying resume in some instants")
|
(l/error :hint "connection error, trying resume in some instants")
|
||||||
(a/<! (a/timeout poll-interval))
|
(a/<! (a/timeout poll-interval))
|
||||||
(recur))
|
(recur))
|
||||||
|
|
||||||
(and (instance? java.sql.SQLException val)
|
(and (instance? java.sql.SQLException val)
|
||||||
(= "40001" (.getSQLState ^java.sql.SQLException val)))
|
(= "40001" (.getSQLState ^java.sql.SQLException val)))
|
||||||
(do
|
(do
|
||||||
(l/log :level :debug :msg "serialization failure (retrying in some instants)")
|
(l/debug :msg "serialization failure (retrying in some instants)")
|
||||||
(a/<! (a/timeout poll-ms))
|
(a/<! (a/timeout poll-ms))
|
||||||
(recur))
|
(recur))
|
||||||
|
|
||||||
(instance? Exception val)
|
(instance? Exception val)
|
||||||
(do
|
(do
|
||||||
(l/log :level :error
|
(l/error :cause val
|
||||||
:cause val
|
:hint "unexpected error ocurried on polling the database (will resume in some instants)")
|
||||||
:hint "unexpected error ocurried on polling the database (will resume in some instants)")
|
|
||||||
(a/<! (a/timeout poll-ms))
|
(a/<! (a/timeout poll-ms))
|
||||||
(recur))
|
(recur))
|
||||||
|
|
||||||
|
@ -185,15 +183,14 @@
|
||||||
interval (db/interval duration)
|
interval (db/interval duration)
|
||||||
props (-> options extract-props db/tjson)
|
props (-> options extract-props db/tjson)
|
||||||
id (uuid/next)]
|
id (uuid/next)]
|
||||||
(l/log :level :debug
|
(l/debug :action "submit task"
|
||||||
:action "submit task"
|
:name (d/name task)
|
||||||
:name (d/name task)
|
:in duration)
|
||||||
:in duration)
|
|
||||||
(db/exec-one! conn [sql:insert-new-task id (d/name task) props (d/name queue) priority max-retries interval])
|
(db/exec-one! conn [sql:insert-new-task id (d/name task) props (d/name queue) priority max-retries interval])
|
||||||
id))
|
id))
|
||||||
|
|
||||||
;; --- RUNNER
|
|
||||||
|
|
||||||
|
;; --- RUNNER
|
||||||
|
|
||||||
(def ^:private
|
(def ^:private
|
||||||
sql:mark-as-retry
|
sql:mark-as-retry
|
||||||
|
@ -249,9 +246,8 @@
|
||||||
(let [task-fn (get tasks name)]
|
(let [task-fn (get tasks name)]
|
||||||
(if task-fn
|
(if task-fn
|
||||||
(task-fn item)
|
(task-fn item)
|
||||||
(l/log :level :warn
|
(l/warn :msg "no task handler found"
|
||||||
:msg "no task handler found"
|
:name (d/name name)))
|
||||||
:name (d/name name)))
|
|
||||||
{:status :completed :task item}))
|
{:status :completed :task item}))
|
||||||
|
|
||||||
(defn get-error-context
|
(defn get-error-context
|
||||||
|
@ -276,10 +272,9 @@
|
||||||
|
|
||||||
(let [cdata (get-error-context error item)]
|
(let [cdata (get-error-context error item)]
|
||||||
(l/update-thread-context! cdata)
|
(l/update-thread-context! cdata)
|
||||||
(l/log :level :error
|
(l/error :cause error
|
||||||
:cause error
|
:hint "unhandled exception on task"
|
||||||
:hint "unhandled exception on task"
|
:id (:id cdata))
|
||||||
:id (:id cdata))
|
|
||||||
|
|
||||||
(if (>= (:retry-num item) (:max-retries item))
|
(if (>= (:retry-num item) (:max-retries item))
|
||||||
{:status :failed :task item :error error}
|
{:status :failed :task item :error error}
|
||||||
|
@ -289,21 +284,19 @@
|
||||||
[{:keys [tasks]} item]
|
[{:keys [tasks]} item]
|
||||||
(let [name (d/name (:name item))]
|
(let [name (d/name (:name item))]
|
||||||
(try
|
(try
|
||||||
(l/log :level :debug
|
(l/debug :action "start task"
|
||||||
:action "start task"
|
:name name
|
||||||
:name name
|
:id (:id item)
|
||||||
:id (:id item)
|
:retry (:retry-num item))
|
||||||
:retry (:retry-num item))
|
|
||||||
|
|
||||||
(handle-task tasks item)
|
(handle-task tasks item)
|
||||||
(catch Exception e
|
(catch Exception e
|
||||||
(handle-exception e item))
|
(handle-exception e item))
|
||||||
(finally
|
(finally
|
||||||
(l/log :level :debug
|
(l/debug :action "end task"
|
||||||
:action "start task"
|
:name name
|
||||||
:name name
|
:id (:id item)
|
||||||
:id (:id item)
|
:retry (:retry-num item))))))
|
||||||
:retry (:retry-num item))))))
|
|
||||||
|
|
||||||
(def sql:select-next-tasks
|
(def sql:select-next-tasks
|
||||||
"select * from task as t
|
"select * from task as t
|
||||||
|
@ -407,12 +400,8 @@
|
||||||
|
|
||||||
(defn- synchronize-schedule-item
|
(defn- synchronize-schedule-item
|
||||||
[conn {:keys [id cron]}]
|
[conn {:keys [id cron]}]
|
||||||
(let [cron (str cron)
|
(let [cron (str cron)]
|
||||||
id (name id)]
|
(l/debug :action "initialize scheduled task" :id id :cron cron)
|
||||||
(l/log :level :debug
|
|
||||||
:action "initialize scheduled task"
|
|
||||||
:id id
|
|
||||||
:cron cron)
|
|
||||||
(db/exec-one! conn [sql:upsert-scheduled-task id cron cron])))
|
(db/exec-one! conn [sql:upsert-scheduled-task id cron cron])))
|
||||||
|
|
||||||
(defn- synchronize-schedule
|
(defn- synchronize-schedule
|
||||||
|
@ -433,9 +422,7 @@
|
||||||
(letfn [(run-task [conn]
|
(letfn [(run-task [conn]
|
||||||
(try
|
(try
|
||||||
(when (db/exec-one! conn [sql:lock-scheduled-task (d/name id)])
|
(when (db/exec-one! conn [sql:lock-scheduled-task (d/name id)])
|
||||||
(l/log :level :debug
|
(l/debug :action "execute scheduled task" :id id)
|
||||||
:action "execute scheduled task"
|
|
||||||
:id id)
|
|
||||||
((:fn task) task))
|
((:fn task) task))
|
||||||
(catch Throwable e
|
(catch Throwable e
|
||||||
e)))
|
e)))
|
||||||
|
@ -444,10 +431,9 @@
|
||||||
(db/with-atomic [conn pool]
|
(db/with-atomic [conn pool]
|
||||||
(let [result (run-task conn)]
|
(let [result (run-task conn)]
|
||||||
(when (ex/exception? result)
|
(when (ex/exception? result)
|
||||||
(l/log :level :error
|
(l/error :cause result
|
||||||
:cause result
|
:hint "unhandled exception on scheduled task"
|
||||||
:hint "unhandled exception on scheduled task"
|
:id id)))))]
|
||||||
:id id)))))]
|
|
||||||
|
|
||||||
(try
|
(try
|
||||||
(px/run! executor handle-task)
|
(px/run! executor handle-task)
|
||||||
|
@ -520,9 +506,7 @@
|
||||||
:help "Background task execution timing."})]
|
:help "Background task execution timing."})]
|
||||||
(reduce-kv (fn [res k v]
|
(reduce-kv (fn [res k v]
|
||||||
(let [tname (name k)]
|
(let [tname (name k)]
|
||||||
(l/log :level :debug
|
(l/debug :action "register task" :name tname)
|
||||||
:action "register task"
|
|
||||||
:name tname)
|
|
||||||
(assoc res k (mtx/wrap-summary v mobj [tname]))))
|
(assoc res k (mtx/wrap-summary v mobj [tname]))))
|
||||||
{}
|
{}
|
||||||
tasks)))
|
tasks)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue