prometheus-splash 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db8cc49d7a0a733b08a9f744a2ac14b5196b69fc229fcd77c9c635dd9e6c61e8
4
- data.tar.gz: c839f4d20b88880a458e92de5b2d10f7d58788645fb7b03c0c8e63d403f5ec78
3
+ metadata.gz: 60d3aa2e635dbea8022a1804e9886e495648ce777db2293442ae3a16bae7e25a
4
+ data.tar.gz: 14912be5e4171daae1ee7706f98ac7974c43a96d56e7daa58a1e9a40d46b60ee
5
5
  SHA512:
6
- metadata.gz: 6d1314705d22d1da16a62b265c0a9967b3fa2cd049db1dd25af3631b144b7872da48a84d1c62d36cc9fa650cb398ab4beaba9523d46f79bde52f3b6382b586e3
7
- data.tar.gz: d8d637a2ea309860d988952f87c63b906c1b4c350dfa5327f12f84ddc0cd352c3ca4b7112ac2f180b890d2acc3553db2caaa0abda3fc1a77a0eccf88d6c44f85
6
+ metadata.gz: d66a48e63fd8940c6343113511e1ad91531037013a042a79348a755de74e6447a791854fa2ec82461c38695370402e30790ac7660fd75c0cc82c0f5ef788701d
7
+ data.tar.gz: 9d59657c45219e31af8a6c85fc137925ee03ccecc7a98e62848ba28540ec2e39df674fcd391b51334c4bc1252de487a5a55110a286707fee9a38e54bf85a3cfc
@@ -150,3 +150,8 @@
150
150
  * orchestrator rebuild
151
151
  * reshash config and reset + grammar and Cli
152
152
  * refacto config
153
+
154
+ ## V0.8.1
155
+
156
+ ### FEATURE
157
+ * #55 historisation for reports for all
data/README.md CHANGED
@@ -9,7 +9,7 @@ SPLASH is **Supervision with Prometheus of Logs and Asynchronous tasks orchestra
9
9
  * Web : http://www.ultragreen.net
10
10
  * Github : https://github.com/Ultragreen/prometheus-splash
11
11
  * Rubygems : https://rubygems.org/gems/prometheus-splash
12
- * DOC yardoc : https://www.rubydoc.info/gems/prometheus-splash/0.8.0
12
+ * DOC yardoc : https://www.rubydoc.info/gems/prometheus-splash/0.8.1
13
13
 
14
14
  Prometheus Logs and Batchs supervision over PushGateway
15
15
 
@@ -26,9 +26,15 @@
26
26
  # :port: 6379
27
27
  # #:auth: "mykey"
28
28
  # :base: 1
29
- :transferts_trace:
29
+ :transfers_trace:
30
30
  :type: :file
31
- :path: /var/run/splash/transferts
31
+ :path: /var/run/splash/transfers
32
+ :logs_trace:
33
+ :type: :file
34
+ :path: /var/run/splash/logs
35
+ :process_trace:
36
+ :type: :file
37
+ :path: /var/run/splash/process
32
38
 
33
39
  :transports:
34
40
  :active: :rabbitmq
@@ -122,15 +128,21 @@
122
128
  - :label: :log_app_1
123
129
  :log: /tmp/test
124
130
  :pattern: ERROR
131
+ :retention:
132
+ :hours: 5
125
133
  - :label: :log_app_2
126
134
  :log: /tmp/test2
127
135
  :pattern: ERROR
136
+ :retention:
137
+ :hours: 5
128
138
 
129
139
  ### configuration of monitored processes
130
140
  :processes:
131
141
  - :process: cron
132
142
  :patterns:
133
143
  - cron
144
+ :retention:
145
+ :hours: 5
134
146
 
135
147
 
136
148
  ###
@@ -93,6 +93,9 @@ module CLISplash
93
93
  option :at, :type => :string
94
94
  option :in, :type => :string
95
95
  def schedule(name)
96
+ unless is_root? then
97
+ splash_exit case: :not_root, :more => "Command scheduling"
98
+ end
96
99
  log = get_logger
97
100
  log.level = :fatal if options[:quiet]
98
101
  hostname = (options[:hostname])? options[:hostname] : Socket.gethostname
@@ -129,6 +132,9 @@ module CLISplash
129
132
  LONGDESC
130
133
  option :hostname, :type => :string, :aliases => "-H"
131
134
  def treeview(command)
135
+ unless is_root? then
136
+ splash_exit case: :not_root, :more => "Command treeview"
137
+ end
132
138
  depht = 0
133
139
  log = get_logger
134
140
  if options[:hostname] then
@@ -179,6 +185,9 @@ module CLISplash
179
185
  option :detail, :type => :boolean, :aliases => "-D"
180
186
  option :hostname, :type => :string, :aliases => "-H"
181
187
  def list
188
+ unless is_root? then
189
+ splash_exit case: :not_root, :more => "Command list"
190
+ end
182
191
  log = get_logger
183
192
  list = {}
184
193
  if options[:hostname] then
@@ -227,6 +236,9 @@ module CLISplash
227
236
  LONGDESC
228
237
  option :hostname, :type => :string, :aliases => "-H"
229
238
  def show(command)
239
+ unless is_root? then
240
+ splash_exit case: :not_root, :more => "Command show specifications"
241
+ end
230
242
  log = get_logger
231
243
  list = {}
232
244
  if options[:hostname] then
@@ -265,6 +277,57 @@ module CLISplash
265
277
  end
266
278
  end
267
279
 
