sensu 0.18.1-java → 0.19.0.beta.1-java

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
  SHA1:
3
- metadata.gz: b6d7a448d0424a899fd3c8d28524ba0069e484b9
4
- data.tar.gz: c8d96c4c8a55343dcb0e0b3064fd64f7a3ef0ca9
3
+ metadata.gz: 1b14366e10ecd072a11321772c05290328d02a5d
4
+ data.tar.gz: d60538ee8e8fcc18f721d4c6bd89be1306804750
5
5
  SHA512:
6
- metadata.gz: af8ea8a7099f459e078968ac86beec8e2554552086fef9578c4b37ab17ee735595f0170d8c88474c6c734f730dd42adc88d39ea1a96a052fd446360fca805f6a
7
- data.tar.gz: e3c0bb292415d73d7a06698e3557cec3b455e92b537e18ea5e1acca2ee7bdd2269fd67a2731c23b3e0efb79d7607fb8c1361b4f753191490b470f5acfc5d5360
6
+ metadata.gz: 599e6341ce3a3c4f6c7260204d3daf92d6d812f2c747854bc8ef01372ff2cdeb1da08f3bb414bd002866a7640008f69d7057acdd65af41c32e437d6ad38ee54e
7
+ data.tar.gz: 2983af3cd6f4920658f4aa833af423e0dd7942a7562c187c4edfab32b56d643fd465b089a703cf171869034b2df837c0830c597b2b40d6fa32e2c6e8232edfde
data/CHANGELOG.md CHANGED
@@ -1,3 +1,38 @@
1
+ ## 0.19.0 - TBD
2
+
3
+ ### Features
4
+
5
+ Redis Sensu transport, a built-in alternative to the default RabbitMQ
6
+ transport. The Redis transport is currently considered experimental.
7
+ Configuring the transport name to be `redis` will enable the Redis
8
+ transport instead of RabbitMQ, e.g. `{"transport": {"name": "redis"}}`.
9
+
10
+ Round-robin client subscriptions, allowing check requests to be sent to a
11
+ single client in a subscription in a round-robin fashion. To create a
12
+ round-robin subscription, start its name with `roundrobin:` to specify the
13
+ type, e.g. "roundrobin:elasticsearch". Any check that targets the
14
+ "roundrobin:elasticsearch" subscription will have its check requests sent
15
+ to clients in a round-robin fashion.
16
+
17
+ Stale check result detection, using a defined check `ttl` and stored check
18
+ results. Sensu is now able to monitor check results, ensuring that checks
19
+ with a defined TTL (time to live) continue to be executed by clients. For
20
+ example, a standalone check could have an interval of 30 seconds and a ttl
21
+ of 50 seconds, Sensu would expect a result at least once every 50 seconds.
22
+
23
+ Check results API routes/endpoints: `/results`, `/results/:client`, and
24
+ `/results/:client/:check`. These new check result API routes/endpoints
25
+ enable new tooling, such as green light dashboards.
26
+
27
+ ### Other
28
+
29
+ POSIX spawn libraries are now loaded upfront/immediately, not at child
30
+ process creation. This removes the possibility of load race conditions
31
+ when real threads are used.
32
+
33
+ Many Ruby EventMachine fixes and improvements, including FD_CLOEXEC for
34
+ the Sensu client UDP socket.
35
+
1
36
  ## 0.18.1 - 2015-05-11
2
37
 
3
38
  ### Other
@@ -725,6 +725,67 @@ module Sensu
725
725
  end
726
726
  end
727
727
  end
