qa_server 6.1.0 → 6.2.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: 3f5c0789b598b78ba1ac24e8070d989c92147bad
4
- data.tar.gz: a3d686757d3cb4f9279c505416c6c3a54edbc00c
3
+ metadata.gz: b602ac44639871d5021eb47493edf93fb8abdc25
4
+ data.tar.gz: bf9e6a5ece3786edab98ed79d1fc3edb8e54f8b7
5
5
  SHA512:
6
- metadata.gz: fc7340db3cc8a3aaf1d20449608427b57c7aa03a0d096b67b093330c92e97b4af7035acd20833bcf74e440056eebd7a6b37bf5224c95686d14294812612ad447
7
- data.tar.gz: d7e0ae7f314ec9c7fb9d16783947a2a9cb5d7dea10388b6ad777c0da8a2e9c5ca035511bd519ed3b4bcb3314e6c782a6901983459a5872cdea0980c0333a6d56
6
+ metadata.gz: ec1fec69f78b763fc7012c92118fddeb6e0f6ad98d53d9ae80d959f80f0c1373c435626452644294ecbcf1b1843ac37517af58a71e04ece333a9d14afa99486f
7
+ data.tar.gz: d4e87a9c8157f8d03b3fdbc26ded7698f294cee41f9c7a2222355db878c26ab7e7d121d32dda69fbf1660f5b7942de7ec05688431a364b1e06f22b9b73967598
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### 6.2.0 (2020-02-17)
2
+
3
+ * use authentication for refreshing monitor tests
4
+ * add performance cache logger
5
+ * exceeding max performance cache size flushing the cache
6
+
1
7
  ### 6.1.0 (2020-02-17)
2
8
 
3
9
  * change historical summary to show number of days instead of number of tests (original intent)
@@ -13,6 +13,7 @@ module QaServer
13
13
 
14
14
  # Sets up presenter with data to display in the UI
15
15
  def index
16
+ log_header
16
17
  validate(authorities_to_validate, validation_type)