280
+
281
+
282
+ # Thor method : show commands executions history
283
+ long_desc <<-LONGDESC
284
+ show commands executions history for LABEL\n
285
+ LONGDESC
286
+ option :table, :type => :boolean, :aliases => "-t"
287
+ desc "history LABEL", "show commands executions history"
288
+ def history(command)
289
+ if is_root? then
290
+ log = get_logger
291
+ log.info "Log : #{command}#"
292
+ config = get_config
293
+ if options[:table] then
294
+ table = TTY::Table.new do |t|
295
+ t << ["Start Date","Status", "end_date", "Execution time","STDOUT empty ? ", "STDERR empty ? "]
296
+ t << ['','','','','','']
297
+ CmdRecords::new(command).get_all_records.each do |item|
298
+ record =item.keys.first
299
+ value=item[record]
300
+ t << [record, value[:status].to_s,
301
+ value[:end_date],
302
+ value[:exec_time],
303
+ value[:stdout].empty?,
304
+ value[:stdout].empty?]
305
+ end
306
+ end
307
+ if check_unicode_term then
308
+ puts table.render(:unicode)
309
+ else
310
+ puts table.render(:ascii)
311
+ end
312
+
313
+ else
314
+ CmdRecords::new(command).get_all_records.each do |item|
315
+ record =item.keys.first
316
+ value=item[record]
317
+ log.item record
318
+ log.arrow "Status : #{value[:status].to_s}"
319
+ log.arrow "End date : #{value[:end_date]}"
320
+ log.arrow "Execution time : #{value[:exec_time]}"
321
+ log.arrow "STDOUT empty ? : #{value[:stdout].empty?}"
322
+ log.arrow "STDERR empty ? : #{value[:stderr].empty?}"
323
+ end
324
+ end
325
+ splash_exit case: :quiet_exit
326
+ else
327
+ splash_exit case: :not_root, :more => "Command execution history"
328
+ end
329
+ end
330
+
268
331
  # Thor method : getting information on the last execution of a command
269
332
  desc "lastrun COMMAND", "Show last running result for specific configured command COMMAND"
270
333
  long_desc <<-LONGDESC
@@ -273,6 +336,9 @@ module CLISplash
273
336
  LONGDESC
274
337
  option :hostname, :type => :string, :aliases => "-H"
275
338
  def lastrun(command)
339
+ unless is_root? then
340
+ splash_exit case: :not_root, :more => "Command last execution report"
341
+ end
276
342
  log = get_logger
277
343
  backend = get_backend :execution_trace
278
344
  redis = (backend.class == Splash::Backends::Redis)? true : false
@@ -294,7 +360,7 @@ module CLISplash
294
360
  tp = Template::new(
295
361
  list_token: get_config.execution_template_tokens,
296
362
  template_file: get_config.execution_template_path)
297
- tp.map YAML::load(res)
363
+ tp.map YAML::load(res).last.values.first
298
364
  log.flat tp.output
299
365
  else
300
366
  log.ko "Command not already runned."
@@ -305,6 +371,58 @@ module CLISplash
305
371
  end
306
372
  end
307
373
 
374
+
375
+ # Thor method : getting information on one specific execution of a command
376
+ desc "onerun COMMAND", "Show running result for specific configured command COMMAND"
377
+ long_desc <<-LONGDESC
378
+ Show specific running result for specific configured command COMMAND\n
379
+ with --hostname <HOSTNAME>, an other Splash monitored server (only with Redis backend configured)
380
+ with --date <DATE>, a date format string (same as in history ouput)
381
+
382
+ LONGDESC
383
+ option :hostname, :type => :string, :aliases => "-H"
384
+ option :date, :type => :string, :aliases => "-D", :required => true
385
+ def onerun(command)
386
+ unless is_root? then
387
+ splash_exit case: :not_root, :more => "Command specific execution report"
388
+ end
389
+ log = get_logger
390
+ backend = get_backend :execution_trace
391
+ redis = (backend.class == Splash::Backends::Redis)? true : false
392
+ if not redis and options[:hostname] then
393
+ splash_exit case: :specific_config_required, :more => "Redis backend is requiered for Remote execution report request"
394
+ end
395
+ splash_exit case: :not_root if not is_root? and not redis
396
+ list = get_config.commands.keys
397
+ if options[:hostname] then
398
+ options[:hostname] = Socket.gethostname if options[:hostname] == 'hostname'
399
+ list = backend.list("*", options[:hostname]).map(&:to_sym)
400
+ end
401
+ if list.include? command.to_sym then
402
+ log.info "Splash command #{command} previous execution report:\n"
403
+ req = { :key => command}
404
+ req[:hostname] = options[:hostname] if options[:hostname]
405
+ if backend.exist? req then
406
+ res = backend.get req
407
+ tp = Template::new(
408
+ list_token: get_config.execution_template_tokens,
409
+ template_file: get_config.execution_template_path)
410
+ prov = YAML::load(res).select{|key,value| key.keys.first == options[:date]}
411
+ if prov.empty? then
412
+ log.ko "Command not runned one this date or date misformatted."
413
+ else
414
+ tp.map prov.first.values.first
415
+ log.flat tp.output
416
+ end
417
+ else
418
+ log.ko "Command not already runned."
419
+ end
420
+ splash_exit case: :quiet_exit
421
+ else
422
+ splash_exit case: :not_found, :more => "Command report never runned remotly" if options[:hostname]
423
+ end
424
+ end
425
+
308
426
  # Thor method : getting the list of avaibles executions reports
309
427
  desc "getreportlist", "list all executions report results "
310
428
  long_desc <<-LONGDESC
@@ -320,6 +438,9 @@ module CLISplash
320
438
  option :all, :type => :boolean, :negate => false, :aliases => "-A"
321
439
  option :detail, :type => :boolean, :aliases => "-D"
322
440
  def getreportlist
441
+ unless is_root? then
442
+ splash_exit case: :not_root, :more => "Command execution report list"
443
+ end
323
444
  log = get_logger
324
445
  options[:hostname] = Socket.gethostname if options[:hostname] == 'hostname'
325
446
  if options[:hostname] and options[:all] then
@@ -355,10 +476,9 @@ module CLISplash
355
476
  req = { :key => command }
356
477
  req[:hostname] = host if options[:all]
357
478
  res = YAML::load(backend.get(req))
358
- log.arrow "Status : #{res[:status]}"
359
- log.arrow "Start date : #{res[:start_date]}"
360
- log.arrow "End date : #{res[:end_date]}"
361
- log.arrow "Execution time : #{res[:exec_time]}"
479
+ res.each do |record|
480
+ log.arrow "#{record.keys.first} : #{record[record.keys.first][:status]}"
481
+ end
362
482
  end
363
483
  end
364
484
  splash_exit case: :quiet_exit
@@ -12,61 +12,73 @@ module CLISplash
12
12
  # Thor method : running Splash configured logs monitors analyse
13
13
  desc "analyse", "analyze logs defined in Splash config"
14
14
  def analyse
