arkaan 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cabcdc8b6578cb29eb81b8ba62909b2a11ebcca1b8e162e8a19364f333f2fdf1
4
- data.tar.gz: a8eb6aa1e2c7018adde2531ec96e0597a988ed69f4dc681ec3036e82117a83dc
3
+ metadata.gz: bde2ac4f9badeeff70fa6534caafb6080a2d0d1f0f1a1a8166ad8b8607bb6bd7
4
+ data.tar.gz: 95b9406a7be27cf571956a25f15714e3738d23ce2f57bbf9d22ca4cdcaf41faa
5
5
  SHA512:
6
- metadata.gz: e7a947e5433212e24033c4a1641b2f1d699bb9e7ab9f2964c2adfba0e4e4135100b53daa058411172777f9c7d7991c31c56a86eb09293390891f61855cf68cd8
7
- data.tar.gz: 5199e13d68f411c928199f6bb80c08844487ed3e1a6817cfa779b6f9c2f64c4df5beb7d497752da1d48c3d7d52616d93e6d25f0d203dda0847273224ba363e8f
6
+ metadata.gz: fd2894fdb157d26cbe7b1421566da14cb9f72ee9ca0033bd6e4c2c308f60985c1e09893f4040de08ec45642dae5b0cf36bb71fe1a2c5b83735d82c9354ce5dc7
7
+ data.tar.gz: fca967434233e4f426ed12a52de45892f555d03ea8288ed2184607ea8392dece9ab517c574996c30b6288b48c44b697dfca6642c2724b37e8013582482624f55
@@ -5,6 +5,7 @@ module Arkaan
5
5
  autoload :Action , 'arkaan/monitoring/action'
6
6
  autoload :Gateway , 'arkaan/monitoring/gateway'
7
7
  autoload :Instance , 'arkaan/monitoring/instance'
8
+ autoload :Results , 'arkaan/monitoring/results'
8
9
  autoload :Route , 'arkaan/monitoring/route'
9
10
  autoload :Service , 'arkaan/monitoring/service'
10
11
  autoload :Vigilante, 'arkaan/monitoring/vigilante'
@@ -27,6 +27,8 @@ module Arkaan
27
27
  # @return [Arkaan::Monitoring::Action] the actions that has been performed on the service.
28
28
  embeds_many :actions, class_name: 'Arkaan::Monitoring::Action', inverse_of: :instance
29
29
 
30
+ has_many :heartbeats, class_name: 'Arkaan::Monitoring::Results::Heartbeat', inverse_of: :instance
31
+
30
32
  validates :url,
31
33
  presence: {message: 'required'},
