qa_server 7.0.0 → 7.1.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: fb73032a8e4f6dfb0d782a8635d8f43668b63a06
4
- data.tar.gz: a857cd62d41bc035a241419815e9fff67fdf1d5a
3
+ metadata.gz: 8f01bf8175022b615153f701ad3cd23c38243d2b
4
+ data.tar.gz: 90ba9bedee3dd3ed4aadd719d18864cf61456615
5
5
  SHA512:
6
- metadata.gz: 490cfcc14713a0fad8e3d5d60aa5d23a5699c5c3ab23359164848a8f5a3223bbf8fb2bbbffbd9f59b5220efed3eec4f4d63a8fece546dee916886f91a51f0287
7
- data.tar.gz: '04027957aeb5955a65a4a5d23d4fd11c7b98827c650ba9b736512953fb10c260e11c9ad4f76de85991861706874eedd7e04bb523184c2a1693e079dc0317b142'
6
+ metadata.gz: b73ad3afcdfe168bdd45edaf4bd147ef8dc169a72ed939f6698e43bc25b0f6217afbdfa43106f9816516852c80cfff5d5efb0a32368b80770849846798c2cc8f
7
+ data.tar.gz: 5b616e7cfcf15b7e04120c421b60c6ad2bccd8a8b9069b2043c8856036351311480ca7b05a65960d68135ed3c87f32a30d5310210a7584a8017adba270aaf444
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ### 7.1.0 (2020-02-20)
2
+
3
+ * allow performance cache size to be set by environment variable
4
+ * move generation of history graph to cache_processors
5
+ * log warning in monitor logger if graphs fail to create
6
+ * monitor_status page won't try to display graphs if graph file does not exist
7
+
1
8
  ### 7.0.0 (2020-02-19)
2
9
 
3
10
  * refactor of caching system to simplify the process
@@ -6,6 +6,7 @@ module QaServer
6
6
  SCENARIO_RUN_SUMMARY_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_summary_data"
7
7
  SCENARIO_RUN_FAILURE_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_failure_data"
8
8
  SCENARIO_RUN_HISTORY_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_history_data"
9
+ SCENARIO_RUN_HISTORY_GRAPH_CACHE_KEY = "QaServer--CacheKeys--scenario_run_history_graph"
9
10
 
10
11
  PERFORMANCE_DATATABLE_DATA_CACHE_KEY = "QaServer--Cache--performance_datatable_data"
11
12
  PERFORMANCE_GRAPH_HOURLY_DATA_CACHE_KEY = "QaServer--CacheKeys--performance_graph_hourly_data"
@@ -16,7 +16,7 @@ module QaServer
16
16
  # 'geonames_ld4l_cache' => { good: 32, bad: 1 } }
17
17
  def historical_summary(force: false)
18
18
  Rails.cache.fetch(cache_key_for_historical_data, expires_in: next_expiry, race_condition_ttl: 30.seconds, force: force) do
19
- QaServer.config.monitor_logger.debug("(QaServer::ScenarioHistoryCache) - CALCULATING HISTORY of scenario runs (force: force)")
19
+ QaServer.config.monitor_logger.debug("(QaServer::ScenarioHistoryCache) - CALCULATING HISTORY of scenario runs (force: #{force})")
20
20
  scenario_history_class.historical_summary
21
21
  end
22
22
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ # Generate graphs for the past 30 days using cached data. Graphs are generated only if the cache has expired.
3
+ module QaServer
4
+ class ScenarioHistoryGraphCache
5
+ class_attribute :graphing_service
6
+ self.graphing_service = QaServer::HistoryGraphingService
7
+
8
+ class << self
9
+ include QaServer::CacheKeys
10
+ include QaServer::MonitorStatus::GruffGraph
11
+
12
+ HISTORICAL_GRAPH_FILENAME = 'historical_side_stacked_bar.png'
13
+
14
+ # Generates graphs for the past 30 days for :search, :fetch, and :all actions for each authority.
15
+ # @param force [Boolean] if true, run the tests even if the cache hasn't expired; otherwise, use cache if not expired
16
+ def generate_graph(data:, force: false)
17
+ return unless QaServer::CacheExpiryService.cache_expired?(key: cache_key_for_force, force: force, next_expiry: next_expiry)
18
+ QaServer.config.monitor_logger.debug("(QaServer::ScenarioHistoryGraphCache) - GENERATING historical summary graph (force: #{force})")
19
+ graphing_service.generate_graph(data)
20
+ end
21
+
22
+ private
23
+
24
+ def cache_key_for_force
25
+ "#{SCENARIO_RUN_HISTORY_GRAPH_CACHE_KEY}--force"
26
+ end
27
+
28
+ def next_expiry
29
+ QaServer::CacheExpiryService.cache_expiry
30
+ end
31
+ end
32
+ end
33
+ end
@@ -41,8 +41,12 @@ module QaServer
41
41
  end