15
- log = get_logger
16
- results = LogScanner::new
17
- res = results.analyse
18
- log.info "SPlash Configured log monitors :"
19
- full_status = true
20
- results.output.each do |result|
21
- if result[:status] == :clean then
22
- log.ok "Log : #{result[:log]} with label : #{result[:label]} : no errors"
23
- log.item "Detected pattern : #{result[:pattern]}"
24
- log.item "Nb lines = #{result[:lines]}"
25
- elsif result[:status] == :missing then
26
- log.ko "Log : #{result[:log]} with label : #{result[:label]} : missing !"
27
- log.item "Detected pattern : #{result[:pattern]}"
28
- else
29
- log.ko "Log : #{result[:log]} with label : #{result[:label]} : #{result[:count]} errors"
30
- log.item "Detected pattern : #{result[:pattern]}"
31
- log.item "Nb lines = #{result[:lines]}"
32
- end
15
+ if is_root? then
16
+ log = get_logger
17
+ results = LogScanner::new
18
+ res = results.analyse
19
+ log.info "SPlash Configured log monitors :"
20
+ full_status = true
21
+ results.output.each do |result|
22
+ if result[:status] == :clean then
23
+ log.ok "Log : #{result[:log]} with label : #{result[:label]} : no errors"
24
+ log.item "Detected pattern : #{result[:pattern]}"
25
+ log.item "Nb lines = #{result[:lines]}"
26
+ elsif result[:status] == :missing then
27
+ log.ko "Log : #{result[:log]} with label : #{result[:label]} : missing !"
28
+ log.item "Detected pattern : #{result[:pattern]}"
29
+ else
30
+ log.ko "Log : #{result[:log]} with label : #{result[:label]} : #{result[:count]} errors"
31
+ log.item "Detected pattern : #{result[:pattern]}"
32
+ log.item "Nb lines = #{result[:lines]}"
33
+ end
33
34
 
34
- full_status = false unless result[:status] == :clean
35
- end
35
+ full_status = false unless result[:status] == :clean
36
+ end
36
37
 
37
- if full_status then
38
- log.ok "Global status : no error found"
38
+ if full_status then
39
+ log.ok "Global status : no error found"
40
+ else
41
+ log.error "Global status : some error found"
42
+ end
43
+ splash_exit case: :quiet_exit
39
44
  else
40
- log.error "Global status : some error found"
45
+ splash_exit case: :not_root, :more => "Log analysis"
41
46
  end
42
- splash_exit case: :quiet_exit
43
47
  end
44
48
 
45
49
 
46
50
  # Thor method : running Splash configured logs monitors analyse and sending to Prometheus Pushgateway
47
51
  desc "monitor", "monitor logs defined in Splash config"
48
52
  def monitor
49
- log = get_logger
50
- log.level = :fatal if options[:quiet]
51
- result = LogScanner::new
52
- result.analyse
53
- splash_exit result.notify
53
+ if is_root? then
54
+ log = get_logger
55
+ log.level = :fatal if options[:quiet]
56
+ result = LogScanner::new
57
+ result.analyse
58
+ splash_exit result.notify
59
+ else
60
+ splash_exit case: :not_root, :more => "Log analysis"
61
+ end
54
62
 
55
63
  end
56
64
 
57
65
  # Thor method : display a specific Splash configured log monitor
58
66
  desc "show LOG", "show Splash configured log monitoring for LOG"
59
67
  def show(logrecord)
60
- log = get_logger
61
- log_record_set = get_config.logs.select{|item| item[:log] == logrecord or item[:label] == logrecord.to_sym}
62
- unless log_record_set.empty? then
63
- record = log_record_set.first
64
- log.info "Splash log monitor : #{record[:log]}"
65
- log.item "pattern : /#{record[:pattern]}/"
66
- log.item "label : #{record[:label]}"
67
- splash_exit case: :quiet_exit
68
+ if is_root? then
69
+ log = get_logger
70
+ log_record_set = get_config.logs.select{|item| item[:log] == logrecord or item[:label] == logrecord.to_sym}
71
+ unless log_record_set.empty? then
72
+ record = log_record_set.first
73
+ log.info "Splash log monitor : #{record[:log]}"
74
+ log.item "pattern : /#{record[:pattern]}/"
75
+ log.item "label : #{record[:label]}"
76
+ splash_exit case: :quiet_exit
77
+ else
78
+ splash_exit case: :not_found, :more => "log not configured"
79
+ end
68
80
  else
69
- splash_exit case: :not_found, :more => "log not configured"
81
+ splash_exit case: :not_root, :more => "Log analysis"
70
82
  end
71
83
  end
72
84
 
@@ -78,17 +90,66 @@ module CLISplash
78
90
  LONGDESC
79
91
  option :detail, :type => :boolean, :aliases => "-D"
80
92
  def list
81
- log = get_logger
82
- log.info "Splash configured log monitoring :"
83
- log_record_set = get_config.logs
84
- log.ko 'No configured commands found' if log_record_set.empty?
85
- log_record_set.each do |record|
86
- log.item "log monitor : #{record[:log]} label : #{record[:label]}"
87
- if options[:detail] then
88
- log.arrow "pattern : /#{record[:pattern]}/"
93
+ if is_root? then
94
+ log = get_logger
95
+ log.info "Splash configured log monitoring :"
96
+ log_record_set = get_config.logs
97
+ log.ko 'No configured commands found' if log_record_set.empty?
98
+ log_record_set.each do |record|
99
+ log.item "log monitor : #{record[:log]} label : #{record[:label]}"
100
+ if options[:detail] then
101
+ log.arrow "pattern : /#{record[:pattern]}/"
102
+ end
103
+ end
104
+ splash_exit case: :quiet_exit
105
+ else
106
+ splash_exit case: :not_root, :more => "Log analysis"
107
+ end
108
+ end
109
+
110
+
111
+ # Thor method : show logs monitoring history
112
+ long_desc <<-LONGDESC
113
+ show logs monitoring history for LABEL\n
114
+ LONGDESC
115
+ option :table, :type => :boolean, :aliases => "-t"
116
+ desc "history LABEL", "show logs monitoring history"
117
+ def history(label)
118
+ if is_root? then
119
+ log = get_logger
120
+ log.info "Log : #{label}"
121
+ config = get_config
122
+ if options[:table] then
123
+ table = TTY::Table.new do |t|
124
+ t << ["Start Date", "File","Status", "Nb errors", "Nb lines"]
125
+ t << ['','','','','']
126
+ LogsRecords::new(label).get_all_records.each do |item|
127
+ record =item.keys.first
128
+ value=item[record]
129
+
130
+ t << [record, value[:file], value[:status].to_s, value[:errors], value[:lines]]
131
+ end
132
+ end
133
+ if check_unicode_term then
134
+ puts table.render(:unicode)
135
+ else
136
+ puts table.render(:ascii)
137
+ end
138
+
139
+ else
140
+ LogsRecords::new(label).get_all_records.each do |item|
141
+ record =item.keys.first
142
+ value=item[record]
143
+ log.item record
144
+ log.arrow "Status : #{value[:status].to_s}"
145
+ log.arrow "nb files : #{value[:errors]}"
146
+ log.arrow "nb lines : #{value[:lines]}"
147
+ end
89
148
  end
