summaryrefslogtreecommitdiff
path: root/app/workers/analytics/usage_trends
diff options
context:
space:
mode:
Diffstat (limited to 'app/workers/analytics/usage_trends')
-rw-r--r--app/workers/analytics/usage_trends/count_job_trigger_worker.rb34
-rw-r--r--app/workers/analytics/usage_trends/counter_job_worker.rb35
2 files changed, 69 insertions, 0 deletions
diff --git a/app/workers/analytics/usage_trends/count_job_trigger_worker.rb b/app/workers/analytics/usage_trends/count_job_trigger_worker.rb
new file mode 100644
index 00000000000..37f5c19d64c
--- /dev/null
+++ b/app/workers/analytics/usage_trends/count_job_trigger_worker.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Analytics
+ module UsageTrends
+ class CountJobTriggerWorker
+ extend ::Gitlab::Utils::Override
+ include ApplicationWorker
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+
+ DEFAULT_DELAY = 3.minutes.freeze
+
+ feature_category :devops_reports
+ urgency :low
+
+ idempotent!
+
+ def perform
+ recorded_at = Time.zone.now
+
+ worker_arguments = Gitlab::Analytics::UsageTrends::WorkersArgumentBuilder.new(
+ measurement_identifiers: ::Analytics::UsageTrends::Measurement.measurement_identifier_values,
+ recorded_at: recorded_at
+ ).execute
+
+ perform_in = DEFAULT_DELAY.minutes.from_now
+ worker_arguments.each do |args|
+ CounterJobWorker.perform_in(perform_in, *args)
+
+ perform_in += DEFAULT_DELAY
+ end
+ end
+ end
+ end
+end
diff --git a/app/workers/analytics/usage_trends/counter_job_worker.rb b/app/workers/analytics/usage_trends/counter_job_worker.rb
new file mode 100644
index 00000000000..275c6ac2de2
--- /dev/null
+++ b/app/workers/analytics/usage_trends/counter_job_worker.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Analytics
+ module UsageTrends
+ class CounterJobWorker
+ extend ::Gitlab::Utils::Override
+ include ApplicationWorker
+
+ feature_category :devops_reports
+ urgency :low
+
+ idempotent!
+
+ def perform(measurement_identifier, min_id, max_id, recorded_at)
+ query_scope = ::Analytics::UsageTrends::Measurement.identifier_query_mapping[measurement_identifier].call
+
+ count = if min_id.nil? || max_id.nil? # table is empty
+ 0
+ else
+ counter(query_scope, min_id, max_id)
+ end
+
+ return if count == Gitlab::Database::BatchCounter::FALLBACK
+
+ UsageTrends::Measurement.insert_all([{ recorded_at: recorded_at, count: count, identifier: measurement_identifier }])
+ end
+
+ private
+
+ def counter(query_scope, min_id, max_id)
+ Gitlab::Database::BatchCount.batch_count(query_scope, start: min_id, finish: max_id)
+ end
+ end
+ end
+end