riemann-tools 1.5.0 → 1.6.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 +4 -4
- data/.github/workflows/ci.yml +2 -2
- data/CHANGELOG.md +14 -0
- data/README.markdown +1 -0
- data/bin/riemann-http-check +10 -0
- data/lib/riemann/tools/bench.rb +0 -1
- data/lib/riemann/tools/health.rb +1 -2
- data/lib/riemann/tools/http_check.rb +208 -0
- data/lib/riemann/tools/mdstat_parser.tab.rb +187 -146
- data/lib/riemann/tools/net.rb +49 -5
- data/lib/riemann/tools/version.rb +1 -1
- data/riemann-tools.gemspec +2 -0
- metadata +37 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e201bab60a1f457d506ec890d20bbda78e7229fba76acbae599b85c7d366a07b
|
4
|
+
data.tar.gz: 522750b32f5002d8fd799f95a4686eb576d63723781269fb489dd23da5567c22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e1634227dddcdd7f4223489f1193ab45168572143fae011790bc811ec346cb21743722b5a068337f8a612a0c20ea76769f7af739d74c242a9d043ec8749b625
|
7
|
+
data.tar.gz: 0c761697583bd243ea1788877a63ea21decdb25012bd52d59e109165e2e76efde3c11299c60b81aa8a0442fb3482957f06539074ea5cb56fb1d5b698994ddf11
|
data/.github/workflows/ci.yml
CHANGED
@@ -13,7 +13,7 @@ jobs:
|
|
13
13
|
lint:
|
14
14
|
runs-on: ubuntu-latest
|
15
15
|
steps:
|
16
|
-
- uses: actions/checkout@
|
16
|
+
- uses: actions/checkout@v3
|
17
17
|
- name: Setup ruby
|
18
18
|
uses: ruby/setup-ruby@v1
|
19
19
|
with:
|
@@ -32,7 +32,7 @@ jobs:
|
|
32
32
|
- 3.0
|
33
33
|
- 3.1
|
34
34
|
steps:
|
35
|
-
- uses: actions/checkout@
|
35
|
+
- uses: actions/checkout@v3
|
36
36
|
- name: Setup Ruby
|
37
37
|
uses: ruby/setup-ruby@v1
|
38
38
|
with:
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v1.6.0](https://github.com/riemann/riemann-tools/tree/v1.6.0) (2022-11-04)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/riemann/riemann-tools/compare/v1.5.0...v1.6.0)
|
6
|
+
|
7
|
+
**Implemented enhancements:**
|
8
|
+
|
9
|
+
- Add `riemann-http-check` to monitor HTTP\(S\) resources [\#248](https://github.com/riemann/riemann-tools/pull/248) ([smortex](https://github.com/smortex))
|
10
|
+
- Add FreeBSD support to `riemann-net` [\#247](https://github.com/riemann/riemann-tools/pull/247) ([smortex](https://github.com/smortex))
|
11
|
+
|
12
|
+
**Fixed bugs:**
|
13
|
+
|
14
|
+
- Fix `riemann-health` detection of `df` header [\#246](https://github.com/riemann/riemann-tools/pull/246) ([smortex](https://github.com/smortex))
|
15
|
+
- Fix/Improve `riemann-md` mdstat parser [\#245](https://github.com/riemann/riemann-tools/pull/245) ([smortex](https://github.com/smortex))
|
16
|
+
|
3
17
|
## [v1.5.0](https://github.com/riemann/riemann-tools/tree/v1.5.0) (2022-09-08)
|
4
18
|
|
5
19
|
[Full Changelog](https://github.com/riemann/riemann-tools/compare/v1.4.0...v1.5.0)
|
data/README.markdown
CHANGED
@@ -40,6 +40,7 @@ ship with the `riemann-tools` gem, including:
|
|
40
40
|
* riemann-kvminstance - Monitor KVM instances.
|
41
41
|
* riemann-ntp - Monitor NTP.
|
42
42
|
* riemann-portcheck - Monitor open TCP ports.
|
43
|
+
* riemann-http-check - Monitor reachability of HTTP(S) resources.
|
43
44
|
|
44
45
|
Also contained in the repository are a number of stand-alone monitoring
|
45
46
|
tools, which are shipped as separate gems.
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
Process.setproctitle($PROGRAM_NAME)
|
5
|
+
|
6
|
+
require 'riemann/tools/http_check'
|
7
|
+
|
8
|
+
raise("Ruby #{Riemann::Tools::HttpCheck::REQUIRED_RUBY_VERSION} or better is required for using riemann-http-check") unless Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(Riemann::Tools::HttpCheck::REQUIRED_RUBY_VERSION)
|
9
|
+
|
10
|
+
Riemann::Tools::HttpCheck.run
|
data/lib/riemann/tools/bench.rb
CHANGED
data/lib/riemann/tools/health.rb
CHANGED
@@ -0,0 +1,208 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'resolv'
|
5
|
+
require 'socket'
|
6
|
+
|
7
|
+
require 'riemann/tools'
|
8
|
+
|
9
|
+
# Test for HTTP requests
|
10
|
+
module Riemann
|
11
|
+
module Tools
|
12
|
+
class HttpCheck
|
13
|
+
REQUIRED_RUBY_VERSION = '2.7.0'
|
14
|
+
|
15
|
+
include Riemann::Tools
|
16
|
+
|
17
|
+
opt :uri, 'URI to fetch', short: :none, type: :strings, default: ['http://localhost']
|
18
|
+
opt :response, 'Expected response codes', short: :none, type: :strings, default: [
|
19
|
+
'200', # OK
|
20
|
+
'301', # Moved Permanently
|
21
|
+
'401', # Unauthorized
|
22
|
+
]
|
23
|
+
opt :connection_latency_warning, 'Lattency warning threshold', short: :none, default: 0.1
|
24
|
+
opt :connection_latency_critical, 'Lattency critical threshold', short: :none, default: 0.25
|
25
|
+
opt :response_latency_warning, 'Lattency warning threshold', short: :none, default: 0.5
|
26
|
+
opt :response_latency_critical, 'Lattency critical threshold', short: :none, default: 1.0
|
27
|
+
opt :http_timeout, 'Timeout (in seconds) for HTTP requests', short: :none, default: 5.0
|
28
|
+
opt :checks, 'A list of checks to run.', short: :none, type: :strings, default: %w[consistency connection-latency response-code response-latency]
|
29
|
+
|
30
|
+
def tick
|
31
|
+
opts[:uri].each do |uri|
|
32
|
+
test_uri(uri)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_uri(uri)
|
37
|
+
uri = URI(uri)
|
38
|
+
|
39
|
+
request = ::Net::HTTP::Get.new(uri)
|
40
|
+
request.basic_auth(uri.user, uri.password)
|
41
|
+
|
42
|
+
responses = []
|
43
|
+
|
44
|
+
with_each_address(uri.host) do |address|
|
45
|
+
responses << test_uri_address(uri, address, request)
|
46
|
+
end
|
47
|
+
|
48
|
+
responses.compact!
|
49
|
+
|
50
|
+
return unless opts[:checks].include?('consistency')
|
51
|
+
|
52
|
+
raise StandardError, "Could not get any response from #{uri.host}" unless responses.any?
|
53
|
+
|
54
|
+
uniq_code = responses.map(&:code).uniq
|
55
|
+
uniq_body = responses.map(&:body).uniq
|
56
|
+
|
57
|
+
issues = []
|
58
|
+
issues << "#{uniq_code.count} different response code" unless uniq_code.one?
|
59
|
+
issues << "#{uniq_body.count} different response body" unless uniq_body.one?
|
60
|
+
|
61
|
+
if issues.none?
|
62
|
+
state = 'ok'
|
63
|
+
description = "consistent response on all #{responses.count} endpoints"
|
64
|
+
else
|
65
|
+
state = 'critical'
|
66
|
+
description = "#{issues.join(' and ')} on #{responses.count} endpoints"
|
67
|
+
end
|
68
|
+
|
69
|
+
report(
|
70
|
+
service: service(uri, 'consistency'),
|
71
|
+
state: state,
|
72
|
+
description: description,
|
73
|
+
hostname: uri.host,
|
74
|
+
port: uri.port,
|
75
|
+
)
|
76
|
+
rescue StandardError => e
|
77
|
+
report(
|
78
|
+
service: service(uri, 'consistency'),
|
79
|
+
state: 'critical',
|
80
|
+
description: e.message,
|
81
|
+
hostname: uri.host,
|
82
|
+
port: uri.port,
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_uri_address(uri, address, request)
|
87
|
+
response = nil
|
88
|
+
|
89
|
+
start = Time.now
|
90
|
+
connected = nil
|
91
|
+
done = nil
|
92
|
+
|
93
|
+
http = nil
|
94
|
+
begin
|
95
|
+
Timeout.timeout(opts[:http_timeout]) do
|
96
|
+
http = ::Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https', verify_mode: OpenSSL::SSL::VERIFY_NONE, ipaddr: address)
|
97
|
+
connected = Time.now
|
98
|
+
response = http.request(request)
|
99
|
+
end
|
100
|
+
rescue Timeout::Error
|
101
|
+
# Ignore
|
102
|
+
else
|
103
|
+
done = Time.now
|
104
|
+
ensure
|
105
|
+
http&.finish
|
106
|
+
end
|
107
|
+
|
108
|
+
report_http_endpoint_response_code(http, uri, response) if opts[:checks].include?('response-code')
|
109
|
+
report_http_endpoint_latency(http, uri, 'connection', start, connected) if opts[:checks].include?('connection-latency')
|
110
|
+
report_http_endpoint_latency(http, uri, 'response', start, done) if opts[:checks].include?('response-latency')
|
111
|
+
|
112
|
+
response
|
113
|
+
rescue StandardError
|
114
|
+
# Ignore this address
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
|
118
|
+
def with_each_address(host, &block)
|
119
|
+
addresses = Resolv::DNS.new.getaddresses(host)
|
120
|
+
if addresses.empty?
|
121
|
+
host = host[1...-1] if host[0] == '[' && host[-1] == ']'
|
122
|
+
addresses << IPAddr.new(host)
|
123
|
+
end
|
124
|
+
|
125
|
+
addresses.each do |address|
|
126
|
+
block.call(address.to_s)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def report_http_endpoint_response_code(http, uri, response)
|
131
|
+
return unless response
|
132
|
+
|
133
|
+
report(
|
134
|
+
{
|
135
|
+
state: response_code_state(response.code),
|
136
|
+
metric: response.code.to_i,
|
137
|
+
description: "#{response.code} #{response.message}",
|
138
|
+
}.merge(endpoint_report(http, uri, 'response code')),
|
139
|
+
)
|
140
|
+
end
|
141
|
+
|
142
|
+
def response_code_state(code)
|
143
|
+
opts[:response].include?(code) ? 'ok' : 'critical'
|
144
|
+
end
|
145
|
+
|
146
|
+
def report_http_endpoint_latency(http, uri, latency, start, stop)
|
147
|
+
if stop
|
148
|
+
metric = stop - start
|
149
|
+
report(
|
150
|
+
{
|
151
|
+
state: latency_state(latency, metric),
|
152
|
+
metric: metric,
|
153
|
+
description: format('%.3f ms', metric * 1000),
|
154
|
+
}.merge(endpoint_report(http, uri, "#{latency} latency")),
|
155
|
+
)
|
156
|
+
else
|
157
|
+
report(
|
158
|
+
{
|
159
|
+
state: 'critical',
|
160
|
+
description: 'timeout',
|
161
|
+
}.merge(endpoint_report(http, uri, "#{latency} latency")),
|
162
|
+
)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def latency_state(name, latency)
|
167
|
+
if latency > opts["#{name}_latency_critical".to_sym]
|
168
|
+
'critical'
|
169
|
+
elsif latency > opts["#{name}_latency_warning".to_sym]
|
170
|
+
'warning'
|
171
|
+
else
|
172
|
+
'ok'
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def endpoint_report(http, uri, service)
|
177
|
+
{
|
178
|
+
service: endpoint_service(http, uri, service),
|
179
|
+
hostname: uri.host,
|
180
|
+
address: http.ipaddr,
|
181
|
+
port: uri.port,
|
182
|
+
}
|
183
|
+
end
|
184
|
+
|
185
|
+
def endpoint_service(http, uri, service)
|
186
|
+
"get #{redact_uri(uri)} #{endpoint_name(IPAddr.new(http.ipaddr), http.port)} #{service}"
|
187
|
+
end
|
188
|
+
|
189
|
+
def service(uri, service)
|
190
|
+
"get #{redact_uri(uri)} #{service}"
|
191
|
+
end
|
192
|
+
|
193
|
+
def redact_uri(uri)
|
194
|
+
reported_uri = uri.dup
|
195
|
+
reported_uri.password = '**redacted**' if reported_uri.password
|
196
|
+
reported_uri
|
197
|
+
end
|
198
|
+
|
199
|
+
def endpoint_name(address, port)
|
200
|
+
if address.ipv6?
|
201
|
+
"[#{address}]:#{port}"
|
202
|
+
else
|
203
|
+
"#{address}:#{port}"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
@@ -15,53 +15,59 @@ module Riemann
|
|
15
15
|
module Tools
|
16
16
|
class MdstatParser < Racc::Parser
|
17
17
|
|
18
|
-
module_eval(<<'...end mdstat_parser.y/module_eval...', 'mdstat_parser.y',
|
18
|
+
module_eval(<<'...end mdstat_parser.y/module_eval...', 'mdstat_parser.y', 58)
|
19
19
|
|
20
20
|
def parse(text)
|
21
21
|
s = Utils::StringTokenizer.new(text)
|
22
22
|
|
23
23
|
until s.eos? do
|
24
24
|
case
|
25
|
-
when s.scan(/\n/)
|
26
|
-
when s.scan(/\s+/)
|
27
|
-
|
28
|
-
when s.scan(/\[
|
29
|
-
when s.scan(
|
30
|
-
|
31
|
-
when s.scan(
|
32
|
-
when s.scan(
|
33
|
-
when s.scan(
|
34
|
-
when s.scan(
|
35
|
-
when s.scan(
|
36
|
-
when s.scan(/\
|
37
|
-
when s.scan(
|
38
|
-
when s.scan(
|
39
|
-
when s.scan(
|
40
|
-
when s.scan(/
|
41
|
-
when s.scan(/
|
42
|
-
|
43
|
-
when s.scan(/
|
44
|
-
when s.scan(/
|
45
|
-
when s.scan(/
|
46
|
-
when s.scan(/
|
47
|
-
when s.scan(/
|
48
|
-
when s.scan(/
|
49
|
-
when s.scan(/
|
25
|
+
when s.scan(/\n/) then s.push_token(nil)
|
26
|
+
when s.scan(/\s+/) then s.push_token(nil)
|
27
|
+
|
28
|
+
when s.scan(/\([WJFSR]\)/) then s.push_token(:DISK_STATUS)
|
29
|
+
when s.scan(/<none>/) then s.push_token(:NONE)
|
30
|
+
|
31
|
+
when s.scan(/\[=*>.*\]/) then s.push_token(:PROGRESS)
|
32
|
+
when s.scan(/%/) then s.push_token('%')
|
33
|
+
when s.scan(/,/) then s.push_token(',')
|
34
|
+
when s.scan(/:/) then s.push_token(':')
|
35
|
+
when s.scan(/=/) then s.push_token('=')
|
36
|
+
when s.scan(/\(/) then s.push_token('(')
|
37
|
+
when s.scan(/\)/) then s.push_token(')')
|
38
|
+
when s.scan(/\./) then s.push_token('.')
|
39
|
+
when s.scan(/\//) then s.push_token('/')
|
40
|
+
when s.scan(/\[/) then s.push_token('[')
|
41
|
+
when s.scan(/]/) then s.push_token(']')
|
42
|
+
|
43
|
+
when s.scan(/DELAYED\b/) then s.push_token(:DELAYED)
|
44
|
+
when s.scan(/KB\b/) then s.push_token(:BYTE_UNIT)
|
45
|
+
when s.scan(/K\/sec\b/) then s.push_token(:SPEED_UNIT)
|
46
|
+
when s.scan(/PENDING\b/) then s.push_token(:PENDING)
|
47
|
+
when s.scan(/Personalities :/) then s.push_token(:PERSONALITIES)
|
48
|
+
when s.scan(/REMOTE\b/) then s.push_token(:REMOTE)
|
49
|
+
when s.scan(/algorithm\b/) then s.push_token(:ALGORITHM)
|
50
|
+
when s.scan(/bitmap\b/) then s.push_token(:BITMAP)
|
51
|
+
when s.scan(/blocks\b/) then s.push_token(:BLOCKS)
|
52
|
+
when s.scan(/check\b/) then s.push_token(:CHECK)
|
53
|
+
when s.scan(/chunk\b/) then s.push_token(:CHUNK)
|
54
|
+
when s.scan(/finish\b/) then s.push_token(:FINISH)
|
55
|
+
when s.scan(/k\b/) then s.push_token(:UNIT)
|
56
|
+
when s.scan(/level\b/) then s.push_token(:LEVEL)
|
57
|
+
when s.scan(/min\b/) then s.push_token(:MIN)
|
58
|
+
when s.scan(/pages\b/) then s.push_token(:PAGES)
|
50
59
|
when s.scan(/(raid([014-6]|10)|linear|multipath|faulty)\b/) then s.push_token(:PERSONALITY)
|
51
|
-
when s.scan(/
|
52
|
-
when s.scan(/recovery/)
|
53
|
-
when s.scan(/reshape/)
|
54
|
-
when s.scan(/resync/)
|
55
|
-
when s.scan(/speed/)
|
56
|
-
when s.scan(/super/)
|
57
|
-
when s.scan(/unused devices
|
58
|
-
|
59
|
-
when s.scan(
|
60
|
-
when s.scan(
|
61
|
-
when s.scan(/\
|
62
|
-
when s.scan(/\d+/) then s.push_token(:INTEGER, s.matched.to_i)
|
63
|
-
when s.scan(/F\b/) then s.push_token(:FAILED)
|
64
|
-
when s.scan(/\w+/) then s.push_token(:IDENTIFIER)
|
60
|
+
when s.scan(/recover\b/) then s.push_token(:RECOVER)
|
61
|
+
when s.scan(/recovery\b/) then s.push_token(:RECOVERY)
|
62
|
+
when s.scan(/reshape\b/) then s.push_token(:RESHAPE)
|
63
|
+
when s.scan(/resync\b/) then s.push_token(:RESYNC)
|
64
|
+
when s.scan(/speed\b/) then s.push_token(:SPEED)
|
65
|
+
when s.scan(/super\b/) then s.push_token(:SUPER)
|
66
|
+
when s.scan(/unused devices:/) then s.push_token(:UNUSED_DEVICES)
|
67
|
+
|
68
|
+
when s.scan(/\d+\.\d+/) then s.push_token(:FLOAT, s.matched.to_f)
|
69
|
+
when s.scan(/\d+/) then s.push_token(:INTEGER, s.matched.to_i)
|
70
|
+
when s.scan(/\w+/) then s.push_token(:IDENTIFIER)
|
65
71
|
else
|
66
72
|
s.unexpected_token
|
67
73
|
end
|
@@ -83,97 +89,109 @@ module_eval(<<'...end mdstat_parser.y/module_eval...', 'mdstat_parser.y', 49)
|
|
83
89
|
##### State transition tables begin ###
|
84
90
|
|
85
91
|
racc_action_table = [
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
58, 64, 65, 66, 67, 68, 69, 70,
|
92
|
-
|
93
|
-
|
92
|
+
60, 17, 10, 53, 54, 15, 73, 55, 56, 14,
|
93
|
+
3, 13, 10, 28, 4, 7, 12, 61, 72, 62,
|
94
|
+
63, 11, 71, 18, 19, 20, 21, 22, 23, 24,
|
95
|
+
10, 27, 30, 32, 34, 35, 36, 37, 38, 39,
|
96
|
+
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
|
97
|
+
50, 51, 58, 64, 65, 66, 67, 68, 69, 70,
|
98
|
+
74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
|
99
|
+
84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
|
100
|
+
94, 95, 96, 97, 98, 99, 100 ]
|
94
101
|
|
95
102
|
racc_action_check = [
|
96
|
-
5,
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
103
|
+
53, 11, 5, 50, 50, 11, 66, 50, 50, 10,
|
104
|
+
0, 10, 25, 25, 1, 4, 6, 53, 66, 53,
|
105
|
+
53, 5, 66, 12, 13, 14, 16, 18, 19, 20,
|
106
|
+
23, 24, 28, 30, 31, 32, 33, 34, 36, 37,
|
107
|
+
38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
108
|
+
48, 49, 52, 54, 55, 56, 58, 59, 64, 65,
|
109
|
+
67, 68, 74, 75, 76, 77, 78, 79, 80, 81,
|
110
|
+
82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
|
111
|
+
92, 93, 94, 95, 97, 98, 99 ]
|
104
112
|
|
105
113
|
racc_action_pointer = [
|
106
|
-
|
107
|
-
-
|
108
|
-
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
nil, nil, nil, nil,
|
113
|
-
|
114
|
-
36,
|
115
|
-
66, 56, nil
|
114
|
+
-8, 14, nil, nil, 15, -10, -16, nil, nil, nil,
|
115
|
+
-23, -11, 4, 12, 12, nil, 14, nil, -6, 9,
|
116
|
+
-4, nil, nil, 18, 22, 0, nil, nil, 28, nil,
|
117
|
+
4, 20, 24, 4, 24, nil, 25, 3, 5, 28,
|
118
|
+
29, 13, 11, 38, 14, 11, 36, 47, 17, 38,
|
119
|
+
-18, nil, 49, -6, 16, 17, 18, nil, 22, 20,
|
120
|
+
nil, nil, nil, nil, 34, 35, -2, 47, 50, nil,
|
121
|
+
nil, nil, nil, nil, 27, 25, 51, 26, 49, 54,
|
122
|
+
36, 34, 57, 58, 67, 33, 41, 65, 40, 40,
|
123
|
+
65, 68, 75, 66, 75, 56, nil, 47, 72, 58,
|
124
|
+
nil ]
|
116
125
|
|
117
126
|
racc_action_default = [
|
118
|
-
-
|
119
|
-
-
|
120
|
-
-
|
121
|
-
|
122
|
-
-
|
123
|
-
-
|
124
|
-
-
|
125
|
-
-
|
126
|
-
-
|
127
|
-
-
|
127
|
+
-33, -33, -6, -4, -33, -33, -2, 101, -1, -5,
|
128
|
+
-33, -33, -33, -33, -33, -29, -30, -32, -33, -33,
|
129
|
+
-33, -31, -3, -33, -11, -33, -9, -10, -33, -8,
|
130
|
+
-13, -15, -33, -33, -33, -12, -33, -33, -33, -33,
|
131
|
+
-33, -33, -33, -33, -33, -33, -33, -33, -33, -33,
|
132
|
+
-24, -14, -17, -33, -33, -33, -33, -7, -33, -33,
|
133
|
+
-25, -26, -27, -28, -33, -33, -33, -33, -33, -19,
|
134
|
+
-20, -21, -22, -23, -33, -33, -33, -33, -33, -33,
|
135
|
+
-33, -33, -33, -33, -33, -33, -33, -33, -33, -33,
|
136
|
+
-33, -33, -33, -33, -33, -33, -16, -33, -33, -33,
|
137
|
+
-18 ]
|
128
138
|
|
129
139
|
racc_goto_table = [
|
130
|
-
9, 1, 2, 5, 8,
|
131
|
-
57, 59,
|
132
|
-
|
140
|
+
9, 1, 2, 5, 8, 6, 25, 31, 33, 52,
|
141
|
+
57, 59, 16, nil, nil, nil, nil, nil, 26, nil,
|
142
|
+
29 ]
|
133
143
|
|
134
144
|
racc_goto_check = [
|
135
145
|
6, 1, 2, 3, 4, 5, 7, 8, 9, 10,
|
136
|
-
11, 12,
|
146
|
+
11, 12, 13, nil, nil, nil, nil, nil, 6, nil,
|
137
147
|
6 ]
|
138
148
|
|
139
149
|
racc_goto_pointer = [
|
140
|
-
nil, 1, 2, 1, -1,
|
141
|
-
-
|
150
|
+
nil, 1, 2, 1, -1, 2, -5, -17, -23, -23,
|
151
|
+
-41, -42, -42, 1 ]
|
142
152
|
|
143
153
|
racc_goto_default = [
|
144
154
|
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
145
|
-
nil, nil, nil ]
|
155
|
+
nil, nil, nil, nil ]
|
146
156
|
|
147
157
|
racc_reduce_table = [
|
148
158
|
0, 0, :racc_error,
|
149
|
-
3,
|
150
|
-
|
151
|
-
4,
|
152
|
-
0, 43, :_reduce_none,
|
153
|
-
2, 41, :_reduce_5,
|
154
|
-
0, 41, :_reduce_6,
|
155
|
-
19, 44, :_reduce_7,
|
156
|
-
2, 45, :_reduce_none,
|
157
|
-
1, 45, :_reduce_none,
|
158
|
-
7, 44, :_reduce_none,
|
159
|
-
4, 44, :_reduce_none,
|
160
|
-
2, 46, :_reduce_none,
|
159
|
+
3, 42, :_reduce_1,
|
160
|
+
2, 43, :_reduce_none,
|
161
|
+
4, 46, :_reduce_none,
|
161
162
|
0, 46, :_reduce_none,
|
162
|
-
|
163
|
-
0,
|
164
|
-
|
163
|
+
2, 44, :_reduce_5,
|
164
|
+
0, 44, :_reduce_6,
|
165
|
+
19, 47, :_reduce_7,
|
166
|
+
2, 48, :_reduce_none,
|
167
|
+
1, 48, :_reduce_none,
|
168
|
+
5, 47, :_reduce_none,
|
169
|
+
4, 47, :_reduce_none,
|
170
|
+
2, 49, :_reduce_none,
|
165
171
|
0, 49, :_reduce_none,
|
166
|
-
|
167
|
-
0,
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
172
|
+
9, 50, :_reduce_none,
|
173
|
+
0, 50, :_reduce_none,
|
174
|
+
14, 52, :_reduce_none,
|
175
|
+
0, 52, :_reduce_none,
|
176
|
+
18, 51, :_reduce_none,
|
177
|
+
3, 51, :_reduce_none,
|
178
|
+
3, 51, :_reduce_none,
|
179
|
+
3, 51, :_reduce_none,
|
180
|
+
3, 51, :_reduce_none,
|
181
|
+
3, 51, :_reduce_none,
|
182
|
+
0, 51, :_reduce_none,
|
183
|
+
1, 53, :_reduce_none,
|
184
|
+
1, 53, :_reduce_none,
|
185
|
+
1, 53, :_reduce_none,
|
186
|
+
1, 53, :_reduce_none,
|
187
|
+
2, 45, :_reduce_none,
|
188
|
+
2, 45, :_reduce_none,
|
189
|
+
2, 54, :_reduce_none,
|
190
|
+
1, 54, :_reduce_none ]
|
173
191
|
|
174
|
-
racc_reduce_n =
|
192
|
+
racc_reduce_n = 33
|
175
193
|
|
176
|
-
racc_shift_n =
|
194
|
+
racc_shift_n = 101
|
177
195
|
|
178
196
|
racc_token_table = {
|
179
197
|
false => 0,
|
@@ -184,38 +202,41 @@ racc_token_table = {
|
|
184
202
|
:BYTE_UNIT => 5,
|
185
203
|
:CHECK => 6,
|
186
204
|
:CHUNK => 7,
|
187
|
-
:
|
188
|
-
:
|
189
|
-
:
|
190
|
-
:
|
191
|
-
:
|
192
|
-
:
|
193
|
-
:
|
194
|
-
:
|
195
|
-
:
|
196
|
-
:
|
197
|
-
:
|
198
|
-
:
|
199
|
-
:
|
200
|
-
:
|
201
|
-
:
|
202
|
-
:
|
203
|
-
:
|
204
|
-
:
|
205
|
-
:
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
"
|
212
|
-
"
|
213
|
-
"
|
214
|
-
"
|
215
|
-
"
|
216
|
-
"
|
217
|
-
|
218
|
-
|
205
|
+
:DELAYED => 8,
|
206
|
+
:DISK_STATUS => 9,
|
207
|
+
:FINISH => 10,
|
208
|
+
:FLOAT => 11,
|
209
|
+
:IDENTIFIER => 12,
|
210
|
+
:INTEGER => 13,
|
211
|
+
:LEVEL => 14,
|
212
|
+
:MIN => 15,
|
213
|
+
:NONE => 16,
|
214
|
+
:PAGES => 17,
|
215
|
+
:PERSONALITIES => 18,
|
216
|
+
:PERSONALITY => 19,
|
217
|
+
:PENDING => 20,
|
218
|
+
:PROGRESS => 21,
|
219
|
+
:RECOVER => 22,
|
220
|
+
:RECOVERY => 23,
|
221
|
+
:REMOTE => 24,
|
222
|
+
:RESHAPE => 25,
|
223
|
+
:RESYNC => 26,
|
224
|
+
:SPEED => 27,
|
225
|
+
:SPEED_UNIT => 28,
|
226
|
+
:SUPER => 29,
|
227
|
+
:UNIT => 30,
|
228
|
+
:UNUSED_DEVICES => 31,
|
229
|
+
"[" => 32,
|
230
|
+
"]" => 33,
|
231
|
+
":" => 34,
|
232
|
+
"/" => 35,
|
233
|
+
"," => 36,
|
234
|
+
"=" => 37,
|
235
|
+
"%" => 38,
|
236
|
+
"(" => 39,
|
237
|
+
")" => 40 }
|
238
|
+
|
239
|
+
racc_nt_base = 41
|
219
240
|
|
220
241
|
racc_use_result_var = true
|
221
242
|
|
@@ -244,18 +265,23 @@ Racc_token_to_s_table = [
|
|
244
265
|
"BYTE_UNIT",
|
245
266
|
"CHECK",
|
246
267
|
"CHUNK",
|
247
|
-
"
|
268
|
+
"DELAYED",
|
269
|
+
"DISK_STATUS",
|
248
270
|
"FINISH",
|
249
271
|
"FLOAT",
|
250
272
|
"IDENTIFIER",
|
251
273
|
"INTEGER",
|
252
274
|
"LEVEL",
|
253
275
|
"MIN",
|
276
|
+
"NONE",
|
254
277
|
"PAGES",
|
255
278
|
"PERSONALITIES",
|
256
279
|
"PERSONALITY",
|
280
|
+
"PENDING",
|
257
281
|
"PROGRESS",
|
282
|
+
"RECOVER",
|
258
283
|
"RECOVERY",
|
284
|
+
"REMOTE",
|
259
285
|
"RESHAPE",
|
260
286
|
"RESYNC",
|
261
287
|
"SPEED",
|
@@ -263,17 +289,15 @@ Racc_token_to_s_table = [
|
|
263
289
|
"SUPER",
|
264
290
|
"UNIT",
|
265
291
|
"UNUSED_DEVICES",
|
266
|
-
"\":\"",
|
267
292
|
"\"[\"",
|
268
293
|
"\"]\"",
|
294
|
+
"\":\"",
|
269
295
|
"\"/\"",
|
270
|
-
"\"(\"",
|
271
|
-
"\")\"",
|
272
296
|
"\",\"",
|
273
297
|
"\"=\"",
|
274
298
|
"\"%\"",
|
275
|
-
"\"
|
276
|
-
"\"
|
299
|
+
"\"(\"",
|
300
|
+
"\")\"",
|
277
301
|
"$start",
|
278
302
|
"target",
|
279
303
|
"personalities",
|
@@ -286,7 +310,8 @@ Racc_token_to_s_table = [
|
|
286
310
|
"level",
|
287
311
|
"progress",
|
288
312
|
"bitmap",
|
289
|
-
"progress_action"
|
313
|
+
"progress_action",
|
314
|
+
"identifiers" ]
|
290
315
|
|
291
316
|
Racc_debug_parser = false
|
292
317
|
|
@@ -362,6 +387,22 @@ module_eval(<<'.,.,', 'mdstat_parser.y', 13)
|
|
362
387
|
|
363
388
|
# reduce 24 omitted
|
364
389
|
|
390
|
+
# reduce 25 omitted
|
391
|
+
|
392
|
+
# reduce 26 omitted
|
393
|
+
|
394
|
+
# reduce 27 omitted
|
395
|
+
|
396
|
+
# reduce 28 omitted
|
397
|
+
|
398
|
+
# reduce 29 omitted
|
399
|
+
|
400
|
+
# reduce 30 omitted
|
401
|
+
|
402
|
+
# reduce 31 omitted
|
403
|
+
|
404
|
+
# reduce 32 omitted
|
405
|
+
|
365
406
|
def _reduce_none(val, _values, result)
|
366
407
|
val[0]
|
367
408
|
end
|
data/lib/riemann/tools/net.rb
CHANGED
@@ -9,7 +9,7 @@ module Riemann
|
|
9
9
|
include Riemann::Tools
|
10
10
|
|
11
11
|
opt :interfaces, 'Interfaces to monitor', type: :strings, default: nil
|
12
|
-
opt :ignore_interfaces, 'Interfaces to ignore', type: :strings, default: ['
|
12
|
+
opt :ignore_interfaces, 'Interfaces to ignore', type: :strings, default: ['\Alo\d*\z']
|
13
13
|
|
14
14
|
def initialize
|
15
15
|
@old_state = nil
|
@@ -19,9 +19,54 @@ module Riemann
|
|
19
19
|
[]
|
20
20
|
end
|
21
21
|
@ignore_interfaces = opts[:ignore_interfaces].reject(&:empty?).map(&:dup)
|
22
|
+
|
23
|
+
ostype = `uname -s`.chomp.downcase
|
24
|
+
case ostype
|
25
|
+
when 'freebsd'
|
26
|
+
@state = method :freebsd_state
|
27
|
+
else
|
28
|
+
puts "WARNING: OS '#{ostype}' not explicitly supported. Falling back to Linux" unless ostype == 'linux'
|
29
|
+
@state = method :linux_state
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def report_interface?(iface)
|
34
|
+
if !@interfaces.empty?
|
35
|
+
@interfaces.any? { |pattern| iface.match?(pattern) }
|
36
|
+
else
|
37
|
+
@ignore_interfaces.none? { |pattern| iface.match?(pattern) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
FREEBSD_MAPPING = {
|
42
|
+
'collisions' => 'tx colls',
|
43
|
+
'dropped-packets' => 'rx drop',
|
44
|
+
'received-bytes' => 'rx bytes',
|
45
|
+
'received-packets' => 'rx packets',
|
46
|
+
'received-errors' => 'rx errs',
|
47
|
+
'sent-bytes' => 'tx bytes',
|
48
|
+
'sent-packets' => 'tx packets',
|
49
|
+
'send-errors' => 'tx errs',
|
50
|
+
}.freeze
|
51
|
+
|
52
|
+
def freebsd_state
|
53
|
+
require 'json'
|
54
|
+
|
55
|
+
state = {}
|
56
|
+
|
57
|
+
all_stats = JSON.parse(`netstat -inb --libxo=json`)
|
58
|
+
all_stats.dig('statistics', 'interface').select { |s| s['mtu'] }.each do |interface_stats|
|
59
|
+
next unless report_interface?(interface_stats['name'])
|
60
|
+
|
61
|
+
FREEBSD_MAPPING.each do |key, service|
|
62
|
+
state["#{interface_stats['name']} #{service}"] = interface_stats[key]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
state
|
22
67
|
end
|
23
68
|
|
24
|
-
def
|
69
|
+
def linux_state
|
25
70
|
f = File.read('/proc/net/dev')
|
26
71
|
state = {}
|
27
72
|
f.split("\n").each do |line|
|
@@ -29,8 +74,7 @@ module Riemann
|
|
29
74
|
|
30
75
|
iface = Regexp.last_match(1)
|
31
76
|
|
32
|
-
next unless
|
33
|
-
next if @ignore_interfaces.any? { |pattern| iface.match?(pattern) }
|
77
|
+
next unless report_interface?(iface)
|
34
78
|
|
35
79
|
['rx bytes',
|
36
80
|
'rx packets',
|
@@ -60,7 +104,7 @@ module Riemann
|
|
60
104
|
end
|
61
105
|
|
62
106
|
def tick
|
63
|
-
state =
|
107
|
+
state = @state.call
|
64
108
|
|
65
109
|
if @old_state
|
66
110
|
# Report services from `@old_state` that don't exist in `state` as expired
|
data/riemann-tools.gemspec
CHANGED
@@ -48,4 +48,6 @@ Gem::Specification.new do |spec|
|
|
48
48
|
spec.add_development_dependency 'rubocop'
|
49
49
|
spec.add_development_dependency 'rubocop-rake'
|
50
50
|
spec.add_development_dependency 'rubocop-rspec'
|
51
|
+
spec.add_development_dependency 'sinatra'
|
52
|
+
spec.add_development_dependency 'webrick'
|
51
53
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riemann-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyle Kingsbury
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -156,6 +156,34 @@ dependencies:
|
|
156
156
|
- - ">="
|
157
157
|
- !ruby/object:Gem::Version
|
158
158
|
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: sinatra
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: webrick
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
type: :development
|
181
|
+
prerelease: false
|
182
|
+
version_requirements: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: '0'
|
159
187
|
description: Collection of utilities which submit events to Riemann,
|
160
188
|
email:
|
161
189
|
- aphyr@aphyr.com
|
@@ -171,6 +199,7 @@ executables:
|
|
171
199
|
- riemann-freeswitch
|
172
200
|
- riemann-haproxy
|
173
201
|
- riemann-health
|
202
|
+
- riemann-http-check
|
174
203
|
- riemann-kvminstance
|
175
204
|
- riemann-md
|
176
205
|
- riemann-memcached
|
@@ -213,6 +242,7 @@ files:
|
|
213
242
|
- bin/riemann-freeswitch
|
214
243
|
- bin/riemann-haproxy
|
215
244
|
- bin/riemann-health
|
245
|
+
- bin/riemann-http-check
|
216
246
|
- bin/riemann-kvminstance
|
217
247
|
- bin/riemann-md
|
218
248
|
- bin/riemann-memcached
|
@@ -237,6 +267,7 @@ files:
|
|
237
267
|
- lib/riemann/tools/freeswitch.rb
|
238
268
|
- lib/riemann/tools/haproxy.rb
|
239
269
|
- lib/riemann/tools/health.rb
|
270
|
+
- lib/riemann/tools/http_check.rb
|
240
271
|
- lib/riemann/tools/kvm.rb
|
241
272
|
- lib/riemann/tools/md.rb
|
242
273
|
- lib/riemann/tools/mdstat_parser.tab.rb
|
@@ -321,7 +352,7 @@ metadata:
|
|
321
352
|
homepage_uri: https://github.com/aphyr/riemann-tools
|
322
353
|
source_code_uri: https://github.com/aphyr/riemann-tools
|
323
354
|
changelog_uri: https://github.com/aphyr/riemann-tools
|
324
|
-
post_install_message:
|
355
|
+
post_install_message:
|
325
356
|
rdoc_options: []
|
326
357
|
require_paths:
|
327
358
|
- lib
|
@@ -336,8 +367,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
336
367
|
- !ruby/object:Gem::Version
|
337
368
|
version: '0'
|
338
369
|
requirements: []
|
339
|
-
rubygems_version: 3.
|
340
|
-
signing_key:
|
370
|
+
rubygems_version: 3.3.23
|
371
|
+
signing_key:
|
341
372
|
specification_version: 4
|
342
373
|
summary: Utilities which submit events to Riemann.
|
343
374
|
test_files: []
|