diff options
Diffstat (limited to 'lib/service_ping/build_payload.rb')
-rw-r--r-- | lib/service_ping/build_payload.rb | 63 |
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') |