42
42
 
43
43
  def log_header
44
- QaServer.config.performance_cache_logger.debug("------------------------------------- check status ---------------------------------")
44
+ QaServer.config.performance_cache_logger.debug("---------------------- check status (max_cache_size = #{max_cache_size}) ----------------------")
45
45
  QaServer.config.performance_cache_logger.debug("(#{self.class}##{__method__}) check status page request (authority_name # #{authority_name})")
46
46
  end
47
+
48
+ def max_cache_size
49
+ ActiveSupport::NumberHelper.number_to_human_size(QaServer.config.max_performance_cache_size)
50
+ end
47
51
  end
48
52
  end
@@ -14,8 +14,7 @@ module QaServer
14
14
  # Sets up presenter with data to display in the UI
15
15
  def index
16
16
  log_header
17
- update_tests
18
- update_performance_graphs
17
+ perform_updates
19
18
  commit_cache if commit_cache?
20
19
  @presenter = presenter_class.new(current_summary: latest_summary,
21
20
  current_failure_data: latest_failures,
@@ -27,6 +26,12 @@ module QaServer
27
26
 
28
27
  private
29
28
 
29
+ def perform_updates
30
+ update_tests
31
+ update_historical_graph
32
+ update_performance_graphs
33
+ end
34
+
30
35
  def update_tests
31
36
  QaServer::ScenarioRunCache.run_tests(force: refresh_tests?)
32
37
  end
@@ -51,7 +56,12 @@ module QaServer
51
56
  # @returns [Array<Hash>] summary of passing/failing tests for each authority
52
57
  # @see QaServer::ScenarioRunHistory#historical_summary for structure of output
53
58
  def historical_data
54
- QaServer::ScenarioHistoryCache.historical_summary(force: refresh_history?)
59
+ @historical_data ||= QaServer::ScenarioHistoryCache.historical_summary(force: refresh_history?)
60
+ end
61
+
62
+ def update_historical_graph
63
+ return unless QaServer.config.display_historical_graph?
64
+ QaServer::ScenarioHistoryGraphCache.generate_graph(data: historical_data, force: refresh_history?)
55
65
  end
56
66
 
57
67
  def performance_table_data
@@ -96,17 +96,29 @@ module QaServer::MonitorStatus
96
96
 
97
97
  def performance_graphs_for_authority(graphs, auth_name)
98
98
  [:search, :fetch, :all_actions].each do |action|
99
- graphs << performance_for_day_graph(auth_name, action)
100
- graphs << performance_for_month_graph(auth_name, action)
101
- graphs << performance_for_year_graph(auth_name, action)
99
+ day_graph = performance_for_day_graph(auth_name, action)
100
+ month_graph = performance_for_month_graph(auth_name, action)
101
+ year_graph = performance_for_year_graph(auth_name, action)
102
+ add_graphs(graphs, day_graph, month_graph, year_graph)
102
103
  end
103
104
  end
104
105
 
106
+ # only add the graphs if all 3 exist
107
+ def add_graphs(graphs, day_graph, month_graph, year_graph)
108
+ return unless day_graph[:exists] && month_graph[:exists] && year_graph[:exists]
109
+ graphs << day_graph
110
+ graphs << month_graph
111
+ graphs << year_graph
112
+ end
113
+
105
114
  def performance_for_day_graph(auth_name, action)
115
+ filepath = QaServer::PerformanceGraphingService.performance_graph_image_path(authority_name: auth_name, action: action, time_period: :day)
116
+ exists = QaServer::PerformanceGraphingService.performance_graph_image_exists?(authority_name: auth_name, action: action, time_period: :day)
106
117
  {
107
118
  action: action,
108
119
  time_period: :day,
109
- graph: QaServer::PerformanceGraphingService.performance_graph_file(authority_name: auth_name, action: action, time_period: :day),
120
+ graph: filepath,
121
+ exists: exists,
110
122
  label: "Performance data for the last 24 hours.",
111
123
  authority_name: auth_name,
112
124
  base_id: "performance-of-#{auth_name}"
@@ -114,10 +126,13 @@ module QaServer::MonitorStatus
114
126
  end
115
127
 
116
128
  def performance_for_month_graph(auth_name, action)
129
+ filepath = QaServer::PerformanceGraphingService.performance_graph_image_path(authority_name: auth_name, action: action, time_period: :month)
130
+ exists = QaServer::PerformanceGraphingService.performance_graph_image_exists?(authority_name: auth_name, action: action, time_period: :month)
117
131
  {
118
132
  action: action,
119
133
  time_period: :month,
120
- graph: QaServer::PerformanceGraphingService.performance_graph_file(authority_name: auth_name, action: action, time_period: :month),
134
+ graph: filepath,
135
+ exists: exists,
121
136
  label: "Performance data for the last 30 days.",
122
137
  authority_name: auth_name,
123
138
  base_id: "performance-of-#{auth_name}"
@@ -125,10 +140,13 @@ module QaServer::MonitorStatus
125
140
  end
126
141
 
127
142
  def performance_for_year_graph(auth_name, action)
143
+ filepath = QaServer::PerformanceGraphingService.performance_graph_image_path(authority_name: auth_name, action: action, time_period: :year)
144
+ exists = QaServer::PerformanceGraphingService.performance_graph_image_exists?(authority_name: auth_name, action: action, time_period: :year)
128
145
  {
129
146
  action: action,
130
147
  time_period: :year,
131
- graph: QaServer::PerformanceGraphingService.performance_graph_file(authority_name: auth_name, action: action, time_period: :year),
148
+ graph: filepath,
149
+ exists: exists,
132
150
  label: "Performance data for the last 12 months.",
133
151
  authority_name: auth_name,
134
152
  base_id: "performance-of-#{auth_name}"
@@ -82,7 +82,7 @@ module QaServer::MonitorStatus
82
82
 
83
83
  # @return [Boolean] true if failure data exists for the latest test run; otherwise false
84
84
  def failures?
85
- failing_tests_count.positive?
85
+ failing_tests_count.positive? && !failures.nil?
86
86
  end
87
87
  end
88
88
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  # This presenter class provides historical testing data needed by the view that monitors status of authorities.
3
3
  module QaServer::MonitorStatus
4
- class HistoryPresenter # rubocop:disable Metrics/ClassLength
4
+ class HistoryPresenter
5
5
  include QaServer::MonitorStatus::GruffGraph
6
6
 
7
7
  # @param parent [QaServer::MonitorStatusPresenter] parent presenter
@@ -19,6 +19,10 @@ module QaServer::MonitorStatus
19
19
  @historical_summary_data
20
20
  end
21
21
 
22
+ def historical_graph
23
+ QaServer::HistoryGraphingService.history_graph_image_path
24
+ end
25
+
22
26
  # @return [Boolean] true if historical test data exists; otherwise false
23
27
  def history?
24
28
  @historical_summary_data.present?
@@ -50,18 +54,6 @@ module QaServer::MonitorStatus
50
54
  QaServer::TimeService.pretty_date(history_end_dt)
51
55
  end
52
56
 
53
- def historical_graph
54
- # g = Gruff::SideStackedBar.new('800x400')
55
- g = Gruff::SideStackedBar.new
56
- historical_graph_theme(g)
57
- historical_data = rework_historical_data_for_gruff
58
- g.labels = historical_data[0]
59
- g.data('Fail', historical_data[1])
60
- g.data('Pass', historical_data[2])
61
- g.write historical_graph_full_path
62
- File.join(graph_relative_path, historical_graph_filename)
63
- end
64
-
65
57
  # @return [String] the name of the css style class to use for the status cell based on the status of the scenario test.
66
58
  def status_style_class(status)
67
59
  "status-#{status[:status]}"
@@ -117,42 +109,11 @@ module QaServer::MonitorStatus
117
109
  end
118
110
 
119
111
  def display_historical_graph?
120
- QaServer.config.display_historical_graph?
112
+ QaServer.config.display_historical_graph? && QaServer::HistoryGraphingService.history_graph_image_exists?
121
113
  end
122
114
 
123
115
  def display_historical_datatable?
124
116
  QaServer.config.display_historical_datatable?
125
117
  end
126
-
127
- private
128
-
129
- def historical_graph_theme(g)
130
- g.theme_pastel
131
- g.colors = ['#ffcccc', '#ccffcc']
132
- g.marker_font_size = 12
133
- g.x_axis_increment = 10
134
- end
135
-
136
- def historical_graph_full_path
137
- graph_full_path(historical_graph_filename)
138
- end
139
-
140
- def historical_graph_filename
141
- 'historical_side_stacked_bar.png'
142
- end
143
-
144
- def rework_historical_data_for_gruff
145
- labels = {}
146
- pass_data = []
147
- fail_data = []
148
- i = 0
149
- historical_summary.each do |auth, data|
150
- labels[i] = auth
151
- i += 1
152
- fail_data << data[:bad]
153
- pass_data << data[:good]
154
- end
155
- [labels, fail_data, pass_data]
156
- end
157
118
  end
158
119
  end
@@ -25,11 +25,11 @@ module QaServer::MonitorStatus
25
25
  end
26
26
 
27
27
  def display_performance_graph?
28
- QaServer.config.display_performance_graph?
28
+ QaServer.config.display_performance_graph? && !performance_graphs.nil? && !performance_graphs.empty?
29
29
  end
30
30
 
31
31
  def display_performance_datatable?
32
- QaServer.config.display_performance_datatable?
32
+ QaServer.config.display_performance_datatable? && !performance_data.nil?
33
33
  end
34
34
 
35
35
  def performance_data_authority_name(entry)
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ # This class sets creates the performance graphs for each authority during day, month, and year time periods for fetch and search actions.
3
+ module QaServer
4
+ class HistoryGraphingService
5
+ class << self
6
+ include QaServer::MonitorStatus::GruffGraph
7
+
8
+ HISTORICAL_GRAPH_FILENAME = 'historical_side_stacked_bar.png'
9
+
10
+ class_attribute :authority_list_class
11
+ self.authority_list_class = QaServer::AuthorityListerService
12
+
13
+ # Path to use with <image> tags
14
+ def history_graph_image_path
15
+ historical_graph_relative_path
16
+ end
17
+
18
+ # @return [Boolean] true if image for graph exists; otherwise, false
19
+ def history_graph_image_exists?
20
+ File.exist? historical_graph_full_path
21
+ end
22
+
23
+ # Generate the graph of historical data
24
+ # @param data [Hash] data to use to generate the graph
25
+ # @see QaServer::ScenarioHistoricalCache.historical_summary for source of data
26
+ def generate_graph(data)
27
+ gruff_data = rework_historical_data_for_gruff(data)
28
+ create_gruff_graph(gruff_data, historical_graph_full_path)
29
+ QaServer.config.monitor_logger.warn("FAILED to write historical graph at #{history_graph_image_path}") unless history_graph_image_exists?
30
+ end
31
+
32
+ private
33
+
34
+ def create_gruff_graph(reworked_data, full_path)
35
+ g = Gruff::SideStackedBar.new
36
+ historical_graph_theme(g)
37
+ g.labels = reworked_data[0]
38
+ g.data('Fail', reworked_data[1])
39
+ g.data('Pass', reworked_data[2])
40
+ g.write full_path
41
+ end
42
+
43
+ def historical_graph_theme(g)
44
+ g.theme_pastel
45
+ g.colors = ['#ffcccc', '#ccffcc']
46
+ g.marker_font_size = 12
47
+ g.x_axis_increment = 10
48
+ end
49
+
50
+ def historical_graph_full_path
51
+ graph_full_path(HISTORICAL_GRAPH_FILENAME)
52
+ end
53
+
54
+ def historical_graph_relative_path
55
+ File.join(graph_relative_path, HISTORICAL_GRAPH_FILENAME)
56
+ end
57
+
58
+ def rework_historical_data_for_gruff(data)
59
+ labels = {}
60
+ pass_data = []
61
+ fail_data = []
62
+ i = 0
63
+ data.each do |authname, authdata|
64
+ labels[i] = authname
65
+ i += 1
66
+ fail_data << authdata[:bad]
67
+ pass_data << authdata[:good]
68
+ end
69
+ [labels, fail_data, pass_data]
70
+ end
71
+ end
72
+ end
73
+ end
@@ -12,9 +12,19 @@ module QaServer
12
12
  # @param authority_name [String] name of the authority
13
13
  # @param action [Symbol] action performed by the request (e.g. :search, :fetch, :all_actions)
14
14
  # @param time_period [Symbol] time period for the graph (i.e. :day, :month, :year)
15
- def performance_graph_file(authority_name: ALL_AUTH, action:, time_period:)
15
+ # @return [String] Path to use with <image> tags
16
+ def performance_graph_image_path(authority_name: ALL_AUTH, action:, time_period:)
16
17
  File.join(graph_relative_path, graph_filename(authority_name, action, time_period))
17
18
  end
19
+ alias performance_graph_file performance_graph_image_path
20
+
21
+ # @param authority_name [String] name of the authority
22
+ # @param action [Symbol] action performed by the request (e.g. :search, :fetch, :all_actions)
23
+ # @param time_period [Symbol] time period for the graph (i.e. :day, :month, :year)
24
+ # @return [Boolean] true if image for graph exists; otherwise, false
25
+ def performance_graph_image_exists?(authority_name: ALL_AUTH, action:, time_period:)
26
+ File.exist?(performance_graph_full_path(authority_name, action, time_period))
27
+ end
18
28
 
19
29
  # Generate one 12 month graph for the authority and action given the graph data.
20
30
  # @param authority_name [String] name of the authority
@@ -24,8 +34,9 @@ module QaServer
24
34
  def generate_monthly_graph(authority_name: ALL_AUTH, action:, data:)
25
35
  gruff_data = rework_performance_data_for_gruff(data, BY_MONTH)
26
36
  create_gruff_graph(gruff_data,
27
- performance_for_year_graph_full_path(authority_name, action),
37
+ performance_graph_full_path(authority_name, action, FOR_YEAR),
28
38
  I18n.t('qa_server.monitor_status.performance.x_axis_month'))
39
+ log_failure(authority_name, action, BY_MONTH)
29
40
  end
30
41
 
31
42
  # Generate one 30 day graph for the authority and action given the graph data.
@@ -36,7 +47,7 @@ module QaServer
36
47
  def generate_daily_graph(authority_name: ALL_AUTH, action:, data:)
37
48
  gruff_data = rework_performance_data_for_gruff(data, BY_DAY)
38
49
  create_gruff_graph(gruff_data,
39
- performance_for_month_graph_full_path(authority_name, action),
50
+ performance_graph_full_path(authority_name, action, FOR_MONTH),
40
51
  I18n.t('qa_server.monitor_status.performance.x_axis_day'))
41
52
  end
42
53
 
@@ -48,22 +59,14 @@ module QaServer
48
59
  def generate_hourly_graph(authority_name: ALL_AUTH, action:, data:)
49
60
  gruff_data = rework_performance_data_for_gruff(data, BY_HOUR)
50
61
  create_gruff_graph(gruff_data,
51
- performance_for_day_graph_full_path(authority_name, action),
62
+ performance_graph_full_path(authority_name, action, FOR_DAY),
52
63
  I18n.t('qa_server.monitor_status.performance.x_axis_hour'))
53
64
  end
54
65
 
55
66
  private
56
67
 
57
- def performance_for_day_graph_full_path(authority_name, action)
58
- graph_full_path(graph_filename(authority_name, action, :day))
59
- end
60
-
61
- def performance_for_month_graph_full_path(authority_name, action)
62
- graph_full_path(graph_filename(authority_name, action, :month))
63
- end
64
-
65
- def performance_for_year_graph_full_path(authority_name, action)
66
- graph_full_path(graph_filename(authority_name, action, :year))
68
+ def performance_graph_full_path(authority_name, action, time_period)
69
+ graph_full_path(graph_filename(authority_name, action, time_period))
67
70
  end
68
71
 
69
72
  def graph_filename(authority_name, action, time_period)
@@ -117,6 +120,12 @@ module QaServer
117
120
  g.data(I18n.t('qa_server.monitor_status.performance.normalization_time_ms'), performance_data[3])
118
121
  g.write performance_graph_full_path
119
122
  end
123
+
124
+ def log_failure(authority_name, action, time_period)
125
+ relative_path = performance_graph_image_path(authority_name: authority_name, action: action, time_period: time_period)
126
+ exists = performance_graph_image_exists?(authority_name: authority_name, action: action, time_period: time_period)
127
+ QaServer.config.monitor_logger.warn("FAILED to write performance graph at #{relative_path}") unless exists
128
+ end
120
129
  end
121
130
  end
122
131
  end
@@ -2,7 +2,7 @@
2
2
  <div id="performance-data" class="status-section">
3
3
  <h3><%= t('qa_server.monitor_status.performance.title') %></h3>
4
4
 
5
- <% if @presenter.display_performance_graph? && !@presenter.performance_graphs.nil? %>
5
+ <% if @presenter.display_performance_graph? %>
6
6
  <script>
7
7
  function switch_performance_view(base_id, time_period, action) {
8
8
  document.getElementById(base_id+'<%= @presenter.performance_graph_data_section_id(action: :all_actions, time_period: :day) %>').className = 'performance-data-section-hidden';
@@ -81,7 +81,7 @@
81
81
  </div>
82
82
  <% end %>
83
83
 
84
- <% if @presenter.display_performance_datatable? && !@presenter.performance_data.nil? %>
84
+ <% if @presenter.display_performance_datatable? %>
85
85
  <div id="performance-datatable-section">
86
86
  <h4><%= t('qa_server.monitor_status.performance.datatable_desc') %></h4>
87
87
  <p class="status-update-dtstamp"><%= t('qa_server.monitor_status.performance.datarange', from: @presenter.performance_data_start, to: @presenter.performance_data_end) %></p>
@@ -6,7 +6,7 @@
6
6
  <%= image_tag(@presenter.historical_graph, alt: 'History Graph Unavailable') %>
7
7
  <% end %>
8
8
 
9
- <% if @presenter.display_historical_datatable? && !@presenter.historical_summary.nil? %>
9
+ <% if @presenter.display_historical_datatable? %>
10
10
  <table class="status">
11
11
  <tr>
12
12
  <th><%= t('qa_server.monitor_status.history.authority') %></th>
@@ -19,7 +19,7 @@
19
19
  </table>
20
20
  <p class="status-update-dtstamp"><%= t('qa_server.monitor_status.summary.last_updated', date: @presenter.last_updated) %></p>
21
21
 
22
- <% if @presenter.failures? & !@presenter.failures.nil? %>
22
+ <% if @presenter.failures?%>
23
23
  <div id="failures" class="status-section">
24
24
  <h4><%= t('qa_server.monitor_status.failures.title') %></h4>
25
25
 
@@ -10,7 +10,7 @@ module QaServer
10
10
  end
11
11
 
12
12
  # Set preferred hour to expire caches related to slow running calculations (e.g. monitoring tests, performance data)
13
- # @param [Integer] count of hours after midnight (0-23 with 0=midnight)
13
+ # @param offset [Integer] count of hours after midnight (0-23 with 0=midnight)
14
14
  # @raise [ArgumentError] if offset is not between 0 and 23
15
15
  # @example
16
16
  # For preferred_time_zone_name of 'Eastern Time (US & Canada)', use 3 for slow down at midnight PT/3am ET
@@ -27,7 +27,7 @@ module QaServer
27
27
  end
28
28
 
29
29
  # Set preferred hour to run monitoring tests (deprecated)
30
- # @param [Integer] count of hours from midnight (0-23 with 0=midnight)
30
+ # @param offset [Integer] count of hours from midnight (0-23 with 0=midnight)
31
31
  # @example
32
32
  # For preferred_time_zone_name of 'Eastern Time (US & Canada)', use 3 for slow down at midnight PT/3am ET
33
33
  # For preferred_time_zone_name of 'Pacific Time (US & Canada)', use 0 for slow down at midnight PT/3am ET
@@ -60,7 +60,7 @@ module QaServer
60
60
  end
61
61
 
62
62
  # Historical datatable default time period.
63
- # @param [Symbol] time period for calculating historical pass/fail (i.e., one of :month, :year, or :all)
63
+ # @param time_period [Symbol] time period for calculating historical pass/fail (i.e., one of :month, :year, or :all)
64
64
  # @raise [ArgumentError] if time_period is not one of :month, :year, or :all
65
65
  def historical_datatable_default_time_period=(time_period)
66
66
  raise ArgumentError, 'time_period must be one of :day, :month, or :year' unless [:month, :year, :all].include? time_period
@@ -112,7 +112,7 @@ module QaServer
112
112
  end
113
113
 
114
114
  # Performance graph default time period for all graphs. All authorities will show the graph for this time period on page load.
115
- # @param [Symbol] time period for default display of performance graphs (i.e., one of :day, :month, or :year)
115
+ # @param time_period [Symbol] time period for default display of performance graphs (i.e., one of :day, :month, or :year)
116
116
  # @raise [ArgumentError] if time_period is not one of :day, :month, or :year
117
117
  def performance_graph_default_time_period=(time_period)
118
118
  raise ArgumentError, 'time_period must be one of :day, :month, or :year' unless [:day, :month, :year].include? time_period
@@ -134,7 +134,7 @@ module QaServer
134
134
  end
135
135
 
136
136
  # Performance datatable default time period for calculating stats.
137
- # @param [Symbol] time period for calculating performance stats (i.e., one of :day, :month, :year, or :all)
137
+ # @param time_period [Symbol] time period for calculating performance stats (i.e., one of :day, :month, :year, or :all)
138
138
  # @raise [ArgumentError] if time_period is not one of :day, :month, :year, or :all
139
139
  def performance_datatable_default_time_period=(time_period)
140
140
  raise ArgumentError, 'time_period must be one of :day, :month, :year, or :all' unless [:day, :month, :year, :all].include? time_period
@@ -205,7 +205,7 @@ module QaServer
205
205
  # @param [Integer] maximum size of performance cache before flushing
206
206
  attr_writer :max_performance_cache_size
207
207
  def max_performance_cache_size
208
- @max_performance_cache_size ||= 32.megabytes
208
+ @max_performance_cache_size ||= convert_size_to_bytes(ENV['MAX_PERFORMANCE_CACHE_SIZE']) || 32.megabytes
209
209
  end
210
210
 
211
211
  # For internal use only
@@ -242,5 +242,22 @@ module QaServer
242
242
  def monitor_logger
243
243
  @monitor_logger ||= Logger.new(ENV['MONITOR_LOG_PATH'] || File.join("log", "monitor.log"))
244
244
  end
245
+
246
+ private
247
+
248
+ def convert_size_to_bytes(size)
249
+ md = size.match(/^(?<num>\d+)\s?(?<unit>\w+)?$/)
250
+ md[:num].to_i *
251
+ case md[:unit].upcase
252
+ when 'KB'
253
+ 1024
254
+ when 'MB'
255
+ 1024**2
256
+ when 'GB'
257
+ 1024**3
258
+ else
259
+ 1
260
+ end
261
+ end
245
262
  end
246
263
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module QaServer
3
- VERSION = '7.0.0'
3
+ VERSION = '7.1.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: 7.0.0
4
+ version: 7.1.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-19 00:00:00.000000000 Z
11
+ date: 2020-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -346,6 +346,7 @@ files:
346
346
  - app/cache_processors/qa_server/performance_hourly_graph_cache.rb
347
347
  - app/cache_processors/qa_server/performance_monthly_graph_cache.rb
348
348
  - app/cache_processors/qa_server/scenario_history_cache.rb
349
+ - app/cache_processors/qa_server/scenario_history_graph_cache.rb
349
350
  - app/cache_processors/qa_server/scenario_run_cache.rb
350
351
  - app/cache_processors/qa_server/scenario_run_failures_cache.rb
351
352
  - app/cache_processors/qa_server/scenario_run_summary_cache.rb
@@ -387,6 +388,7 @@ files:
387
388
  - app/services/qa_server/authority_loader_service.rb
388
389
  - app/services/qa_server/authority_validator_service.rb
389
390
  - app/services/qa_server/database_migrator.rb
391
+ - app/services/qa_server/history_graphing_service.rb
390
392
  - app/services/qa_server/performance_calculator_service.rb
391
393
  - app/services/qa_server/performance_datatable_service.rb
392
394
  - app/services/qa_server/performance_graph_data_service.rb