149
+ splash_exit case: :quiet_exit
150
+ else
151
+ splash_exit case: :not_root, :more => "Log analysis"
90
152
  end
91
- splash_exit case: :quiet_exit
92
153
  end
93
154
 
94
155
  end
@@ -12,65 +12,77 @@ module CLISplash
12
12
  # Thor method : unning Splash configured processes monitors analyse
13
13
  desc "analyse", "analyze processes defined in Splash config"
14
14
  def analyse
15
- log = get_logger
16
- results = ProcessScanner::new
17
- res = results.analyse
18
- log.info "Splash Configured process records :"
19
- full_status = true
20
- results.output.each do |result|
21
- if result[:status] == :running then
22
- log.ok "Process : #{result[:process]} : running"
23
- log.item "Detected patterns : "
24
- result[:patterns].each do |pattern|
25
- log.arrow "/#{pattern}/"
15
+ if is_root? then
16
+ log = get_logger
17
+ results = ProcessScanner::new
18
+ res = results.analyse
19
+ log.info "Splash Configured process records :"
20
+ full_status = true
21
+ results.output.each do |result|
22
+ if result[:status] == :running then
23
+ log.ok "Process : #{result[:process]} : running"
24
+ log.item "Detected patterns : "
25
+ result[:patterns].each do |pattern|
26
+ log.arrow "/#{pattern}/"
27
+ end
28
+ log.item "CPU usage in % : #{result[:cpu]} "
29
+ log.item "Memory usage in % : #{result[:mem]} "
30
+ else
31
+ log.ko "Process : #{result[:process]} : inexistant"
32
+ log.item "Detected patterns : "
33
+ result[:patterns].each do |pattern|
34
+ log.arrow "/#{pattern}/"
35
+ end
26
36
  end
27
- log.item "CPU usage in % : #{result[:cpu]} "
28
- log.item "Memory usage in % : #{result[:mem]} "
29
- else
30
- log.ko "Process : #{result[:process]} : inexistant"
31
- log.item "Detected patterns : "
32
- result[:patterns].each do |pattern|
33
- log.arrow "/#{pattern}/"
34
- end
35
- end
36
37
 
37
- full_status = false unless result[:status] == :running
38
- end
38
+ full_status = false unless result[:status] == :running
39
+ end
39
40
 
40
- if full_status then
41
- log.ok "Global status : no error found"
41
+ if full_status then
42
+ log.ok "Global status : no error found"
43
+ else
44
+ log.error "Global status : some error found"
45
+ end
46
+ splash_exit case: :quiet_exit
42
47
  else
43
- log.error "Global status : some error found"
48
+ splash_exit case: :not_root, :more => "Process analysis"
44
49
  end
45
- splash_exit case: :quiet_exit
46
50
  end
47
51
 
48
52
 
49
53
  # Thor method : running Splash configured processes monitors analyse and sending to Prometheus Pushgateway
50
54
  desc "monitor", "monitor processes defined in Splash config"
51
55
  def monitor
52
- log = get_logger
53
- log.level = :fatal if options[:quiet]
54
- result = ProcessScanner::new
55
- result.analyse
56
- splash_exit result.notify
56
+ if is_root? then
57
+ log = get_logger
58
+ log.level = :fatal if options[:quiet]
59
+ result = ProcessScanner::new
60
+ result.analyse
61
+ splash_exit result.notify
62
+ else
63
+ splash_exit case: :not_root, :more => "Process analysis"
64
+ end
57
65
  end
58
66
 
59
67
  # Thor method : display a specific Splash configured process monitor
60
68
  desc "show PROCESS", "show Splash configured process record for PROCESS"
61
69
  def show(record)
62
- log = get_logger
63
- process_recordset = get_config.processes.select{|item| item[:process] == record }
64
- unless process_recordset.empty? then
65
- record = process_recordset.first
66
- log.item "Process monitor : #{record[:process]}"
67
- log.arrow "patterns :"
68
- record[:patterns].each do |pattern|
69
- log.flat " - /#{pattern}/"
70
+ if is_root? then
71
+ log = get_logger
72
+ process_recordset = get_config.processes.select{|item| item[:process] == record }
73
+ unless process_recordset.empty? then
74
+ record = process_recordset.first
75
+ log.item "Process monitor : #{record[:process]}"
76
+ log.arrow "patterns :"
77
+ record[:patterns].each do |pattern|
78
+ log.flat " - /#{pattern}/"
79
+ end
80
+ splash_exit case: :quiet_exit
81
+ else
82
+ splash_exit case: :not_found, :more => "Process not configured"
70
83
  end
71
- splash_exit case: :quiet_exit
72
84
  else
73
- splash_exit case: :not_found, :more => "Process not configured"
85
+ splash_exit case: :not_root, :more => "Process analysis"
74
86
  end
75
87
  end
76
88
 
@@ -82,20 +94,68 @@ module CLISplash
82
94
  LONGDESC
83
95
  option :detail, :type => :boolean, :aliases => "-D"
84
96
  def list
85
- log = get_logger
86
- log.info "Splash configured process records :"
87
- process_recordset = get_config.processes
88
- log.ko 'No configured process found' if process_recordset.empty?
89
- process_recordset.each do |record|
90
- log.item "Process monitor : #{record[:process]}"
91
- if options[:detail] then
92
- log.arrow "patterns :"
93
- record[:patterns].each do |pattern|
94
- log.flat " - /#{pattern}/"
97
+ if is_root? then
98
+ log = get_logger
99
+ log.info "Splash configured process records :"
100
+ process_recordset = get_config.processes
101
+ log.ko 'No configured process found' if process_recordset.empty?
102
+ process_recordset.each do |record|
103
+ log.item "Process monitor : #{record[:process]}"
104
+ if options[:detail] then
105
+ log.arrow "patterns :"
106
+ record[:patterns].each do |pattern|
107
+ log.flat " - /#{pattern}/"
108
+ end
95
109
  end