17
18
  @presenter = presenter_class.new(authorities_list: authorities_list,
18
19
  connection_status_data: connection_status_data_from_log,
@@ -38,5 +39,10 @@ module QaServer
38
39
  return @authority_name if @authority_name.present?
39
40
  @authority_name = params.key?(:authority) ? params[:authority].downcase : nil
40
41
  end
42
+
43
+ def log_header
44
+ QaServer.config.performance_cache_logger.debug("------------------------------------- check status ---------------------------------")
45
+ QaServer.config.performance_cache_logger.debug("(#{self.class}##{__method__}) check status page request (authority_name # #{authority_name})")
46
+ end
41
47
  end
42
48
  end
@@ -21,11 +21,13 @@ module QaServer
21
21
  def index
22
22
  log_header
23
23
  latest_test_run
24
+ commit_cache if commit_cache?
24
25
  @presenter = presenter_class.new(current_summary: latest_summary,
25
26
  current_failure_data: latest_failures,
26
27
  historical_summary_data: historical_data,
27
28
  performance_data: performance_table_data)
28
29
  update_performance_graphs
30
+ QaServer.config.monitor_logger.debug("(#{self.class}##{__method__}) DONE rendering")
29
31
  render 'index', status: :internal_server_error if latest_summary.failing_authority_count.positive?
30
32
  end
31
33
 
@@ -40,7 +42,7 @@ module QaServer
40
42
  # @see #latest_test_run_from_temp_cache
41
43
  def latest_test_run_from_cache
42
44
  Rails.cache.fetch("#{self.class}/#{__method__}", expires_in: QaServer::MonitorCacheService.cache_expiry, race_condition_ttl: 5.minutes, force: refresh_tests?) do
43
- QaServer.config.monitor_logger.info("(#{self.class}##{__method__}) get latest run of monitoring tests - cache expired or refresh requested (force: #{refresh_tests?})")
45
+ QaServer.config.monitor_logger.debug("(#{self.class}##{__method__}) get latest run of monitoring tests - cache expired or refresh requested (force: #{refresh_tests?})")
44
46
  QaServer::MonitorTestsJob.perform_later
45
47
  scenario_run_registry_class.latest_run
46
48
  end
@@ -80,7 +82,7 @@ module QaServer
80
82
  end
81
83
 
82
84
  def refresh?
83
- params.key? :refresh
85
+ params.key?(:refresh) && validate_auth_reload_token("refresh status")
84
86
  end
85
87
 
86
88
  def refresh_all?
@@ -103,10 +105,28 @@ module QaServer
103
105
  refresh_all? || params[:refresh].casecmp?('performance')
104
106
  end
105
107
 
108
+ def commit_cache?
109
+ params.key?(:commit) && validate_auth_reload_token("commit cache")
110
+ end
111
+
112
+ def commit_cache
113
+ QaServer.config.performance_cache.write_all
114
+ end
115
+
116
+ def validate_auth_reload_token(action)
117
+ token = params.key?(:auth_token) ? params[:auth_token] : nil
118
+ valid = Qa.config.valid_authority_reload_token?(token)
119
+ return true if valid
120
+ msg = "Permission denied. Unable to #{action}."
121
+ logger.warn msg
122
+ flash.now[:error] = msg
123
+ false
124
+ end
125
+
106
126
  def log_header
107
127
  QaServer.config.monitor_logger.debug("------------------------------------- monitor status ---------------------------------")
108
- QaServer.config.monitor_logger.info("(#{self.class}##{__method__}) monitor status page request (refresh_tests? # #{refresh_tests?}, " \
109
- "refresh_history? # #{refresh_history?}, refresh_performance? # #{refresh_performance?})")
128
+ QaServer.config.monitor_logger.debug("(#{self.class}##{__method__}) monitor status page request (refresh_tests? # #{refresh_tests?}, " \
129
+ "refresh_history? # #{refresh_history?}, refresh_performance? # #{refresh_performance?})")
110
130
  end
111
131
  end
112
132
  end
@@ -9,9 +9,8 @@ module QaServer
9
9
  class_attribute :scenario_run_registry_class
10
10
  self.scenario_run_registry_class = QaServer::ScenarioRunRegistry
11
11
 
12
- # def perform(job_id:)
13
12
  def perform
14
- Rails.cache.fetch("QaServer::MonitorTestsController/latest_test_run_from_cache", expires_in: QaServer::MonitorCacheService.cache_expiry, race_condition_ttl: 5.minutes, force: true) do
13
+ Rails.cache.fetch("QaServer::MonitorStatusController/latest_test_run_from_cache", expires_in: QaServer::MonitorCacheService.cache_expiry, race_condition_ttl: 5.minutes, force: true) do
15
14
  job_id = SecureRandom.uuid
16
15
  monitor_tests_job_id = job_id unless monitor_tests_job_id
17
16
  run_tests if monitor_tests_job_id == job_id # avoid race conditions
@@ -22,11 +21,11 @@ module QaServer
22
21
  private
23
22
 
24
23
  def run_tests
25
- QaServer.config.monitor_logger.info("(#{self.class}##{__method__}-#{job_id}) RUNNING monitoring tests")
24
+ QaServer.config.monitor_logger.debug("(#{self.class}##{__method__}-#{job_id}) RUNNING monitoring tests")
26
25
  validate(authorities_list)
27
26
  log_results(authorities_list, status_log.to_a)
28
27
  scenario_run_registry_class.save_run(scenarios_results: status_log.to_a)
29
- QaServer.config.monitor_logger.info("(#{self.class}##{__method__}-#{job_id}) COMPLETED monitoring tests")
28
+ QaServer.config.monitor_logger.debug("(#{self.class}##{__method__}-#{job_id}) COMPLETED monitoring tests")
30
29
  reset_monitor_tests_job_id
31
30
  end
32
31
 
@@ -21,32 +21,47 @@ module QaServer
21
21
  @cache[id] = entry.merge(updates)
22
22
  end
23
23
 
24
+ def complete_entry(id:)
25
+ log(id: id)
26
+ QaServer.config.performance_cache_logger.debug("#{self.class}##{__method__} - id: #{id} cache memory: #{ObjectSpace.memsize_of @cache}")
27
+ write_all if ObjectSpace.memsize_of(@cache) > QaServer.config.max_performance_cache_size
28
+ end
29
+
24
30
  def destroy(id)
25
- @cache.delete(id)
31
+ @cache.delete(id) # WARNING: doesn't change the size of the cache
26
32
  end
27
33
 
28
34
  def write_all
29
- size_before = @cache.size
30
- @cache.each do |id, entry|
35
+ cache_to_write = swap_cache_hash
36
+ size_before = cache_to_write.size
37
+ cache_to_write.each do |id, entry|
31
38
  next if incomplete? entry
32
39
  QaServer::PerformanceHistory.create(dt_stamp: entry[:dt_stamp], authority: entry[:authority],
33
40
  action: entry[:action], action_time_ms: entry[:action_time_ms],
34
41
  size_bytes: entry[:size_bytes], retrieve_time_ms: entry[:retrieve_time_ms],
35
42
  graph_load_time_ms: entry[:graph_load_time_ms],
36
43
  normalization_time_ms: entry[:normalization_time_ms])
37
- @cache.delete(id)
44
+ cache_to_write.delete(id)
38
45
  end
39
- log_write_all("(#{self.class}##{__method__})", size_before, @cache.size)
40
- end
41
-
42
- def log(id:)
43
- return if QaServer.config.suppress_logging_performance_datails
44
- Rails.logger.debug("*** performance data for id: #{id} ***")
45
- Rails.logger.debug(@cache[id].to_yaml)
46
+ log_write_all("(#{self.class}##{__method__})", size_before, cache_to_write.size)
47
+ cache_to_write = nil # free cache for garbage collection
46
48
  end
47
49
 
48
50
  private
49
51
 
52
+ def swap_cache_hash
53
+ cache_to_write = @cache
54
+ @cache = {} # reset main cache so new items after write begins are cached in the main cache
55
+ QaServer.config.performance_cache_logger.debug("#{self.class}##{__method__} - cache memory BEFORE write: #{ObjectSpace.memsize_of(cache_to_write)}")
56
+ cache_to_write
57
+ end
58
+
59
+ def log(id:)
60
+ return if QaServer.config.suppress_logging_performance_datails
61
+ Rails.logger.debug("*** performance data for id: #{id} ***")
62
+ Rails.logger.debug(@cache[id].to_yaml)
63
+ end
64
+
50
65
  def incomplete?(entry)
51
66
  required_keys.each { |k| return true unless entry.key? k }
52
67
  false
@@ -65,11 +80,12 @@ module QaServer
65
80
 
66
81
  def log_write_all(prefix, size_before, cache_size)
67
82
  if size_before.positive?
68
- QaServer.config.monitor_logger.warn("#{prefix} 0 of #{size_before} performance data records were saved") if size_before == cache_size
69
- QaServer.config.monitor_logger.info("#{prefix} #{size_before - cache_size} of #{size_before} performance data records were saved") if size_before > cache_size
83
+ QaServer.config.performance_cache_logger.debug("#{prefix} 0 of #{size_before} performance data records were saved") if size_before == cache_size
84
+ QaServer.config.performance_cache_logger.debug("#{prefix} #{size_before - cache_size} of #{size_before} performance data records were saved") if size_before > cache_size
70
85
  else
71
- QaServer.config.monitor_logger.info("#{prefix} 0 of 0 performance data records were saved")
86
+ QaServer.config.performance_cache_logger.debug("#{prefix} 0 of 0 performance data records were saved")
72
87
  end
88
+ QaServer.config.performance_cache_logger.debug("#{prefix} - cache memory AFTER write: #{ObjectSpace.memsize_of @cache}")
73
89
  end
74
90
  end
75
91
  end
@@ -47,7 +47,7 @@ module QaServer
47
47
  # * total_scenario_count: 159,
48
48
  def run_summary(scenario_run:, force: false)
49
49
  Rails.cache.fetch("QaServer::ScenarioRunHistory/#{__method__}", expires_in: QaServer::MonitorCacheService.cache_expiry, race_condition_ttl: 1.minute, force: force) do
50
- QaServer.config.monitor_logger.info("(QaServer::ScenarioRunHistory##{__method__}) - CALCULATING summary of latest run - cache expired or refresh requested (force: #{force})")
50
+ QaServer.config.monitor_logger.debug("(QaServer::ScenarioRunHistory##{__method__}) - CALCULATING summary of latest run - cache expired or refresh requested (force: #{force})")
51
51
  status = status_counts_in_run(run_id: scenario_run.id)
52
52
  summary_class.new(run_id: scenario_run.id,
53
53
  run_dt_stamp: scenario_run.dt_stamp,
@@ -130,7 +130,7 @@ module QaServer
130
130
  def run_failures(run_id:, force: false)
131
131
  return [] unless run_id
132
132
  Rails.cache.fetch("QaServer::ScenarioRunHistory/#{__method__}", expires_in: QaServer::MonitorCacheService.cache_expiry, race_condition_ttl: 1.minute, force: force) do
133
- QaServer.config.monitor_logger.info("(QaServer::ScenarioRunHistory##{__method__}) - finding failures in latest run - cache expired or refresh requested (force: #{force})")
133
+ QaServer.config.monitor_logger.debug("(QaServer::ScenarioRunHistory##{__method__}) - finding failures in latest run - cache expired or refresh requested (force: #{force})")
134
134
  QaServer::ScenarioRunHistory.where(scenario_run_registry_id: run_id).where.not(status: :good).to_a
135
135
  end
136
136
  end
@@ -142,7 +142,7 @@ module QaServer
142
142
  # 'geonames_ld4l_cache' => { good: 32, bad: 1 } }
143
143
  def historical_summary(force: false)
144
144
  Rails.cache.fetch("QaServer::ScenarioRunHistory/#{__method__}", expires_in: QaServer::MonitorCacheService.cache_expiry, race_condition_ttl: 1.minute, force: force) do
145
- QaServer.config.monitor_logger.info("(QaServer::ScenarioRunHistory##{__method__}) - CALCULATING authority connection history - cache expired or refresh requested (force: #{force})")
145
+ QaServer.config.monitor_logger.debug("(QaServer::ScenarioRunHistory##{__method__}) - CALCULATING authority connection history - cache expired or refresh requested (force: #{force})")
146
146
  days_good = count_days(:good)
147
147
  days_bad = count_days(:bad)
148
148
  days_unknown = count_days(:unknown)
@@ -35,7 +35,7 @@ module PrependedLinkedData::FindTerm
35
35
  retrieve_plus_graph_load_time_ms: full_results[:performance][:fetch_time_s] * 1000,
36
36
  normalization_time_ms: full_results[:performance][:normalization_time_s] * 1000 }
37
37
  QaServer.config.performance_cache.update(id: @phid, updates: updates)
38
- QaServer.config.performance_cache.log(id: @phid)
38
+ QaServer.config.performance_cache.complete_entry(id: @phid)
39
39
  end
40
40
 
41
41
  # Override to append performance history record id into the URL to allow access to the record in RDF::Graph
@@ -35,7 +35,7 @@ module PrependedLinkedData::SearchQuery
35
35
  retrieve_plus_graph_load_time_ms: full_results[:performance][:fetch_time_s] * 1000,
36
36
  normalization_time_ms: full_results[:performance][:normalization_time_s] * 1000 }
