Skip to content

Harden Usage Ping | Alternative counts

Problem

Currently in Usage Ping there are ~400 usage ping counters with varying implementations, this causes stability issues and in some causes an uncaught error can cause the entire usage ping to fail. Some of these aren't really counters like version information, date etc. These include anything miscellaneous such as https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L26

Proposal

Make these miscellaneous metrics more resilient by reworking them so they are isolated within a Alternative Counter method which is isolated with rescue fail safes.

Result

A more robust usage ping without single points of failure

Next steps (if any)

Checked for this metrics

Checking for counters located:

        usage_data = {
          uuid: Gitlab::CurrentSettings.uuid,
          hostname: Gitlab.config.gitlab.host,
          version: Gitlab::VERSION,
          installation_type: installation_type,
          active_user_count: count(User.active),
          recorded_at: Time.now,
          edition: 'CE'
        }
      def features_usage_data_ce
        {
          container_registry_enabled: Gitlab.config.registry.enabled,
          dependency_proxy_enabled: Gitlab.config.try(:dependency_proxy)&.enabled,
          gitlab_shared_runners_enabled: Gitlab.config.gitlab_ci.shared_runners_enabled,
          gravatar_enabled: Gitlab::CurrentSettings.gravatar_enabled?,
          influxdb_metrics_enabled: Gitlab::Metrics.influx_metrics_enabled?,
          ldap_enabled: Gitlab.config.ldap.enabled,
          mattermost_enabled: Gitlab.config.mattermost.enabled,
          omniauth_enabled: Gitlab::Auth.omniauth_enabled?,
          prometheus_metrics_enabled: Gitlab::Metrics.prometheus_metrics_enabled?,
          reply_by_email_enabled: Gitlab::IncomingEmail.enabled?,
          signup_enabled: Gitlab::CurrentSettings.allow_signup?,
          web_ide_clientside_preview_enabled: Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?,
          ingress_modsecurity_enabled: Feature.enabled?(:ingress_modsecurity)
        }
      end

https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L134

     def features_usage_data_ce
        {
          container_registry_enabled: Gitlab.config.registry.enabled,
          dependency_proxy_enabled: Gitlab.config.try(:dependency_proxy)&.enabled,
          gitlab_shared_runners_enabled: Gitlab.config.gitlab_ci.shared_runners_enabled,
          gravatar_enabled: Gitlab::CurrentSettings.gravatar_enabled?,
          influxdb_metrics_enabled: Gitlab::Metrics.influx_metrics_enabled?,
          ldap_enabled: Gitlab.config.ldap.enabled,
          mattermost_enabled: Gitlab.config.mattermost.enabled,
          omniauth_enabled: Gitlab::Auth.omniauth_enabled?,
          prometheus_metrics_enabled: Gitlab::Metrics.prometheus_metrics_enabled?,
          reply_by_email_enabled: Gitlab::IncomingEmail.enabled?,
          signup_enabled: Gitlab::CurrentSettings.allow_signup?,
          web_ide_clientside_preview_enabled: Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?,
          ingress_modsecurity_enabled: Feature.enabled?(:ingress_modsecurity)
        }
      end
     def components_usage_data
        {
          git: { version: Gitlab::Git.version },
          gitaly: { version: Gitaly::Server.all.first.server_version, servers: Gitaly::Server.count, filesystems: Gitaly::Server.filesystems },
          gitlab_pages: { enabled: Gitlab.config.pages.enabled, version: Gitlab::Pages::VERSION },
          database: { adapter: Gitlab::Database.adapter_name, version: Gitlab::Database.version },
          app_server: { type: app_server_type }
        }
      end
        def features_usage_data_ee
          {
            elasticsearch_enabled: ::Gitlab::CurrentSettings.elasticsearch_search?,
            license_trial_ends_on: License.trial_ends_on,
            geo_enabled: ::Gitlab::Geo.enabled?
          }
        end
        def license_usage_data
          usage_data = super
          license = ::License.current
          usage_data[:edition] =
            if license
              license.edition
            else
              'EE Free'
            end

          if license
            usage_data[:license_md5] = license.md5
            usage_data[:license_id] = license.license_id
            usage_data[:historical_max_users] = ::HistoricalData.max_historical_user_count
            usage_data[:licensee] = license.licensee
            usage_data[:license_user_count] = license.restricted_user_count
            usage_data[:license_starts_at] = license.starts_at
            usage_data[:license_expires_at] = license.expires_at
            usage_data[:license_plan] = license.plan
            usage_data[:license_add_ons] = license.add_ons
            usage_data[:license_trial] = license.trial?
          end

          usage_data
        end
Edited by Alina Mihaila