observed-logstash 0.1.0

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