96
110
  end
111
+ splash_exit case: :quiet_exit
112
+ else
113
+ splash_exit case: :not_root, :more => "Process analysis"
114
+ end
115
+ end
116
+
117
+
118
+ # Thor method : show logs monitoring history
119
+ long_desc <<-LONGDESC
120
+ show Process monitoring history for LABEL\n
121
+ LONGDESC
122
+ option :table, :type => :boolean, :aliases => "-t"
123
+ desc "history PROCESS", "show process monitoring history"
124
+ def history(process)
125
+ if is_root? then
126
+ log = get_logger
127
+ log.info "Process : #{process}"
128
+ config = get_config
129
+ if options[:table] then
130
+ table = TTY::Table.new do |t|
131
+ t << ["Start Date", "Status", "CPU Percent", "MEM Percent"]
132
+ t << ['','','','']
133
+ ProcessRecords::new(process).get_all_records.each do |item|
134
+ record =item.keys.first
135
+ value=item[record]
136
+ t << [record, value[:status].to_s, value[:cpu_percent], value[:mem_percent]]
137
+ end
138
+ end
139
+ if check_unicode_term then
140
+ puts table.render(:unicode)
141
+ else
142
+ puts table.render(:ascii)
143
+ end
144
+
145
+ else
146
+ ProcessRecords::new(process).get_all_records.each do |item|
147
+ record =item.keys.first
148
+ value=item[record]
149
+ log.item record
150
+ log.arrow "Status : #{value[:status].to_s}"
151
+ log.arrow "CPU Percent : #{value[:cpu_percent]}"
152
+ log.arrow "MEM Percent : #{value[:mem_percent]}"
153
+ end
154
+ end
155
+ splash_exit case: :quiet_exit
156
+ else
157
+ splash_exit case: :not_root, :more => "Process analysis"
97
158
  end
98
- splash_exit case: :quiet_exit
99
159
  end
100
160
 
101
161
  end
@@ -44,7 +44,10 @@ module CLISplash
44
44
  log = get_logger
45
45
  log.item "Transfer : #{name}"
46
46
  config = get_config
47
- data = TxRecords::new(name).get_all_records.select {|record,value| record == options[:date]}.first
47
+ data = TxRecords::new(name).get_all_records.select {|item|
48
+ record =item.keys.first
49
+ value=item[record]
50
+ record == options[:date]}.first
48
51
  if data.nil? then
49
52
  log.ko "Result for #{name} on date #{options[:date]} not found"
50
53
  splash_exit case: :not_found, :more => "Result inexistant"
@@ -93,7 +96,9 @@ module CLISplash
93
96
  table = TTY::Table.new do |t|
94
97
  t << ["Start Date", "End date", "time", "Files count","File count error","Status"]
95
98
  t << ['','','','','','']
96
- TxRecords::new(name).get_all_records.each do |record,value|
99
+ TxRecords::new(name).get_all_records.each do |item|
100
+ record =item.keys.first
101
+ value=item[record]
97
102
  start_date = record
98
103
  end_date = (value[:end_date].nil?)? '': value[:end_date]
99
104
  time = (value[:time].nil?)? '': value[:time]
@@ -111,7 +116,9 @@ module CLISplash
111
116
  end
112
117
 
113
118
  else
114
- TxRecords::new(name).get_all_records.each do |record,value|
119
+ TxRecords::new(name).get_all_records.each do |item|
120
+ record =item.keys.first
121
+ value=item[record]
115
122
  failed = (value[:count].nil? or value[:done].nil?)? 'undef': value[:count].to_i - value[:done].count
116
123
  if value[:end_date].nil? then
117
124
  log.item "Event : #{record} STATUS : #{value[:status]}"
@@ -6,6 +6,78 @@ module Splash
6
6
  # Splash Commands module/namespace
7
7
  module Commands
8
8
 
9
+
10
+ class CmdNotifier
11
+
12
+ @@registry = Prometheus::Client::Registry::new
13
+ @@metric_exitcode = Prometheus::Client::Gauge.new(:exitcode, docstring: 'SPLASH metric batch exitcode')
14
+ @@metric_time = Prometheus::Client::Gauge.new(:exectime, docstring: 'SPLASH metric batch execution time')
15
+ @@registry.register(@@metric_exitcode)
16
+ @@registry.register(@@metric_time)
17
+
18
+
19
+
20
+ def initialize(options={})
21
+ @config = get_config
22
+ @url = @config.prometheus_pushgateway_url
23
+ @name = "cmd_#{options[:name].to_s}"
24
+ @exitcode = options[:exitcode]
25
+ @time = options[:time]
26
+ end
27
+
28
+ # send metrics to Prometheus PushGateway
29
+ # @return [Bool]
30
+ def notify
31
+ unless verify_service url: @url then
32
+ return { :case => :service_dependence_missing, :more => "Prometheus Notification not send."}
33
+ end
34
+ @@metric_exitcode.set(@exitcode)
35
+ @@metric_time.set(@time)
36
+ hostname = Socket.gethostname
37
+ return Prometheus::Client::Push.new(@name, hostname, @url).add(@@registry)
38
+ end
39
+
40
+ end
41
+
42
+
43
+ class CmdRecords
44
+ include Splash::Backends
45
+ include Splash::Constants
46
+ def initialize(name)
47
+ @name = name
48
+ @backend = get_backend :execution_trace
49
+ end
50
+
51
+ def purge(retention)
52
+ retention = {} if retention.nil?
53
+ if retention.include? :hours then
54
+ adjusted_datetime = DateTime.now - retention[:hours].to_f / 24
55
+ elsif retention.include? :hours then
56
+ adjusted_datetime = DateTime.now - retention[:days].to_i
57
+ else
58
+ adjusted_datetime = DateTime.now - DEFAULT_RETENTION
59
+ end
60
+
61
+ data = get_all_records
62
+
63
+ data.delete_if { |item|
64
+ DateTime.parse(item.keys.first) <= (adjusted_datetime)}
65
+ @backend.put key: @name, value: data.to_yaml
66
+ end
67
+
68
+ def add_record(record)
69
+ data = get_all_records
70
+ data.push({ DateTime.now.to_s => record })
71
+ @backend.put key: @name, value: data.to_yaml
72
+ end
73
+
74
+ def get_all_records(options={})
75
+ return (@backend.exist?({key: @name}))? YAML::load(@backend.get({key: @name})) : []
76
+ end
77
+
78
+ end
79
+
80
+
9
81
  # command execution wrapper
