summaryrefslogtreecommitdiff
path: root/lib/service_ping/build_payload.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/service_ping/build_payload.rb')
-rw-r--r--lib/service_ping/build_payload.rb63
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/service_ping/build_payload.rb b/lib/service_ping/build_payload.rb
new file mode 100644
index 00000000000..4d3b32a1fc0
--- /dev/null
+++ b/lib/service_ping/build_payload.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module ServicePing
+ class BuildPayload
+ def execute
+ return {} unless ServicePingSettings.product_intelligence_enabled?
+
+ filtered_usage_data
+ end
+
+ private
+
+ def raw_payload
+ @raw_payload ||= ::Gitlab::Usage::ServicePingReport.for(output: :all_metrics_values)
+ end
+
+ def filtered_usage_data(payload = raw_payload, parents = [])
+ return unless payload.is_a?(Hash)
+
+ payload.keep_if do |label, node|
+ key_path = parents.dup.append(label).join('.')
+
+ if has_metric_definition?(key_path)
+ include_metric?(key_path)
+ else
+ filtered_usage_data(node, parents.dup << label) if node.is_a?(Hash)
+ end
+ end
+ end
+
+ def include_metric?(key_path)
+ valid_metric_status?(key_path) && permitted_metric?(key_path)
+ end
+
+ def valid_metric_status?(key_path)
+ metric_definitions[key_path]&.valid_service_ping_status?
+ end
+
+ def permitted_categories
+ @permitted_categories ||= ::ServicePing::PermitDataCategories.new.execute
+ end
+
+ def permitted_metric?(key_path)
+ permitted_categories.include?(metric_category(key_path))
+ end
+
+ def has_metric_definition?(key_path)
+ metric_definitions[key_path].present?
+ end
+
+ def metric_category(key_path)
+ metric_definitions[key_path]
+ &.attributes
+ &.fetch(:data_category, ::ServicePing::PermitDataCategories::OPTIONAL_CATEGORY)
+ end
+
+ def metric_definitions
+ @metric_definitions ||= ::Gitlab::Usage::MetricDefinition.definitions
+ end
+ end
+end
+
+ServicePing::BuildPayload.prepend_mod_with('ServicePing::BuildPayload')