728
+
729
+ aget "/results/?" do
730
+ response = Array.new
731
+ settings.redis.smembers("clients") do |clients|
732
+ unless clients.empty?
733
+ clients.each_with_index do |client_name, client_index|
734
+ settings.redis.smembers("result:#{client_name}") do |checks|
735
+ unless checks.empty?
736
+ checks.each_with_index do |check_name, check_index|
737
+ result_key = "result:#{client_name}:#{check_name}"
738
+ settings.redis.get(result_key) do |result_json|
739
+ check = MultiJson.load(result_json)
740
+ response << {:client => client_name, :check => check}
741
+ if client_index == clients.size - 1 && check_index == checks.size - 1
742
+ body MultiJson.dump(response)
743
+ end
744
+ end
745
+ end
746
+ else
747
+ body MultiJson.dump(response)
748
+ end
749
+ end
750
+ end
751
+ else
752
+ body MultiJson.dump(response)
753
+ end
754
+ end
755
+ end
756
+
757
+ aget %r{^/results?/([\w\.-]+)/?$} do |client_name|
758
+ response = Array.new
759
+ settings.redis.smembers("result:#{client_name}") do |checks|
760
+ unless checks.empty?
761
+ checks.each_with_index do |check_name, check_index|
762
+ result_key = "result:#{client_name}:#{check_name}"
763
+ settings.redis.get(result_key) do |result_json|
764
+ check = MultiJson.load(result_json)
765
+ response << {:client => client_name, :check => check}
766
+ if check_index == checks.size - 1
767
+ body MultiJson.dump(response)
768
+ end
769
+ end
770
+ end
771
+ else
772
+ not_found!
773
+ end
774
+ end
775
+ end
776
+
777
+ aget %r{^/results?/([\w\.-]+)/([\w\.-]+)/?$} do |client_name, check_name|
778
+ result_key = "result:#{client_name}:#{check_name}"
779
+ settings.redis.get(result_key) do |result_json|
780
+ unless result_json.nil?
781
+ check = MultiJson.load(result_json)
782
+ response = {:client => client_name, :check => check}
783
+ body MultiJson.dump(response)
784
+ else
785
+ not_found!
786
+ end
787
+ end
788
+ end
728
789
  end
729
790
  end
730
791
  end
@@ -233,20 +233,42 @@ module Sensu
233
233
  end
234
234
  end
235
235
 
236
+ # Determine the Sensu transport subscribe options for a
237
+ # subscription. If a subscription begins with a transport pipe
238
+ # type, either "direct:" or "roundrobin:", the subscription uses
239
+ # a direct transport pipe, and the subscription name is used for
240
+ # both the pipe and the funnel names. If a subscription does not
241
+ # specify a transport pipe type, a fanout transport pipe is
242
+ # used, the subscription name is used for the pipe, and a unique
243
+ # funnel is created for the Sensu client. The unique funnel name
244
+ # for the Sensu client is created using a combination of the
245
+ # client name, the Sensu version, and the process start time
246
+ # (epoch).
247
+ #
248
+ # @param subscription [String]
249
+ # @return [Array] containing the transport subscribe options:
250
+ # the transport pipe type, pipe, and funnel.
251
+ def transport_subscribe_options(subscription)
252
+ _, raw_type = subscription.split(":", 2).reverse
253
+ case raw_type
254
+ when "direct", "roundrobin"
255
+ [:direct, subscription, subscription]
256
+ else
257
+ funnel = [@settings[:client][:name], VERSION, start_time].join("-")
258
+ [:fanout, subscription, funnel]
259
+ end
260
+ end
261
+
236
262
  # Set up Sensu client subscriptions. Subscriptions determine the
237
- # kinds of check requests the client will receive. A unique
238
- # transport funnel is created for the Sensu client, using a
239
- # combination of it's name, the Sensu version, and the current
240
- # timestamp (epoch). The unique funnel is bound to each
241
- # transport pipe, named after the client subscription. The Sensu
263
+ # kinds of check requests the client will receive. The Sensu
242
264
  # client will receive JSON serialized check requests from its
243
- # funnel, that get parsed and processed.
265
+ # subscriptions, that get parsed and processed.
244
266
  def setup_subscriptions
245
267
  @logger.debug("subscribing to client subscriptions")
246
268
  @settings[:client][:subscriptions].each do |subscription|
247
269
  @logger.debug("subscribing to a subscription", :subscription => subscription)
