Class: Gitlab::Metrics::Samplers::RubySampler

Inherits:
BaseSampler show all
Defined in:
lib/gitlab/metrics/samplers/ruby_sampler.rb

Constant Summary collapse

DEFAULT_SAMPLING_INTERVAL_SECONDS =
60
GC_REPORT_BUCKETS =
[0.01, 0.05, 0.1, 0.2, 0.3, 0.5, 1].freeze

Instance Attribute Summary

Attributes inherited from BaseSampler

#interval

Attributes inherited from Daemon

#thread

Instance Method Summary collapse

Methods inherited from BaseSampler

#safe_sample, #sleep_interval

Methods inherited from Daemon

#enabled?, initialize_instance, instance, #start, #stop, #thread?, #thread_name

Constructor Details

#initialize(prefix: nil, **options) ⇒ RubySampler

Returns a new instance of RubySampler.



10
11
12
13
14
15
16
17
18
# File 'lib/gitlab/metrics/samplers/ruby_sampler.rb', line 10

def initialize(prefix: nil, **options)
  @prefix = prefix

  GC::Profiler.clear

  metrics[:process_start_time_seconds].set(labels, Time.now.to_i)

  super(**options)
end

Instance Method Details

#init_metricsObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/gitlab/metrics/samplers/ruby_sampler.rb', line 32

def init_metrics
  metrics = {
    file_descriptors: ::Gitlab::Metrics.gauge(metric_name(:file, :descriptors), 'File descriptors used', labels),
    process_cpu_seconds_total: ::Gitlab::Metrics.gauge(metric_name(:process, :cpu_seconds_total), 'Process CPU seconds total'),
    process_max_fds: ::Gitlab::Metrics.gauge(metric_name(:process, :max_fds), 'Process max fds'),
    process_resident_memory_bytes: ::Gitlab::Metrics.gauge(metric_name(:process, :resident_memory_bytes), 'Memory used (RSS)', labels),
    process_resident_anon_memory_bytes: ::Gitlab::Metrics.gauge(metric_name(:process, :resident_anon_memory_bytes), 'Anonymous memory used (RSS)', labels),
    process_resident_file_memory_bytes: ::Gitlab::Metrics.gauge(metric_name(:process, :resident_file_memory_bytes), 'File backed memory used (RSS)', labels),
    process_unique_memory_bytes: ::Gitlab::Metrics.gauge(metric_name(:process, :unique_memory_bytes), 'Memory used (USS)', labels),
    process_proportional_memory_bytes: ::Gitlab::Metrics.gauge(metric_name(:process, :proportional_memory_bytes), 'Memory used (PSS)', labels),
    process_start_time_seconds: ::Gitlab::Metrics.gauge(metric_name(:process, :start_time_seconds), 'Process start time seconds'),
    sampler_duration: ::Gitlab::Metrics.counter(metric_name(:sampler, :duration_seconds_total), 'Sampler time', labels),
    gc_duration_seconds: ::Gitlab::Metrics.histogram(metric_name(:gc, :duration_seconds), 'GC time', labels, GC_REPORT_BUCKETS),
    heap_fragmentation: ::Gitlab::Metrics.gauge(metric_name(:gc_stat_ext, :heap_fragmentation), 'Ruby heap fragmentation', labels)
  }

  GC.stat.keys.each do |key|
    metrics[key] = ::Gitlab::Metrics.gauge(metric_name(:gc_stat, key), to_doc_string(key), labels)
  end

  metrics
end

#labelsObject



28
29
30
# File 'lib/gitlab/metrics/samplers/ruby_sampler.rb', line 28

def labels
  {}
end

#metricsObject



20
21
22
# File 'lib/gitlab/metrics/samplers/ruby_sampler.rb', line 20

def metrics
  @metrics ||= init_metrics
end

#sampleObject



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/gitlab/metrics/samplers/ruby_sampler.rb', line 55

def sample
  start_time = System.monotonic_time

  metrics[:file_descriptors].set(labels, System.file_descriptor_count)
  metrics[:process_cpu_seconds_total].set(labels, ::Gitlab::Metrics::System.cpu_time)
  metrics[:process_max_fds].set(labels, ::Gitlab::Metrics::System.max_open_file_descriptors)
  set_memory_usage_metrics
  sample_gc

  metrics[:sampler_duration].increment(labels, System.monotonic_time - start_time)
end

#to_doc_string(name) ⇒ Object



24
25
26
# File 'lib/gitlab/metrics/samplers/ruby_sampler.rb', line 24

def to_doc_string(name)
  name.to_s.humanize
end