1
+ require " log"
2
+
1
3
require " crometheus"
2
4
require " kemal"
3
5
@@ -6,6 +8,29 @@ require "./args"
6
8
require " ./metrics/*"
7
9
8
10
module GlusterMetricsExporter
11
+ class ExporterAPILogHandler < Kemal::BaseLogHandler
12
+ def initialize
13
+ end
14
+
15
+ def call (context : HTTP ::Server ::Context )
16
+ elapsed_time = Time .measure { call_next(context) }
17
+ elapsed_text = elapsed_text(elapsed_time)
18
+ Log .info & .emit(" #{ context.request.method } #{ context.request.resource } " , status_code: " #{ context.response.status_code } " , duration: " #{ elapsed_text } " )
19
+ context
20
+ end
21
+
22
+ def write (message : String )
23
+ Log .info { message.strip }
24
+ end
25
+
26
+ private def elapsed_text (elapsed )
27
+ millis = elapsed.total_milliseconds
28
+ return " #{ millis.round(2 ) } ms" if millis >= 1
29
+
30
+ " #{ (millis * 1000 ).round(2 ) } µs"
31
+ end
32
+ end
33
+
9
34
# A handler to be called before calling Crometheus handler
10
35
class MetricsRunHandler < Kemal::Handler
11
36
def call (env )
@@ -42,8 +67,14 @@ module GlusterMetricsExporter
42
67
def self.run
43
68
parse_args
44
69
70
+ Dir .mkdir_p @@config .log_dir
71
+ logfile = Path [@@config .log_dir].join(@@config .log_file)
72
+ # TODO: Handle Log level from CLI arg
73
+ Log .setup(:info , Log ::IOBackend .new(File .new(logfile, " a+" )))
74
+
45
75
Crometheus .default_registry.path = @@config .metrics_path
46
76
Kemal .config.port = @@config .port
77
+ Kemal .config.logger = ExporterAPILogHandler .new
47
78
Kemal .run
48
79
end
49
80
end
0 commit comments