10
82
  class CommandWrapper
11
83
  include Splash::Templates
@@ -16,11 +88,7 @@ module Splash
16
88
  include Splash::Transports
17
89
 
18
90
 
19
- @@registry = Prometheus::Client::Registry::new
20
- @@metric_exitcode = Prometheus::Client::Gauge.new(:errorcode, docstring: 'SPLASH metric batch errorcode')
21
- @@metric_time = Prometheus::Client::Gauge.new(:exectime, docstring: 'SPLASH metric batch execution time')
22
- @@registry.register(@@metric_exitcode)
23
- @@registry.register(@@metric_time)
91
+
24
92
 
25
93
  # Constructor
26
94
  # @param [String] name the name of the command
@@ -43,14 +111,17 @@ module Splash
43
111
  # @param [String] value numeric.to_s
44
112
  # @param [String] time execution time numeric.to_s
45
113
  # @return [Hash] Exiter case :quiet_exit
46
- def notify(value,time)
114
+ def notify(value,time, session)
115
+ log = get_logger
47
116
  unless verify_service url: @config.prometheus_pushgateway_url then
48
117
  return { :case => :service_dependence_missing, :more => "Prometheus Notification not send."}
49
118
  end
50
- @@metric_exitcode.set(value)
51
- @@metric_time.set(time)
52
- hostname = Socket.gethostname
53
- Prometheus::Client::Push.new(@name, hostname, @url).add(@@registry)
119
+ cmdmonitor = CmdNotifier::new({name: @name, exitcode: value, time: time})
120
+ if cmdmonitor.notify then
121
+ log.ok "Sending metrics to Prometheus Pushgateway",session
122
+ else
123
+ log.ko "Failed to send metrics to Prometheus Pushgateway",session
124
+ end
54
125
  return { :case => :quiet_exit}
55
126
  end
56
127
 
@@ -110,9 +181,6 @@ module Splash
110
181
  stdout, stderr, status = Open3.capture3(@config.commands[@name.to_sym][:command])
111
182
  end
112
183
  time = Time.now - start
113
- tp = Template::new(
114
- list_token: @config.execution_template_tokens,
115
- template_file: @config.execution_template_path)
116
184
  data = Hash::new
117
185
  data[:start_date] = start_date
118
186
  data[:end_date] = DateTime.now.to_s
@@ -123,17 +191,15 @@ module Splash
123
191
  data[:stdout] = stdout
124
192
  data[:stderr] = stderr
125
193
  data[:exec_time] = time.to_s
126
- backend = get_backend :execution_trace
127
- key = @name
128
-
129
- backend.put key: key, value: data.to_yaml
194
+ cmdrec = CmdRecords::new @name
195
+ cmdrec.purge(@config.commands[@name.to_sym][:retention])
196
+ cmdrec.add_record data
130
197
  exit_code = status.exitstatus
131
198
  end
132
199
  log.ok "Command executed", session
133
200
  log.arrow "exitcode #{exit_code}", session
134
201
  if options[:notify] then
135
- acase = notify(exit_code,time.to_i)
136
- get_logger.ok "Prometheus Gateway notified.",session
202
+ acase = notify(exit_code,time.to_i,session)
137
203
  else
138
204
  log.item "Without Prometheus notification", session
139
205
  end
@@ -7,7 +7,7 @@ module Splash
7
7
  module Constants
8
8
 
9
9
  # Current splash version
10
- VERSION = "0.8.0"
10
+ VERSION = "0.8.1"
11
11
 
12
12
  # the path to th config file, not overridable by config
13
13
  CONFIG_FILE = "/etc/splash.yml"
@@ -87,8 +87,8 @@ module Splash
87
87
  # the default sdterr trace file
88
88
  WEBADMIN_STDERR_TRACE="stderr.txt"
89
89
 
90
- # default transfer retention for trace
91
- TRANSFER_DEFAULT_RETENTION=1
90
+ # default retention for trace
91
+ DEFAULT_RETENTION=1
92
92
 
93
93
  end
94
94
  end
@@ -6,6 +6,79 @@ module Splash
6
6
  # Logs namespace
7
7
  module Logs
8
8
 
9
+ class LogsNotifier
10
+
11
+ @@registry = Prometheus::Client::Registry::new
12
+ @@metric_missing = Prometheus::Client::Gauge.new(:logmissing, docstring: 'SPLASH metric log missing', labels: [:log ])
13
+ @@metric_count = Prometheus::Client::Gauge.new(:logerrors, docstring: 'SPLASH metric log error', labels: [:log ])
14
+ @@metric_lines = Prometheus::Client::Gauge.new(:loglines, docstring: 'SPLASH metric log lines numbers', labels: [:log ])
15
+ @@registry.register(@@metric_count)
16
+ @@registry.register(@@metric_missing)
17
+ @@registry.register(@@metric_lines)
18
+
19
+ def initialize(options={})
20
+ @config = get_config
21
+ @url = @config.prometheus_pushgateway_url
22
+ @name = options[:name]
23
+ @missing = options[:missing]
24
+ @lines = options[:lines]
25
+ @errors = options[:errors]
26
+ end
27
+
28
+ # send metrics to Prometheus PushGateway
29
+ # @return [Bool]
30
+ def notify
31
+ unless verify_service url: @url then
32
+ return { :case => :service_dependence_missing, :more => "Prometheus Notification not send."}
33
+ end
34
+ @@metric_missing.set(@missing, labels: { log: @name })
35
+ @@metric_count.set(@errors, labels: { log: @name })
36
+ @@metric_lines.set(@lines, labels: { log: @name })
37
+ hostname = Socket.gethostname
38
+ return Prometheus::Client::Push.new("Splash", hostname, @url).add(@@registry)
39
+ end
40
+
41
+ end
42
+
43
+ class LogsRecords
44
+ include Splash::Backends
45
+ include Splash::Constants
46
+ def initialize(name)
47
+ @name = name
48
+ @backend = get_backend :logs_trace
49
+ end
50
+
51
+ def purge(retention)
52
+ retention = {} if retention.nil?
53
+ if retention.include? :hours then
54
+ adjusted_datetime = DateTime.now - retention[:hours].to_f / 24
55
+ elsif retention.include? :hours then
56
+ adjusted_datetime = DateTime.now - retention[:days].to_i
57
+ else
58
+ adjusted_datetime = DateTime.now - DEFAULT_RETENTION
59
+ end
60
+
61
+ data = get_all_records
62
+
63
+ data.delete_if { |item|
64
+ DateTime.parse(item.keys.first) <= (adjusted_datetime)}
65
+ @backend.put key: @name, value: data.to_yaml
66
+ end
67
+
68
+ def add_record(record)
69
+ data = get_all_records
70
+ data.push({ DateTime.now.to_s => record })
71
+ @backend.put key: @name, value: data.to_yaml
72
+ end
73
+
74
+ def get_all_records(options={})
75
+ return (@backend.exist?({key: @name}))? YAML::load(@backend.get({key: @name})) : []
76
+ end
77
+
78
+ end
79
+
80
+
81
+
9
82
  # Log scanner and notifier
