fluent-plugin-sensu 0.0.1 → 0.0.2
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.
- data/.travis.yml +8 -0
- data/README.md +10 -9
- data/fluent-plugin-sensu.gemspec +1 -1
- data/lib/fluent/plugin/out_sensu.rb +61 -33
- data/test/plugin/test_out_sensu.rb +7 -0
- metadata +5 -4
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -47,19 +47,19 @@ which contains attributes as follows.
|
|
47
47
|
Attributes are indicated
|
48
48
|
by [JSONPath](http://goessner.net/articles/JsonPath/) expressions.
|
49
49
|
|
50
|
-
* `$.name`
|
50
|
+
* [`$.name`](#name-attribute)
|
51
51
|
* The check name to identify the check.
|
52
|
-
* `$.output`
|
52
|
+
* [`$.output`](#output-attribute)
|
53
53
|
* An arbitrary string to describe the check result.
|
54
54
|
* This attribute is often used to contain metric values.
|
55
|
-
* `$.status`
|
55
|
+
* [`$.status`](#status-attribute)
|
56
56
|
* The severity of the check result.
|
57
57
|
* 0 (OK), 1 (WARNING), 2 (CRITICAL) or 3 (UNKNOWN or CUSTOM).
|
58
58
|
|
59
59
|
The check result can also contain other attributes.
|
60
60
|
This plugin supports the attributes below.
|
61
61
|
|
62
|
-
* `$.type`
|
62
|
+
* [`$.type`](#type-attribute)
|
63
63
|
* Either "standard" or "metric".
|
64
64
|
* If the attribute is set to "standard", the sensu-server creates an event
|
65
65
|
only when the status is not OK or when the status is changed to OK.
|
@@ -67,27 +67,28 @@ This plugin supports the attributes below.
|
|
67
67
|
even if the status is OK.
|
68
68
|
It is useful when Sensu sends check results to metrics collectors
|
69
69
|
such as [Graphite](http://graphite.wikidot.com/).
|
70
|
-
* `$.ttl`
|
70
|
+
* [`$.ttl`](#ttl-attribute)
|
71
71
|
* The time to live (TTL) in seconds,
|
72
72
|
until the check result is considered stale.
|
73
73
|
If TTL expires, sensu-server creates an event.
|
74
74
|
* This attribute is useful when you want to be notified
|
75
75
|
when logs are not output for a certain period.
|
76
76
|
* Same as `freshness_threshold` in Nagios.
|
77
|
-
* `$.handlers`
|
77
|
+
* [`$.handlers`](#handlers-attributes)
|
78
78
|
* The names of handlers which process events created for the check.
|
79
|
-
* `$.low_flap_threshold` and `$.high_flap_threshold`
|
79
|
+
* [`$.low_flap_threshold` and `$.high_flap_threshold`](
|
80
|
+
#low_flap_threshold-and-high_flap_threshold-attributes)
|
80
81
|
* Threshold percentages to determine the status is considered "flapping,"
|
81
82
|
or the state is changed too frequently.
|
82
83
|
* Same as the options in Nagios.
|
83
84
|
See the description of [Flap Detection](
|
84
85
|
https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/3/en/flapping.html)
|
85
86
|
in Nagios.
|
86
|
-
* `$.source`
|
87
|
+
* [`$.source`](#source-attribute)
|
87
88
|
* The source of the check, such as servers or network switches.
|
88
89
|
* If this attribute is not specified,
|
89
90
|
the host of sensu-client is considered as the source.
|
90
|
-
* `$.executed`
|
91
|
+
* [`$.executed`](#executed-attribute)
|
91
92
|
* The timestamp on which the check is executed.
|
92
93
|
* Note that there is also another timestamp attribute named `issued`,
|
93
94
|
which is automatically measured by sensu-client process.
|
data/fluent-plugin-sensu.gemspec
CHANGED
@@ -6,7 +6,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = "fluent-plugin-sensu"
|
9
|
-
spec.version = '0.0.
|
9
|
+
spec.version = '0.0.2'
|
10
10
|
spec.authors = ["MIYAKAWA Taku"]
|
11
11
|
spec.email = ["miyakawa.taku@gmail.com"]
|
12
12
|
spec.description = 'Fluentd output plugin to send checks' +
|
@@ -1,5 +1,4 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# vim: et sw=2 sts=2
|
3
2
|
|
4
3
|
module Fluent
|
5
4
|
|
@@ -88,6 +87,10 @@ module Fluent
|
|
88
87
|
# Options for "executed" attribute.
|
89
88
|
config_param :check_executed_field, :string, :default => nil
|
90
89
|
|
90
|
+
# Buffering option.
|
91
|
+
# Set to 1 second by default so that checks are not delayed so much.
|
92
|
+
config_param :flush_interval, :time, :default => 1
|
93
|
+
|
91
94
|
# Load modules.
|
92
95
|
private
|
93
96
|
def initialize
|
@@ -116,11 +119,16 @@ module Fluent
|
|
116
119
|
# Reject invalid check_low_flap_threshold and check_high_flap_threshold
|
117
120
|
private
|
118
121
|
def reject_invalid_flapping_thresholds
|
119
|
-
|
122
|
+
# Thresholds must be specified together or not specified at all.
|
123
|
+
only_one_threshold_is_specified =
|
124
|
+
@check_low_flap_threshold.nil? ^ @check_high_flap_threshold.nil?
|
125
|
+
if only_one_threshold_is_specified
|
120
126
|
raise ConfigError,
|
121
127
|
"'check_low_flap_threshold' and 'check_high_flap_threshold'" +
|
122
|
-
" specified togher, or not specified at all."
|
128
|
+
" must be specified togher, or not specified at all."
|
123
129
|
end
|
130
|
+
|
131
|
+
# Check 0 <= check_low_flap_threshold <= check_high_flap_threshold <= 100
|
124
132
|
if @check_low_flap_threshold
|
125
133
|
in_order = 0 <= @check_low_flap_threshold &&
|
126
134
|
@check_low_flap_threshold <= @check_high_flap_threshold &&
|
@@ -139,40 +147,46 @@ module Fluent
|
|
139
147
|
[tag, time, record].to_msgpack
|
140
148
|
end
|
141
149
|
|
142
|
-
# Send a check
|
150
|
+
# Send a check result for each data.
|
143
151
|
public
|
144
152
|
def write(chunk)
|
145
|
-
results = []
|
146
153
|
chunk.msgpack_each { |(tag, time, record)|
|
147
|
-
payload =
|
148
|
-
'name' => determine_check_name(tag, record),
|
149
|
-
'output' => determine_output(tag, record),
|
150
|
-
'status' => determine_status(tag, record),
|
151
|
-
'type' => @check_type,
|
152
|
-
'handlers' => @check_handlers,
|
153
|
-
'executed' => determine_executed_time(tag, time, record),
|
154
|
-
'fluentd' => {
|
155
|
-
'tag' => tag,
|
156
|
-
'time' => time.to_i,
|
157
|
-
'record' => record,
|
158
|
-
},
|
159
|
-
}
|
160
|
-
add_attribute_if_present(
|
161
|
-
payload, 'ttl', @check_ttl)
|
162
|
-
add_attribute_if_present(
|
163
|
-
payload, 'low_flap_threshold', @check_low_flap_threshold)
|
164
|
-
add_attribute_if_present(
|
165
|
-
payload, 'high_flap_threshold', @check_high_flap_threshold)
|
166
|
-
add_attribute_if_present(
|
167
|
-
payload, 'source', determine_source(tag, record))
|
154
|
+
payload = make_check_result(tag, time, record)
|
168
155
|
send_check(@server, @port, payload)
|
169
156
|
}
|
170
157
|
end
|
171
158
|
|
172
|
-
#
|
159
|
+
# Make a check result for the Fluentd data.
|
160
|
+
private
|
161
|
+
def make_check_result(tag, time, record)
|
162
|
+
check_result = {
|
163
|
+
'name' => determine_check_name(tag, record),
|
164
|
+
'output' => determine_output(tag, record),
|
165
|
+
'status' => determine_status(tag, record),
|
166
|
+
'type' => @check_type,
|
167
|
+
'handlers' => @check_handlers,
|
168
|
+
'executed' => determine_executed_time(tag, time, record),
|
169
|
+
'fluentd' => {
|
170
|
+
'tag' => tag,
|
171
|
+
'time' => time.to_i,
|
172
|
+
'record' => record,
|
173
|
+
},
|
174
|
+
}
|
175
|
+
add_attribute_if_present(
|
176
|
+
check_result, 'ttl', @check_ttl)
|
177
|
+
add_attribute_if_present(
|
178
|
+
check_result, 'low_flap_threshold', @check_low_flap_threshold)
|
179
|
+
add_attribute_if_present(
|
180
|
+
check_result, 'high_flap_threshold', @check_high_flap_threshold)
|
181
|
+
add_attribute_if_present(
|
182
|
+
check_result, 'source', determine_source(tag, record))
|
183
|
+
return check_result
|
184
|
+
end
|
185
|
+
|
186
|
+
# Send a check result to sensu-client.
|
173
187
|
private
|
174
|
-
def send_check(server, port,
|
175
|
-
json =
|
188
|
+
def send_check(server, port, check_result)
|
189
|
+
json = check_result.to_json
|
176
190
|
sensu_client = TCPSocket.open(@server, @port)
|
177
191
|
begin
|
178
192
|
sensu_client.puts(json)
|
@@ -181,10 +195,10 @@ module Fluent
|
|
181
195
|
end
|
182
196
|
end
|
183
197
|
|
184
|
-
# Adds an attribute to the
|
198
|
+
# Adds an attribute to the check result if present.
|
185
199
|
private
|
186
|
-
def add_attribute_if_present(
|
187
|
-
|
200
|
+
def add_attribute_if_present(check_result, name, value)
|
201
|
+
check_result[name] = value if value
|
188
202
|
end
|
189
203
|
|
190
204
|
# Determines "name" attribute of a check.
|
@@ -202,14 +216,17 @@ module Fluent
|
|
202
216
|
:value => check_name)
|
203
217
|
# Fall through
|
204
218
|
end
|
219
|
+
|
205
220
|
# check_name option
|
206
221
|
return @check_name if @check_name
|
222
|
+
|
207
223
|
# Tag
|
208
224
|
return tag if tag =~ CHECK_NAME_PATTERN
|
209
|
-
# Default value
|
210
225
|
log.warn('Invalid check name in the tag.' +
|
211
226
|
'Fallback to the constant "fluent-plugin-sensu".',
|
212
227
|
:tag => tag)
|
228
|
+
|
229
|
+
# Default value
|
213
230
|
return 'fluent-plugin-sensu'
|
214
231
|
end
|
215
232
|
|
@@ -224,8 +241,10 @@ module Fluent
|
|
224
241
|
:tag => tag, :check_output_field => @check_output_field)
|
225
242
|
# Fall through
|
226
243
|
end
|
244
|
+
|
227
245
|
# Returns the option value
|
228
246
|
return @check_output if @check_output
|
247
|
+
|
229
248
|
# Default to JSON notation of the record
|
230
249
|
return record.to_json
|
231
250
|
end
|
@@ -244,6 +263,7 @@ module Fluent
|
|
244
263
|
:tag => tag, :check_status_field => @check_status_field,
|
245
264
|
:value => status_field_val)
|
246
265
|
end
|
266
|
+
|
247
267
|
# Returns the default
|
248
268
|
return @check_status
|
249
269
|
end
|
@@ -262,27 +282,35 @@ module Fluent
|
|
262
282
|
# Determines "source" attribute of a check.
|
263
283
|
private
|
264
284
|
def determine_source(tag, record)
|
285
|
+
# Read the field
|
265
286
|
if @check_source_field
|
266
287
|
source = record[@check_source_field]
|
267
288
|
return source if source
|
268
289
|
log.warn('the field for "source" attribute is absent',
|
269
290
|
:tag => tag, :check_source_field => @check_source_field)
|
270
291
|
end
|
292
|
+
|
293
|
+
# Default to "check_source" option or N/A
|
271
294
|
return @check_source
|
272
295
|
end
|
273
296
|
|
274
297
|
# Determines "executed" attribute of a check.
|
275
298
|
private
|
276
299
|
def determine_executed_time(tag, time, record)
|
300
|
+
# Read the field
|
277
301
|
if @check_executed_field
|
278
302
|
executed = record[@check_executed_field]
|
279
303
|
return executed if executed.is_a?(Integer)
|
280
304
|
log.warn('the field for "executed" attribute is absent',
|
281
305
|
:tag => tag, :check_executed_field => @check_executed_field)
|
282
306
|
end
|
307
|
+
|
308
|
+
# Default to the time of Fluentd data
|
283
309
|
return time
|
284
310
|
end
|
285
311
|
|
286
312
|
end
|
287
313
|
|
288
314
|
end
|
315
|
+
|
316
|
+
# vim: et sw=2 sts=2
|
@@ -30,6 +30,13 @@ class SensuOutputTest < Test::Unit::TestCase
|
|
30
30
|
# }}}1
|
31
31
|
# Default value {{{1
|
32
32
|
|
33
|
+
# flush_interval is set to 1 second so that checks are not delayed so much
|
34
|
+
def test_default_buffer_setting
|
35
|
+
driver = create_driver('', 'ddos')
|
36
|
+
flush_interval = driver.instance.instance_eval{ @flush_interval }
|
37
|
+
assert_equal 1, flush_interval
|
38
|
+
end
|
39
|
+
|
33
40
|
# Send default values for empty data and empty setting
|
34
41
|
def test_write_empty_data_with_empty_setting
|
35
42
|
driver = create_driver('', 'ddos')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-sensu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-08-
|
12
|
+
date: 2015-08-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -99,6 +99,7 @@ extensions: []
|
|
99
99
|
extra_rdoc_files: []
|
100
100
|
files:
|
101
101
|
- .gitignore
|
102
|
+
- .travis.yml
|
102
103
|
- Gemfile
|
103
104
|
- LICENSE.txt
|
104
105
|
- README.md
|
@@ -122,7 +123,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
123
|
version: '0'
|
123
124
|
segments:
|
124
125
|
- 0
|
125
|
-
hash:
|
126
|
+
hash: 494592010274468206
|
126
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
128
|
none: false
|
128
129
|
requirements:
|
@@ -131,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
132
|
version: '0'
|
132
133
|
segments:
|
133
134
|
- 0
|
134
|
-
hash:
|
135
|
+
hash: 494592010274468206
|
135
136
|
requirements: []
|
136
137
|
rubyforge_project:
|
137
138
|
rubygems_version: 1.8.23
|