Skip to content
Snippets Groups Projects
Select Git revision
  • move-gl-dropdown
  • improve-table-pagination-spec
  • move-markdown-preview
  • winh-fix-merge-request-spec
  • master default
  • index-namespaces-lower-name
  • winh-single-karma-test
  • 10-3-stable
  • 36782-replace-team-user-role-with-add_role-user-in-specs
  • winh-modal-internal-state
  • tz-ide-file-icons
  • 38869-milestone-select
  • update-autodevops-template
  • jivl-activate-repo-cookie-preferences
  • qa-add-deploy-key
  • docs-move-article-ldap
  • 40780-choose-file
  • 22643-manual-job-page
  • refactor-cluster-show-page-conservative
  • dm-sidekiq-versioning
  • v10.4.0.pre
  • v10.3.0
  • v10.3.0-rc5
  • v10.3.0-rc4
  • v10.3.0-rc3
  • v10.3.0-rc2
  • v10.2.5
  • v10.3.0-rc1
  • v10.0.7
  • v10.1.5
  • v10.2.4
  • v10.2.3
  • v10.2.2
  • v10.2.1
  • v10.3.0.pre
  • v10.2.0
  • v10.2.0-rc4
  • v10.2.0-rc3
  • v10.1.4
  • v10.2.0-rc2
40 results

metrics.rb

Blame
  • Forked from GitLab.org / GitLab FOSS
    25880 commits behind the upstream repository.
    metrics.rb 3.26 KiB
    module Gitlab
      module Metrics
        extend Gitlab::CurrentSettings
    
        RAILS_ROOT   = Rails.root.to_s
        METRICS_ROOT = Rails.root.join('lib', 'gitlab', 'metrics').to_s
        PATH_REGEX   = /^#{RAILS_ROOT}\/?/
    
        def self.settings
          @settings ||= {
            enabled:               current_application_settings[:metrics_enabled],
            pool_size:             current_application_settings[:metrics_pool_size],
            timeout:               current_application_settings[:metrics_timeout],
            method_call_threshold: current_application_settings[:metrics_method_call_threshold],
            host:                  current_application_settings[:metrics_host],
            port:                  current_application_settings[:metrics_port],
            sample_interval:       current_application_settings[:metrics_sample_interval] || 15
          }
        end
    
        def self.enabled?
          settings[:enabled] || false
        end
    
        def self.mri?
          RUBY_ENGINE == 'ruby'
        end
    
        def self.method_call_threshold
          # This is memoized since this method is called for every instrumented
          # method. Loading data from an external cache on every method call slows
          # things down too much.
          @method_call_threshold ||= settings[:method_call_threshold]
        end
    
        def self.pool
          @pool
        end
    
        def self.submit_metrics(metrics)
          prepared = prepare_metrics(metrics)
    
          pool.with do |connection|
            prepared.each do |metric|
              begin
                connection.write_points([metric])
              rescue StandardError
              end
            end
          end
        end
    
        def self.prepare_metrics(metrics)
          metrics.map do |hash|
            new_hash = hash.symbolize_keys
    
            new_hash[:tags].each do |key, value|
              if value.blank?
                new_hash[:tags].delete(key)
              else
                new_hash[:tags][key] = escape_value(value)
              end
            end
    
            new_hash
          end
        end
    
        def self.escape_value(value)
          value.to_s.gsub('=', '\\=')
        end
    
        # Measures the execution time of a block.
        #
        # Example:
        #
        #     Gitlab::Metrics.measure(:find_by_username_duration) do
        #       User.find_by_username(some_username)
        #     end
        #
        # name - The name of the field to store the execution time in.
        #
        # Returns the value yielded by the supplied block.
        def self.measure(name)
          trans = current_transaction
    
          return yield unless trans
    
          real_start = Time.now.to_f
          cpu_start = System.cpu_time
    
          retval = yield
    
          cpu_stop = System.cpu_time
          real_stop = Time.now.to_f
    
          real_time = (real_stop - real_start) * 1000.0
          cpu_time = cpu_stop - cpu_start
    
          trans.increment("#{name}_real_time", real_time)
          trans.increment("#{name}_cpu_time", cpu_time)
          trans.increment("#{name}_call_count", 1)
    
          retval
        end
    
        # When enabled this should be set before being used as the usual pattern
        # "@foo ||= bar" is _not_ thread-safe.
        if enabled?
          @pool = ConnectionPool.new(size: settings[:pool_size], timeout: settings[:timeout]) do
            host = settings[:host]
            port = settings[:port]
    
            InfluxDB::Client.
              new(udp: { host: host, port: port })
          end
        end
    
        private
    
        def self.current_transaction
          Transaction.current
        end
      end
    end