10
83
  class LogScanner
11
84
  include Splash::Constants
@@ -17,13 +90,7 @@ module Splash
17
90
  def initialize
18
91
  @logs_target = Marshal.load(Marshal.dump(get_config.logs))
19
92
  @config = get_config
20
- @registry = Prometheus::Client::Registry::new
21
- @metric_count = Prometheus::Client::Gauge.new(:logerrors, docstring: 'SPLASH metric log error', labels: [:log ])
22
- @metric_missing = Prometheus::Client::Gauge.new(:logmissing, docstring: 'SPLASH metric log missing', labels: [:log ])
23
- @metric_lines = Prometheus::Client::Gauge.new(:loglines, docstring: 'SPLASH metric log lines numbers', labels: [:log ])
24
- @registry.register(@metric_count)
25
- @registry.register(@metric_missing)
26
- @registry.register(@metric_lines)
93
+
27
94
  end
28
95
 
29
96
 
@@ -62,17 +129,24 @@ module Splash
62
129
  session = (options[:session]) ? options[:session] : log.get_session
63
130
  log.info "Sending metrics to Prometheus Pushgateway", session
64
131
  @logs_target.each do |item|
65
- missing = (item[:status] == :missing)? 1 : 0
66
- log.item "Sending metrics for #{item[:log]}", session
67
- @metric_count.set(item[:count], labels: { log: item[:log] })
68
- @metric_missing.set(missing, labels: { log: item[:log] })
132
+ logsrec = LogsRecords::new item[:label]
133
+ errors = (item[:count])? item[:count] : 0
69
134
  lines = (item[:lines])? item[:lines] : 0
70
- @metric_lines.set(lines, labels: { log: item[:log] })
135
+ missing = (item[:status] = :missing)? 1 : 0
136
+ file = item[:log]
137
+ logsrec.purge(item[:retention])
138
+ logsrec.add_record :status => item[:status],
139
+ :errors => errors,
140
+ :lines => lines,
141
+ :file => file
142
+
143
+ logsmonitor = LogsNotifier::new({name: item[:label], missing: missing, file: file, errors: errors, lines: lines})
144
+ if logsmonitor.notify then
145
+ log.ok "Sending metrics for log #{file} to Prometheus Pushgateway", session
146
+ else
147
+ log.ko "Failed to send metrics for log #{file} to Prometheus Pushgateway", session
148
+ end
71
149
  end
72
- hostname = Socket.gethostname
73
- url = @config.prometheus_pushgateway_url
74
- Prometheus::Client::Push.new('Splash',hostname, url).add(@registry)
75
- log.ok "Sending to Prometheus PushGateway done.", session
76
150
  return {:case => :quiet_exit }
77
151
  end
78
152
 
@@ -6,6 +6,81 @@ module Splash
6
6
  # Processes namespace
7
7
  module Processes
8
8
 
9
+
10
+ class ProcessNotifier
11
+
12
+ @@registry = Prometheus::Client::Registry::new
13
+ @@metric_status = Prometheus::Client::Gauge.new(:process_status, docstring: 'SPLASH metric process status', labels: [:process ])
14
+ @@metric_cpu_percent = Prometheus::Client::Gauge.new(:process_cpu_percent, docstring: 'SPLASH metric process CPU usage in percent', labels: [:process ])
15
+ @@metric_mem_percent = Prometheus::Client::Gauge.new(:process_mem_percent, docstring: 'SPLASH metric process MEM usage in percent', labels: [:process ])
16
+ @@registry.register(@@metric_status)
17
+ @@registry.register(@@metric_cpu_percent)
18
+ @@registry.register(@@metric_mem_percent)
19
+
20
+
21
+ def initialize(options={})
22
+ @config = get_config
23
+ @url = @config.prometheus_pushgateway_url
24
+ @name = options[:name]
25
+ @status = options[:status]
26
+ @cpu_percent = options[:cpu_percent]
27
+ @mem_percent = options[:mem_percent]
28
+ end
29
+
30
+ # send metrics to Prometheus PushGateway
31
+ # @return [Bool]
32
+ def notify
33
+ unless verify_service url: @url then
34
+ return { :case => :service_dependence_missing, :more => "Prometheus Notification not send."}
35
+ end
36
+ @@metric_mem_percent.set(@mem_percent, labels: { process: @name })
37
+ @@metric_cpu_percent.set(@cpu_percent, labels: { process: @name })
38
+ @@metric_status.set(@status, labels: { process: @name })
39
+ hostname = Socket.gethostname
40
+ return Prometheus::Client::Push.new("Splash", hostname, @url).add(@@registry)
41
+ end
42
+
43
+ end
44
+
45
+
46
+ class ProcessRecords
47
+ include Splash::Backends
48
+ include Splash::Constants
49
+
50
+ def initialize(name)
51
+ @name = name
52
+ @backend = get_backend :process_trace
53
+ end
54
+
55
+ def purge(retention)
56
+ retention = {} if retention.nil?
57
+ if retention.include? :hours then
58
+ adjusted_datetime = DateTime.now - retention[:hours].to_f / 24
59
+ elsif retention.include? :hours then
60
+ adjusted_datetime = DateTime.now - retention[:days].to_i
61
+ else
62
+ adjusted_datetime = DateTime.now - DEFAULT_RETENTION
63
+ end
64
+
65
+ data = get_all_records
66
+
67
+ data.delete_if { |item|
68
+ DateTime.parse(item.keys.first) <= (adjusted_datetime)}
69
+ @backend.put key: @name, value: data.to_yaml
70
+ end
71
+
72
+ def add_record(record)
73
+ data = get_all_records
74
+ data.push({ DateTime.now.to_s => record })
75
+ @backend.put key: @name, value: data.to_yaml
76
+ end
77
+
78
+ def get_all_records(options={})
79
+ return (@backend.exist?({key: @name}))? YAML::load(@backend.get({key: @name})) : []
80
+ end
81
+
82
+ end
83
+
9
84
  # Processes scanner and notifier