248
- funnel = [@settings[:client][:name], VERSION, Time.now.to_i].join("-")
249
- @transport.subscribe(:fanout, subscription, funnel) do |message_info, message|
270
+ options = transport_subscribe_options(subscription)
271
+ @transport.subscribe(*options) do |message_info, message|
250
272
  begin
251
273
  check = MultiJson.load(message)
252
274
  @logger.info("received check request", :check => check)
@@ -1,7 +1,7 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
3
  # Sensu release version.
4
- VERSION = "0.18.1"
4
+ VERSION = "0.19.0.beta.1"
5
5
 
6
6
  # Sensu check severities.
7
7
  SEVERITIES = %w[ok warning critical unknown]
data/lib/sensu/daemon.rb CHANGED
@@ -2,13 +2,13 @@ require "rubygems"
2
2
 
3
3
  gem "multi_json", "1.11.0"
4
4
 
5
- gem "sensu-em", "2.4.1"
5
+ gem "sensu-em", "2.5.0.beta"
6
6
  gem "sensu-logger", "1.0.0"
7
- gem "sensu-settings", "1.8.0"
7
+ gem "sensu-settings", "1.9.0"
8
8
  gem "sensu-extension", "1.1.2"
9
9
  gem "sensu-extensions", "1.2.0"
10
- gem "sensu-transport", "2.4.0"
11
- gem "sensu-spawn", "1.1.0"
10
+ gem "sensu-transport", "3.0.0"
11
+ gem "sensu-spawn", "1.2.0"
12
12
 
13
13
  require "time"
14
14
  require "uri"
@@ -31,13 +31,16 @@ module Sensu
31
31
  module Daemon
32
32
  include Utilities
33
33
 
34
- # Initialize the Sensu process. Set the initial service state, set
35
- # up the logger, load settings, load extensions, and optionally
36
- # daemonize the process and/or create a PID file. A subclass may
37
- # override this method.
34
+ attr_reader :start_time
35
+
36
+ # Initialize the Sensu process. Set the start time, initial
37
+ # service state, set up the logger, load settings, load
38
+ # extensions, and optionally daemonize the process and/or create a
39
+ # PID file. A subclass may override this method.
38
40
  #
39
41
  # @param options [Hash]
40
42
  def initialize(options={})
43
+ @start_time = Time.now.to_i
41
44
  @state = :initializing
42
45
  @timers = {:run => []}
43
46
  setup_logger(options)
data/lib/sensu/redis.rb CHANGED
@@ -1,6 +1,6 @@
1
- gem "em-redis-unified", "0.6.0"
1
+ gem "em-redis-unified", "1.0.0"
2
2
 
3
- require "em-redis"
3
+ require "em-redis-unified"
4
4
 
5
5
  module Sensu
6
6
  class Redis
@@ -436,6 +436,26 @@ module Sensu
436
436
  end
437
437
  end
438
438
 
439
+ # Determine the Sensu transport publish options for a
440
+ # subscription. If a subscription begins with a transport pipe
441
+ # type, either "direct:" or "roundrobin:", the subscription uses
442
+ # a direct transport pipe. If a subscription does not specify a
443
+ # transport pipe type, a fanout transport pipe is used.
444
+ #
445
+ # @param subscription [String]
446
+ # @return [Array] containing the transport publish options:
447
+ # the transport pipe type, pipe, and the message to be
448
+ # published.
449
+ def transport_publish_options(subscription, message)
450
+ _, raw_type = subscription.split(":", 2).reverse
451
+ case raw_type
452
+ when "direct", "roundrobin"
453
+ [:direct, subscription, message]
454
+ else
455
+ [:fanout, subscription, message]
456
+ end
457
+ end
458
+
439
459
  # Publish a check request to the transport. A check request is
440
460
  # composted of a check `:name`, an `:issued` timestamp, and a
441
461
  # check `:command` if available. The check request is published
@@ -456,7 +476,8 @@ module Sensu
456
476
  :subscribers => check[:subscribers]
457
477
  })
458
478
  check[:subscribers].each do |subscription|
