qa_server 7.2.1 → 7.6.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.
Files changed (116) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop_fixme.yml +3 -0
  3. data/.travis.yml +4 -5
  4. data/CHANGELOG.md +41 -0
  5. data/Rakefile +1 -1
  6. data/app/assets/stylesheets/qa_server/_check-status.scss +36 -0
  7. data/app/cache_processors/concerns/qa_server/cache_keys.rb +0 -5
  8. data/app/cache_processors/qa_server/cache_expiry_service.rb +13 -8
  9. data/app/cache_processors/qa_server/job_id_cache.rb +29 -0
  10. data/app/cache_processors/qa_server/performance_cache.rb +34 -34
  11. data/app/cache_processors/qa_server/performance_day_graph_cache.rb +27 -0
  12. data/app/cache_processors/qa_server/performance_month_graph_cache.rb +27 -0
  13. data/app/cache_processors/qa_server/performance_year_graph_cache.rb +27 -0
  14. data/app/cache_processors/qa_server/scenario_history_cache.rb +7 -7
  15. data/app/cache_processors/qa_server/scenario_history_graph_cache.rb +12 -17
  16. data/app/cache_processors/qa_server/scenario_run_cache.rb +8 -8
  17. data/app/cache_processors/qa_server/scenario_run_failures_cache.rb +7 -7
  18. data/app/cache_processors/qa_server/scenario_run_summary_cache.rb +7 -7
  19. data/app/controllers/concerns/qa_server/authority_validation_behavior.rb +49 -44
  20. data/app/controllers/qa_server/check_status_controller.rb +92 -22
  21. data/app/controllers/qa_server/fetch_controller.rb +36 -36
  22. data/app/controllers/qa_server/monitor_status_controller.rb +108 -108
  23. data/app/jobs/qa_server/history_graph_job.rb +28 -0
  24. data/app/jobs/qa_server/monitor_tests_job.rb +19 -39
  25. data/app/jobs/qa_server/performance_day_graph_job.rb +45 -0
  26. data/app/jobs/qa_server/performance_month_graph_job.rb +45 -0
  27. data/app/jobs/qa_server/performance_per_byte_job.rb +85 -0
  28. data/app/jobs/qa_server/performance_year_graph_job.rb +45 -0
  29. data/app/loggers/qa_server/scenario_logger.rb +74 -4
  30. data/app/models/concerns/qa_server/performance_history_data_keys.rb +8 -0
  31. data/app/models/qa_server/authority_scenario.rb +4 -4
  32. data/app/models/qa_server/authority_status.rb +2 -2
  33. data/app/models/qa_server/authority_status_failure.rb +1 -1
  34. data/app/models/qa_server/performance_history.rb +2 -2
  35. data/app/models/qa_server/scenario_run_history.rb +52 -52
  36. data/app/models/qa_server/scenario_run_registry.rb +2 -2
  37. data/app/models/qa_server/scenarios.rb +26 -26
  38. data/app/models/qa_server/search_scenario.rb +24 -13
  39. data/app/models/qa_server/term_scenario.rb +29 -29
  40. data/app/prepends/prepended_linked_data/find_term.rb +40 -40
  41. data/app/prepends/prepended_linked_data/search_query.rb +36 -36
  42. data/app/prepends/prepended_rdf/rdf_graph.rb +7 -7
  43. data/app/presenters/concerns/qa_server/monitor_status/performance_datatable_behavior.rb +32 -32
  44. data/app/presenters/concerns/qa_server/monitor_status/performance_graph_behavior.rb +64 -64
  45. data/app/presenters/qa_server/check_status_presenter.rb +63 -7
  46. data/app/presenters/qa_server/monitor_status/current_status_presenter.rb +9 -8
  47. data/app/services/concerns/qa_server/gruff_graph.rb +16 -16
  48. data/app/services/qa_server/authority_loader_service.rb +14 -14
  49. data/app/services/qa_server/authority_validator_service.rb +1 -0
  50. data/app/services/qa_server/database_migrator.rb +14 -14
  51. data/app/services/qa_server/history_graphing_service.rb +30 -30
  52. data/app/services/qa_server/performance_calculator_service.rb +80 -80
  53. data/app/services/qa_server/performance_datatable_service.rb +35 -35
  54. data/app/services/qa_server/performance_graph_data_service.rb +28 -28
  55. data/app/services/qa_server/performance_graphing_service.rb +58 -58
  56. data/app/services/qa_server/performance_per_byte_calculator_service.rb +88 -0
  57. data/app/services/qa_server/performance_per_byte_data_service.rb +41 -0
  58. data/app/services/qa_server/scenarios_loader_service.rb +1 -1
  59. data/app/services/qa_server/time_period_service.rb +21 -21
  60. data/app/validators/qa_server/scenario_validator.rb +99 -87
  61. data/app/validators/qa_server/search_scenario_validator.rb +67 -61
  62. data/app/validators/qa_server/term_scenario_validator.rb +20 -15
  63. data/app/views/qa_server/check_status/index.html.erb +120 -24
  64. data/app/views/qa_server/monitor_status/_test_summary.html.erb +1 -1
  65. data/config/i18n-tasks.yml +133 -0
  66. data/config/locales/qa_server.en.yml +16 -0
  67. data/lib/generators/qa_server/assets_generator.rb +4 -4
  68. data/lib/generators/qa_server/templates/config/authorities/linked_data/cerl_ld4l_cache.json +2 -2
  69. data/lib/generators/qa_server/templates/config/authorities/linked_data/getty_aat_ld4l_cache.json +62 -1
  70. data/lib/generators/qa_server/templates/config/authorities/linked_data/getty_tgn_ld4l_cache.json +45 -11
  71. data/lib/generators/qa_server/templates/config/authorities/linked_data/getty_ulan_ld4l_cache.json +104 -8
  72. data/lib/generators/qa_server/templates/config/authorities/linked_data/isni_ld4l_cache.json +90 -0
  73. data/lib/generators/qa_server/templates/config/authorities/linked_data/ligatus_ld4l_cache.json +133 -0
  74. data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo2_ld4l_cache.json +248 -0
  75. data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo3_ld4l_cache.json +248 -0
  76. data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo_ld4l_cache.json +4 -4
  77. data/lib/generators/qa_server/templates/config/authorities/linked_data/locvocabs_ld4l_cache.json +117 -0
  78. data/lib/generators/qa_server/templates/config/authorities/linked_data/mesh_nlm_ld4l_cache.json +135 -3
  79. data/lib/generators/qa_server/templates/config/authorities/linked_data/oclcfast_direct.json +5 -0
  80. data/lib/generators/qa_server/templates/config/authorities/linked_data/oclcfast_ld4l_cache.json +2 -4
  81. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/agrovoc_direct_validation.yml +31 -0
  82. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/agrovoc_ld4l_cache_validation.yml +31 -0
  83. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/cerl_ld4l_cache_validation.yml +26 -14
  84. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/dbpedia_ld4l_cache_validation.yml +33 -0
  85. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/geonames_direct_validation.yml +35 -0
  86. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/geonames_ld4l_cache_validation.yml +55 -5
  87. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_aat_ld4l_cache_validation.yml +253 -0
  88. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_tgn_ld4l_cache_validation.yml +31 -1
  89. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_ulan_ld4l_cache_validation.yml +38 -1
  90. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/isni_ld4l_cache_validation.yml +10 -0
  91. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/ligatus_ld4l_cache_validation.yml +36 -0
  92. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locdemographics_ld4l_cache_validation.yml +69 -44
  93. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locgenres_ld4l_cache_validation.yml +22 -0
  94. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_ld4l_cache_validation.yml +65 -0
  95. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo2_ld4l_cache_validation.yml +78 -0
  96. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo3_ld4l_cache_validation.yml +73 -0
  97. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo_ld4l_cache_validation.yml +71 -3
  98. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locperformance_ld4l_cache_validation.yml +6 -0
  99. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locsubjects_ld4l_cache_validation.yml +30 -0
  100. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locvocabs_ld4l_cache_validation.yml +430 -0
  101. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/mesh_nlm_ld4l_cache_validation.yml +54 -1
  102. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/nalt_ld4l_cache_validation.yml +37 -0
  103. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/oclc_fast_validation.yml +71 -5
  104. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/oclcfast_direct_validation.yml +73 -2
  105. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/oclcfast_ld4l_cache_validation.yml +73 -0
  106. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/rda_registry_ld4l_cache_validation.yml +307 -0
  107. data/lib/qa_server/configuration.rb +28 -24
  108. data/lib/qa_server/version.rb +1 -1
  109. data/qa_server.gemspec +6 -5
  110. data/spec/feature/accuracy_spec.rb +32 -0
  111. data/spec/i18n_spec.rb +36 -0
  112. data/spec/spec_helper.rb +4 -0
  113. metadata +74 -20
  114. data/app/cache_processors/qa_server/performance_daily_graph_cache.rb +0 -60
  115. data/app/cache_processors/qa_server/performance_hourly_graph_cache.rb +0 -65
  116. data/app/cache_processors/qa_server/performance_monthly_graph_cache.rb +0 -60
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4a11e25bb0e1f04c1f4d6a9e1970f1cb438fc752
4
- data.tar.gz: 4a97306cce9c2b6dff9a4e417db000a06c79f3e5
2
+ SHA256:
3
+ metadata.gz: 76e06f7b15b4f8041797890dd3e4f7c362d73e73a31808060361cbcf16b4fe46
4
+ data.tar.gz: efbd4527118c03ea42c1075a69196fd4aa6696a524d2c675085a280aa0838d5d
5
5
  SHA512:
6
- metadata.gz: c8902939fc36473dbbf7979d0166f72d8e05912ad8b1713268cbe9297f9cfe5c0d01f96cb7b248864c6952c9c9430a061702e783eb37b2536bacc318e04ef637
7
- data.tar.gz: f831642e258fa4d658b283151b73d792242f999629febf58f8f82297b0bed98df5641a4cf03158ffcb689c50438e716ef54734d4bac8182a3be7a8c21cde17c6
6
+ metadata.gz: d22de7e60cfb453837013bc4b0ca6df756bfbc9f180ea9d27f28734a6822e3606dd32f73cd1fd8eb9fd563985ce706c9e18fb4055129fa3c17a6cc11f6955deb
7
+ data.tar.gz: c334da18f0a702644149e7228ecfb2407234feb3fe3e663388429f5513e3ca1a3f39ba9f364ce48213b17907b7bb0a27b4dbd53eb21d157047c7b254eeb8bacb
data/.rubocop_fixme.yml CHANGED
@@ -12,3 +12,6 @@ Lint/UnusedMethodArgument:
12
12
  Style/SpecialGlobalVars:
13
13
  Exclude:
14
14
  - 'tasks/qa_server_dev.rake'
15
+
16
+ Layout/AccessModifierIndentation:
17
+ EnforcedStyle: outdent
data/.travis.yml CHANGED
@@ -13,9 +13,9 @@ before_install:
13
13
  - google-chrome-stable --headless --disable-gpu --no-sandbox --remote-debugging-port=9222 http://localhost &
