🎉 Add metrics for svgc function.

This commit is contained in:
Andrey Antukh 2021-01-31 20:01:35 +01:00 committed by Alonso Torres
parent b80295a21c
commit b252b55c85

View file

@ -25,33 +25,36 @@
;; SVG Clean ;; SVG Clean
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare do-svg-clean) (declare clean-svg)
(declare prepare-context-pool) (declare prepare-context-pool)
(defmethod ig/pre-init-spec ::svgc [_] (defmethod ig/pre-init-spec ::svgc [_]
(s/keys :req-un [::mtx/metrics])) (s/keys :req-un [::mtx/metrics]))
(defmethod ig/init-key ::svgc (defmethod ig/init-key ::svgc
[_ _] [_ {:keys [metrics] :as cfg}]
(let [ctx-pool (prepare-context-pool)] (let [pool (prepare-context-pool cfg)
(with-meta cfg (assoc cfg :pool pool)
(fn [data] handler #(clean-svg cfg %)
(with-open [ctx (pool/acquire ctx-pool)] handler (->> {:registry (:registry metrics)
(do-svg-clean @ctx data))) :type :summary
{::ctx-pool ctx-pool}))) :name "svgc_timing"
:help "svg optimization function timing"}
(mtx/instrument handler))]
(with-meta handler {::pool pool})))
(defmethod ig/halt-key! ::svgc (defmethod ig/halt-key! ::svgc
[_ f] [_ f]
(let [{:keys [::ctx-pool]} (meta f)] (let [{:keys [::pool]} (meta f)]
(pool/clear! ctx-pool) (pool/clear! pool)
(pool/close! ctx-pool))) (pool/close! pool)))
(defn- prepare-context-pool (defn- prepare-context-pool
[] [cfg]
(pool/create (pool/create
{:min-idle 0 {:min-idle (:min-idle cfg 0)
:max-idle 3 :max-idle (:max-idle cfg 3)
:max-total 3 :max-total (:max-total cfg 3)
:create :create
(fn [] (fn []
(let [ctx (graal/context "js")] (let [ctx (graal/context "js")]
@ -62,27 +65,29 @@
(fn [ctx] (fn [ctx]
(graal/close! ctx))})) (graal/close! ctx))}))
(defn- do-svg-clean (defn- clean-svg
[ctx data] [{:keys [pool]} data]
(let [res (promise) (with-open [ctx (pool/acquire pool)]
optimize (-> (graal/get-bindings ctx "js") (let [res (promise)
(graal/get-member "svgc") optimize (-> (graal/get-bindings @ctx "js")
(graal/get-member "optimize")) (graal/get-member "svgc")
resultp (graal/invoke optimize data)] (graal/get-member "optimize"))
resultp (graal/invoke optimize data)]
(graal/invoke-member resultp "then" (graal/invoke-member resultp "then"
(reify Consumer (reify Consumer
(accept [_ val] (accept [_ val]
(deliver res val)))) (deliver res val))))
(graal/invoke-member resultp "catch"
(reify Consumer
(accept [_ err]
(deliver res err))))
(let [result (deref res)] (graal/invoke-member resultp "catch"
(if (instance? Throwable result) (reify Consumer
(throw result) (accept [_ err]
result)))) (deliver res err))))
(let [result (deref res)]
(if (instance? Throwable result)
(throw result)
result)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Handler ;; Handler