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

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
  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