summaryrefslogtreecommitdiff
path: root/lib/gitlab/import/metrics.rb
blob: 76638a8cf86c9d76acf8e7c536e4a65c621e7e1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# frozen_string_literal: true

# Prepend `Gitlab::Import::Metrics` to a class in order
# to measure and emit `Gitlab::Metrics` metrics of specified methods.
#
# @example
#   class Importer
#     prepend Gitlab::Import::Metrics
#
#     Gitlab::ImportExport::Metrics.measure :execute, metrics: {
#       importer_counter: {
#         type: :counter,
#         description: 'counter'
#       },
#       importer_histogram: {
#         type: :histogram,
#         labels: { importer: 'importer' },
#         description: 'histogram'
#       }
#     }
#
#     def execute
#        ...
#     end
#   end
#
# Each call to `#execute` increments `importer_counter` as well as
# measures `#execute` duration and reports histogram `importer_histogram`
module Gitlab
  module Import
    module Metrics
      def self.measure(method_name, metrics:)
        define_method "#{method_name}" do |*args|
          start_time = Time.zone.now

          result = super(*args)

          end_time = Time.zone.now

          report_measurement_metrics(metrics, end_time - start_time)

          result
        end
      end

      def report_measurement_metrics(metrics, duration)
        metrics.each do |metric_name, metric_value|
          case metric_value[:type]
          when :counter
            Gitlab::Metrics.counter(metric_name, metric_value[:description]).increment
          when :histogram
            Gitlab::Metrics.histogram(metric_name, metric_value[:description]).observe(metric_value[:labels], duration)
          else
            nil
          end
        end
      end
    end
  end
end