10
85
  class ProcessScanner
11
86
  include Splash::Constants
@@ -17,14 +92,6 @@ module Splash
17
92
  def initialize
18
93
  @processes_target = Marshal.load(Marshal.dump(get_config.processes))
19
94
  @config = get_config
20
- @registry = Prometheus::Client::Registry::new
21
- @metric_status = Prometheus::Client::Gauge.new(:process_status, docstring: 'SPLASH metric process status', labels: [:process ])
22
- @metric_cpu_percent = Prometheus::Client::Gauge.new(:process_cpu_percent, docstring: 'SPLASH metric process CPU usage in percent', labels: [:process ])
23
- @metric_mem_percent = Prometheus::Client::Gauge.new(:process_mem_percent, docstring: 'SPLASH metric process MEM usage in percent', labels: [:process ])
24
- @registry.register(@metric_status)
25
- @registry.register(@metric_cpu_percent)
26
- @registry.register(@metric_mem_percent)
27
-
28
95
  end
29
96
 
30
97
 
@@ -64,17 +131,21 @@ module Splash
64
131
  session = (options[:session]) ? options[:session] : log.get_session
65
132
  log.info "Sending metrics to Prometheus Pushgateway", session
66
133
  @processes_target.each do |item|
134
+ processrec = ProcessRecords::new item[:process]
67
135
  missing = (item[:status] == :missing)? 1 : 0
68
- log.item "Sending metrics for #{item[:process]}", session
69
136
  val = (item[:status] == :running )? 1 : 0
70
- @metric_status.set(val, labels: { process: item[:process] })
71
- @metric_cpu_percent.set(item[:cpu], labels: { process: item[:process] })
72
- @metric_mem_percent.set(item[:mem], labels: { process: item[:process] })
137
+ processrec.purge(item[:retention])
138
+ processrec.add_record :status => item[:status],
139
+ :cpu_percent => item[:cpu],
140
+ :mem_percent => item[:mem] ,
141
+ :process => item[:process]
142
+ processmonitor = ProcessNotifier::new({name: item[:process], status: val , cpu_percent: item[:cpu], mem_percent: item[:mem]})
143
+ if processmonitor.notify then
144
+ log.ok "Sending metrics for process #{item[:process]} to Prometheus Pushgateway", session
145
+ else
146
+ log.ko "Failed to send metrics for process #{item[:process]} to Prometheus Pushgateway", session
147
+ end
73
148
  end
74
- hostname = Socket.gethostname
75
- url = @config.prometheus_pushgateway_url
76
- Prometheus::Client::Push.new('Splash',hostname, url).add(@registry)
77
- log.ok "Sending to Prometheus PushGateway done.", session
78
149
  return {:case => :quiet_exit }
79
150
  end
80
151
 
@@ -49,40 +49,45 @@ module Splash
49
49
 
50
50
  class TxRecords
51
51
  include Splash::Backends
52
+ include Splash::Constants
53
+
52
54
  def initialize(name)
53
55
  @name = name
54
- @backend = get_backend :transferts_trace
56
+ @backend = get_backend :transfers_trace
55
57
  end
56
58
 
57
59
  def purge(retention)
60
+ retention = {} if retention.nil?
58
61
  if retention.include? :hours then
59
62
  adjusted_datetime = DateTime.now - retention[:hours].to_f / 24
60
63
  elsif retention.include? :hours then
61
64
  adjusted_datetime = DateTime.now - retention[:days].to_i
62
65
  else
63
- retention = TRANSFER_DEFAULT_RETENTION
66
+ adjusted_datetime = DateTime.now - DEFAULT_RETENTION
64
67
  end
65
68
 
66
69
  data = get_all_records
67
70
 
68
- data.delete_if { |item,value|
69
- DateTime.parse(item) <= (adjusted_datetime) and value[:status] != :prepared}
71
+ data.delete_if { |item|
72
+ DateTime.parse(item.keys.first) <= (adjusted_datetime)}
70
73
  @backend.put key: @name, value: data.to_yaml
71
74
  end
72
75
 
73
76
  def add_record(record)
74
77
  data = get_all_records
75
- data[DateTime.now.to_s] = record
78
+ data.push({ DateTime.now.to_s => record })
76
79
  @backend.put key: @name, value: data.to_yaml
77
80
  end
78
81
 
79
- def get_all_records
80
- return (@backend.exist?({key: @name}))? YAML::load(@backend.get({key: @name})) : {}
82
+ def get_all_records(options={})
83
+ return (@backend.exist?({key: @name}))? YAML::load(@backend.get({key: @name})) : []
81
84
  end
82
85
 
83
86
  def check_prepared
84
87
  return :never_run_prepare unless @backend.exist?({key: @name})
85
- return :never_prepare unless YAML::load(@backend.get({key: @name})).select {|item,value|
88
+ return :never_prepare unless YAML::load(@backend.get({key: @name})).select {|item|
89
+ record =item.keys.first
90
+ value=item[record]
86
91
  value[:status] == :prepared
87
92
  }.count > 0
88
93
  return :prepared
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prometheus-splash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Romain GEORGES
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-15 00:00:00.000000000 Z
11
+ date: 2020-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -508,7 +508,7 @@ homepage: https://github.com/Ultragreen/prometheus-splash
508
508
  licenses:
509
509
  - BSD-2-Clause
510
510
  metadata: {}
511
- post_install_message:
511
+ post_install_message:
512
512
  rdoc_options: []
513
513
  require_paths:
514
514
  - lib
@@ -523,8 +523,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
523
523
  - !ruby/object:Gem::Version
524
524
  version: '0'
525
525
  requirements: []
526
- rubygems_version: 3.1.2
527
- signing_key:
526
+ rubygems_version: 3.0.6
527
+ signing_key:
528
528
  specification_version: 4
529
529
  summary: Supervision with Prometheus of Logs and Asynchronous tasks orchestration
530
530
  for Services or Hosts