Skip to content

Commit 8d797b2

Browse files
committed
Dynamic Params
1 parent f0984cd commit 8d797b2

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

Diff for: lib/logstash/inputs/http_poller.rb

+46-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
require "socket" # for Socket.gethostname
66
require "manticore"
77
require "rufus/scheduler"
8+
require "yaml" # persistence
89

910
class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
1011
include LogStash::PluginMixins::HttpClient
@@ -57,10 +58,15 @@ def setup_requests!
5758
@requests = Hash[@urls.map {|name, url| [name, normalize_request(url)] }]
5859
end
5960

61+
private
62+
def filter_dynamic_params(allowed_keys, params)
63+
params.slice(*allowed_keys)
64+
end
65+
6066
private
6167
def normalize_request(url_or_spec)
6268
if url_or_spec.is_a?(String)
63-
res = [:get, url_or_spec]
69+
res = [:get, url_or_spec, {}]
6470
elsif url_or_spec.is_a?(Hash)
6571
# The client will expect keys / values
6672
spec = Hash[url_or_spec.clone.map {|k,v| [k.to_sym, v] }] # symbolize keys
@@ -77,17 +83,30 @@ def normalize_request(url_or_spec)
7783
auth = spec[:auth]
7884
user = spec.delete(:user) || (auth && auth["user"])
7985
password = spec.delete(:password) || (auth && auth["password"])
80-
86+
8187
if user.nil? ^ password.nil?
8288
raise LogStash::ConfigurationError, "'user' and 'password' must both be specified for input HTTP poller!"
8389
end
8490

8591
if user && password
8692
spec[:auth] = {
87-
user: user,
93+
user: user,
8894
pass: password,
8995
eager: true
90-
}
96+
}
97+
end
98+
99+
if spec.delete(:use_dynamic_params)
100+
last_dynamic_params_location = spec[:last_dynamic_params]
101+
dynamic_params_map = spec[:dynamic_params_map]
102+
103+
if last_dynamic_params_location.is_a?(String) && File.exist?(last_dynamic_params_location)
104+
dynamic_params = YAML.load(File.read(last_dynamic_params_location))
105+
allowed_keys = dynamic_params_map.is_a?(Hash) ? dynamic_params_map.keys : []
106+
spec[:dynamic_params] = filter_dynamic_params(allowed_keys, dynamic_params)
107+
else
108+
spec[:dynamic_params] = {}
109+
end
91110
end
92111
res = [method, url, spec]
93112
else
@@ -133,13 +152,23 @@ def setup_schedule(queue)
133152

134153
@scheduler = Rufus::Scheduler.new(:max_work_threads => 1)
135154
#as of v3.0.9, :first_in => :now doesn't work. Use the following workaround instead
136-
opts = schedule_type == "every" ? { :first_in => 0.01 } : {}
155+
opts = schedule_type == "every" ? { :first_in => 0.01 } : {}
137156
@scheduler.send(schedule_type, schedule_value, opts) { run_once(queue) }
138157
@scheduler.join
139158
end
140159

160+
private
161+
def assign_dynamic_params(request)
162+
params = request[2][:dynamic_params]
163+
request[2][:query] = {} if !request[2][:query]
164+
params.keys.each do |key|
165+
request[2][:query][key] = params[key]
166+
end
167+
end
168+
141169
def run_once(queue)
142170
@requests.each do |name, request|
171+
assign_dynamic_params(request) if request[2][:dynamic_params]
143172
request_async(queue, name, request)
144173
end
145174

@@ -175,11 +204,23 @@ def handle_success(queue, name, request, response, execution_time)
175204
end
176205
end
177206

207+
private
208+
def update_dynamic_params(request, event)
209+
request[2][:dynamic_params_map].keys.each do |key|
210+
value = request[2][:dynamic_params_map][key]
211+
event_value = event.get(value)
212+
request[2][:dynamic_params][key] = event_value if event_value
213+
end
214+
File.write(request[2][:last_dynamic_params], YAML.dump(request[2][:dynamic_params]))
215+
end
216+
178217
private
179218
def handle_decoded_event(queue, name, request, response, event, execution_time)
180219
apply_metadata(event, name, request, response, execution_time)
181220
decorate(event)
182221
queue << event
222+
223+
update_dynamic_params(request, event) if request[2][:dynamic_params]
183224
rescue StandardError, java.lang.Exception => e
184225
@logger.error? && @logger.error("Error eventifying response!",
185226
:exception => e,

0 commit comments

Comments
 (0)