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