14
14
 
15
15
  rvm:
16
- - 2.4.6
17
- - 2.5.5
18
- - 2.6.3
16
+ - 2.5.8
17
+ - 2.6.6
18
+ - 2.7.1
19
19
 
20
20
  env:
21
21
  global:
@@ -26,8 +26,7 @@ env:
26
26
  # It should be sufficient to test only the latest of the patch versions for a minor version, they
27
27
  # should be compatible across patch versions (only bug fixes are released in patch versions).
28
28
  matrix:
29
- - "RAILS_VERSION=5.1.7"
30
- - "RAILS_VERSION=5.2.3"
29
+ - "RAILS_VERSION=5.2.5"
31
30
 
32
31
  services:
33
32
  - redis-server
data/CHANGELOG.md CHANGED
@@ -1,3 +1,44 @@
1
+ ### 7.6.0 (2021-04-12)
2
+
3
+ * update authority configs and test scenarios to use the new cache indexing with results stored as blobs in the index
4
+ * update to Rails 5.2.5
5
+ * update dependencies
6
+ * fix exception when first time running monitor status
7
+
8
+ ### 7.5.1 (2020-12-08)
9
+
10
+ * define missing i18n translations
11
+ * add i18n-tasks gem for managing translations
12
+ * add spec test to check for missing translations
13
+
14
+ ### 7.5.0 (2020-12-07)
15
+
16
+ * UI improvements of check_status page
17
+ * pre-populate selection fields with most recently submitted authorities
18
+ * add ability to compare two authorities' accuracy tests in UI
19
+ * update check_status UI to require GO button click to start processing
20
+ * fix javascript to avoid referencing missing elements
21
+ * accuracy test updates
22
+ * accuracy tests default to `context=false` since it is not required for testing
23
+ * allow accuracy tests through rspec to be marked pending (allows for better regression testing)
24
+ * add pending to failing validation tests such that accuracy_spec passes
25
+ * sync tests with production accuracy tests
26
+ * fix typo in `position` and a few syntax errors
27
+ * adjust result_size for validations where passing tests return less than 200 chars
28
+ * split locnames_rwo_ld4l_cache into 3 sets of tests of about 9 each to avoid time out
29
+ * add extended context for getty_aat_ld4l_cache and getty_tgn_ld4l_cache
30
+ * add authority locvocabs_ld4l_cache
31
+ * add request_data to status_logger (e.g. query for search, identifier for term)
32
+ * update to latest bixby v3.0
33
+
34
+ ### 7.4.0 (2020-04-13)
35
+
36
+ * add size and complexity performance statistics (not auto-generated)
37
+
38
+ ### 7.3.0 (2020-04-08)
39
+
40
+ * move generation of graphs to background jobs
41
+
1
42
  ### 7.2.1 (2020-02-23)
