Skip to content

Commit 6ea2681

Browse files
authored
refactor: Added more logs to datafile manager (#260)
* Added more logs to datafile manager * fixed lint error * added unit tests * fixed lint error
1 parent 3a687f2 commit 6ea2681

File tree

2 files changed

+46
-14
lines changed

2 files changed

+46
-14
lines changed

lib/optimizely/config_manager/http_project_config_manager.rb

+22-12
Original file line numberDiff line numberDiff line change
@@ -148,16 +148,18 @@ def fetch_datafile_config
148148
end
149149

150150
def request_config
151-
@logger.log(
152-
Logger::DEBUG,
153-
"Fetching datafile from #{@datafile_url}"
154-
)
155-
begin
156-
headers = {}
157-
headers['Content-Type'] = 'application/json'
158-
headers['If-Modified-Since'] = @last_modified if @last_modified
159-
headers['Authorization'] = "Bearer #{@access_token}" unless @access_token.nil?
151+
@logger.log(Logger::DEBUG, "Fetching datafile from #{@datafile_url}")
152+
headers = {}
153+
headers['Content-Type'] = 'application/json'
154+
headers['If-Modified-Since'] = @last_modified if @last_modified
155+
headers['Authorization'] = "Bearer #{@access_token}" unless @access_token.nil?
156+
157+
# Cleaning headers before logging to avoid exposing authorization token
158+
cleansed_headers = {}
159+
headers.each { |key, value| cleansed_headers[key] = key == 'Authorization' ? '********' : value }
160+
@logger.log(Logger::DEBUG, "Datafile request headers: #{cleansed_headers}")
160161

162+
begin
161163
response = Helpers::HttpUtils.make_request(
162164
@datafile_url, :get, nil, headers, Helpers::Constants::CONFIG_MANAGER['REQUEST_TIMEOUT']
163165
)
@@ -169,6 +171,9 @@ def request_config
169171
return nil
170172
end
171173

174+
response_code = response.code.to_i
175+
@logger.log(Logger::DEBUG, "Datafile response status code #{response_code}")
176+
172177
# Leave datafile and config unchanged if it has not been modified.
173178
if response.code == '304'
174179
@logger.log(
@@ -178,9 +183,14 @@ def request_config
178183
return
179184
end
180185

181-
@last_modified = response[Helpers::Constants::HTTP_HEADERS['LAST_MODIFIED']]
182-
183-
config = DatafileProjectConfig.create(response.body, @logger, @error_handler, @skip_json_validation) if response.body
186+
if response_code >= 200 && response_code < 400
187+
@logger.log(Logger::DEBUG, 'Successfully fetched datafile, generating Project config')
188+
config = DatafileProjectConfig.create(response.body, @logger, @error_handler, @skip_json_validation)
189+
@last_modified = response[Helpers::Constants::HTTP_HEADERS['LAST_MODIFIED']]
190+
@logger.log(Logger::DEBUG, "Saved last modified header value from response: #{@last_modified}.")
191+
else
192+
@logger.log(Logger::DEBUG, "Datafile fetch failed, status: #{response.code}, message: #{response.message}")
193+
end
184194

185195
config
186196
end

spec/config_manager/http_project_config_manager_spec.rb

+24-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
'Content-Type' => 'application/json'
4848
}
4949
)
50-
.to_return(status: 403, body: '', headers: {})
50+
.to_return(status: [403, 'Forbidden'], body: '', headers: {})
5151
end
5252

5353
after(:example) do
@@ -236,7 +236,7 @@
236236
sleep 0.3
237237

238238
expect(spy_logger).to have_received(:log).with(Logger::DEBUG, 'Fetching datafile from https://cdn.optimizely.com/datafiles/valid_sdk_key.json').once
239-
239+
expect(spy_logger).to have_received(:log).with(Logger::DEBUG, 'Datafile response status code 200').once
240240
expect(spy_logger).to have_received(:log).with(Logger::DEBUG, 'Received new datafile and updated config. ' \
241241
'Old revision number: 42. New revision number: 81.').once
242242

@@ -361,6 +361,17 @@
361361

362362
expect(spy_logger).to have_received(:log).once.with(Logger::ERROR, 'Invalid url_template https://cdn.optimizely.com/datafiles/%d.json provided.')
363363
end
364+
365+
it 'Should log failure message with status code when failed to fetch datafile' do
366+
@http_project_config_manager = Optimizely::HTTPProjectConfigManager.new(
367+
url: 'https://cdn.optimizely.com/datafiles/invalid_sdk_key.json',
368+
sdk_key: 'valid_sdk_key',
369+
datafile_access_token: 'the-token',
370+
logger: spy_logger
371+
)
372+
sleep 0.1
373+
expect(spy_logger).to have_received(:log).with(Logger::DEBUG, 'Datafile fetch failed, status: 403, message: Forbidden').once
374+
end
364375
end
365376

366377
describe '.polling_interval' do
@@ -504,5 +515,16 @@
504515
sleep 0.1
505516
expect(Optimizely::Helpers::HttpUtils).to have_received(:make_request).with('http://awesomeurl', any_args)
506517
end
518+
519+
it 'should hide access token when printing logs' do
520+
allow(Optimizely::Helpers::HttpUtils).to receive(:make_request)
521+
@http_project_config_manager = Optimizely::HTTPProjectConfigManager.new(
522+
sdk_key: 'valid_sdk_key',
523+
datafile_access_token: 'the-token',
524+
logger: spy_logger
525+
)
526+
sleep 0.1
527+
expect(spy_logger).to have_received(:log).with(Logger::DEBUG, 'Datafile request headers: {"Content-Type"=>"application/json", "Authorization"=>"********"}').once
528+
end
507529
end
508530
end

0 commit comments

Comments
 (0)