From 229b520f4f22ef6cbb593945504a69e157e48cf0 Mon Sep 17 00:00:00 2001
From: Niko Belokolodov <nbelokolodov@gitlab.com>
Date: Mon, 18 Oct 2021 22:35:07 +1300
Subject: [PATCH] Migrate License metrics to one class

---
 .../license/20210204124831_license_md5.yml    | 11 +++--
 .../license/20210204124833_license_id.yml     |  4 ++
 .../20210204124843_license_user_count.yml     |  4 ++
 .../20210204124845_license_starts_at.yml      |  4 ++
 .../20210204124847_license_expires_at.yml     |  4 ++
 .../license/20210204124849_license_plan.yml   |  4 ++
 .../license/20210204124851_license_trial.yml  |  4 ++
 ...20210204124852_license_subscription_id.yml |  5 +-
 .../20210204124926_license_trial_ends_on.yml  |  4 ++
 ee/lib/ee/gitlab/usage_data.rb                |  2 +-
 .../instrumentations/license_metric.rb        | 46 +++++++++++++++++++
 lib/gitlab/utils/usage_data.rb                |  5 +-
 12 files changed, 88 insertions(+), 9 deletions(-)
 create mode 100644 ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb

diff --git a/ee/config/metrics/license/20210204124831_license_md5.yml b/ee/config/metrics/license/20210204124831_license_md5.yml
index cc8417957eeda..f59f41e0785fa 100644
--- a/ee/config/metrics/license/20210204124831_license_md5.yml
+++ b/ee/config/metrics/license/20210204124831_license_md5.yml
@@ -9,13 +9,16 @@ value_type: string
 status: active
 time_frame: none
 data_source: license
-instrumentation_class: LicenseMdFiveMetric
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    - md5
 data_category: standard
 distribution:
-- ee
+  - ee
 tier:
-- premium
-- ultimate
+  - premium
+  - ultimate
 introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/557
 performance_indicator_type: []
 milestone: "<13.9"
diff --git a/ee/config/metrics/license/20210204124833_license_id.yml b/ee/config/metrics/license/20210204124833_license_id.yml
index 1397c859915cb..28beb96ec7ae8 100644
--- a/ee/config/metrics/license/20210204124833_license_id.yml
+++ b/ee/config/metrics/license/20210204124833_license_id.yml
@@ -10,6 +10,10 @@ status: active
 time_frame: none
 data_source: license
 data_category: subscription
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    - id
 distribution:
 - ee
 tier:
diff --git a/ee/config/metrics/license/20210204124843_license_user_count.yml b/ee/config/metrics/license/20210204124843_license_user_count.yml
index e8100d8057bde..f050ab2c671eb 100644
--- a/ee/config/metrics/license/20210204124843_license_user_count.yml
+++ b/ee/config/metrics/license/20210204124843_license_user_count.yml
@@ -10,6 +10,10 @@ status: active
 time_frame: none
 data_source: license
 data_category: subscription
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    user_count
 distribution:
 - ee
 tier:
diff --git a/ee/config/metrics/license/20210204124845_license_starts_at.yml b/ee/config/metrics/license/20210204124845_license_starts_at.yml
index fc3cf6c616f9d..c04aba4c5f2c0 100644
--- a/ee/config/metrics/license/20210204124845_license_starts_at.yml
+++ b/ee/config/metrics/license/20210204124845_license_starts_at.yml
@@ -10,6 +10,10 @@ status: active
 time_frame: none
 data_source: license
 data_category: subscription
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    - starts_at
 distribution:
 - ee
 tier:
diff --git a/ee/config/metrics/license/20210204124847_license_expires_at.yml b/ee/config/metrics/license/20210204124847_license_expires_at.yml
index 51cf495e5ca77..2d0455db26ff6 100644
--- a/ee/config/metrics/license/20210204124847_license_expires_at.yml
+++ b/ee/config/metrics/license/20210204124847_license_expires_at.yml
@@ -10,6 +10,10 @@ status: active
 data_category: subscription
 time_frame: none
 data_source: license
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    - expires_at
 distribution:
 - ee
 tier:
diff --git a/ee/config/metrics/license/20210204124849_license_plan.yml b/ee/config/metrics/license/20210204124849_license_plan.yml
index f591954f7e760..8e52228d0b08f 100644
--- a/ee/config/metrics/license/20210204124849_license_plan.yml
+++ b/ee/config/metrics/license/20210204124849_license_plan.yml
@@ -10,6 +10,10 @@ status: active
 time_frame: none
 data_source: license
 data_category: subscription
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    - plan
 distribution:
 - ee
 tier:
diff --git a/ee/config/metrics/license/20210204124851_license_trial.yml b/ee/config/metrics/license/20210204124851_license_trial.yml
index fd14a5b9abca3..84e979bf728ac 100644
--- a/ee/config/metrics/license/20210204124851_license_trial.yml
+++ b/ee/config/metrics/license/20210204124851_license_trial.yml
@@ -10,6 +10,10 @@ status: active
 time_frame: none
 data_source: license
 data_category: subscription
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    - trial
 distribution:
 - ee
 tier:
diff --git a/ee/config/metrics/license/20210204124852_license_subscription_id.yml b/ee/config/metrics/license/20210204124852_license_subscription_id.yml
index d91e17902d07c..12edf3d00b59a 100644
--- a/ee/config/metrics/license/20210204124852_license_subscription_id.yml
+++ b/ee/config/metrics/license/20210204124852_license_subscription_id.yml
@@ -9,7 +9,10 @@ value_type: string
 status: active
 time_frame: none
 data_source: license
-instrumentation_class: ZuoraSubscriptionIdMetric
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    - subsription_id
 data_category: standard
 distribution:
 - ee
diff --git a/ee/config/metrics/license/20210204124926_license_trial_ends_on.yml b/ee/config/metrics/license/20210204124926_license_trial_ends_on.yml
index ca2433a03d71e..7095255a51995 100644
--- a/ee/config/metrics/license/20210204124926_license_trial_ends_on.yml
+++ b/ee/config/metrics/license/20210204124926_license_trial_ends_on.yml
@@ -10,6 +10,10 @@ status: active
 time_frame: none
 data_source: database
 data_category: subscription
+instrumentation_class: LicenseMetric
+options:
+  attribute:
+    - trial_ends_on
 distribution:
 - ee
 tier:
diff --git a/ee/lib/ee/gitlab/usage_data.rb b/ee/lib/ee/gitlab/usage_data.rb
index ff529830e80d4..35118127c1dd9 100644
--- a/ee/lib/ee/gitlab/usage_data.rb
+++ b/ee/lib/ee/gitlab/usage_data.rb
@@ -72,7 +72,7 @@ def features_usage_data
         def features_usage_data_ee
           {
             elasticsearch_enabled: alt_usage_data(fallback: nil) { ::Gitlab::CurrentSettings.elasticsearch_search? },
-            license_trial_ends_on: alt_usage_data(fallback: nil) { License.trial_ends_on },
+            license_trial_ends_on: alt_usage_data(fallback: nil) { add_metric("LicenseMetric", options: { attribute: :trial_ends_on }) },
             geo_enabled: alt_usage_data(fallback: nil) { ::Gitlab::Geo.enabled? },
             user_cap_feature_enabled: add_metric('UserCapSettingEnabledMetric', time_frame: 'none')
           }
diff --git a/ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb b/ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb
new file mode 100644
index 0000000000000..af361ad8125a4
--- /dev/null
+++ b/ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module Gitlab
+  module Usage
+    module Metrics
+      module Instrumentations
+        class LicenseMetric < GenericMetric
+          # Usage example
+          #
+          # In metric YAML defintion
+          # instrumentation_class: LicenseMetric
+          # options:
+          #   attribute: md5
+          # end
+
+          ALLOWED_ATTRIBUTES = %i(md5
+                                  id
+                                  plan
+                                  trial
+                                  starts_at
+                                  expires_at
+                                  user_count
+                                  trial_ends_on
+                                  subscription_id).freeze
+
+          def initialize(time_frame:, options: {})
+            super
+
+            raise ArgumentError, "License options attribute are required" unless license_attribute.present?
+            raise ArgumentError, "attribute should one allowed" unless license_attribute.in?(ALLOWED_ATTRIBUTES)
+          end
+
+          def license_attribute
+            options[:attribute]
+          end
+
+          def value
+            alt_usage_data(fallback: -1) do
+              ::Licese.current.send(license_attribute)
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/lib/gitlab/utils/usage_data.rb b/lib/gitlab/utils/usage_data.rb
index 0c4d767f12695..d46e43038311f 100644
--- a/lib/gitlab/utils/usage_data.rb
+++ b/lib/gitlab/utils/usage_data.rb
@@ -45,14 +45,13 @@ module UsageData
       MAX_BUCKET_SIZE = 100
       INSTRUMENTATION_CLASS_FALLBACK = -100
 
-      def add_metric(metric, time_frame: 'none')
+      def add_metric(metric, time_frame: 'none', options: {})
         # Results of this method should be overwritten by instrumentation class values
         # -100 indicates the metric was not properly merged.
         return INSTRUMENTATION_CLASS_FALLBACK if Feature.enabled?(:usage_data_instrumentation)
-
         metric_class = "Gitlab::Usage::Metrics::Instrumentations::#{metric}".constantize
 
-        metric_class.new(time_frame: time_frame).value
+        metric_class.new(time_frame: time_frame, options: options).value
       end
 
       def count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)
-- 
GitLab