2
43
 
3
44
  * fix graph fails generation when any label is empty string
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ end
9
9
  Bundler::GemHelper.install_tasks
10
10
 
11
11
  # Set up the test application prior to running jasmine tasks.
12
- task :setup_test_server do
12
+ task setup_test_server: :environment do
13
13
  require 'engine_cart'
14
14
  EngineCart.load_application!
15
15
  end
@@ -25,6 +25,23 @@ div#example-url-warning {
25
25
  color: #4d0000;
26
26
  }
27
27
 
28
+ div#authority-selector {
29
+ margin-top: 20px;
30
+ margin-bottom: 0px;
31
+ margin-left: 20px;
32
+ margin-right: 20px;
33
+ width: 40%;
34
+ }
35
+
36
+ div#comparison-authority-selector {
37
+ display: none;
38
+ margin-top: 20px;
39
+ margin-bottom: 0px;
40
+ margin-left: 20px;
41
+ margin-right: 20px;
42
+ width: 40%;
43
+ }
44
+
28
45
  div.status-section {
29
46
  margin-top: 50px;
30
47
  }
@@ -43,6 +60,20 @@ table, th, td {
43
60
  padding: 5px;
44
61
  }
45
62
 
63
+ th.comparison-header {
64
+ background-color: #2e2c2c;
65
+ }
66
+
67
+ th.comparison-before {
68
+ text-align: center;
69
+ color: #f4f360;
70
+ }
71
+
72
+ th.comparison-after {
73
+ text-align: center;
74
+ color: #7df34c;
75
+ }
76
+
46
77
  th {
47
78
  background-color: #a1b1c4;
48
79
  color: black;
@@ -52,6 +83,11 @@ td.position {
52
83
  text-align: center;
53
84
  }
54
85
 
86
+ th.bold-left-border,
87
+ td.bold-left-border {
88
+ border-left: 2px solid black;
89
+ }
90
+
55
91
  .status-good {
56
92
  text-align: center;
57
93
  background-color: #ccffcc;
@@ -2,15 +2,10 @@
2
2
  # This module sets up the keys used to identify data in Rails.cache
3
3
  module QaServer
4
4
  module CacheKeys
5
- SCENARIO_RUN_TEST_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_test_data"
6
5
  SCENARIO_RUN_SUMMARY_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_summary_data"
7
6
  SCENARIO_RUN_FAILURE_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_failure_data"
8
7
  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"
10
8
 
11
9
  PERFORMANCE_DATATABLE_DATA_CACHE_KEY = "QaServer--Cache--performance_datatable_data"
12
- PERFORMANCE_GRAPH_HOURLY_DATA_CACHE_KEY = "QaServer--CacheKeys--performance_graph_hourly_data"
13
- PERFORMANCE_GRAPH_DAILY_DATA_CACHE_KEY = "QaServer--CacheKeys--performance_graph_daily_data"
14
- PERFORMANCE_GRAPH_MONTHLY_DATA_CACHE_KEY = "QaServer--CacheKeys--performance_graph_monthly_data"
15
10
  end
16
11
  end
@@ -8,6 +8,11 @@ module QaServer
8
8
  cache_expires_at - QaServer::TimeService.current_time
9
9
  end
10
10
 
11
+ def end_of_hour_expiry
12
+ ct = QaServer::TimeService.current_time
13
+ ct.end_of_hour - ct
14
+ end
15
+
11
16
  # @param key [String] cache key
12
17
  # @param force [Boolean] if true, forces cache to regenerate by returning true; otherwise, uses cache expiry to determine whether cache has expired
13
18
  # @return [Boolean] true if cache has expired or is being forced to expire
@@ -19,15 +24,15 @@ module QaServer
19
24
  force
20
25
  end
21
26
 
22
- private
27
+ private
23
28
 
24
- # @return [ActiveSupport::TimeWithZone] DateTime at which cache should expire
25
- def cache_expires_at
26
- offset = QaServer.config.hour_offset_to_expire_cache
27
- offset_time = QaServer::TimeService.current_time
28
- offset_time = offset_time.tomorrow unless (offset_time + 5.minutes).hour < offset
29
- offset_time.beginning_of_day + offset.hours - 5.minutes
30
- end
29
+ # @return [ActiveSupport::TimeWithZone] DateTime at which cache should expire
30
+ def cache_expires_at
31
+ offset = QaServer.config.hour_offset_to_expire_cache
32
+ offset_time = QaServer::TimeService.current_time
33
+ offset_time = offset_time.tomorrow unless (offset_time + 5.minutes).hour < offset
34
+ offset_time.beginning_of_day + offset.hours - 5.minutes
35
+ end
31
36
  end
32
37
  end
33
38
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ # Provide service methods for getting a list of all authorities and scenarios for an authority.
3
+ module QaServer
4
+ class JobIdCache
5
+ class << self
6
+ # Is the passed in job_id the active one for the job_key?
7
+ # @param job_key [String] key unique to the job being run (e.g. "QaServer::Jobs::MonitorTestsJob")
8
+ # @param job_id [String] UUID for job running the tests
9
+ # @param expires_in [ActiveSupport::Duration] This should be at least as long as the expected job run time to avoid multiple instances of the job running at the same time.
10
+ # @note When job completes, call reset_job_id to invalidate the cache
11
+ def active_job_id?(job_key:, job_id:, expires_in: 30.minutes)
12
+ cached_job_id = Rails.cache.fetch(cache_key(job_key), expires_in: expires_in, race_condition_ttl: 5.minutes) { job_id }
13
+ cached_job_id == job_id
14
+ end
15
+
16
+ # Delete cache for job id for the job represented by job_key. Call this when the job completes.
17
+ # @param job_key [String] key unique to the job being run (e.g. "QaServer::Jobs::MonitorTestsJob")
18
+ def reset_job_id(job_key:)
19
+ Rails.cache.delete(cache_key(job_key))
20
+ end
21
+
22
+ private
23
+
24
+ def cache_key(job_key)
25
+ "#{job_key}-job_id"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -49,45 +49,45 @@ module QaServer
49
49
  cache_to_write = nil # free cache for garbage collection
50
50
  end
51
51
 
52
- private
52
+ private
53
53
 
54
- def swap_cache_hash
55
- cache_to_write = @cache
56
- @cache = {} # reset main cache so new items after write begins are cached in the main cache
57
- QaServer.config.performance_cache_logger.debug("#{self.class}##{__method__} - cache memory BEFORE write: #{ObjectSpace.memsize_of(cache_to_write)}")
58
- cache_to_write
59
- end
54
+ def swap_cache_hash
55
+ cache_to_write = @cache
56
+ @cache = {} # reset main cache so new items after write begins are cached in the main cache
57
+ QaServer.config.performance_cache_logger.debug("#{self.class}##{__method__} - cache memory BEFORE write: #{ObjectSpace.memsize_of(cache_to_write)}")
58
+ cache_to_write
59
+ end
60
60
 
61
- def log(id:)
62
- return if QaServer.config.suppress_logging_performance_datails?
63
- Rails.logger.debug("*** performance data for id: #{id} ***")
64
- Rails.logger.debug(@cache[id].to_yaml)
65
- end
61
+ def log(id:)
62
+ return if QaServer.config.suppress_logging_performance_datails?
63
+ Rails.logger.debug("*** performance data for id: #{id} ***")
64
+ Rails.logger.debug(@cache[id].to_yaml)
65
+ end
66
66
 
67
- def incomplete?(entry)
68
- required_keys.each { |k| return true unless entry.key? k }
69
- false
70
- end
67
+ def incomplete?(entry)
68
+ required_keys.each { |k| return true unless entry.key? k }
69
+ false
70
+ end
71
71
 
72
- def required_keys
73
- [:dt_stamp,
74
- :authority,
75
- :action,
76
- :action_time_ms,
77
- :size_bytes,
78
- :retrieve_time_ms,
79
- :graph_load_time_ms,
80
- :normalization_time_ms]
81
- end
72
+ def required_keys
73
+ [:dt_stamp,
74
+ :authority,
75
+ :action,
76
+ :action_time_ms,
77
+ :size_bytes,
78
+ :retrieve_time_ms,
79
+ :graph_load_time_ms,
80
+ :normalization_time_ms]
81
+ end
82
82
 
83
- def log_write_all(prefix, size_before, cache_size)
84
- if size_before.positive?
85
- QaServer.config.performance_cache_logger.debug("#{prefix} 0 of #{size_before} performance data records were saved") if size_before == cache_size
86
- QaServer.config.performance_cache_logger.debug("#{prefix} #{size_before - cache_size} of #{size_before} performance data records were saved") if size_before > cache_size
87
- else
88
- QaServer.config.performance_cache_logger.debug("#{prefix} 0 of 0 performance data records were saved")
89
- end
90
- QaServer.config.performance_cache_logger.debug("#{prefix} - cache memory AFTER write: #{ObjectSpace.memsize_of @cache}")
83
+ def log_write_all(prefix, size_before, cache_size)
84
+ if size_before.positive?
85
+ QaServer.config.performance_cache_logger.debug("#{prefix} 0 of #{size_before} performance data records were saved") if size_before == cache_size
86
+ QaServer.config.performance_cache_logger.debug("#{prefix} #{size_before - cache_size} of #{size_before} performance data records were saved") if size_before > cache_size
87
+ else
88
+ QaServer.config.performance_cache_logger.debug("#{prefix} 0 of 0 performance data records were saved")
91
89
  end
90
+ QaServer.config.performance_cache_logger.debug("#{prefix} - cache memory AFTER write: #{ObjectSpace.memsize_of @cache}")
91
+ end
92
92
  end
93
93
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ # Cache the datetime_stamp of the last time the performance day graph was generated. Calls job to generate the graph if expired.
3
+ module QaServer
4
+ class PerformanceDayGraphCache
5
+ class << self
6
+ # Generates graphs for the past 24 hours for :search, :fetch, and :all actions for each authority.
7
+ # @param force [Boolean] if true, run the tests even if the cache hasn't expired; otherwise, use cache if not expired
8
+ def generate_graphs(force: false)
9
+ Rails.cache.fetch(cache_key, expires_in: next_expiry, race_condition_ttl: 30.seconds, force: force) do
10
+ QaServer.config.monitor_logger.debug("(QaServer::PerformanceDayGraphCache) - KICKING OFF PERFORMANCE DAY GRAPH GENERATION (force: #{force})")
11
+ QaServer::PerformanceDayGraphJob.perform_later
12
+ "Graphs generation initiated at #{QaServer::TimeService.current_time}"
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def cache_key
19
+ "QaServer::PerformanceDayGraphCache.generate_graphs--latest_generation_initiated"
20
+ end
21
+
22
+ def next_expiry
23
+ QaServer::CacheExpiryService.end_of_hour_expiry
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ # Cache the datetime_stamp of the last time the performance month graph was generated. Calls job to generate the graph if expired.
3
+ module QaServer
4
+ class PerformanceMonthGraphCache
5
+ class << self
6
+ # Generates graphs for the past 30 days for :search, :fetch, and :all actions for each authority.
7
+ # @param force [Boolean] if true, run the tests even if the cache hasn't expired; otherwise, use cache if not expired
8
+ def generate_graphs(force: false)
9
+ Rails.cache.fetch(cache_key, expires_in: next_expiry, race_condition_ttl: 30.seconds, force: force) do
10
+ QaServer.config.monitor_logger.debug("(QaServer::PerformanceMonthGraphCache) - KICKING OFF PERFORMANCE MONTH GRAPH GENERATION (force: #{force})")
11
+ QaServer::PerformanceMonthGraphJob.perform_later
12
+ "Graphs generation initiated at #{QaServer::TimeService.current_time}"
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def cache_key
19
+ "QaServer::PerformanceMonthGraphCache.generate_graphs--latest_generation_initiated"
20
+ end
21
+
22
+ def next_expiry
23
+ QaServer::CacheExpiryService.cache_expiry
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ # Cache the datetime_stamp of the last time the performance year graph was generated. Calls job to generate the graph if expired.
3
+ module QaServer
4
+ class PerformanceYearGraphCache
5
+ class << self
6
+ # Generates graphs for the 12 months for :search, :fetch, and :all actions for each authority.
7
+ # @param force [Boolean] if true, run the tests even if the cache hasn't expired; otherwise, use cache if not expired
8
+ def generate_graphs(force: false)
9
+ Rails.cache.fetch(cache_key, expires_in: next_expiry, race_condition_ttl: 30.seconds, force: force) do
10
+ QaServer.config.monitor_logger.debug("(QaServer::PerformanceYearGraphCache) - KICKING OFF PERFORMANCE YEAR GRAPH GENERATION (force: #{force})")
11
+ QaServer::PerformanceYearGraphJob.perform_later
12
+ "Graphs generation initiated at #{QaServer::TimeService.current_time}"
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def cache_key
19
+ "QaServer::PerformanceYearGraphCache.generate_graphs--latest_generation_initiated"
20
+ end
21
+
22
+ def next_expiry
23
+ QaServer::CacheExpiryService.cache_expiry
24
+ end
25
+ end
26
+ end
27
+ end
@@ -21,15 +21,15 @@ module QaServer
21
21
  end
22
22
  end
23
23
 
24
- private
24
+ private
25
25
 
26
- def cache_key_for_historical_data
27
- SCENARIO_RUN_HISTORY_DATA_CACHE_KEY
28
- end
26
+ def cache_key_for_historical_data
27
+ SCENARIO_RUN_HISTORY_DATA_CACHE_KEY
28
+ end
29
29
 
30
- def next_expiry
31
- QaServer::CacheExpiryService.cache_expiry
32
- end
30
+ def next_expiry
31
+ QaServer::CacheExpiryService.cache_expiry
32
+ end
33
33
  end
34
34
  end
35
35
  end
@@ -2,31 +2,26 @@
2
2
  # Generate graphs for the past 30 days using cached data. Graphs are generated only if the cache has expired.
3
3
  module QaServer
4
4
  class ScenarioHistoryGraphCache
5
- class_attribute :graphing_service
6
- self.graphing_service = QaServer::HistoryGraphingService
7
-
8
5
  class << self
9
- include QaServer::CacheKeys
10
-
11
- HISTORICAL_GRAPH_FILENAME = 'historical_side_stacked_bar.png'
12
-
13
6
  # Generates graphs for the past 30 days for :search, :fetch, and :all actions for each authority.
14
7
  # @param force [Boolean] if true, run the tests even if the cache hasn't expired; otherwise, use cache if not expired
15
8
  def generate_graph(data:, force: false)
16
- return unless QaServer::CacheExpiryService.cache_expired?(key: cache_key_for_force, force: force, next_expiry: next_expiry)
17
- QaServer.config.monitor_logger.debug("(QaServer::ScenarioHistoryGraphCache) - GENERATING historical summary graph (force: #{force})")
18
- graphing_service.generate_graph(data)
9
+ Rails.cache.fetch(cache_key, expires_in: next_expiry, race_condition_ttl: 30.seconds, force: force) do
10
+ QaServer.config.monitor_logger.debug("(QaServer::ScenarioHistoryGraphCache) - KICKING OFF HISTORY GRAPH GENERATION (force: #{force})")
11
+ QaServer::HistoryGraphJob.perform_later(data: data)
12
+ "Graph generation initiated at #{QaServer::TimeService.current_time}"
13
+ end
19
14
  end
20
15
 
21
- private
16
+ private
22
17
 
23
- def cache_key_for_force
24
- "#{SCENARIO_RUN_HISTORY_GRAPH_CACHE_KEY}--force"
25
- end
18
+ def cache_key
19
+ "QaServer::ScenarioHistoryGraphCache.generate_graph--latest_generation_initiated"
20
+ end
26
21
 
27
- def next_expiry
28
- QaServer::CacheExpiryService.cache_expiry
29
- end
22
+ def next_expiry
23
+ QaServer::CacheExpiryService.cache_expiry
24
+ end
30
25
  end
31
26
  end
32
27
  end