37
37
  QaServer.config.performance_cache.update(id: @phid, updates: updates)
38
- QaServer.config.performance_cache.log(id: @phid)
38
+ QaServer.config.performance_cache.complete_entry(id: @phid)
39
39
  end
40
40
 
41
41
  # Override to append performance history record id into the URL to allow access to the record in RDF::Graph
@@ -26,7 +26,7 @@ module QaServer
26
26
  # }
27
27
  def calculate_datatable_data(force:)
28
28
  Rails.cache.fetch("QaServer::PerformanceDatatableService/#{__method__}", expires_in: QaServer::MonitorCacheService.cache_expiry, race_condition_ttl: 5.minutes, force: force) do
29
- QaServer.config.monitor_logger.info("(QaServer::PerformanceDatatableService##{__method__}) - CALCULATING performance datatable stats - cache expired or refresh requested (force: #{force})")
29
+ QaServer.config.monitor_logger.debug("(QaServer::PerformanceDatatableService##{__method__}) - CALCULATING performance datatable stats - cache expired or refresh requested (force: #{force})")
30
30
  data = {}
31
31
  auths = authority_list_class.authorities_list
32
32
  data[ALL_AUTH] = datatable_data_for_authority
@@ -49,7 +49,7 @@ module QaServer
49
49
  data = {}
