Skip to content

Commit 31d9e59

Browse files
committed
add database appender
1 parent 0cee8d1 commit 31d9e59

File tree

8 files changed

+104
-12
lines changed

8 files changed

+104
-12
lines changed

clojure/wheel/.joker

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
{:known-macros [mount.core/defstate]}
1+
{:known-macros [mount.core/defstate
2+
toucan.models/defmodel]}

clojure/wheel/project.clj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
[org.postgresql/postgresql "42.2.6"]
1111
[org.flywaydb/flyway-core "5.2.4"]
1212
[com.taoensso/timbre "4.10.0"]
13-
[cheshire "5.9.0"]]
13+
[cheshire "5.9.0"]
14+
[toucan "1.14.0"]]
1415
:main ^:skip-aot wheel.core
1516
:target-path "target/%s"
1617
:profiles {:uberjar {:aot :all}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
CREATE TYPE event_level AS ENUM (
2+
'info', 'debug',
3+
'error', 'warn',
4+
'fatal');
5+
6+
CREATE TYPE channel_name AS ENUM (
7+
'tata-cliq', 'amazon', 'flipkart');
8+
9+
CREATE TABLE event (
10+
id UUID PRIMARY KEY,
11+
parent_id UUID REFERENCES event(id),
12+
level event_level NOT NULL,
13+
name TEXT NOT NULL,
14+
channel_id TEXT NOT NULL,
15+
channel_name channel_name NOT NULL,
16+
timestamp TIMESTAMP WITH TIME ZONE NOT NULL
17+
);

clojure/wheel/src/wheel/infra/database.clj

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
(ns wheel.infra.database
22
(:require [wheel.infra.config :as config]
33
[mount.core :as mount]
4-
[hikari-cp.core :as hikari])
5-
(:import [org.flywaydb.core Flyway]))
4+
[hikari-cp.core :as hikari]
5+
[toucan.db :as db]
6+
[toucan.models :as models])
7+
(:import [org.flywaydb.core Flyway]
8+
[org.postgresql.util PGobject]))
69

710
(defn- make-datasource []
811
(hikari/make-datasource (config/database)))
@@ -18,7 +21,27 @@
1821
load
1922
migrate))
2023

24+
(defn- pg-object-fn [pg-enum-type]
25+
(fn [value]
26+
(doto (PGobject.)
27+
(.setType pg-enum-type)
28+
(.setValue (name value)))))
29+
30+
(defn- configure-toucan []
31+
(db/set-default-db-connection! {:datasource datasource})
32+
(models/set-root-namespace! 'wheel.model)
33+
(db/set-default-automatically-convert-dashes-and-underscores! true)
34+
(models/add-type! :event-level
35+
:in (pg-object-fn "event_level")
36+
:out keyword)
37+
(models/add-type! :channel-name
38+
:in (pg-object-fn "channel_name")
39+
:out keyword))
40+
41+
(mount/defstate toucan
42+
:start (configure-toucan))
43+
2144
(comment
22-
(mount/start)
45+
(user/reset)
2346
(migrate)
2447
(mount/stop))

clojure/wheel/src/wheel/infra/log.clj

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
(:require [taoensso.timbre :as timbre]
33
[cheshire.core :as json]
44
[clojure.spec.alpha :as s]
5-
[wheel.middleware.event :as event]))
5+
[wheel.middleware.event :as event]
6+
[wheel.infra.log-appender.database :as database]))
67

78
(defn- json-output [{:keys [msg_]}]
89
(let [event (read-string (force msg_))]
910
(json/generate-string event)))
1011

1112
(defn init []
12-
(timbre/merge-config! {:output-fn json-output}))
13+
(timbre/merge-config! {:output-fn json-output
14+
:appenders {:database database/appender}}))
1315

1416
(defn write! [{:keys [level]
1517
:as event}]
@@ -33,12 +35,11 @@
3335
(write! {:level :info :name :foo})
3436
(s/check-asserts false)
3537
(s/assert ::event/event {:level :info :name :foo})
36-
(write! {:name :ranging/succeeded
38+
(write! {:name :deranging/succeeded
3739
:type :domain
3840
:level :info
39-
:channel-id 1
40-
:timestamp "2019-10-01T21:56+05:30"
41-
:id #uuid "8e70f4df-fc3d-4474-8ee9-33f4c87bf934"
42-
:parent-id #uuid "20c84be2-7ec2-4127-8d39-a9cb4065a9ce"
41+
:channel-id "UB"
42+
:timestamp "2019-10-04T15:56+05:30"
43+
:id (java.util.UUID/randomUUID)
4344
:channel-name :tata-cliq})
4445
)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
(ns wheel.infra.log-appender.database
2+
(:require [wheel.model.event :as event]))
3+
4+
(defn- append-to-db [{:keys [msg_]}]
5+
(let [evnt (read-string (force msg_))]
6+
(when (= :domain (:type evnt))
7+
(event/create! evnt))))
8+
9+
(def appender {:enabled? true
10+
:output-fn :inherit
11+
:async? true
12+
:fn append-to-db})

clojure/wheel/src/wheel/middleware/event.clj

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

2727
(s/def ::event (s/multi-spec event-type :type))
2828

29+
(defn domain? [event]
30+
(and (s/valid? ::event event) (= :domain (:type event))))
31+
2932
(comment
3033
(s/valid?
3134
::event
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
(ns wheel.model.event
2+
(:require [toucan.models :as models]
3+
[clojure.spec.alpha :as s]
4+
[toucan.db :as db]
5+
[wheel.middleware.event :as event])
6+
(:import [java.time OffsetDateTime]
7+
[java.time.format DateTimeFormatter]))
8+
9+
(models/defmodel Event :event
10+
models/IModel
11+
(types [_]
12+
{:name :keyword
13+
:channel-name :channel-name
14+
:level :event-level}))
15+
16+
(defn- timestamp->offset-date-time [timestamp]
17+
(OffsetDateTime/parse timestamp DateTimeFormatter/ISO_OFFSET_DATE_TIME))
18+
19+
(defn create! [new-event]
20+
{:pre [(s/assert ::event/event new-event)
21+
(s/assert event/domain? new-event)]}
22+
(as-> new-event evt
23+
(update evt :timestamp timestamp->offset-date-time)
24+
(dissoc evt :type)
25+
(db/insert! Event evt)))
26+
27+
(comment
28+
(create! {:name :ranging/succeeded
29+
:type :domain
30+
:channel-id "UA"
31+
:level :info
32+
:timestamp "2019-10-01T12:30+05:30"
33+
:id (java.util.UUID/randomUUID)
34+
:channel-name :tata-cliq}))

0 commit comments

Comments
 (0)