qa_server 7.4.0 → 7.7.1
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 +5 -5
- data/.rubocop_fixme.yml +7 -0
- data/.travis.yml +4 -5
- data/CHANGELOG.md +45 -0
- data/Rakefile +1 -1
- data/app/assets/stylesheets/qa_server/_check-status.scss +36 -0
- data/app/cache_processors/qa_server/cache_expiry_service.rb +8 -8
- data/app/cache_processors/qa_server/job_id_cache.rb +4 -4
- data/app/cache_processors/qa_server/performance_cache.rb +34 -34
- data/app/cache_processors/qa_server/performance_day_graph_cache.rb +7 -7
- data/app/cache_processors/qa_server/performance_month_graph_cache.rb +7 -7
- data/app/cache_processors/qa_server/performance_year_graph_cache.rb +7 -7
- data/app/cache_processors/qa_server/scenario_history_cache.rb +7 -7
- data/app/cache_processors/qa_server/scenario_history_graph_cache.rb +7 -7
- data/app/cache_processors/qa_server/scenario_run_cache.rb +7 -7
- data/app/cache_processors/qa_server/scenario_run_failures_cache.rb +7 -7
- data/app/cache_processors/qa_server/scenario_run_summary_cache.rb +7 -7
- data/app/controllers/concerns/qa_server/authority_validation_behavior.rb +49 -44
- data/app/controllers/qa_server/check_status_controller.rb +92 -22
- data/app/controllers/qa_server/fetch_controller.rb +36 -36
- data/app/controllers/qa_server/monitor_status_controller.rb +106 -84
- data/app/jobs/qa_server/history_graph_job.rb +10 -10
- data/app/jobs/qa_server/monitor_tests_job.rb +17 -17
- data/app/jobs/qa_server/performance_day_graph_job.rb +21 -21
- data/app/jobs/qa_server/performance_month_graph_job.rb +21 -21
- data/app/jobs/qa_server/performance_per_byte_job.rb +56 -56
- data/app/jobs/qa_server/performance_year_graph_job.rb +21 -21
- data/app/loggers/qa_server/scenario_logger.rb +74 -4
- data/app/models/qa_server/authority_scenario.rb +4 -4
- data/app/models/qa_server/authority_status.rb +2 -2
- data/app/models/qa_server/authority_status_failure.rb +1 -1
- data/app/models/qa_server/performance_history.rb +2 -2
- data/app/models/qa_server/scenario_run_history.rb +63 -54
- data/app/models/qa_server/scenario_run_registry.rb +2 -2
- data/app/models/qa_server/scenarios.rb +26 -26
- data/app/models/qa_server/search_scenario.rb +24 -13
- data/app/models/qa_server/term_scenario.rb +29 -29
- data/app/prepends/prepended_linked_data/find_term.rb +40 -40
- data/app/prepends/prepended_linked_data/search_query.rb +36 -36
- data/app/prepends/prepended_rdf/rdf_graph.rb +7 -7
- data/app/presenters/concerns/qa_server/monitor_status/performance_datatable_behavior.rb +32 -32
- data/app/presenters/concerns/qa_server/monitor_status/performance_graph_behavior.rb +64 -64
- data/app/presenters/qa_server/check_status_presenter.rb +63 -7
- data/app/presenters/qa_server/monitor_status/current_status_presenter.rb +9 -8
- data/app/presenters/qa_server/monitor_status/history_presenter.rb +55 -4
- data/app/services/concerns/qa_server/gruff_graph.rb +16 -16
- data/app/services/qa_server/authority_loader_service.rb +14 -14
- data/app/services/qa_server/authority_validator_service.rb +1 -0
- data/app/services/qa_server/database_migrator.rb +14 -14
- data/app/services/qa_server/history_graphing_service.rb +30 -30
- data/app/services/qa_server/performance_calculator_service.rb +80 -80
- data/app/services/qa_server/performance_datatable_service.rb +35 -35
- data/app/services/qa_server/performance_graph_data_service.rb +27 -27
- data/app/services/qa_server/performance_graphing_service.rb +55 -55
- data/app/services/qa_server/performance_per_byte_calculator_service.rb +38 -38
- data/app/services/qa_server/performance_per_byte_data_service.rb +7 -7
- data/app/services/qa_server/scenarios_loader_service.rb +1 -1
- data/app/services/qa_server/time_period_service.rb +21 -21
- data/app/validators/qa_server/scenario_validator.rb +99 -87
- data/app/validators/qa_server/search_scenario_validator.rb +67 -61
- data/app/validators/qa_server/term_scenario_validator.rb +20 -15
- data/app/views/qa_server/check_status/index.html.erb +120 -24
- data/app/views/qa_server/monitor_status/_test_summary.html.erb +1 -1
- data/config/i18n-tasks.yml +133 -0
- data/config/locales/qa_server.en.yml +21 -5
- data/lib/generators/qa_server/assets_generator.rb +4 -4
- data/lib/generators/qa_server/templates/config/authorities/linked_data/cerl_ld4l_cache.json +2 -2
- data/lib/generators/qa_server/templates/config/authorities/linked_data/getty_aat_ld4l_cache.json +62 -1
- data/lib/generators/qa_server/templates/config/authorities/linked_data/getty_tgn_ld4l_cache.json +45 -11
- data/lib/generators/qa_server/templates/config/authorities/linked_data/getty_ulan_ld4l_cache.json +104 -8
- data/lib/generators/qa_server/templates/config/authorities/linked_data/isni_ld4l_cache.json +90 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/ligatus_ld4l_cache.json +133 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo2_ld4l_cache.json +248 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo3_ld4l_cache.json +248 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo_ld4l_cache.json +4 -4
- data/lib/generators/qa_server/templates/config/authorities/linked_data/locvocabs_ld4l_cache.json +117 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/mesh_nlm_ld4l_cache.json +135 -3
- data/lib/generators/qa_server/templates/config/authorities/linked_data/oclcfast_direct.json +5 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/oclcfast_ld4l_cache.json +2 -4
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/agrovoc_direct_validation.yml +31 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/agrovoc_ld4l_cache_validation.yml +31 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/cerl_ld4l_cache_validation.yml +24 -12
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/dbpedia_ld4l_cache_validation.yml +33 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/geonames_direct_validation.yml +35 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/geonames_ld4l_cache_validation.yml +55 -5
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_aat_ld4l_cache_validation.yml +253 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_tgn_ld4l_cache_validation.yml +31 -1
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_ulan_ld4l_cache_validation.yml +38 -1
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/isni_ld4l_cache_validation.yml +10 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/ligatus_ld4l_cache_validation.yml +36 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locdemographics_ld4l_cache_validation.yml +69 -44
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locgenres_ld4l_cache_validation.yml +22 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_ld4l_cache_validation.yml +65 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo2_ld4l_cache_validation.yml +78 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo3_ld4l_cache_validation.yml +73 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo_ld4l_cache_validation.yml +71 -3
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locperformance_ld4l_cache_validation.yml +6 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locsubjects_ld4l_cache_validation.yml +30 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locvocabs_ld4l_cache_validation.yml +430 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/mesh_nlm_ld4l_cache_validation.yml +54 -1
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/nalt_ld4l_cache_validation.yml +37 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/oclc_fast_validation.yml +71 -5
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/oclcfast_direct_validation.yml +73 -2
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/oclcfast_ld4l_cache_validation.yml +73 -0
- data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/rda_registry_ld4l_cache_validation.yml +307 -0
- data/lib/qa_server/configuration.rb +28 -24
- data/lib/qa_server/version.rb +1 -1
- data/qa_server.gemspec +6 -5
- data/spec/feature/accuracy_spec.rb +32 -0
- data/spec/i18n_spec.rb +35 -0
- data/spec/presenters/qa_server/monitor_status/history_presenter_spec.rb +81 -0
- data/spec/spec_helper.rb +4 -0
- metadata +65 -17
|
@@ -13,12 +13,13 @@ module QaServer::MonitorStatus
|
|
|
13
13
|
|
|
14
14
|
# @return [ActiveSupport::TimeWithZone] date time stamp of last test run
|
|
15
15
|
def last_updated_dt
|
|
16
|
-
@current_summary.run_dt_stamp
|
|
16
|
+
@current_summary ? @current_summary.run_dt_stamp : QaServer::TimeService.current_time
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
# @return [String] date with time of last test run
|
|
20
20
|
def last_updated
|
|
21
|
-
|
|
21
|
+
return I18n.t('qa_server.monitor_status.summary.no_data') if @current_summary.blank?
|
|
22
|
+
I18n.t('qa_server.monitor_status.summary.last_updated', date: QaServer::TimeService.pretty_time(last_updated_dt))
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
# @return [ActiveSupport::TimeWithZone] date time stamp of first recorded test run
|
|
@@ -33,12 +34,12 @@ module QaServer::MonitorStatus
|
|
|
33
34
|
|
|
34
35
|
# @return [Integer] number of loaded authorities
|
|
35
36
|
def authorities_count
|
|
36
|
-
@current_summary.authority_count
|
|
37
|
+
@current_summary ? @current_summary.authority_count : "N/A"
|
|
37
38
|
end
|
|
38
39
|
|
|
39
40
|
# @return [Integer] number of authorities with failing tests in the latest test run
|
|
40
41
|
def failing_authorities_count
|
|
41
|
-
@current_failure_data.map { |f| f[:authority_name] }.uniq.count
|
|
42
|
+
@current_failure_data ? @current_failure_data.map { |f| f[:authority_name] }.uniq.count : "N/A"
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
# @return [String] css style class representing whether all tests passed or any failed
|
|
@@ -48,17 +49,17 @@ module QaServer::MonitorStatus
|
|
|
48
49
|
|
|
49
50
|
# @return [Integer] number of tests in the latest test run
|
|
50
51
|
def tests_count
|
|
51
|
-
@current_summary.total_scenario_count
|
|
52
|
+
@current_summary ? @current_summary.total_scenario_count : 0
|
|
52
53
|
end
|
|
53
54
|
|
|
54
55
|
# @return [Integer] number of passing tests in the latest test run
|
|
55
56
|
def passing_tests_count
|
|
56
|
-
@current_summary.passing_scenario_count
|
|
57
|
+
@current_summary ? @current_summary.passing_scenario_count : 0
|
|
57
58
|
end
|
|
58
59
|
|
|
59
60
|
# @return [Integer] number of failing tests in the latest test run
|
|
60
61
|
def failing_tests_count
|
|
61
|
-
@current_summary.failing_scenario_count
|
|
62
|
+
@current_summary ? @current_summary.failing_scenario_count : 0
|
|
62
63
|
end
|
|
63
64
|
|
|
64
65
|
# @return [String] css style class representing whether all tests passed or any failed
|
|
@@ -77,7 +78,7 @@ module QaServer::MonitorStatus
|
|
|
77
78
|
# url: '/qa/search/linked_data/locnames_ld4l_cache/person?q=mark twain&maxRecords=4',
|
|
78
79
|
# err_message: 'Exception: Something went wrong.' }, ... ]
|
|
79
80
|
def failures
|
|
80
|
-
@current_failure_data
|
|
81
|
+
@current_failure_data ? @current_failure_data : []
|
|
81
82
|
end
|
|
82
83
|
|
|
83
84
|
# @return [Boolean] true if failure data exists for the latest test run; otherwise false
|
|
@@ -2,8 +2,16 @@
|
|
|
2
2
|
# This presenter class provides historical testing data needed by the view that monitors status of authorities.
|
|
3
3
|
module QaServer::MonitorStatus
|
|
4
4
|
class HistoryPresenter
|
|
5
|
+
CAUTION_THRESHOLD = 0.05
|
|
6
|
+
WARNING_THRESHOLD = 0.1
|
|
7
|
+
|
|
5
8
|
# @param parent [QaServer::MonitorStatusPresenter] parent presenter
|
|
6
9
|
# @param historical_summary_data [Array<Hash>] summary of past failuring runs per authority to drive chart
|
|
10
|
+
# @example historical_summary_data
|
|
11
|
+
# {
|
|
12
|
+
# "AGROVOC_DIRECT"=>{:good=>4, :bad=>0},
|
|
13
|
+
# "AGROVOC_LD4L_CACHE"=>{:good=>4, :bad=>0}
|
|
14
|
+
# }
|
|
7
15
|
def initialize(parent:, historical_summary_data:)
|
|
8
16
|
@parent = parent
|
|
9
17
|
@historical_summary_data = historical_summary_data
|
|
@@ -11,8 +19,10 @@ module QaServer::MonitorStatus
|
|
|
11
19
|
|
|
12
20
|
# @return [Array<Hash>] historical test data to be displayed (authname, failing, passing)
|
|
13
21
|
# @example
|
|
14
|
-
#
|
|
15
|
-
#
|
|
22
|
+
# {
|
|
23
|
+
# "AGROVOC_DIRECT"=>{:good=>4, :bad=>0},
|
|
24
|
+
# "AGROVOC_LD4L_CACHE"=>{:good=>4, :bad=>0}
|
|
25
|
+
# }
|
|
16
26
|
def historical_summary
|
|
17
27
|
@historical_summary_data
|
|
18
28
|
end
|
|
@@ -69,47 +79,88 @@ module QaServer::MonitorStatus
|
|
|
69
79
|
end
|
|
70
80
|
end
|
|
71
81
|
|
|
82
|
+
# @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
|
|
83
|
+
# @return [String] name of the authority (e.g. 'AUTH_NAME')
|
|
84
|
+
# @example historical_entry
|
|
85
|
+
# [ 'AUTH_NAME', { good: 949, bad: 51 } ]
|
|
72
86
|
def historical_data_authority_name(historical_entry)
|
|
73
87
|
historical_entry[0]
|
|
74
88
|
end
|
|
75
89
|
|
|
90
|
+
# @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
|
|
91
|
+
# @return [Integer] number of days with passing tests (e.g. 949)
|
|
92
|
+
# @example historical_entry
|
|
93
|
+
# [ 'AUTH_NAME', { good: 949, bad: 51 } ]
|
|
76
94
|
def days_authority_passing(historical_entry)
|
|
77
95
|
historical_entry[1][:good]
|
|
78
96
|
end
|
|
79
97
|
|
|
98
|
+
# @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
|
|
99
|
+
# @return [Integer] number of days with failing tests (e.g. 51)
|
|
100
|
+
# @example historical_entry
|
|
101
|
+
# [ 'AUTH_NAME', { good: 949, bad: 51 } ]
|
|
80
102
|
def days_authority_failing(historical_entry)
|
|
81
103
|
historical_entry[1][:bad]
|
|
82
104
|
end
|
|
83
105
|
|
|
106
|
+
# @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
|
|
107
|
+
# @return [Integer] number of days tested (e.g. 1000)
|
|
108
|
+
# @example historical_entry
|
|
109
|
+
# [ 'AUTH_NAME', { good: 949, bad: 51 } ]
|
|
84
110
|
def days_authority_tested(historical_entry)
|
|
85
111
|
days_authority_passing(historical_entry) + days_authority_failing(historical_entry)
|
|
86
112
|
end
|
|
87
113
|
|
|
114
|
+
# @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
|
|
115
|
+
# @return [Float] percent of failing to passing tests (e.g. 0.05374 )
|
|
116
|
+
# @example historical_entry
|
|
117
|
+
# [ 'AUTH_NAME', { good: 949, bad: 51 } ]
|
|
88
118
|
def percent_authority_failing(historical_entry)
|
|
89
119
|
days_authority_failing(historical_entry).to_f / days_authority_tested(historical_entry)
|
|
90
120
|
end
|
|
91
121
|
|
|
122
|
+
# @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
|
|
123
|
+
# @return [String] percent of failing to passing tests (e.g. '5.4%')
|
|
124
|
+
# @example historical_entry
|
|
125
|
+
# [ 'AUTH_NAME', { good: 949, bad: 51 } ]
|
|
92
126
|
def percent_authority_failing_str(historical_entry)
|
|
93
127
|
ActiveSupport::NumberHelper.number_to_percentage(percent_authority_failing(historical_entry) * 100, precision: 1)
|
|
94
128
|
end
|
|
95
129
|
|
|
130
|
+
# @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
|
|
131
|
+
# @return [String] css class for background in Days Failing and Percent Failing columns (e.g. 'status-neutral', 'status-unknown', 'status-bad')
|
|
132
|
+
# @example historical_entry
|
|
133
|
+
# [ 'AUTH_NAME', { good: 949, bad: 51 } ]
|
|
96
134
|
def failure_style_class(historical_entry)
|
|
97
|
-
|
|
98
|
-
|
|
135
|
+
case percent_authority_failing(historical_entry)
|
|
136
|
+
when 0.0...CAUTION_THRESHOLD
|
|
137
|
+
"status-neutral"
|
|
138
|
+
when CAUTION_THRESHOLD...WARNING_THRESHOLD
|
|
139
|
+
"status-unknown"
|
|
140
|
+
else
|
|
141
|
+
"status-bad"
|
|
142
|
+
end
|
|
99
143
|
end
|
|
100
144
|
|
|
145
|
+
# @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
|
|
146
|
+
# @return [String] css class for background in Days Passing column (e.g. 'status-good', 'status-bad')
|
|
147
|
+
# @example historical_entry
|
|
148
|
+
# [ 'AUTH_NAME', { good: 949, bad: 51 } ]
|
|
101
149
|
def passing_style_class(historical_entry)
|
|
102
150
|
days_authority_passing(historical_entry) <= 0 ? "status-bad" : "status-good"
|
|
103
151
|
end
|
|
104
152
|
|
|
153
|
+
# @return [Boolean] true if historical section should be visible; otherwise false
|
|
105
154
|
def display_history_details?
|
|
106
155
|
display_historical_graph? || display_historical_datatable?
|
|
107
156
|
end
|
|
108
157
|
|
|
158
|
+
# @return [Boolean] true if historical graph should be visible; otherwise false
|
|
109
159
|
def display_historical_graph?
|
|
110
160
|
QaServer.config.display_historical_graph? && QaServer::HistoryGraphingService.history_graph_image_exists?
|
|
111
161
|
end
|
|
112
162
|
|
|
163
|
+
# @return [Boolean] true if historical datatable should be visible; otherwise false
|
|
113
164
|
def display_historical_datatable?
|
|
114
165
|
QaServer.config.display_historical_datatable?
|
|
115
166
|
end
|
|
@@ -5,24 +5,24 @@ require 'gruff'
|
|
|
5
5
|
# This module include provides graph methods for generating graphs with Gruff
|
|
6
6
|
module QaServer
|
|
7
7
|
module GruffGraph
|
|
8
|
-
|
|
8
|
+
private
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
# common path for displaying and writing
|
|
11
|
+
def graph_relative_path
|
|
12
|
+
File.join('qa_server', 'charts')
|
|
13
|
+
end
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
# used for displaying in a view with <image> tag
|
|
16
|
+
def graph_image_path
|
|
17
|
+
File.join('/', graph_relative_path)
|
|
18
|
+
end
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
# used for writing out the file
|
|
21
|
+
def graph_full_path(graph_filename)
|
|
22
|
+
path = Rails.root.join('public', graph_relative_path)
|
|
23
|
+
# path = Rails.root.join('app', 'assets', 'images', graph_relative_path)
|
|
24
|
+
FileUtils.mkdir_p path
|
|
25
|
+
File.join(path, graph_filename)
|
|
26
|
+
end
|
|
27
27
|
end
|
|
28
28
|
end
|
|
@@ -22,24 +22,24 @@ module QaServer
|
|
|
22
22
|
authority
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
private
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
def authority_key(authority_name)
|
|
28
|
+
authority_name.upcase.to_sym
|
|
29
|
+
end
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
end
|
|
39
|
-
return nil
|
|
31
|
+
def load_authority(authority_name, status_log)
|
|
32
|
+
authority = Qa::Authorities::LinkedData::GenericAuthority.new(authority_key(authority_name))
|
|
33
|
+
if authority.blank?
|
|
34
|
+
if status_log.present?
|
|
35
|
+
status_log.add(authority_name: authority_name,
|
|
36
|
+
status: QaServer::ScenarioValidator::FAIL,
|
|
37
|
+
error_message: "Unable to load authority '#{authority_name}'; cause: UNKNOWN")
|
|
40
38
|
end
|
|
41
|
-
|
|
39
|
+
return nil
|
|
42
40
|
end
|
|
41
|
+
authority
|
|
42
|
+
end
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
|
@@ -14,6 +14,7 @@ module QaServer
|
|
|
14
14
|
|
|
15
15
|
VALIDATE_CONNECTIONS = validator_class::VALIDATE_CONNECTION
|
|
16
16
|
VALIDATE_ACCURACY = validator_class::VALIDATE_ACCURACY
|
|
17
|
+
VALIDATE_ACCURACY_COMPARISON = validator_class::VALIDATE_ACCURACY_COMPARISON
|
|
17
18
|
ALL_VALIDATIONS = validator_class::ALL_VALIDATIONS
|
|
18
19
|
DEFAULT_VALIDATION_TYPE = validator_class::DEFAULT_VALIDATION_TYPE
|
|
19
20
|
|
|
@@ -50,22 +50,22 @@ module QaServer
|
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
private
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
def migrations
|
|
56
|
+
Dir.chdir(self.class.migrations_dir) { Dir.glob('db/migrate/[0-9]*_*.rb.erb') }.sort
|
|
57
|
+
end
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
def parse_basename_from(filename)
|
|
60
|
+
# Add engine name to filename to mimic ``ActiveRecord::Migration.copy` behavior
|
|
61
|
+
filename.slice(/(?<dateprefix>\d)+_(?<basename>.+)\.erb/, 'basename').sub('.', '.qa_server.')
|
|
62
|
+
end
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
def migration_version
|
|
65
|
+
# Don't use AR migration versioning in Rails 4
|
|
66
|
+
return if Rails.version < '5.0.0'
|
|
67
|
+
# Specify the current major.minor version of Rails for AR migrations
|
|
68
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
|
69
|
+
end
|
|
70
70
|
end
|
|
71
71
|
end
|
|
@@ -29,41 +29,41 @@ module QaServer
|
|
|
29
29
|
QaServer.config.monitor_logger.warn("FAILED to write historical graph at #{history_graph_image_path}") unless history_graph_image_exists?
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
private
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
def historical_graph_full_path
|
|
51
|
+
graph_full_path(HISTORICAL_GRAPH_FILENAME)
|
|
52
|
+
end
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
end
|
|
65
|
-
[labels, fail_data, pass_data]
|
|
54
|
+
def rework_historical_data_for_gruff(data)
|
|
55
|
+
labels = {}
|
|
56
|
+
pass_data = []
|
|
57
|
+
fail_data = []
|
|
58
|
+
i = 0
|
|
59
|
+
data.each do |authname, authdata|
|
|
60
|
+
labels[i] = authname
|
|
61
|
+
i += 1
|
|
62
|
+
fail_data << authdata[:bad]
|
|
63
|
+
pass_data << authdata[:good]
|
|
66
64
|
end
|
|
65
|
+
[labels, fail_data, pass_data]
|
|
66
|
+
end
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
end
|
|
@@ -40,85 +40,85 @@ module QaServer
|
|
|
40
40
|
stats
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def calculate_load_stats(avg, low, high)
|
|
46
|
+
stats[AVG_LOAD] = calculate_average(full_load_times) if avg
|
|
47
|
+
stats[LOW_LOAD] = calculate_10th_percentile(full_load_times) if low
|
|
48
|
+
stats[HIGH_LOAD] = calculate_90th_percentile(full_load_times) if high
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def calculate_retrieve_stats(avg, low, high)
|
|
52
|
+
stats[AVG_RETR] = calculate_average(retrieve_times) if avg
|
|
53
|
+
stats[LOW_RETR] = calculate_10th_percentile(retrieve_times) if low
|
|
54
|
+
stats[HIGH_RETR] = calculate_90th_percentile(retrieve_times) if high
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def calculate_graph_load_stats(avg, low, high)
|
|
58
|
+
stats[AVG_GRPH] = calculate_average(graph_load_times) if avg
|
|
59
|
+
stats[LOW_GRPH] = calculate_10th_percentile(graph_load_times) if low
|
|
60
|
+
stats[HIGH_GRPH] = calculate_90th_percentile(graph_load_times) if high
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def calculate_normalization_stats(avg, low, high)
|
|
64
|
+
stats[AVG_NORM] = calculate_average(norm_times) if avg
|
|
65
|
+
stats[LOW_NORM] = calculate_10th_percentile(norm_times) if low
|
|
66
|
+
stats[HIGH_NORM] = calculate_90th_percentile(norm_times) if high
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def calculate_action_stats(avg, low, high)
|
|
70
|
+
stats[AVG_ACTN] = calculate_average(action_times) if avg
|
|
71
|
+
stats[LOW_ACTN] = calculate_10th_percentile(action_times) if low
|
|
72
|
+
stats[HIGH_ACTN] = calculate_90th_percentile(action_times) if high
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def tenth_percentile_count(times)
|
|
76
|
+
percentile_count = (times.count * 0.1).round
|
|
77
|
+
percentile_count = 1 if percentile_count.zero? && times.count > 1
|
|
78
|
+
percentile_count
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def times(column)
|
|
82
|
+
where_clause = action.nil? ? "" : { "action" => action }
|
|
83
|
+
records.where(where_clause).where.not(column => nil).order(column).pluck(column)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def full_load_times
|
|
87
|
+
@full_load_times ||= times(:retrieve_plus_graph_load_time_ms)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def retrieve_times
|
|
91
|
+
@retrieve_times ||= times(:retrieve_time_ms)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def graph_load_times
|
|
95
|
+
@graph_load_times ||= times(:graph_load_time_ms)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def norm_times
|
|
99
|
+
@norm_times ||= times(:normalization_time_ms)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def action_times
|
|
103
|
+
@action_times ||= times(:action_time_ms)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def calculate_average(times)
|
|
107
|
+
return 0 if times.count.zero?
|
|
108
|
+
return times[0] if times.count == 1
|
|
109
|
+
times.inject(0.0) { |sum, el| sum + el } / times.count
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def calculate_10th_percentile(times)
|
|
113
|
+
return 0 if times.count.zero?
|
|
114
|
+
return times[0] if times.count == 1
|
|
115
|
+
times[tenth_percentile_count(times) - 1]
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def calculate_90th_percentile(times)
|
|
119
|
+
return 0 if times.count.zero?
|
|
120
|
+
return times[0] if times.count == 1
|
|
121
|
+
times[times.count - tenth_percentile_count(times)]
|
|
122
|
+
end
|
|
123
123
|
end
|
|
124
124
|
end
|