50
50
  auths = authority_list_class.authorities_list
51
51
  calculate_all = force || cache_expired?
52
- QaServer.config.monitor_logger.info("(QaServer::PerformanceGraphDataService##{__method__}) - CALCULATING performance graph data (calculate_all: #{calculate_all})")
52
+ QaServer.config.monitor_logger.debug("(QaServer::PerformanceGraphDataService##{__method__}) - CALCULATING performance graph data (calculate_all: #{calculate_all})")
53
53
  data[ALL_AUTH] = graph_data_for_authority(force: force, calculate_all: calculate_all)
54
54
  auths.each { |auth_name| data[auth_name] = graph_data_for_authority(authority_name: auth_name, force: force, calculate_all: calculate_all) }
55
55
  data
@@ -12,7 +12,7 @@ module QaServer
12
12
  # @param performance_data [Hash] hash of all performance data for all authorities
13
13
  # @see QaServer:PerformanceHistory
14
14
  def create_performance_graphs(performance_data:)
15
- QaServer.config.monitor_logger.info("(QaServer::PerformanceGraphingService##{__method__}) - generating graphs")
15
+ QaServer.config.monitor_logger.debug("(QaServer::PerformanceGraphingService##{__method__}) - generating graphs")
16
16
  performance_data.each_key do |auth_name|
