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

method_call.rb

Forked from GitLab.org / GitLab FOSS
2 commits behind, 4047 commits ahead of the upstream repository.
  • Yorick Peterse's avatar
    905f8d76
    Reduce instrumentation overhead · 905f8d76
    Yorick Peterse authored
    This reduces the overhead of the method instrumentation code primarily
    by reducing the number of method calls. There are also some other small
    optimisations such as not casting timing values to Floats (there's no
    particular need for this), using Symbols for method call metric names,
    and reducing the number of Hash lookups for instrumented methods.
    
    The exact impact depends on the code being executed. For example, for a
    method that's only called once the difference won't be very noticeable.
    However, for methods that are called many times the difference can be
    more significant.
    
    For example, the loading time of a large commit
    (nrclark/dummy_project@81ebdea5df2fb42e59257cb3eaad671a5c53ca36)
    was reduced from around 19 seconds to around 15 seconds using these
    changes.
    Verified
    905f8d76
    History
    Reduce instrumentation overhead
    Yorick Peterse authored
    This reduces the overhead of the method instrumentation code primarily
    by reducing the number of method calls. There are also some other small
    optimisations such as not casting timing values to Floats (there's no
    particular need for this), using Symbols for method call metric names,
    and reducing the number of Hash lookups for instrumented methods.
    
    The exact impact depends on the code being executed. For example, for a
    method that's only called once the difference won't be very noticeable.
    However, for methods that are called many times the difference can be
    more significant.
    
    For example, the loading time of a large commit
    (nrclark/dummy_project@81ebdea5df2fb42e59257cb3eaad671a5c53ca36)
    was reduced from around 19 seconds to around 15 seconds using these
    changes.
method_call.rb 1.33 KiB
module Gitlab
  module Metrics
    # Class for tracking timing information about method calls
    class MethodCall
      attr_reader :real_time, :cpu_time, :call_count

      # name - The full name of the method (including namespace) such as
      #        `User#sign_in`.
      #
      # series - The series to use for storing the data.
      def initialize(name, series)
        @name = name
        @series = series
        @real_time = 0
        @cpu_time = 0
        @call_count = 0
      end

      # Measures the real and CPU execution time of the supplied block.
      def measure
        start_real = System.monotonic_time
        start_cpu = System.cpu_time
        retval = yield

        @real_time += System.monotonic_time - start_real
        @cpu_time += System.cpu_time - start_cpu
        @call_count += 1

        retval
      end

      # Returns a Metric instance of the current method call.
      def to_metric
        Metric.new(
          @series,
          {
            duration:     real_time,
            cpu_duration: cpu_time,
            call_count:   call_count
          },
          method: @name
        )
      end

      # Returns true if the total runtime of this method exceeds the method call
      # threshold.
      def above_threshold?
        real_time >= Metrics.method_call_threshold
      end
    end
  end
end