/
reporter.clj
38 lines (33 loc) · 1.65 KB
/
reporter.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
(ns clojider-gatling-highcharts-reporter.reporter
(:require [clojure-csv.core :refer [write-csv]])
(:import (java.time ZoneId)))
(defn- flatten-one-level [coll]
(mapcat #(if (sequential? %) % [%]) coll))
(defn- map-request [scenario-name request]
(let [start (str (:start request))
end (str (:end request))
id (str (:id request))
execution-start start
request-end start
response-start end
execution-end end
result (if (:result request) "OK" "KO")]
[scenario-name id "REQUEST" "" (:name request) execution-start request-end response-start execution-end result "\u0020"]))
(defn- scenario->rows [scenario]
(let [start (str (:start scenario))
end (str (:end scenario))
id (str (:id scenario))
scenario-start [(:name scenario) id "USER" "START" start id]
scenario-end [(:name scenario) id "USER" "END" end end]
requests (mapcat #(vector (map-request (:name scenario) %)) (:requests scenario))]
(concat [scenario-start] requests [scenario-end])))
(defn gatling-csv-lines [start-time simulation _ results]
(let [timestamp (-> start-time (.atZone (ZoneId/systemDefault)) .toInstant .toEpochMilli str)
header ["clj-gatling" (:name simulation) "RUN" timestamp "\u0020" "2.0"]]
(conj (flatten-one-level (mapcat #(vector (scenario->rows %)) results)) header)))
(defn csv-writer [path start-time simulation idx results]
(let [result-lines (gatling-csv-lines start-time simulation idx results)
csv (write-csv result-lines :delimiter "\t" :end-of-line "\n")
file-name (str path "/simulation" idx ".log")]
(spit file-name csv)
[file-name]))