riemann-tools 1.4.0 → 1.5.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/CHANGELOG.md +13 -0
- data/lib/riemann/tools/haproxy.rb +2 -2
- data/lib/riemann/tools/health.rb +11 -0
- data/lib/riemann/tools/md.rb +6 -0
- data/lib/riemann/tools/mdstat_parser.tab.rb +165 -134
- data/lib/riemann/tools/uptime_parser.tab.rb +41 -29
- data/lib/riemann/tools/utils.rb +48 -0
- data/lib/riemann/tools/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce2307f0dfeaad07e9b904c5f0edf2b0d7a586507c94e8ffb2ff9e3ccf6b3c6f
|
4
|
+
data.tar.gz: 8178becee10569b018dfdb54693cfa9e5c5a61dfe62ecdec7ca257004e2365ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7588c24abd5c87eb95ced867cc23350697ef893463e939a47c481518209a386c2b0a56e93e9d470e2fe1d9d0a78fa01d5b8d0e3f6af265d014072a00cf44570d
|
7
|
+
data.tar.gz: 54bd9df700e67ee112e856e6104018bac1ad54444533186cdd2425416fa2ab9a0939c5bfd7de5446045d4813c9a8fac5e34db9d997ea841c9665ae97f7224b95
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v1.5.0](https://github.com/riemann/riemann-tools/tree/v1.5.0) (2022-09-08)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/riemann/riemann-tools/compare/v1.4.0...v1.5.0)
|
6
|
+
|
7
|
+
**Implemented enhancements:**
|
8
|
+
|
9
|
+
- Improve error reporting on parse error [\#242](https://github.com/riemann/riemann-tools/pull/242) ([smortex](https://github.com/smortex))
|
10
|
+
|
11
|
+
**Fixed bugs:**
|
12
|
+
|
13
|
+
- Fix `riemann-haproxy` HTTP response processing [\#243](https://github.com/riemann/riemann-tools/pull/243) ([ahoetker-deca](https://github.com/ahoetker-deca))
|
14
|
+
- Fix `riemann-md` parsing of mdstat when device is being checked [\#241](https://github.com/riemann/riemann-tools/pull/241) ([smortex](https://github.com/smortex))
|
15
|
+
|
3
16
|
## [v1.4.0](https://github.com/riemann/riemann-tools/tree/v1.4.0) (2022-08-30)
|
4
17
|
|
5
18
|
[Full Changelog](https://github.com/riemann/riemann-tools/compare/v1.3.0...v1.4.0)
|
@@ -44,7 +44,7 @@ module Riemann
|
|
44
44
|
def csv
|
45
45
|
http = ::Net::HTTP.new(@uri.host, @uri.port)
|
46
46
|
http.use_ssl = true if @uri.scheme == 'https'
|
47
|
-
http.start do |h|
|
47
|
+
res = http.start do |h|
|
48
48
|
get = ::Net::HTTP::Get.new(@uri.request_uri)
|
49
49
|
unless @uri.userinfo.nil?
|
50
50
|
userinfo = @uri.userinfo.split(':')
|
@@ -52,7 +52,7 @@ module Riemann
|
|
52
52
|
end
|
53
53
|
h.request get
|
54
54
|
end
|
55
|
-
CSV.parse(
|
55
|
+
CSV.parse(res.body.split('# ')[1], { headers: true })
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
data/lib/riemann/tools/health.rb
CHANGED
@@ -103,6 +103,8 @@ module Riemann
|
|
103
103
|
@swap_enabled = true
|
104
104
|
end
|
105
105
|
end
|
106
|
+
|
107
|
+
invalidate_cache
|
106
108
|
end
|
107
109
|
|
108
110
|
def alert(service, state, metric, description)
|
@@ -139,6 +141,8 @@ module Riemann
|
|
139
141
|
end
|
140
142
|
|
141
143
|
def report_uptime(uptime)
|
144
|
+
return unless uptime
|
145
|
+
|
142
146
|
description = uptime_to_human(uptime)
|
143
147
|
|
144
148
|
if uptime < @limits[:uptime][:critical]
|
@@ -262,6 +266,13 @@ module Riemann
|
|
262
266
|
|
263
267
|
def uptime
|
264
268
|
@cached_data[:uptime] ||= uptime_parser.parse(`uptime`)
|
269
|
+
rescue Racc::ParseError => e
|
270
|
+
report(
|
271
|
+
service: 'uptime',
|
272
|
+
description: "Error parsing uptime: #{e.message}",
|
273
|
+
state: 'critical',
|
274
|
+
)
|
275
|
+
@cached_data[:uptime] = {}
|
265
276
|
end
|
266
277
|
|
267
278
|
def bsd_load
|
data/lib/riemann/tools/md.rb
CHANGED
@@ -23,6 +23,12 @@ module Riemann
|
|
23
23
|
description: status,
|
24
24
|
state: state,
|
25
25
|
)
|
26
|
+
rescue Racc::ParseError => e
|
27
|
+
report(
|
28
|
+
service: 'mdstat',
|
29
|
+
description: "Error parsing mdstat: #{e.message}",
|
30
|
+
state: 'critical',
|
31
|
+
)
|
26
32
|
rescue Errno::ENOENT => e
|
27
33
|
report(
|
28
34
|
service: 'mdstat',
|
@@ -9,155 +9,171 @@ require 'racc/parser.rb'
|
|
9
9
|
|
10
10
|
require 'strscan'
|
11
11
|
|
12
|
+
require 'riemann/tools/utils'
|
13
|
+
|
12
14
|
module Riemann
|
13
15
|
module Tools
|
14
16
|
class MdstatParser < Racc::Parser
|
15
17
|
|
16
|
-
module_eval(<<'...end mdstat_parser.y/module_eval...', 'mdstat_parser.y',
|
18
|
+
module_eval(<<'...end mdstat_parser.y/module_eval...', 'mdstat_parser.y', 49)
|
17
19
|
|
18
20
|
def parse(text)
|
19
|
-
s =
|
20
|
-
@tokens = []
|
21
|
+
s = Utils::StringTokenizer.new(text)
|
21
22
|
|
22
23
|
until s.eos? do
|
23
24
|
case
|
24
|
-
when s.scan(/\n/) then
|
25
|
-
when s.scan(/\s+/) then
|
26
|
-
|
27
|
-
when s.scan(/\[=*>.*\]/) then
|
28
|
-
when s.scan(/%/) then
|
29
|
-
when s.scan(/,/) then
|
30
|
-
when s.scan(/:/) then
|
31
|
-
when s.scan(/</) then
|
32
|
-
when s.scan(/=/) then
|
33
|
-
when s.scan(/>/) then
|
34
|
-
when s.scan(/\(/) then
|
35
|
-
when s.scan(/\)/) then
|
36
|
-
when s.scan(/\./) then
|
37
|
-
when s.scan(/\//) then
|
38
|
-
when s.scan(/\[/) then
|
39
|
-
when s.scan(/]/) then
|
40
|
-
when s.scan(/algorithm/) then
|
41
|
-
when s.scan(/bitmap/) then
|
42
|
-
when s.scan(/blocks/) then
|
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(/
|
50
|
-
when s.scan(/
|
51
|
-
when s.scan(/
|
52
|
-
when s.scan(/
|
53
|
-
when s.scan(/
|
54
|
-
when s.scan(/
|
55
|
-
when s.scan(/
|
56
|
-
when s.scan(/
|
57
|
-
when s.scan(
|
58
|
-
when s.scan(
|
59
|
-
when s.scan(/
|
60
|
-
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(/\[=*>.*\]/) then s.push_token(:PROGRESS)
|
29
|
+
when s.scan(/%/) then s.push_token('%')
|
30
|
+
when s.scan(/,/) then s.push_token(',')
|
31
|
+
when s.scan(/:/) then s.push_token(':')
|
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(/algorithm/) then s.push_token(:ALGORITHM)
|
42
|
+
when s.scan(/bitmap/) then s.push_token(:BITMAP)
|
43
|
+
when s.scan(/blocks/) then s.push_token(:BLOCKS)
|
44
|
+
when s.scan(/check/) then s.push_token(:CHECK)
|
45
|
+
when s.scan(/chunk/) then s.push_token(:CHUNK)
|
46
|
+
when s.scan(/finish/) then s.push_token(:FINISH)
|
47
|
+
when s.scan(/level/) then s.push_token(:LEVEL)
|
48
|
+
when s.scan(/min/) then s.push_token(:MIN)
|
49
|
+
when s.scan(/pages/) then s.push_token(:PAGES)
|
50
|
+
when s.scan(/(raid([014-6]|10)|linear|multipath|faulty)\b/) then s.push_token(:PERSONALITY)
|
51
|
+
when s.scan(/Personalities/) then s.push_token(:PERSONALITIES)
|
52
|
+
when s.scan(/recovery/) then s.push_token(:RECOVERY)
|
53
|
+
when s.scan(/reshape/) then s.push_token(:RESHAPE)
|
54
|
+
when s.scan(/resync/) then s.push_token(:RESYNC)
|
55
|
+
when s.scan(/speed/) then s.push_token(:SPEED)
|
56
|
+
when s.scan(/super/) then s.push_token(:SUPER)
|
57
|
+
when s.scan(/unused devices/) then s.push_token(:UNUSED_DEVICES)
|
58
|
+
when s.scan(/K\/sec/) then s.push_token(:SPEED_UNIT)
|
59
|
+
when s.scan(/KB/) then s.push_token(:BYTE_UNIT)
|
60
|
+
when s.scan(/k/) then s.push_token(:UNIT)
|
61
|
+
when s.scan(/\d+\.\d+/) then s.push_token(:FLOAT, s.matched.to_f)
|
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)
|
61
65
|
else
|
62
|
-
|
66
|
+
s.unexpected_token
|
63
67
|
end
|
64
68
|
end
|
65
69
|
|
70
|
+
@tokens = s.tokens
|
71
|
+
|
66
72
|
do_parse
|
67
73
|
end
|
68
74
|
|
69
75
|
def next_token
|
70
76
|
@tokens.shift
|
71
77
|
end
|
78
|
+
|
79
|
+
def on_error(error_token_id, error_value, value_stack)
|
80
|
+
raise(Racc::ParseError, "parse error on value \"#{error_value[:value]}\" (#{token_to_str(error_token_id)}) on line #{error_value[:lineno]}:\n#{error_value[:line]}\n#{' ' * error_value[:pos]}^#{'~' * (error_value[:value].to_s.length - 1)}")
|
81
|
+
end
|
72
82
|
...end mdstat_parser.y/module_eval...
|
73
83
|
##### State transition tables begin ###
|
74
84
|
|
75
85
|
racc_action_table = [
|
76
|
-
10, 13, 14, 10, 29, 3, 4, 6, 7,
|
77
|
-
16, 17, 18,
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
86
|
+
10, 13, 14, 60, 10, 29, 3, 4, 6, 7,
|
87
|
+
15, 16, 17, 18, 19, 11, 61, 62, 63, 20,
|
88
|
+
21, 22, 23, 24, 10, 27, 28, 31, 32, 33,
|
89
|
+
35, 37, 38, 39, 40, 41, 42, 43, 44, 45,
|
90
|
+
46, 47, 48, 49, 50, 51, 52, 53, 54, 56,
|
91
|
+
58, 64, 65, 66, 67, 68, 69, 70, 71, 72,
|
92
|
+
73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
|
93
|
+
83, 84, 85, 86, 87, 88, 89, 90, 91, 92 ]
|
84
94
|
|
85
95
|
racc_action_check = [
|
86
|
-
5, 10, 10, 25, 25, 0, 1, 3, 4,
|
87
|
-
12, 13, 14,
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
96
|
+
5, 10, 10, 56, 25, 25, 0, 1, 3, 4,
|
97
|
+
11, 12, 13, 14, 15, 5, 56, 56, 56, 16,
|
98
|
+
17, 18, 19, 20, 21, 22, 23, 27, 29, 31,
|
99
|
+
32, 34, 35, 36, 37, 39, 40, 41, 42, 43,
|
100
|
+
44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
|
101
|
+
55, 58, 59, 64, 65, 66, 67, 68, 69, 70,
|
102
|
+
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
|
103
|
+
81, 82, 83, 84, 85, 86, 87, 89, 90, 91 ]
|
94
104
|
|
95
105
|
racc_action_pointer = [
|
96
|
-
-10,
|
97
|
-
-
|
98
|
-
-
|
99
|
-
nil, -
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
106
|
+
-10, 7, nil, -19, 9, -11, nil, nil, nil, nil,
|
107
|
+
-26, -17, -17, 1, 1, -22, 2, 3, -8, 11,
|
108
|
+
-6, 13, -6, -11, nil, -7, nil, 19, nil, 24,
|
109
|
+
nil, -3, 6, nil, 18, 22, 5, 22, nil, 23,
|
110
|
+
3, 7, 26, 27, 15, 12, 35, 15, 11, 34,
|
111
|
+
44, 18, 36, 31, nil, 47, -3, nil, 24, 18,
|
112
|
+
nil, nil, nil, nil, 41, 44, 25, 21, 45, 27,
|
113
|
+
44, 48, 33, 32, 51, 52, 60, 34, 38, 59,
|
114
|
+
36, 36, 59, 62, 68, 60, 68, 54, nil, 43,
|
115
|
+
66, 56, nil ]
|
105
116
|
|
106
117
|
racc_action_default = [
|
107
|
-
-
|
108
|
-
-
|
109
|
-
-
|
110
|
-
-8, -
|
111
|
-
-
|
112
|
-
-
|
113
|
-
-
|
114
|
-
-
|
115
|
-
-
|
118
|
+
-25, -25, -6, -25, -25, -25, -4, 93, -1, -5,
|
119
|
+
-25, -25, -2, -25, -25, -25, -25, -25, -25, -25,
|
120
|
+
-25, -25, -11, -25, -3, -25, -9, -25, -24, -25,
|
121
|
+
-8, -25, -13, -10, -15, -25, -25, -25, -12, -25,
|
122
|
+
-25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
|
123
|
+
-25, -25, -25, -19, -14, -17, -25, -7, -25, -25,
|
124
|
+
-20, -21, -22, -23, -25, -25, -25, -25, -25, -25,
|
125
|
+
-25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
|
126
|
+
-25, -25, -25, -25, -25, -25, -25, -25, -16, -25,
|
127
|
+
-25, -25, -18 ]
|
116
128
|
|
117
129
|
racc_goto_table = [
|
118
130
|
9, 1, 2, 5, 8, 12, 25, 34, 36, 55,
|
119
|
-
57,
|
131
|
+
57, 59, nil, nil, nil, nil, 26, nil, nil, nil,
|
120
132
|
30 ]
|
121
133
|
|
122
134
|
racc_goto_check = [
|
123
135
|
6, 1, 2, 3, 4, 5, 7, 8, 9, 10,
|
124
|
-
11,
|
136
|
+
11, 12, nil, nil, nil, nil, 6, nil, nil, nil,
|
125
137
|
6 ]
|
126
138
|
|
127
139
|
racc_goto_pointer = [
|
128
140
|
nil, 1, 2, 1, -1, -1, -5, -15, -25, -26,
|
129
|
-
-44, -45 ]
|
141
|
+
-44, -45, -45 ]
|
130
142
|
|
131
143
|
racc_goto_default = [
|
132
144
|
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
133
|
-
nil, nil ]
|
145
|
+
nil, nil, nil ]
|
134
146
|
|
135
147
|
racc_reduce_table = [
|
136
148
|
0, 0, :racc_error,
|
137
|
-
3,
|
138
|
-
3,
|
139
|
-
4,
|
140
|
-
0, 40, :_reduce_none,
|
141
|
-
2, 38, :_reduce_5,
|
142
|
-
0, 38, :_reduce_6,
|
143
|
-
19, 41, :_reduce_7,
|
144
|
-
2, 42, :_reduce_none,
|
145
|
-
1, 42, :_reduce_none,
|
146
|
-
7, 41, :_reduce_none,
|
147
|
-
4, 41, :_reduce_none,
|
148
|
-
2, 43, :_reduce_none,
|
149
|
+
3, 39, :_reduce_1,
|
150
|
+
3, 40, :_reduce_none,
|
151
|
+
4, 43, :_reduce_none,
|
149
152
|
0, 43, :_reduce_none,
|
150
|
-
|
151
|
-
0,
|
152
|
-
|
153
|
-
|
154
|
-
|
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,
|
155
161
|
0, 46, :_reduce_none,
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
162
|
+
9, 47, :_reduce_none,
|
163
|
+
0, 47, :_reduce_none,
|
164
|
+
14, 49, :_reduce_none,
|
165
|
+
0, 49, :_reduce_none,
|
166
|
+
18, 48, :_reduce_none,
|
167
|
+
0, 48, :_reduce_none,
|
168
|
+
1, 50, :_reduce_none,
|
169
|
+
1, 50, :_reduce_none,
|
170
|
+
1, 50, :_reduce_none,
|
171
|
+
1, 50, :_reduce_none,
|
172
|
+
5, 42, :_reduce_none ]
|
173
|
+
|
174
|
+
racc_reduce_n = 25
|
175
|
+
|
176
|
+
racc_shift_n = 93
|
161
177
|
|
162
178
|
racc_token_table = {
|
163
179
|
false => 0,
|
@@ -166,37 +182,40 @@ racc_token_table = {
|
|
166
182
|
:BITMAP => 3,
|
167
183
|
:BLOCKS => 4,
|
168
184
|
:BYTE_UNIT => 5,
|
169
|
-
:
|
170
|
-
:
|
171
|
-
:
|
172
|
-
:
|
173
|
-
:
|
174
|
-
:
|
175
|
-
:
|
176
|
-
:
|
177
|
-
:
|
178
|
-
:
|
179
|
-
:
|
180
|
-
:
|
181
|
-
:
|
182
|
-
:
|
183
|
-
:
|
184
|
-
:
|
185
|
-
:
|
186
|
-
:
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
"
|
191
|
-
"
|
192
|
-
"
|
193
|
-
"
|
194
|
-
"
|
195
|
-
"
|
196
|
-
"
|
197
|
-
"
|
198
|
-
|
199
|
-
|
185
|
+
:CHECK => 6,
|
186
|
+
:CHUNK => 7,
|
187
|
+
:FAILED => 8,
|
188
|
+
:FINISH => 9,
|
189
|
+
:FLOAT => 10,
|
190
|
+
:IDENTIFIER => 11,
|
191
|
+
:INTEGER => 12,
|
192
|
+
:LEVEL => 13,
|
193
|
+
:MIN => 14,
|
194
|
+
:PAGES => 15,
|
195
|
+
:PERSONALITIES => 16,
|
196
|
+
:PERSONALITY => 17,
|
197
|
+
:PROGRESS => 18,
|
198
|
+
:RECOVERY => 19,
|
199
|
+
:RESHAPE => 20,
|
200
|
+
:RESYNC => 21,
|
201
|
+
:SPEED => 22,
|
202
|
+
:SPEED_UNIT => 23,
|
203
|
+
:SUPER => 24,
|
204
|
+
:UNIT => 25,
|
205
|
+
:UNUSED_DEVICES => 26,
|
206
|
+
":" => 27,
|
207
|
+
"[" => 28,
|
208
|
+
"]" => 29,
|
209
|
+
"/" => 30,
|
210
|
+
"(" => 31,
|
211
|
+
")" => 32,
|
212
|
+
"," => 33,
|
213
|
+
"=" => 34,
|
214
|
+
"%" => 35,
|
215
|
+
"<" => 36,
|
216
|
+
">" => 37 }
|
217
|
+
|
218
|
+
racc_nt_base = 38
|
200
219
|
|
201
220
|
racc_use_result_var = true
|
202
221
|
|
@@ -223,6 +242,7 @@ Racc_token_to_s_table = [
|
|
223
242
|
"BITMAP",
|
224
243
|
"BLOCKS",
|
225
244
|
"BYTE_UNIT",
|
245
|
+
"CHECK",
|
226
246
|
"CHUNK",
|
227
247
|
"FAILED",
|
228
248
|
"FINISH",
|
@@ -236,6 +256,8 @@ Racc_token_to_s_table = [
|
|
236
256
|
"PERSONALITY",
|
237
257
|
"PROGRESS",
|
238
258
|
"RECOVERY",
|
259
|
+
"RESHAPE",
|
260
|
+
"RESYNC",
|
239
261
|
"SPEED",
|
240
262
|
"SPEED_UNIT",
|
241
263
|
"SUPER",
|
@@ -262,8 +284,9 @@ Racc_token_to_s_table = [
|
|
262
284
|
"list_of_devices",
|
263
285
|
"super",
|
264
286
|
"level",
|
287
|
+
"progress",
|
265
288
|
"bitmap",
|
266
|
-
"
|
289
|
+
"progress_action" ]
|
267
290
|
|
268
291
|
Racc_debug_parser = false
|
269
292
|
|
@@ -300,7 +323,7 @@ module_eval(<<'.,.,', 'mdstat_parser.y', 11)
|
|
300
323
|
|
301
324
|
module_eval(<<'.,.,', 'mdstat_parser.y', 13)
|
302
325
|
def _reduce_7(val, _values, result)
|
303
|
-
result = { val[0] => val[15] }
|
326
|
+
result = { val[0][:value] => val[15][:value] }
|
304
327
|
result
|
305
328
|
end
|
306
329
|
.,.,
|
@@ -331,6 +354,14 @@ module_eval(<<'.,.,', 'mdstat_parser.y', 13)
|
|
331
354
|
|
332
355
|
# reduce 20 omitted
|
333
356
|
|
357
|
+
# reduce 21 omitted
|
358
|
+
|
359
|
+
# reduce 22 omitted
|
360
|
+
|
361
|
+
# reduce 23 omitted
|
362
|
+
|
363
|
+
# reduce 24 omitted
|
364
|
+
|
334
365
|
def _reduce_none(val, _values, result)
|
335
366
|
val[0]
|
336
367
|
end
|
@@ -9,45 +9,52 @@ require 'racc/parser.rb'
|
|
9
9
|
|
10
10
|
require 'strscan'
|
11
11
|
|
12
|
+
require 'riemann/tools/utils'
|
13
|
+
|
12
14
|
module Riemann
|
13
15
|
module Tools
|
14
16
|
class UptimeParser < Racc::Parser
|
15
17
|
|
16
|
-
module_eval(<<'...end uptime_parser.y/module_eval...', 'uptime_parser.y',
|
18
|
+
module_eval(<<'...end uptime_parser.y/module_eval...', 'uptime_parser.y', 45)
|
17
19
|
|
18
20
|
def parse(text)
|
19
|
-
s =
|
20
|
-
@tokens = []
|
21
|
+
s = Utils::StringTokenizer.new(text)
|
21
22
|
|
22
23
|
until s.eos? do
|
23
24
|
case
|
24
|
-
when s.scan(/\n/) then
|
25
|
-
when s.scan(/\s+/) then
|
26
|
-
|
27
|
-
when s.scan(/:/) then
|
28
|
-
when s.scan(/,/) then
|
29
|
-
when s.scan(/\d+[,.]\d+/) then
|
30
|
-
when s.scan(/\d+/) then
|
31
|
-
when s.scan(/AM/) then
|
32
|
-
when s.scan(/PM/) then
|
33
|
-
when s.scan(/up/) then
|
34
|
-
when s.scan(/days?/) then
|
35
|
-
when s.scan(/hrs?/) then
|
36
|
-
when s.scan(/mins?/) then
|
37
|
-
when s.scan(/secs?/) then
|
38
|
-
when s.scan(/users?/) then
|
39
|
-
when s.scan(/load averages?:/) then
|
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(/:/) then s.push_token(':')
|
29
|
+
when s.scan(/,/) then s.push_token(',')
|
30
|
+
when s.scan(/\d+[,.]\d+/) then s.push_token(:FLOAT, s.matched.sub(',', '.').to_f)
|
31
|
+
when s.scan(/\d+/) then s.push_token(:INTEGER, s.matched.to_i)
|
32
|
+
when s.scan(/AM/) then s.push_token(:AM)
|
33
|
+
when s.scan(/PM/) then s.push_token(:PM)
|
34
|
+
when s.scan(/up/) then s.push_token(:UP)
|
35
|
+
when s.scan(/days?/) then s.push_token(:DAYS)
|
36
|
+
when s.scan(/hrs?/) then s.push_token(:HRS)
|
37
|
+
when s.scan(/mins?/) then s.push_token(:MINS)
|
38
|
+
when s.scan(/secs?/) then s.push_token(:SECS)
|
39
|
+
when s.scan(/users?/) then s.push_token(:USERS)
|
40
|
+
when s.scan(/load averages?:/) then s.push_token(:LOAD_AVERAGES)
|
40
41
|
else
|
41
|
-
raise s.
|
42
|
+
raise s.unexpected_token
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
46
|
+
@tokens = s.tokens
|
47
|
+
|
45
48
|
do_parse
|
46
49
|
end
|
47
50
|
|
48
51
|
def next_token
|
49
52
|
@tokens.shift
|
50
53
|
end
|
54
|
+
|
55
|
+
def on_error(error_token_id, error_value, value_stack)
|
56
|
+
raise(Racc::ParseError, "parse error on value \"#{error_value[:value]}\" (#{token_to_str(error_token_id)}) on line #{error_value[:lineno]}:\n#{error_value[:line]}\n#{' ' * error_value[:pos]}^#{'~' * (error_value[:value].to_s.length - 1)}")
|
57
|
+
end
|
51
58
|
...end uptime_parser.y/module_eval...
|
52
59
|
##### State transition tables begin ###
|
53
60
|
|
@@ -113,7 +120,7 @@ racc_reduce_table = [
|
|
113
120
|
2, 23, :_reduce_16,
|
114
121
|
2, 24, :_reduce_17,
|
115
122
|
2, 25, :_reduce_18,
|
116
|
-
2, 19, :
|
123
|
+
2, 19, :_reduce_19,
|
117
124
|
4, 20, :_reduce_20,
|
118
125
|
6, 20, :_reduce_21 ]
|
119
126
|
|
@@ -265,51 +272,56 @@ module_eval(<<'.,.,', 'uptime_parser.y', 18)
|
|
265
272
|
|
266
273
|
module_eval(<<'.,.,', 'uptime_parser.y', 20)
|
267
274
|
def _reduce_14(val, _values, result)
|
268
|
-
result = val[0] * 86400
|
275
|
+
result = val[0][:value] * 86400
|
269
276
|
result
|
270
277
|
end
|
271
278
|
.,.,
|
272
279
|
|
273
280
|
module_eval(<<'.,.,', 'uptime_parser.y', 22)
|
274
281
|
def _reduce_15(val, _values, result)
|
275
|
-
result = val[0] * 3600 + val[2] * 60
|
282
|
+
result = val[0][:value] * 3600 + val[2][:value] * 60
|
276
283
|
result
|
277
284
|
end
|
278
285
|
.,.,
|
279
286
|
|
280
287
|
module_eval(<<'.,.,', 'uptime_parser.y', 24)
|
281
288
|
def _reduce_16(val, _values, result)
|
282
|
-
result = val[0] * 3600
|
289
|
+
result = val[0][:value] * 3600
|
283
290
|
result
|
284
291
|
end
|
285
292
|
.,.,
|
286
293
|
|
287
294
|
module_eval(<<'.,.,', 'uptime_parser.y', 26)
|
288
295
|
def _reduce_17(val, _values, result)
|
289
|
-
result = val[0] * 60
|
296
|
+
result = val[0][:value] * 60
|
290
297
|
result
|
291
298
|
end
|
292
299
|
.,.,
|
293
300
|
|
294
301
|
module_eval(<<'.,.,', 'uptime_parser.y', 28)
|
295
302
|
def _reduce_18(val, _values, result)
|
296
|
-
result = val[0]
|
303
|
+
result = val[0][:value]
|
297
304
|
result
|
298
305
|
end
|
299
306
|
.,.,
|
300
307
|
|
301
|
-
|
308
|
+
module_eval(<<'.,.,', 'uptime_parser.y', 30)
|
309
|
+
def _reduce_19(val, _values, result)
|
310
|
+
result = val[0][:value]
|
311
|
+
result
|
312
|
+
end
|
313
|
+
.,.,
|
302
314
|
|
303
315
|
module_eval(<<'.,.,', 'uptime_parser.y', 32)
|
304
316
|
def _reduce_20(val, _values, result)
|
305
|
-
result = { 1 => val[1], 5 => val[2], 15 => val[3] }
|
317
|
+
result = { 1 => val[1][:value], 5 => val[2][:value], 15 => val[3][:value] }
|
306
318
|
result
|
307
319
|
end
|
308
320
|
.,.,
|
309
321
|
|
310
322
|
module_eval(<<'.,.,', 'uptime_parser.y', 33)
|
311
323
|
def _reduce_21(val, _values, result)
|
312
|
-
result = { 1 => val[1], 5 => val[3], 15 => val[5] }
|
324
|
+
result = { 1 => val[1][:value], 5 => val[3][:value], 15 => val[5][:value] }
|
313
325
|
result
|
314
326
|
end
|
315
327
|
.,.,
|
data/lib/riemann/tools/utils.rb
CHANGED
@@ -3,6 +3,54 @@
|
|
3
3
|
module Riemann
|
4
4
|
module Tools
|
5
5
|
module Utils # :nodoc:
|
6
|
+
class StringTokenizer
|
7
|
+
attr_reader :tokens
|
8
|
+
|
9
|
+
def initialize(text)
|
10
|
+
@scanner = StringScanner.new(text)
|
11
|
+
|
12
|
+
@lineno = 1
|
13
|
+
@pos = 0
|
14
|
+
@line = next_line
|
15
|
+
@tokens = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def scan(expression)
|
19
|
+
@scanner.scan(expression)
|
20
|
+
end
|
21
|
+
|
22
|
+
def eos?
|
23
|
+
@scanner.eos?
|
24
|
+
end
|
25
|
+
|
26
|
+
def matched
|
27
|
+
@scanner.matched
|
28
|
+
end
|
29
|
+
|
30
|
+
def next_line
|
31
|
+
(@scanner.check_until(/\n/) || @scanner.rest).chomp
|
32
|
+
end
|
33
|
+
|
34
|
+
def push_token(token, value = nil)
|
35
|
+
value ||= @scanner.matched
|
36
|
+
|
37
|
+
if value == "\n"
|
38
|
+
@lineno += 1
|
39
|
+
@line = next_line
|
40
|
+
@pos = pos = 0
|
41
|
+
else
|
42
|
+
pos = @pos
|
43
|
+
@pos += @scanner.matched.length
|
44
|
+
end
|
45
|
+
|
46
|
+
@tokens << [token, { value: value, line: @line, lineno: @lineno, pos: pos }] if token
|
47
|
+
end
|
48
|
+
|
49
|
+
def unexpected_token
|
50
|
+
raise(Racc::ParseError, "unexpected data on line #{@lineno}:\n#{@line}\n#{' ' * @pos}^")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
6
54
|
def reverse_numeric_sort_with_header(data, header: 1, count: 10)
|
7
55
|
lines = data.chomp.split("\n")
|
8
56
|
header = lines.shift(header)
|
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.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyle Kingsbury
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08
|
11
|
+
date: 2022-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|