qa_server 5.2.1 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2981264303c79aed94820ba9955f0e61b005afbc
4
- data.tar.gz: 1e506e5f45848be21886d73116fdd4bb48e90d69
3
+ metadata.gz: c2905e19c557faccf19c7dd83f587f06ceacb2c2
4
+ data.tar.gz: db5ce48e087afee79569c080898a612f814f5250
5
5
  SHA512:
6
- metadata.gz: 49baea993d35cfdc84ca8af81c2e577a0d908ff13b77c53ad1e6cbc28b9c291ee9603339c97d64efa7fbfef27ab693b2442237c44baad24c2cc9c55b09db043d
7
- data.tar.gz: 85d53d7ccae9be71244f42b0d24f9f1e454d1b8f462c9329e5e3519d85be7034cc8ac59e2965f628773b35a17656ccb5da4c6f7d46d88344678d7127cb299e37
6
+ metadata.gz: ac00bc271dd281d3d7e42c5b926cc292210ed200566c9083fab772fbd1e2fd96f0c76f12d9b27536e91c0474d62cdceeca5df0f11ec893776bb7ac86c18482e9
7
+ data.tar.gz: c56721d0a15ddc0d683d9b758a621ae4ae9f26a1b1685d97d22d468332caa9370bb6db77376415abcf1dfea53a1437f18bfd6832bc40da3c6c5226fcba628b49
@@ -8,7 +8,7 @@ cache:
8
8
  bundler: true
9
9
 
10
10
  before_install:
11
- - gem update --system
11
+ - gem update bundler
12
12
  - gem install bundler
13
13
  - google-chrome-stable --headless --disable-gpu --no-sandbox --remote-debugging-port=9222 http://localhost &
14
14
 
@@ -1,3 +1,11 @@
1
+ ### 5.3.0 (2019-12-19)
2
+
3
+ * optionally log browser and platform user agent info
4
+ * update to qa 5.3
5
+ * add a request id to the search and find request headers
6
+ * log exception for graph load failures
7
+ * optionally include IP info at start of search/find linked data requests
8
+
1
9
  ### 5.2.1 (2019-12-13)
2
10
 
3
11
  * fix - add defaults to the initializer generator template for new configs
@@ -41,8 +41,8 @@ module QaServer
41
41
  end
42
42
 
43
43
  def log(id:)
44
- Rails.logger.info("*** performance data for id: #{id} ***")
45
- Rails.logger.info(@cache[id].to_yaml)
44
+ Rails.logger.debug("*** performance data for id: #{id} ***")
45
+ Rails.logger.debug(@cache[id].to_yaml)
46
46
  end
47
47
 
48
48
  private
@@ -2,30 +2,35 @@
2
2
  module PrependedLinkedData::FindTerm
3
3
  # Override Qa::Authorities::LinkedData::FindTerm#find method
4
4
  # @return [Hash] single term results in requested format
5
- def find(id, request_header: {}, language: nil, replacements: {}, subauth: nil, format: nil, performance_data: false) # rubocop:disable Metrics/ParameterLists, Metrics/CyclomaticComplexity
5
+ def find(id, request_header: {}, language: nil, replacements: {}, subauth: nil, format: nil, performance_data: false) # rubocop:disable Metrics/ParameterLists
6
6
  return super if QaServer.config.suppress_performance_gathering
7
-
8
- start_time_s = QaServer.current_time_s
9
- request_header = build_request_header(language: language, replacements: replacements, subauth: subauth, format: format, performance_data: performance_data) if request_header.empty?
10
- saved_performance_data = performance_data || request_header[:performance_data]
11
- request_header[:performance_data] = true
12
-
7
+ request_header = setup_find(request_header: request_header, language: language, replacements: replacements, subauth: subauth,
8
+ format: format, performance_data: performance_data)
13
9
  @phid = QaServer.config.performance_cache.new_entry(authority: authority_name, action: 'fetch')
14
10
  begin
15
11
  full_results = super
16
- update_performance_history_record(full_results, start_time_s)
12
+ update_performance_history_record(full_results)
17
13
  rescue Exception => e # rubocop:disable Lint/RescueException
18
14
  QaServer.config.performance_cache.destroy(@phid)
19
15
  raise e
20
16
  end
21
- saved_performance_data || !full_results.is_a?(Hash) ? full_results : full_results[:results]
17
+ requested_results(full_results)
22
18
  end
23
19
 
24
20
  private
25
21
 
