fluent-plugin-spectrum 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -12
- data/fluent-plugin-spectrum.gemspec +1 -1
- data/lib/fluent/plugin/in_spectrum.rb +63 -35
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a907d9e3749f2604e633e9d2e7d208b2595eca8
|
4
|
+
data.tar.gz: 6bf4af623fa6d9aed08638ea59d474a694bf2e87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6d14688b87fa043d58a4eaef3394507a82c64b0178a7d32f435a00d5d1c6ea429a1ed44853cd8c4af268d997ca7d3a0748b78e40d4dbf2e75fc020440783266
|
7
|
+
data.tar.gz: a48028226c73f7a715a43861ed31fe9eec1ecf2aac9ba7ec536a88cfa6ed39ba1b81b2314326fc1ea29021001115ba012266d206837b214fc2f3783407e91378
|
data/README.md
CHANGED
@@ -20,17 +20,19 @@ Or install it yourself as:
|
|
20
20
|
## Usage
|
21
21
|
Add the following into your fluentd config.
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
<source>
|
24
|
+
type spectrum # required, choosing the input plugin
|
25
|
+
endpoint spectrumapi.corp.yourdomain.net # required, FQDN of spectrum endpoint
|
26
|
+
user username # required, username for APIs
|
27
|
+
pass password # required, password for APIs
|
28
|
+
tag alert.spectrum # optional, tag to assign to events, default is alert.spectrum
|
29
|
+
interval 60 # optional, interval in seconds for how often to poll, defaults to 300
|
30
|
+
include_raw false # optional, include original object as key raw
|
31
|
+
</source>
|
32
|
+
|
33
|
+
<match alert.spectrum>
|
34
|
+
type stdout
|
35
|
+
</match>
|
34
36
|
|
35
37
|
Now startup fluentd
|
36
38
|
|
@@ -40,4 +42,8 @@ Send a test
|
|
40
42
|
TBD
|
41
43
|
|
42
44
|
## To Do
|
43
|
-
|
45
|
+
Add retry login. On timeout/failure retry, how often, increasing delay? (how would that affect polling time, possible duplicates?)
|
46
|
+
All flag to allow specifying spectrum attributes to get or get _ALL_
|
47
|
+
Add flag to allow start date/time if users want to backfill data from a specific date. then start loop.
|
48
|
+
Add flag to disable loop, if users only wanted to backfill from datetime to now or specific end time.
|
49
|
+
change loop to allow multiple runs to stack on eachother to avoid missing data?
|
@@ -2,9 +2,19 @@ module Fluent
|
|
2
2
|
# TODO:
|
3
3
|
# Add a fields all or list option
|
4
4
|
# error checking in every section
|
5
|
+
# class for handling interval in loop
|
6
|
+
class TimerWatcher < Coolio::TimerWatcher
|
7
|
+
def initialize(interval, repeat, &callback)
|
8
|
+
@callback = callback
|
9
|
+
super(interval, repeat)
|
10
|
+
end # def initialize
|
11
|
+
def on_timer
|
12
|
+
@callback.call
|
13
|
+
end # def on_timer
|
14
|
+
end
|
15
|
+
|
5
16
|
class SpectrumInput < Input
|
6
17
|
Fluent::Plugin.register_input('spectrum', self)
|
7
|
-
|
8
18
|
config_param :tag, :string, :default => "alert.spectrum"
|
9
19
|
config_param :endpoint, :string, :default => "pleasechangeme.com" #fqdn of endpoint
|
10
20
|
config_param :interval, :integer, :default => '300' #Default 5 minutes
|
@@ -13,6 +23,19 @@ module Fluent
|
|
13
23
|
config_param :include_raw, :string, :default => "false" #Include original object as raw
|
14
24
|
config_param :attributes, :string, :default => "ALL" # fields to include, ALL for... well, ALL.
|
15
25
|
|
26
|
+
# function to UTF8 encode
|
27
|
+
def to_utf8(str)
|
28
|
+
str = str.force_encoding('UTF-8')
|
29
|
+
return str if str.valid_encoding?
|
30
|
+
str.encode("UTF-8", 'binary', invalid: :replace, undef: :replace, replace: '')
|
31
|
+
end
|
32
|
+
|
33
|
+
def parseAttributes(alarmAttribute)
|
34
|
+
key = @spectrum_access_code[alarmAttribute['@id'].to_s].to_s
|
35
|
+
value = ((to_utf8(alarmAttribute['$'].to_s)).strip).gsub(/\r?\n/, " ")
|
36
|
+
return key,value
|
37
|
+
end
|
38
|
+
|
16
39
|
def initialize
|
17
40
|
require 'rest_client'
|
18
41
|
require 'json'
|
@@ -92,24 +115,23 @@ module Fluent
|
|
92
115
|
super
|
93
116
|
@loop.stop
|
94
117
|
@thread.join
|
118
|
+
rescue
|
119
|
+
$log.error "Spectrum :: unexpected error", :error=>$!.to_s
|
120
|
+
$log.error_backtrace
|
95
121
|
end # def shutdown
|
96
122
|
|
97
123
|
def run
|
98
124
|
@loop.run
|
125
|
+
rescue
|
126
|
+
$log.error "Spectrum :: unexpected error", :error=>$!.to_s
|
127
|
+
$log.error_backtrace
|
99
128
|
end # def run
|
100
129
|
|
101
130
|
def input
|
102
131
|
alertStartTime = Engine.now.to_i - @interval.to_i
|
103
|
-
$log.info "Spectrum :: Polling
|
132
|
+
$log.info "Spectrum :: Polling alerts for time period: #{alertStartTime.to_i} - #{Engine.now.to_i}"
|
104
133
|
|
105
|
-
#
|
106
|
-
def to_utf8(str)
|
107
|
-
str = str.force_encoding('UTF-8')
|
108
|
-
return str if str.valid_encoding?
|
109
|
-
str.encode("UTF-8", 'binary', invalid: :replace, undef: :replace, replace: '')
|
110
|
-
end
|
111
|
-
|
112
|
-
# XML for spectrum post
|
134
|
+
# Format XML for spectrum post
|
113
135
|
@xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
|
114
136
|
<rs:alarm-request throttlesize=\"10000\"
|
115
137
|
xmlns:rs=\"http://www.ca.com/spectrum/restful/schema/request\"
|
@@ -132,51 +154,57 @@ module Fluent
|
|
132
154
|
# Post to Spectrum and parse results
|
133
155
|
responsePost=spectrumEnd.post @xml,:content_type => 'application/xml',:accept => 'application/json'
|
134
156
|
body = JSON.parse(responsePost.body)
|
135
|
-
|
157
|
+
|
158
|
+
# Processing for multiple alerts returned
|
136
159
|
if body['ns1.alarm-response-list']['@total-alarms'].to_i > 1
|
137
|
-
$log.info "Spectrum :: returned #{body['ns1.alarm-response-list']['@total-alarms'].to_i} alarms"
|
138
|
-
# iterate through
|
160
|
+
$log.info "Spectrum :: returned #{body['ns1.alarm-response-list']['@total-alarms'].to_i} alarms for period #{alertStartTime.to_i} - #{Engine.now.to_i}"
|
161
|
+
# iterate through each alarm
|
139
162
|
body['ns1.alarm-response-list']['ns1.alarm-responses']['ns1.alarm'].each do |alarm|
|
163
|
+
# Create initial structure
|
140
164
|
record_hash = Hash.new # temp hash to hold attributes of alarm
|
165
|
+
raw_array = Array.new # temp hash to hold attributes of alarm for raw
|
141
166
|
record_hash['event_type'] = @tag.to_s
|
142
167
|
record_hash['intermediary_source'] = @endpoint.to_s
|
143
|
-
# iterate though alarm attributes
|
168
|
+
# iterate though alarm attributes
|
144
169
|
alarm['ns1.attribute'].each do |attribute|
|
145
|
-
|
170
|
+
key,value = parseAttributes(attribute)
|
171
|
+
record_hash[key] = value
|
172
|
+
if @include_raw.to_s == "true"
|
173
|
+
raw_array << { "#{key}" => "#{value}" }
|
174
|
+
end
|
146
175
|
end
|
147
|
-
#
|
176
|
+
# append raw object
|
148
177
|
if @include_raw.to_s == "true"
|
149
|
-
record_hash[
|
178
|
+
record_hash[:raw] = raw_array
|
150
179
|
end
|
151
180
|
Engine.emit(@tag, record_hash['CREATION_DATE'].to_i,record_hash)
|
152
181
|
end
|
182
|
+
# Processing for single alarm returned
|
153
183
|
elsif body['ns1.alarm-response-list']['@total-alarms'].to_i == 1
|
154
|
-
$log.info "Spectrum :: returned #{body['ns1.alarm-response-list']['@total-alarms'].to_i} alarms"
|
184
|
+
$log.info "Spectrum :: returned #{body['ns1.alarm-response-list']['@total-alarms'].to_i} alarms for period #{alertStartTime.to_i} - #{Engine.now.to_i}"
|
185
|
+
# Create initial structure
|
155
186
|
record_hash = Hash.new # temp hash to hold attributes of alarm
|
187
|
+
raw_array = Array.new # temp hash to hold attributes of alarm for raw
|
156
188
|
record_hash['event_type'] = @tag.to_s
|
157
189
|
record_hash['intermediary_source'] = @endpoint.to_s
|
158
190
|
# iterate though alarm attributes and add to temp hash
|
159
191
|
body['ns1.alarm-response-list']['ns1.alarm-responses']['ns1.alarm']['ns1.attribute'].each do |attribute|
|
160
|
-
|
192
|
+
key,value = parseAttributes(attribute)
|
193
|
+
record_hash[key] = value
|
194
|
+
if @include_raw.to_s == "true"
|
195
|
+
raw_array << { "#{key}" => "#{value}" }
|
196
|
+
end
|
161
197
|
end
|
162
|
-
#
|
198
|
+
# append raw object
|
163
199
|
if @include_raw.to_s == "true"
|
164
|
-
record_hash[
|
200
|
+
record_hash[:raw] = raw_array
|
165
201
|
end
|
166
202
|
Engine.emit(@tag, record_hash['CREATION_DATE'].to_i,record_hash)
|
167
|
-
|
168
|
-
|
203
|
+
# No alarms returned
|
204
|
+
else
|
205
|
+
$log.info "Spectrum :: returned #{body['ns1.alarm-response-list']['@total-alarms'].to_i} alarms for period #{alertStartTime.to_i} - #{Engine.now.to_i}"
|
206
|
+
end
|
207
|
+
|
208
|
+
end # def input
|
169
209
|
end # class SpectrumInput
|
170
|
-
|
171
|
-
# class for handling interval in loop
|
172
|
-
class TimerWatcher < Coolio::TimerWatcher
|
173
|
-
def initialize(interval, repeat, &callback)
|
174
|
-
@callback = callback
|
175
|
-
super(interval, repeat)
|
176
|
-
end # def initialize
|
177
|
-
def on_timer
|
178
|
-
@callback.call
|
179
|
-
end # def on_timer
|
180
|
-
end
|
181
|
-
|
182
210
|
end # module Fluent
|