qa_server 5.2.1 → 5.3.0

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.
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