observed-logstash 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5e005dcc11482579c3f276584704d1fcc079d8dc
4
+ data.tar.gz: a083fe5f0232256bcc4c30430741b488555bce73
5
+ SHA512:
6
+ metadata.gz: 95579163f7d1ee17ab9b84992db83d19ae9c9d4ff0b1b2509fd86cecf4de1a5a7d00e6d7a54618a1b19458c2f0dc1581af341f5f08bc056327ce8e84197cf5bb
7
+ data.tar.gz: dd64751c5f2f269baba128f574e8a5ba4e16d78b46f32b0f809c7b9ebf858d67b3eeae745b47e27cd124e21871bad4adc60bf6f1ad6a6f8de09f78aa7f81ef6b
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in observed-logstash.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 GREE, Inc.
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # Observed::Logstash
2
+
3
+ Allows you to use the number of results returned by an Elasticsearch query as an [Observed](https://github.com/gree/observed) healthcheck.
4
+
5
+ Expected use case is searching server logs stored in Logstash format.
6
+
7
+ You provide an Elasticsearch query and a timespan, and the plugin will search for logs that match your query. If there are too few hits, or too many, it will record an error event.
8
+
9
+ ## Example use cases
10
+
11
+ * If your web server returned more than X "500 Internal Server Error" responses in the last few minutes, it's probably unhealthy.
12
+
13
+ * If it returned fewer than Y "200 OK" responses in the last few minutes, it's probably unhealthy.
14
+
15
+ ## Installation
16
+
17
+ Add this line to your application's Gemfile:
18
+
19
+ gem 'observed-logstash'
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install observed-logstash
28
+
29
+ ## Test
30
+
31
+ Some tests expect an Elasticsearch instance to be running on Localhost.
32
+
33
+ $ git clone https://github.com/cb372/observed-logstash.git
34
+ $ cd observed-logstash
35
+ $ bundle install
36
+ $ elasticsearch
37
+ $ bundle exec rspec
38
+
39
+ ## Usage
40
+
41
+ ### Configuration parameters
42
+
43
+ <table>
44
+ <tr><th>Name</th><th>Required?</th><th>Default value</th><th>Description</th></tr>
45
+ <tr><td>host</td><td>No</td><td>localhost:9200</td><td>ES server hostname and port</td></tr>
46
+ <tr><td>index_name_format</td><td>No</td><td>logstash-%Y.%m.%d (Logstash daily format)</td><td>Naming format of ES indices</td></tr>
47
+ <tr><td>query</td><td>Yes</td><td></td><td>A hash representing an ES query, e.g. { :term => { :status => 404 } }</td></tr>
48
+ <tr><td>timespan_in_seconds</td><td>Yes</td><td></td><td>Search for logs from the last N seconds</td></tr>
49
+ <tr><td>max_hits</td><td>No</td><td>1000000</td><td>Maximum number of matching logs in the last N seconds. If there are more than these, an error will be recorded.</td></tr>
50
+ <tr><td>min_hits</td><td>No</td><td>0</td><td></td></tr>
51
+ </table>
52
+
53
+ ### Example configuration
54
+
55
+ ````ruby
56
+ observe 'myapp.404', via: 'logstash', with: {
57
+ host: 'localhost:9200',
58
+ index_name_format: 'observed-logstash-test-%Y.%m.%d',
59
+ query: { :term => { :status => 404 } },
60
+ timespan_in_seconds: 3600,
61
+ max_hits: 10
62
+ }
63
+ ````
64
+
65
+ ### Example reporting
66
+
67
+ ````ruby
68
+ report /myapp.404/, via: 'stdout', with: {
69
+ format: -> tag, time, data {
70
+ case data[:status]
71
+ when :success
72
+ "Looks OK! #{data[:message]}"
73
+ else
74
+ "Oh noes! #{data[:message]}"
75
+ end
76
+ }
77
+ }
78
+ ````
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,31 @@
1
+ Feature: Check the number of 404 errors using an Elasticsearch query
2
+
3
+ In order to observe the number of Apache logs with status code 404 using Observed,
4
+ I want to the observed-logstash plugin to perform an Elasticsearch query,
5
+ check the number of search results, and report the result via reporters
6
+
7
+ Scenario: Create a .rb file containing Observed code and run it with the ruby command
8
+ Given a file named "test.rb" with:
9
+ """
10
+ require 'observed'
11
+ require 'observed/logstash'
12
+
13
+ include Observed
14
+
15
+ observe 'foo_1', via: 'logstash', with: {
16
+ host: 'localhost:9200',
17
+ query: { :term => { :status => 404 } },
18
+ timespan_in_seconds: 60,
19
+ max_results: 10,
20
+ timeout_in_milliseconds: 1000
21
+ }
22
+
23
+ report /foo_\d+/, via: 'stdout'
24
+
25
+ run 'foo_1'
26
+ """
27
+ When I run `ruby test.rb`
28
+ Then the output should contain:
29
+ """
30
+ foo_1.success
31
+ """
@@ -0,0 +1,8 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+ require 'aruba/cucumber'
3
+
4
+ World(Aruba::Api)
5
+
6
+ Before do
7
+ @aruba_timeout_seconds = 20
8
+ end
@@ -0,0 +1,81 @@
1
+ require 'observed/logstash/version'
2
+ require 'observed/observer'
3
+ require 'observed/observer_helpers/timer'
4
+ require 'elasticsearch'
5
+
6
+ module Observed
7
+ module Plugins
8
+ class Logstash < Observed::Observer
9
+
10
+ attribute :host, default: 'localhost:9200'
11
+ attribute :index_name_format, default: 'logstash-%Y.%m.%d'
12
+ attribute :query
13
+ attribute :timespan_in_seconds
14
+ attribute :max_hits, default: 1000000
15
+ attribute :min_hits, default: 0
16
+
17
+ def build_client
18
+ Elasticsearch::Client.new host: host
19
+ end
20
+
21
+ def build_timestamp_filter
22
+ {
23
+ :range => {
24
+ :@timestamp => {
25
+ :from => (system.now.to_f * 1000).to_i - (1000 * timespan_in_seconds),
26
+ :to => (system.now.to_f * 1000).to_i
27
+ }
28
+ }
29
+ }
30
+ end
31
+
32
+ def build_body
33
+ {
34
+ :query => query,
35
+ :filter => build_timestamp_filter
36
+ }
37
+ end
38
+
39
+ def build_data(hits)
40
+ data = { hits: hits, min_hits: min_hits, max_hits: max_hits }
41
+ if hits < min_hits
42
+ data[:status] = :error
43
+ data[:message] = "Not enough hits. Only #{hits} in the last #{timespan_in_seconds} seconds, required at least #{min_hits}"
44
+ elsif hits > max_hits
45
+ data[:status] = :error
46
+ data[:message] = "Too many hits. Got #{hits} in the last #{timespan_in_seconds} seconds, required at most #{max_hits}"
47
+ else
48
+ data[:status] = :success
49
+ data[:message] = "#{hits} hits in the last #{timespan_in_seconds} seconds"
50
+ end
51
+
52
+ data
53
+ end
54
+
55
+ def observe
56
+ logger.debug "Host: #{host}, index name format: #{index_name_format}, query: [#{query}], timespan: #{timespan_in_seconds}s, max hits: #{max_hits}, min hits: #{min_hits}"
57
+
58
+ index = system.now.strftime(index_name_format)
59
+ body = build_body
60
+
61
+ logger.debug "Index: #{index}, Body: #{body}"
62
+
63
+ client = build_client
64
+ response = client.search :index => index,
65
+ :body => body
66
+ hits = response['hits']['total'].to_i
67
+ logger.debug("Hits: #{hits}")
68
+
69
+ data = build_data(hits)
70
+ system.report("#{self.tag}.#{data[:status]}", data)
71
+ end
72
+
73
+ def logger
74
+ @logger ||= Logger.new(STDOUT)
75
+ end
76
+
77
+ plugin_name 'logstash'
78
+
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,5 @@
1
+ module Observed
2
+ module Logstash
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'observed/logstash/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "observed-logstash"
8
+ spec.version = Observed::Logstash::VERSION
9
+ spec.authors = ["Chris Birchall"]
10
+ spec.email = ["chris.birchall@gmail.com"]
11
+ spec.description = %q{observed-logstash}
12
+ spec.summary = %q{observed-logstash is a plugin for Observed that runs an Elasticsearch query and checks the number of results as a sign of healthiness.}
13
+ spec.homepage = "https://github.com/cb372/observed-logstash"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "observed", "~> 0.1.0"
22
+ spec.add_dependency "elasticsearch", "~> 0.4.1"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "mocha"
28
+ spec.add_development_dependency "fakefs"
29
+ spec.add_development_dependency "simplecov"
30
+ spec.add_development_dependency "cucumber"
31
+ spec.add_development_dependency "aruba"
32
+ end
@@ -0,0 +1,12 @@
1
+ require 'observed/builtin_plugins'
2
+ require 'observed/logstash'
3
+
4
+ observe 'myapp.404', via: 'logstash', with: {
5
+ host: 'localhost:9200',
6
+ index_name_format: 'observed-logstash-test-%Y.%m.%d',
7
+ query: { :term => { :status => 404 } },
8
+ timespan_in_seconds: 3600,
9
+ max_hits: 10
10
+ }
11
+
12
+ report /myapp.404/, via: 'stdout'
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ require 'observed/application/oneshot'
4
+ require 'elasticsearch'
5
+
6
+ describe Observed::Application::Oneshot do
7
+ subject {
8
+ Observed::Application::Oneshot.create(
9
+ config_file: 'spec/fixtures/observed.conf'
10
+ )
11
+ }
12
+
13
+ let(:index_name) {
14
+ Time.now.strftime('observed-logstash-test-%Y.%m.%d')
15
+ }
16
+
17
+ let(:client) {
18
+ Elasticsearch::Client.new
19
+ }
20
+
21
+ before do
22
+ client.indices.create :index => index_name
23
+ end
24
+
25
+ it 'initializes' do
26
+ expect(subject.run.size).not_to eq(0)
27
+ end
28
+
29
+ after do
30
+ client.indices.delete :index => index_name
31
+ end
32
+
33
+ end
@@ -0,0 +1,129 @@
1
+ require 'spec_helper'
2
+
3
+ require 'observed/logstash'
4
+ require 'elasticsearch'
5
+
6
+ describe Observed::Plugins::Logstash do
7
+
8
+ subject {
9
+ Observed::Plugins::Logstash.new
10
+ }
11
+
12
+ before {
13
+ subject.configure config
14
+ }
15
+
16
+ let(:config) {
17
+ {
18
+ host: 'localhost:9200',
19
+ index_name_format: 'apache_myapp-%Y.%m.%d',
20
+ query: { :term => { :status => 404 } },
21
+ timespan_in_seconds: 3600,
22
+ min_hits: 5,
23
+ max_hits: 10,
24
+ tag: 'foo',
25
+ system: sys
26
+ }
27
+ }
28
+
29
+ let(:sys) {
30
+ sys = mock('system')
31
+ sys.stubs(:now).returns(now)
32
+ sys
33
+ }
34
+
35
+ let(:now) {
36
+ Time.at(1384333117)
37
+ }
38
+
39
+ let(:now_millis) {
40
+ now.to_i * 1000
41
+ }
42
+
43
+ let(:one_hour_ago_millis) {
44
+ now_millis - (3600 * 1000)
45
+ }
46
+
47
+ let(:client) {
48
+ mock('client')
49
+ }
50
+
51
+ context 'when not enough hits' do
52
+ before {
53
+ client.stubs(:search).returns({ "hits" => { "total" => 4 } })
54
+ subject.stubs(:build_client).returns(client)
55
+
56
+ sys.expects(:report).with('foo.error', {
57
+ hits: 4,
58
+ min_hits: 5,
59
+ max_hits: 10,
60
+ status: :error,
61
+ message: 'Not enough hits. Only 4 in the last 3600 seconds, required at least 5'
62
+ })
63
+ }
64
+
65
+ it 'reports an error' do
66
+ expect { subject.observe }.to_not raise_error
67
+ end
68
+ end
69
+
70
+ context 'when too many hits' do
71
+ before {
72
+ client.stubs(:search).returns({ "hits" => { "total" => 11 } })
73
+ subject.stubs(:build_client).returns(client)
74
+
75
+ sys.expects(:report).with('foo.error', {
76
+ hits: 11,
77
+ min_hits: 5,
78
+ max_hits: 10,
79
+ status: :error,
80
+ message: 'Too many hits. Got 11 in the last 3600 seconds, required at most 10'
81
+ })
82
+ }
83
+
84
+ it 'reports an error' do
85
+ expect { subject.observe }.to_not raise_error
86
+ end
87
+ end
88
+
89
+ context 'when not too many or too few hits' do
90
+ before {
91
+ client.stubs(:search).returns({ "hits" => { "total" => 10 } })
92
+ subject.stubs(:build_client).returns(client)
93
+
94
+ sys.expects(:report).with('foo.success', {
95
+ hits: 10,
96
+ min_hits: 5,
97
+ max_hits: 10,
98
+ status: :success,
99
+ message: '10 hits in the last 3600 seconds'
100
+ })
101
+ }
102
+
103
+ it 'reports success' do
104
+ expect { subject.observe }.to_not raise_error
105
+ end
106
+ end
107
+
108
+ context 'when searching' do
109
+ before {
110
+ client.stubs(:search).returns({ "hits" => { "total" => 10 } })
111
+ subject.stubs(:build_client).returns(client)
112
+ }
113
+
114
+ it 'searches the correct index and constructs query correctly' do
115
+ expect { client.search :index => 'apache_myapp-2013.11.13',
116
+ :body => {
117
+ :query => { :term => { :status => 404 } },
118
+ :filter => { @timestamp => {
119
+ :from => one_hour_ago_millis,
120
+ :to => now_millis
121
+ }
122
+ }
123
+ }
124
+ }
125
+ end
126
+ end
127
+
128
+
129
+ end
@@ -0,0 +1,25 @@
1
+ require 'fakefs/spec_helpers'
2
+ require 'rspec'
3
+
4
+ Dir["#{File.expand_path('..', __FILE__)}/support/**/*.rb"].each { |f| require f }
5
+
6
+ puts "Please do not update/create files while tests are running."
7
+
8
+ RSpec.configure do |config|
9
+ config.color_enabled = true
10
+ config.order = :random
11
+ config.filter_run :focus => true
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+
15
+ config.before(:each) do
16
+ @fixture_path = Pathname.new(File.expand_path('../fixtures/', __FILE__))
17
+ end
18
+
19
+ config.mock_framework = :mocha
20
+ end
21
+
22
+ if RUBY_VERSION =~ /^1.9/
23
+ require 'simplecov'
24
+ SimpleCov.start
25
+ end
metadata ADDED
@@ -0,0 +1,205 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: observed-logstash
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Birchall
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: observed
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: elasticsearch
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.4.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.4.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mocha
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: fakefs
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: cucumber
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: aruba
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: observed-logstash
154
+ email:
155
+ - chris.birchall@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - .gitignore
161
+ - Gemfile
162
+ - LICENSE.txt
163
+ - README.md
164
+ - Rakefile
165
+ - features/observe_404_counts_using_elasticsearch.feature
166
+ - features/support/env.rb
167
+ - lib/observed/logstash.rb
168
+ - lib/observed/logstash/version.rb
169
+ - observed-logstash.gemspec
170
+ - spec/fixtures/observed.conf
171
+ - spec/integration_spec.rb
172
+ - spec/logstash_spec.rb
173
+ - spec/spec_helper.rb
174
+ homepage: https://github.com/cb372/observed-logstash
175
+ licenses:
176
+ - MIT
177
+ metadata: {}
178
+ post_install_message:
179
+ rdoc_options: []
180
+ require_paths:
181
+ - lib
182
+ required_ruby_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ requirements: []
193
+ rubyforge_project:
194
+ rubygems_version: 2.0.3
195
+ signing_key:
196
+ specification_version: 4
197
+ summary: observed-logstash is a plugin for Observed that runs an Elasticsearch query
198
+ and checks the number of results as a sign of healthiness.
199
+ test_files:
200
+ - features/observe_404_counts_using_elasticsearch.feature
201
+ - features/support/env.rb
202
+ - spec/fixtures/observed.conf
203
+ - spec/integration_spec.rb
204
+ - spec/logstash_spec.rb
205
+ - spec/spec_helper.rb