17
17
  create_graphs_for_authority(performance_data, auth_name.to_sym, :search)
18
18
  create_graphs_for_authority(performance_data, auth_name.to_sym, :fetch)
@@ -82,4 +82,20 @@ QaServer.config do |config|
82
82
  # by QaServer and can eat up logging realestate. To suppress the logging of details, set this config to true.
83
83
  # @param [Boolean] do not log performance data details when true (defaults to false for backward compatibitily)
84
84
  # config.suppress_logging_performance_datails = false
85
+
86
+ # Maximum amount of memory the performance cache can occupy before it is written to the database.
87
+ # @param [Integer] maximum size of performance cache before flushing
88
+ # config.max_performance_cache_size = 32.megabytes
89
+
90
+ # Enable/Disable logging of performance cache
91
+ # Uncomment one of the lines below to enable or disable performance cache logging. NOTE: By default, loggers follow the
92
+ # default levels for Rails loggers (i.e. enabled for development, disabled for production.)
93
+ # config.enable_performance_cache_logging
94
+ # config.disable_performance_cache_logging
95
+
96
+ # Enable/Disable logging of monitoring process
97
+ # Uncomment one of the lines below to enable or disable monitoring process logging. NOTE: By default, loggers follow the
98
+ # default levels for Rails loggers (i.e. enabled for development, disabled for production.)
99
+ # config.enable_monitor_status_logging
100
+ # config.disable_monitor_status_logging
85
101
  end
@@ -201,12 +201,43 @@ module QaServer
201
201
  @suppress_logging_performance_datails ||= false
202
202
  end
203
203
 
204
+ # Maximum amount of memory the performance cache can occupy before it is written to the database.
205
+ # @param [Integer] maximum size of performance cache before flushing
206
+ attr_writer :max_performance_cache_size
207
+ def max_performance_cache_size
208
+ @max_performance_cache_size ||= 32.megabytes
209
+ end
210
+
204
211
  # For internal use only
205
- # TODO: consider refactor performance caching to use Rails cache
206
212
  def performance_cache
207
213
  @performance_cache ||= QaServer::PerformanceCache.new
208
214
  end
209
215
 
216
+ # Enable logging of performance cache
217
+ def enable_performance_cache_logging
218
+ performance_cache_logger.level = Logger::DEBUG
219
+ end
220
+
221
+ # Disable logging of performance cache
222
+ def disable_performance_cache_logging
223
+ performance_cache_logger.level = Logger::INFO
224
+ end
225
+
226
+ # For internal use only
227
+ def performance_cache_logger
228
+ @performance_cache_logger ||= Logger.new(ENV['PERFORMANCE_CACHE_LOG_PATH'] || File.join("log", "performance_cache.log"))
229
+ end
230
+
231
+ # Enable logging of monitoring process
232
+ def enable_monitor_status_logging
233
+ monitor_logger.level = Logger::DEBUG
234
+ end
235
+
236
+ # Disable logging of performance cache
237
+ def disable_monitor_status_logging
238
+ monitor_logger.level = Logger::INFO
239
+ end
240
+
210
241
  # For internal use only
211
242
  def monitor_logger
212
243
  @monitor_logger ||= Logger.new(ENV['MONITOR_LOG_PATH'] || File.join("log", "monitor.log"))
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module QaServer
3
- VERSION = '6.1.0'
3
+ VERSION = '6.2.0'
4
4
  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: 6.1.0
4
+ version: 6.2.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: 2020-02-17 00:00:00.000000000 Z
11
+ date: 2020-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails