diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index 875bd5663..ce233b142 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -121,15 +121,14 @@ cause (or parent-cause error)] (cond (= code :data-validation) - (let [explain (::sm/explain data) - explain (sm/humanize-data explain)] + (let [explain (ex/explain data)] (l/error :hint "data assertion error" :cause cause) {::yrs/status 500 ::yrs/body {:type :server-error :code :assertion :data (-> data (dissoc ::sm/explain) - (assoc :explain explain))}}) + (cond-> explain (assoc :explain explain)))}}) (= code :spec-validation) (let [explain (ex/explain data)] @@ -231,7 +230,7 @@ (defmethod handle-exception java.util.concurrent.CompletionException [cause request _] (let [cause' (ex-cause cause)] - (if (ex/error? cause) + (if (ex/error? cause') (handle-error cause' request cause) (handle-exception cause' request cause)))) diff --git a/backend/src/app/loggers/database.clj b/backend/src/app/loggers/database.clj index 85e5c6e3f..9cdfdcf8c 100644 --- a/backend/src/app/loggers/database.clj +++ b/backend/src/app/loggers/database.clj @@ -40,32 +40,40 @@ [{:keys [::l/context ::l/message ::l/props ::l/logger ::l/level ::l/cause] :as record}] (us/assert! ::l/record record) - (let [data (ex-data cause) - ctx (-> context - (assoc :tenant (cf/get :tenant)) - (assoc :host (cf/get :host)) - (assoc :public-uri (cf/get :public-uri)) - (assoc :logger/name logger) - (assoc :logger/level level) - (dissoc :request/params :value :params :data))] - (merge - {:context (-> (into (sorted-map) ctx) - (pp/pprint-str :width 200 :length 50 :level 10)) - :props (pp/pprint-str props :width 200 :length 50) - :hint (or (ex-message cause) @message) - :trace (ex/format-throwable cause :data? false :explain? false :header? false :summary? false)} + (if (or (instance? java.util.concurrent.CompletionException cause) + (instance? java.util.concurrent.ExecutionException cause)) + (-> record + (assoc ::trace (ex/format-throwable cause :data? false :explain? false :header? false :summary? false)) + (assoc ::l/cause (ex-cause cause)) + (record->report)) - (when-let [params (or (:request/params context) (:params context))] - {:params (pp/pprint-str params :width 200 :length 50 :level 10)}) + (let [data (ex-data cause) + ctx (-> context + (assoc :tenant (cf/get :tenant)) + (assoc :host (cf/get :host)) + (assoc :public-uri (cf/get :public-uri)) + (assoc :logger/name logger) + (assoc :logger/level level) + (dissoc :request/params :value :params :data))] + (merge + {:context (-> (into (sorted-map) ctx) + (pp/pprint-str :width 200 :length 50 :level 10)) + :props (pp/pprint-str props :width 200 :length 50) + :hint (or (ex-message cause) @message) + :trace (or (::trace record) + (ex/format-throwable cause :data? false :explain? false :header? false :summary? false))} - (when-let [value (:value context)] - {:value (pp/pprint-str value :width 200 :length 50 :level 10)}) + (when-let [params (or (:request/params context) (:params context))] + {:params (pp/pprint-str params :width 200 :length 50 :level 10)}) - (when-let [data (some-> data (dissoc ::s/problems ::s/value ::s/spec ::sm/explain :hint))] - {:data (pp/pprint-str data :width 200)}) + (when-let [value (:value context)] + {:value (pp/pprint-str value :width 200 :length 50 :level 10)}) - (when-let [explain (ex/explain data {:level 10 :length 50})] - {:explain explain})))) + (when-let [data (some-> data (dissoc ::s/problems ::s/value ::s/spec ::sm/explain :hint))] + {:data (pp/pprint-str data :width 200)}) + + (when-let [explain (ex/explain data {:level 10 :length 50})] + {:explain explain}))))) (defn error-record? [{:keys [::l/level ::l/cause]}] diff --git a/common/src/app/common/exceptions.cljc b/common/src/app/common/exceptions.cljc index cb6388997..fa3b932fb 100644 --- a/common/src/app/common/exceptions.cljc +++ b/common/src/app/common/exceptions.cljc @@ -66,7 +66,7 @@ (defn explain ([data] (explain data nil)) - ([data {:keys [level length] :or {level 8 length 12} :as opts}] + ([data opts] (cond ;; NOTE: a special case for spec validation errors on integrant (and (= (:reason data) :integrant.core/build-failed-spec) @@ -78,10 +78,10 @@ (contains? data ::s/spec)) (binding [s/*explain-out* expound/printer] (with-out-str - (s/explain-out (update data ::s/problems #(take length %))))) + (s/explain-out (update data ::s/problems #(take (:length opts 10) %))))) (contains? data ::sm/explain) - (sm/humanize-data (::sm/explain data) :level level :length length)))) + (sm/humanize-data (::sm/explain data) opts)))) #?(:clj (defn format-throwable @@ -93,7 +93,7 @@ explain? true chain? true data-length 10 - data-level 8}}] + data-level 5}}] (letfn [(print-trace-element [^StackTraceElement e] (let [class (.getClassName e) @@ -123,7 +123,11 @@ (print-trace-title [^Throwable cause] (print " → ") - (printf "%s: %s" (.getName (class cause)) (first (str/lines (ex-message cause)))) + (printf "%s: %s" (.getName (class cause)) + (-> (ex-message cause) + (str/lines) + (first) + (str/prune 100))) (when-let [^StackTraceElement e (first (.getStackTrace ^Throwable cause))] (printf " (%s:%d)" (or (.getFileName e) "") (.getLineNumber e)))