🎉 Add profile activity registry logger.

This commit is contained in:
Andrey Antukh 2021-04-07 17:45:22 +02:00
parent c40d9d9a7c
commit 8daf6e822e
6 changed files with 70 additions and 56 deletions

View file

@ -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>

View file

@ -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>

View file

@ -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)}]]]]))

View file

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

View file

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

View file

@ -90,8 +90,7 @@
(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)
@ -102,31 +101,30 @@
;; 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,8 +246,7 @@
(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}))
@ -276,8 +272,7 @@
(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))
@ -289,8 +284,7 @@
[{: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))
@ -299,8 +293,7 @@
(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))))))
@ -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,8 +431,7 @@
(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)))))]
@ -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)))