32
34
  format: {with: /\A(https?:\/\/)((([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*)|(localhost:[0-9]{2,4})\/?)\z/, message: 'pattern', if: :url?}
@@ -0,0 +1,10 @@
1
+ module Arkaan
2
+ module Monitoring
3
+ # The results module handle classes to make results for the vigilante runs.
4
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
5
+ module Results
6
+ autoload :Report, 'arkaan/monitoring/results/report'
7
+ autoload :Heartbeat, 'arkaan/monitoring/results/heartbeat'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,50 @@
1
+ module Arkaan
2
+ module Monitoring
3
+ module Results
4
+ # A record is the result of the vigilante asking the health of one instance.
5
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
6
+ class Heartbeat
7
+ include Mongoid::Document
8
+
9
+ # @!attribute [rw] status
10
+ # @return [Integer] the HTTP status of the request made for this record.
11
+ field :status, type: Integer, default: 500
12
+ # @!attribute [rw] body
13
+ # @return [Hash] the JSON parsed body from the heartbeat request.
14
+ field :body, type: Hash, default: {}
15
+ # @!attribute [rw] healthy
16
+ # @return [Boolean] TRUE if the instance is deemed healthy, FALSE otherwise.
17
+ field :healthy, type: Boolean, default: false
18
+ # @!attribute [rw] started_at
19
+ # @return [DateTime] the date at which the heartbeat request has started.
20
+ field :started_at, type: DateTime
21
+ # @!attribute [rw] ended_at
22
+ # @return [DateTime] the date at which the request was terminated.
23
+ field :ended_at, type: DateTime
24
+
25
+ # @!attribute [rw] instance
26
+ # @return [Arkaan::Monitoring::Instance] the instance on which the record has been done.
27
+ belongs_to :instance, class_name: 'Arkaan::Monitoring::Instance', inverse_of: :heartbeats
28
+
29
+ # @!attribute [rw] report
30
+ # @return [Arkaan::Monitoring::Results::Report] the report made by the vigilante including this record.
31
+ belongs_to :report, class_name: 'Arkaan::Monitoring::Results::Report', inverse_of: :heartbeats
32
+
33
+ attr_readonly :healthy
34
+
35
+ def status=(status)
36
+ self[:status] = status
37
+ self[:healthy] = status == 200
38
+ end
39
+
40
+ def start!
41
+ self.started_at = DateTime.now
42
+ end
43
+
44
+ def end!
45
+ self.ended_at = DateTime.now
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,46 @@
1
+ module Arkaan
2
+ module Monitoring
3
+ module Results
4
+ # A report is the result of one call to the API on one instance status route.
5
+ # @author Vincent Courtois <courtoi.vincent@outlook.com>
6
+ class Report
7
+ include Mongoid::Document
8
+ include Mongoid::Timestamps
9
+
10
+ field :started_at, type: DateTime
11
+ # @!attribute [rw] ended_at
12
+ # @return [DateTime] the timestamp at which the report ends.
13
+ field :ended_at, type: DateTime
14
+ # @!attribute [rw] total
15
+ # @return [Integer] the total number of services monitored.
16
+ field :total, type: Integer, default: 0
17
+ # @!attribute [rw] healthy
18
+ # @return [Integer] the number of healthy services amongst all the monitored services.
19
+ field :healthy, type: Integer, default: 0
20
+
21
+ # @!attribute [rw] records
22
+ # @return [Array<Arkaan::Monitoring::Results::Record>] the records linked to this report.
23
+ has_many :heartbeats, class_name: 'Arkaan::Monitoring::Results::Heartbeat', inverse_of: :report
24
+ # @!attribute [rw] vigilante
25
+ # @return [Arkaan::Monitoring::Vigilante] the vigilante application that has created this report.
26
+ belongs_to :vigilante, class_name: 'Arkaan::Monitoring::Vigilante', inverse_of: :reports
27
+
28
+ def add_heartbeat(heartbeat)
29
+ self.heartbeats << heartbeat
30
+ self.total += 1
31
+ self.healthy += (heartbeat.healthy ? 1 : 0)
32
+ heartbeat.end!
33
+ end
34
+
35
+ def start!
36
+ self.started_at = DateTime.now
37
+ end
38
+
39
+ def end!
40
+ self.ended_at = DateTime.now
41
+ self.save!
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -10,8 +10,39 @@ module Arkaan
10
10
  # @!attribute [rw] token
11
11
  # @return [String] the token the vigilante uses to identify himself in the services
12
12
  field :token, type: String
13
+ # @!attribute [rw] max_results
14
+ # @return [Integer] the number of results the vigilante should be keeping at any time.
15
+ # The oldest result should be erased to not go over the limit
16
+ field :max_results, type: Integer, default: 20
17
+
18
+ # @!attribute [rw] reports
19
+ # @return [Array<Arkaan::monitoring::Results::Report>] the report generated by running this vigilante.
20
+ has_many :reports, class_name: 'Arkaan::Monitoring::Results::Report', inverse_of: :vigilante
13
21
 
14
22
  validates :token, presence: {message: 'required'}
23
+
24
+ validates :max_results,
25
+ numericality: {greater_than: 0, message: 'minimum'}
26
+
27
+ # Adds a report to the collection of reports by eventually deleting the oldest one.
28
+ # @param report [Arkaan::Monitoring::Results::Report] the report to add to the vigilante,
29
+ # added only if it does not exceed the max number of reports the vigilante can store.
30
+ def add_report(report)
31
+ erase_oldest_result if result_full?
32
+ reports << report
33
+ end
34
+
35
+ # Checks if the list of reports is already full, or if more can be added.
36
+ # @return [Boolean] TRUE if the number of reports already exceeds the max number.
37
+ def results_full?
38
+ reports.to_a.count >= max_results
39
+ end
40
+
41
+ # Erases the oldest results to keep only MAX - 1 results in the list.
42
+ def erase_oldest_result
43
+ limit = reports.count + 1 - vigilante.max_results
44
+ reports.sort_by(created_at: :asc).limit(limit).each(&:delete)
45
+ end
15
46
  end
16
47
  end
17
48
  end
@@ -1,3 +1,3 @@
1
1
  module Arkaan
2
- VERSION = '1.6.1'
2
+ VERSION = '1.7.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arkaan
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vincent Courtois
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-07 00:00:00.000000000 Z
11
+ date: 2019-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -330,6 +330,9 @@ files:
330
330
  - lib/arkaan/monitoring/action.rb
331
331
  - lib/arkaan/monitoring/gateway.rb
332
332
  - lib/arkaan/monitoring/instance.rb
333
+ - lib/arkaan/monitoring/results.rb
334
+ - lib/arkaan/monitoring/results/heartbeat.rb
335
+ - lib/arkaan/monitoring/results/report.rb
333
336
  - lib/arkaan/monitoring/route.rb
334
337
  - lib/arkaan/monitoring/service.rb
335
338
  - lib/arkaan/monitoring/vigilante.rb