26
- def update_performance_history_record(full_results, start_time_s)
22
+ def setup_find(request_header: {}, language: nil, replacements: {}, subauth: nil, format: nil, performance_data: false) # rubocop:disable Metrics/ParameterLists
23
+ QaServer.log_agent_info(request_header[:request])
24
+ @start_time_s = QaServer.current_time_s
25
+ request_header = build_request_header(language: language, replacements: replacements, subauth: subauth, format: format, performance_data: performance_data) if request_header.empty?
26
+ @saved_performance_data = performance_data || request_header[:performance_data]
27
+ request_header[:performance_data] = true
28
+ request_header
29
+ end
30
+
31
+ def update_performance_history_record(full_results)
27
32
  return QaServer.config.performance_cache.destroy(@phid) unless full_results.is_a?(Hash) && full_results.key?(:performance)
28
- updates = { action_time_ms: (QaServer.current_time_s - start_time_s) * 1000,
33
+ updates = { action_time_ms: (QaServer.current_time_s - @start_time_s) * 1000,
29
34
  size_bytes: full_results[:performance][:fetched_bytes],
30
35
  retrieve_plus_graph_load_time_ms: full_results[:performance][:fetch_time_s] * 1000,
31
36
  normalization_time_ms: full_results[:performance][:normalization_time_s] * 1000 }
@@ -51,7 +56,13 @@ module PrependedLinkedData::FindTerm
51
56
  # Temporary override to fix bug. Remove when QA Issue #271 is fixed and a new release is cut
52
57
  def performance_data?
53
58
  return super if QaServer.config.suppress_performance_gathering
54
-
55
59
  @performance_data == true
56
60
  end
61
+
62
+ def requested_results(full_results)
63
+ return full_results if @saved_performance_data || !full_results.is_a?(Hash)
64
+ return full_results[:results] unless full_results.key? :response_header
65
+ full_results.delete(:performance)
66
+ full_results
67
+ end
57
68
  end
@@ -4,28 +4,33 @@ module PrependedLinkedData::SearchQuery
4
4
  # @return [String] json results for search query
5
5
  def search(query, request_header: {}, language: nil, replacements: {}, subauth: nil, context: false, performance_data: false) # rubocop:disable Metrics/ParameterLists
6
6
  return super if QaServer.config.suppress_performance_gathering
7
-
8
- start_time_s = QaServer.current_time_s
9
- request_header = build_request_header(language: language, replacements: replacements, subauth: subauth, context: context, performance_data: performance_data) if request_header.empty?
10
- saved_performance_data = performance_data || request_header[:performance_data]
11
- request_header[:performance_data] = true
12
-
7
+ request_header = setup_search(request_header: request_header, language: language, replacements: replacements, subauth: subauth,
8
+ context: context, performance_data: performance_data)
13
9
  @phid = QaServer.config.performance_cache.new_entry(authority: authority_name, action: 'search')
14
10
  begin
15
11
  full_results = super
16
- update_performance_history_record(full_results, start_time_s)
12
+ update_performance_history_record(full_results)
17
13
  rescue Exception => e # rubocop:disable Lint/RescueException
18
14
  QaServer.config.performance_cache.destroy(@phid)
19
15
  raise e
20
16
  end
21
- requested_results(full_results, saved_performance_data)
17
+ requested_results(full_results)
22
18
  end
23
19
 
24
20
  private
25
21
 
26
- def update_performance_history_record(full_results, start_time_s)
22
+ def setup_search(request_header: {}, language: nil, replacements: {}, subauth: nil, context: false, performance_data: false) # rubocop:disable Metrics/ParameterLists
23
+ QaServer.log_agent_info(request_header[:request])
24
+ @start_time_s = QaServer.current_time_s
25
+ request_header = build_request_header(language: language, replacements: replacements, subauth: subauth, context: context, performance_data: performance_data) if request_header.empty?
26
+ @saved_performance_data = performance_data || request_header[:performance_data]
27
+ request_header[:performance_data] = true
28
+ request_header
29
+ end
30
+
31
+ def update_performance_history_record(full_results)
27
32
  return QaServer.config.performance_cache.destroy(@phid) unless full_results.is_a?(Hash) && full_results.key?(:performance)
28
- updates = { action_time_ms: (QaServer.current_time_s - start_time_s) * 1000,
33
+ updates = { action_time_ms: (QaServer.current_time_s - @start_time_s) * 1000,
29
34
  size_bytes: full_results[:performance][:fetched_bytes],
30
35
  retrieve_plus_graph_load_time_ms: full_results[:performance][:fetch_time_s] * 1000,
31
36
  normalization_time_ms: full_results[:performance][:normalization_time_s] * 1000 }
@@ -48,8 +53,8 @@ module PrependedLinkedData::SearchQuery
48
53
  Rails.logger.info("Time to receive data from authority: #{access_time_s}s")
49
54
  end
50
55
 
51
- def requested_results(full_results, saved_performance_data)
52
- return full_results if saved_performance_data
56
+ def requested_results(full_results)
57
+ return full_results if @saved_performance_data
53
58
  return full_results[:results] unless full_results.key? :response_header
54
59
  full_results.delete(:performance)
55
60
  full_results
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require 'qa_server/engine'
3
3
  require 'qa_server/version'
4
+ require 'user_agent'
4
5
 
5
6
  module QaServer
6
7
  extend ActiveSupport::Autoload
@@ -34,4 +35,15 @@ module QaServer
34
35
  offset = QaServer.config.hour_offset_to_run_monitoring_tests
35
36
  (current_time - offset.hours).beginning_of_day + offset.hours
36
37
  end
38
+
39
+ def self.log_agent_info(request)
40
+ return if !Qa.config.respond_to?(:suppress_ip_data_from_log) || Qa.config.suppress_ip_data_from_log
41
+ user_agent = request.respond_to?(:user_agent) && !request.user_agent.nil? ? ::UserAgent.parse(request.user_agent) : nil
42
+ return Rails.logger.info("{browser: UNKNOWN, browser_version: UNKNOWN, platform: UNKNOWN, os: UNKNOWN}") if user_agent.nil?
43
+ browser = user_agent.browser
44
+ browser_version = user_agent.version
45
+ platform = user_agent.platform
46
+ os = user_agent.os
47
+ Rails.logger.info("{browser: #{browser}, browser_version: #{browser_version}, platform: #{platform}, os: #{os}}")
48
+ end
37
49
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module QaServer
3
- VERSION = '5.2.1'
3
+ VERSION = '5.3.0'
4
4
  end
@@ -23,9 +23,10 @@ Gem::Specification.new do |spec|
23
23
  # minor version releases can include breaking changes; see
24
24
  # http://guides.rubyonrails.org/maintenance_policy.html
25
25
  spec.add_dependency 'rails', '~> 5.0' # Keep in sync with version supported by Hyrax
26
+ spec.add_dependency 'useragent'
26
27
 
27
28
  # Required gems for QA and linked data access
28
- spec.add_development_dependency 'qa', '~> 5.1' # required for response_header
29
+ spec.add_development_dependency 'qa', '~> 5.3'
29
30
  spec.add_development_dependency 'linkeddata'
30
31
 
31
32
  # Produces dashboard charts on monitor status page
@@ -43,5 +43,49 @@ RSpec.describe QaServer do
43
43
  end
44
44
  end
45
45
  end
46
+
47
+ # rubocop:disable RSpec/MessageSpies
48
+ describe '.log_agent_info' do
49
+ let(:request) { double }
50
+
51
+ context 'when ip logging is suppressed' do
52
+ before { allow(Qa).to receive_message_chain(:config, :suppress_ip_data_from_log).and_return(true) }
53
+
54
+ it 'suppresses agent logging' do
55
+ expect(Rails.logger).not_to receive(:info).with(/^\{browser: /)
56
+ described_class.log_agent_info(request)
57
+ end
58
+ end
59
+
60
+ context 'when ip logging is not suppressed' do
61
+ before { allow(Qa).to receive_message_chain(:config, :suppress_ip_data_from_log).and_return(false) }
62
+
63
+ context 'and user_agent is nil' do
64
+ before { allow(request).to receive(:user_agent).and_return(nil) }
65
+ it 'logs agent info as UNKNOWN' do
66
+ expect(Rails.logger).to receive(:info).with("{browser: UNKNOWN, browser_version: UNKNOWN, platform: UNKNOWN, os: UNKNOWN}")
67
+ described_class.log_agent_info(request)
68
+ end
69
+ end
70
+
71
+ context 'and user_agent has data' do
72
+ # rubocop:disable RSpec/AnyInstance
73
+ before do
74
+ allow(request).to receive(:user_agent).and_return("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
75
+ allow_any_instance_of(UserAgent::Browsers::Chrome).to receive(:browser).and_return("Chrome")
76
+ allow_any_instance_of(UserAgent::Browsers::Chrome).to receive(:version).and_return("v1.1")
77
+ allow_any_instance_of(UserAgent::Browsers::Chrome).to receive(:platform).and_return("Mac")
78
+ allow_any_instance_of(UserAgent::Browsers::Chrome).to receive(:os).and_return("10.14")
79
+ end
80
+ # rubocop:enable RSpec/AnyInstance
81
+
82
+ it 'logs agent info as UNKNOWN' do
83
+ expect(Rails.logger).to receive(:info).with("{browser: Chrome, browser_version: v1.1, platform: Mac, os: 10.14}")
84
+ described_class.log_agent_info(request)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ # rubocop:enable RSpec/MessageSpies
46
90
  # rubocop:enable RSpec/MessageChain
47
91
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qa_server
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.1
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - E. Lynette Rayle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-14 00:00:00.000000000 Z
11
+ date: 2019-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,20 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: useragent
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: qa
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '5.1'
47
+ version: '5.3'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '5.1'
54
+ version: '5.3'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: linkeddata
43
57
  requirement: !ruby/object:Gem::Requirement