459
- @transport.publish(:fanout, subscription, MultiJson.dump(payload)) do |info|
479
+ options = transport_publish_options(subscription, MultiJson.dump(payload))
480
+ @transport.publish(*options) do |info|
460
481
  if info[:error]
461
482
  @logger.error("failed to publish check request", {
462
483
  :subscription => subscription,
@@ -527,11 +548,11 @@ module Sensu
527
548
  # serialization is used when publishing the check result payload
528
549
  # to the transport pipe. Transport errors are logged.
529
550
  #
530
- # @param client [Hash]
551
+ # @param client_name [String]
531
552
  # @param check [Hash]
532
- def publish_check_result(client, check)
553
+ def publish_check_result(client_name, check)
533
554
  payload = {
534
- :client => client[:name],
555
+ :client => client_name,
535
556
  :check => check
536
557
  }
537
558
  @logger.debug("publishing check result", :payload => payload)
@@ -606,7 +627,7 @@ module Sensu
606
627
  check[:output] << "#{time_since_last_keepalive} seconds ago"
607
628
  check[:status] = 0
608
629
  end
609
- publish_check_result(client, check)
630
+ publish_check_result(client[:name], check)
610
631
  end
611
632
  end
612
633
  end
@@ -623,6 +644,50 @@ module Sensu
623
644
  end
624
645
  end
625
646
 
647
+ # Determine stale check results, those that have not executed in
648
+ # a specified amount of time (check TTL). This method iterates
649
+ # through the client registry and check results for checks with
650
+ # a defined TTL value (in seconds). If a check result has a
651
+ # defined TTL, the time since last check execution (in seconds)
652
+ # is calculated. If the time since last execution is equal to or
653
+ # greater than the check TTL, a warning check result is
654
+ # published with the appropriate check output.
655
+ def determine_stale_check_results
656
+ @logger.info("determining stale check results")
657
+ @redis.smembers("clients") do |clients|
658
+ clients.each do |client_name|
659
+ @redis.smembers("result:#{client_name}") do |checks|
660
+ checks.each do |check_name|
661
+ result_key = "#{client_name}:#{check_name}"
662
+ @redis.get("result:#{result_key}") do |result_json|
663
+ unless result_json.nil?
664
+ check = MultiJson.load(result_json)
665
+ next unless check[:ttl] && check[:executed]
666
+ time_since_last_execution = Time.now.to_i - check[:executed]
667
+ if time_since_last_execution >= check[:ttl]
668
+ check[:output] = "Last check execution was "
669
+ check[:output] << "#{time_since_last_execution} seconds ago"
670
+ check[:status] = 1
671
+ publish_check_result(client_name, check)
672
+ end
673
+ end
674
+ end
675
+ end
676
+ end
677
+ end
678
+ end
679
+ end
680
+
681
+ # Set up the check result monitor, a periodic timer to run
682
+ # `determine_stale_check_results()` every 30 seconds. The timer
683
+ # is stored in the timers hash under `:leader`.
684
+ def setup_check_result_monitor
685
+ @logger.debug("monitoring check results")
686
+ @timers[:leader] << EM::PeriodicTimer.new(30) do
687
+ determine_stale_check_results
688
+ end
689
+ end
690
+
626
691
  # Prune check result aggregations (aggregates). Sensu only
627
692
  # stores the 20 latest aggregations for a check, to keep the
628
693
  # amount of data stored to a minimum.
@@ -672,6 +737,7 @@ module Sensu
672
737
  def leader_duties
673
738
  setup_check_request_publisher
674
739
  setup_client_monitor
740
+ setup_check_result_monitor
675
741
  setup_check_result_aggregation_pruner
676
742
  end
677
743
 
data/sensu.gemspec CHANGED
@@ -17,14 +17,14 @@ Gem::Specification.new do |s|
17
17
  s.add_dependency "multi_json", "1.11.0"
18
18
  s.add_dependency "uuidtools", "2.1.4"
19
19
  s.add_dependency "eventmachine", "1.0.3"
20
- s.add_dependency "sensu-em", "2.4.1"
20
+ s.add_dependency "sensu-em", "2.5.0.beta"
21
21
  s.add_dependency "sensu-logger", "1.0.0"
22
- s.add_dependency "sensu-settings", "1.8.0"
22
+ s.add_dependency "sensu-settings", "1.9.0"
23
23
  s.add_dependency "sensu-extension", "1.1.2"
24
24
  s.add_dependency "sensu-extensions", "1.2.0"
25
- s.add_dependency "sensu-transport", "2.4.0"
26
- s.add_dependency "sensu-spawn", "1.1.0"
27
- s.add_dependency "em-redis-unified", "0.6.0"
25
+ s.add_dependency "sensu-transport", "3.0.0"
26
+ s.add_dependency "sensu-spawn", "1.2.0"
27
+ s.add_dependency "em-redis-unified", "1.0.0"
28
28
  s.add_dependency "sinatra", "1.4.6"
29
29
  s.add_dependency "async_sinatra", "1.2.0"
30
30
  s.add_dependency "thin", "1.5.0" unless RUBY_PLATFORM =~ /java/
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.1
4
+ version: 0.19.0.beta.1
5
5
  platform: java
6
6
  authors:
7
7
  - Sean Porter
@@ -9,232 +9,232 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-05-12 00:00:00.000000000 Z
12
+ date: 2015-05-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: multi_json
16
- version_requirements: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - '='
19
- - !ruby/object:Gem::Version
20
- version: 1.11.0
21
15
  requirement: !ruby/object:Gem::Requirement
22
16
  requirements:
23
17
  - - '='
24
18
  - !ruby/object:Gem::Version
25
19
  version: 1.11.0
20
+ name: multi_json
26
21
  prerelease: false
27
22
  type: :runtime
28
- - !ruby/object:Gem::Dependency
29
- name: uuidtools
30
23
  version_requirements: !ruby/object:Gem::Requirement
31
24
  requirements:
32
25
  - - '='
33
26
  - !ruby/object:Gem::Version
34
- version: 2.1.4
27
+ version: 1.11.0
28
+ - !ruby/object:Gem::Dependency
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - '='
38
32
  - !ruby/object:Gem::Version
39
33
  version: 2.1.4
34
+ name: uuidtools
40
35
  prerelease: false
41
36
  type: :runtime
42
- - !ruby/object:Gem::Dependency
43
- name: eventmachine
44
37
  version_requirements: !ruby/object:Gem::Requirement
45
38
  requirements:
46
39
  - - '='
47
40
  - !ruby/object:Gem::Version
48
- version: 1.0.3
41
+ version: 2.1.4
42
+ - !ruby/object:Gem::Dependency
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - '='
52
46
  - !ruby/object:Gem::Version
53
47
  version: 1.0.3
48
+ name: eventmachine
54
49
  prerelease: false
55
50
  type: :runtime
56
- - !ruby/object:Gem::Dependency
57
- name: sensu-em
58
51
  version_requirements: !ruby/object:Gem::Requirement
59
52
  requirements:
60
53
  - - '='
61
54
  - !ruby/object:Gem::Version
62
- version: 2.4.1
55
+ version: 1.0.3
56
+ - !ruby/object:Gem::Dependency
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - '='
66
60
  - !ruby/object:Gem::Version
67
- version: 2.4.1
61
+ version: 2.5.0.beta
62
+ name: sensu-em
68
63
  prerelease: false
69
64
  type: :runtime
70
- - !ruby/object:Gem::Dependency
71
- name: sensu-logger
72
65
  version_requirements: !ruby/object:Gem::Requirement
73
66
  requirements:
74
67
  - - '='
75
68
  - !ruby/object:Gem::Version
76
- version: 1.0.0
69
+ version: 2.5.0.beta
70
+ - !ruby/object:Gem::Dependency
77
71
  requirement: !ruby/object:Gem::Requirement
78
72
  requirements:
79
73
  - - '='
80
74
  - !ruby/object:Gem::Version
81
75
  version: 1.0.0
76
+ name: sensu-logger
82
77
  prerelease: false
83
78
  type: :runtime
84
- - !ruby/object:Gem::Dependency
85
- name: sensu-settings
86
79
  version_requirements: !ruby/object:Gem::Requirement
87
80
  requirements:
88
81
  - - '='
89
82
  - !ruby/object:Gem::Version
90
- version: 1.8.0
83
+ version: 1.0.0
84
+ - !ruby/object:Gem::Dependency
91
85
  requirement: !ruby/object:Gem::Requirement
92
86
  requirements:
93
87
  - - '='
94
88
  - !ruby/object:Gem::Version
95
- version: 1.8.0
89
+ version: 1.9.0
90
+ name: sensu-settings
96
91
  prerelease: false
97
92
  type: :runtime
98
- - !ruby/object:Gem::Dependency
99
- name: sensu-extension
100
93
  version_requirements: !ruby/object:Gem::Requirement
101
94
  requirements:
102
95
  - - '='
103
96
  - !ruby/object:Gem::Version
104
- version: 1.1.2
97
+ version: 1.9.0
98
+ - !ruby/object:Gem::Dependency
105
99
  requirement: !ruby/object:Gem::Requirement
106
100
  requirements:
107
101
  - - '='
108
102
  - !ruby/object:Gem::Version
109
103
  version: 1.1.2
104
+ name: sensu-extension
110
105
  prerelease: false
111
106
  type: :runtime
112
- - !ruby/object:Gem::Dependency
113
- name: sensu-extensions
114
107
  version_requirements: !ruby/object:Gem::Requirement
115
108
  requirements:
116
109
  - - '='
117
110
  - !ruby/object:Gem::Version
118
- version: 1.2.0
111
+ version: 1.1.2
112
+ - !ruby/object:Gem::Dependency
119
113
  requirement: !ruby/object:Gem::Requirement
120
114
  requirements:
121
115
  - - '='
122
116
  - !ruby/object:Gem::Version
123
117
  version: 1.2.0
118
+ name: sensu-extensions
124
119
  prerelease: false
125
120
  type: :runtime
126
- - !ruby/object:Gem::Dependency
127
- name: sensu-transport
128
121
  version_requirements: !ruby/object:Gem::Requirement
129
122
  requirements:
130
123
  - - '='
131
124
  - !ruby/object:Gem::Version
132
- version: 2.4.0
125
+ version: 1.2.0
126
+ - !ruby/object:Gem::Dependency
133
127
  requirement: !ruby/object:Gem::Requirement
134
128
  requirements:
135
129
  - - '='
136
130
  - !ruby/object:Gem::Version
137
- version: 2.4.0
131
+ version: 3.0.0
132
+ name: sensu-transport
138
133
  prerelease: false
139
134
  type: :runtime
140
- - !ruby/object:Gem::Dependency
141
- name: sensu-spawn
142
135
  version_requirements: !ruby/object:Gem::Requirement
143
136
  requirements:
144
137
  - - '='
145
138
  - !ruby/object:Gem::Version
146
- version: 1.1.0
139
+ version: 3.0.0
140
+ - !ruby/object:Gem::Dependency
147
141
  requirement: !ruby/object:Gem::Requirement
148
142
  requirements:
149
143
  - - '='
150
144
  - !ruby/object:Gem::Version
151
- version: 1.1.0
145
+ version: 1.2.0
146
+ name: sensu-spawn
152
147
  prerelease: false
153
148
  type: :runtime
154
- - !ruby/object:Gem::Dependency
155
- name: em-redis-unified
156
149
  version_requirements: !ruby/object:Gem::Requirement
157
150
  requirements:
158
151
  - - '='
159
152
  - !ruby/object:Gem::Version
160
- version: 0.6.0
153
+ version: 1.2.0
154
+ - !ruby/object:Gem::Dependency
161
155
  requirement: !ruby/object:Gem::Requirement
162
156
  requirements:
163
157
  - - '='
164
158
  - !ruby/object:Gem::Version
165
- version: 0.6.0
159
+ version: 1.0.0
160
+ name: em-redis-unified
166
161
  prerelease: false
167
162
  type: :runtime
168
- - !ruby/object:Gem::Dependency
169
- name: sinatra
170
163
  version_requirements: !ruby/object:Gem::Requirement
171
164
  requirements:
172
165
  - - '='
173
166
  - !ruby/object:Gem::Version
174
- version: 1.4.6
167
+ version: 1.0.0
168
+ - !ruby/object:Gem::Dependency
175
169
  requirement: !ruby/object:Gem::Requirement
176
170
  requirements:
177
171
  - - '='
178
172
  - !ruby/object:Gem::Version
179
173
  version: 1.4.6
174
+ name: sinatra
180
175
  prerelease: false
181
176
  type: :runtime
182
- - !ruby/object:Gem::Dependency
183
- name: async_sinatra
184
177
  version_requirements: !ruby/object:Gem::Requirement
185
178
  requirements:
186
179
  - - '='
187
180
  - !ruby/object:Gem::Version
188
- version: 1.2.0
181
+ version: 1.4.6
182
+ - !ruby/object:Gem::Dependency
189
183
  requirement: !ruby/object:Gem::Requirement
190
184
  requirements:
191
185
  - - '='
192
186
  - !ruby/object:Gem::Version
193
187
  version: 1.2.0
188
+ name: async_sinatra
194
189
  prerelease: false
195
190
  type: :runtime
196
- - !ruby/object:Gem::Dependency
197
- name: rake
198
191
  version_requirements: !ruby/object:Gem::Requirement
199
192
  requirements:
200
- - - ~>
193
+ - - '='
201
194
  - !ruby/object:Gem::Version
202
- version: '10.3'
195
+ version: 1.2.0
196
+ - !ruby/object:Gem::Dependency
203
197
  requirement: !ruby/object:Gem::Requirement
204
198
  requirements:
205
199
  - - ~>
206
200
  - !ruby/object:Gem::Version
207
201
  version: '10.3'
202
+ name: rake
208
203
  prerelease: false
209
204
  type: :development
210
- - !ruby/object:Gem::Dependency
211
- name: rspec
212
205
  version_requirements: !ruby/object:Gem::Requirement
213
206
  requirements:
214
207
  - - ~>
215
208
  - !ruby/object:Gem::Version
216
- version: 3.0.0
209
+ version: '10.3'
210
+ - !ruby/object:Gem::Dependency
217
211
  requirement: !ruby/object:Gem::Requirement
218
212
  requirements:
219
213
  - - ~>
220
214
  - !ruby/object:Gem::Version
221
215
  version: 3.0.0
216
+ name: rspec
222
217
  prerelease: false
223
218
  type: :development
224
- - !ruby/object:Gem::Dependency
225
- name: em-http-request
226
219
  version_requirements: !ruby/object:Gem::Requirement
227
220
  requirements:
228
221
  - - ~>
229
222
  - !ruby/object:Gem::Version
230
- version: '1.1'
223
+ version: 3.0.0
224
+ - !ruby/object:Gem::Dependency
231
225
  requirement: !ruby/object:Gem::Requirement
232
226
  requirements:
233
227
  - - ~>
234
228
  - !ruby/object:Gem::Version
235
229
  version: '1.1'
230
+ name: em-http-request
236
231
  prerelease: false
237
232
  type: :development
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ~>
236
+ - !ruby/object:Gem::Version
237
+ version: '1.1'
238
238
  description: A monitoring framework that aims to be simple, malleable, and scalable.
239
239
  email:
240
240
  - portertech@gmail.com
@@ -283,9 +283,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
283
283
  version: '0'
284
284
  required_rubygems_version: !ruby/object:Gem::Requirement
285
285
  requirements:
286
- - - '>='
286
+ - - '>'
287
287
  - !ruby/object:Gem::Version
288
- version: '0'
288
+ version: 1.3.1
289
289
  requirements: []
290
290
  rubyforge_project:
291
291
  rubygems_version: 2.1.9