Commit f181f05e authored by Yorick Peterse's avatar Yorick Peterse

Track object counts using the "allocations" Gem

This allows us to track the counts of actual classes instead of "T_XXX"
nodes. This is only enabled on CRuby as it uses CRuby specific APIs.
parent bcee44ad
...@@ -210,6 +210,7 @@ gem 'net-ssh', '~> 3.0.1' ...@@ -210,6 +210,7 @@ gem 'net-ssh', '~> 3.0.1'
# Metrics # Metrics
group :metrics do group :metrics do
gem 'allocations', '~> 1.0', require: false, platform: :mri
gem 'method_source', '~> 0.8', require: false gem 'method_source', '~> 0.8', require: false
gem 'influxdb', '~> 0.2', require: false gem 'influxdb', '~> 0.2', require: false
gem 'connection_pool', '~> 2.0', require: false gem 'connection_pool', '~> 2.0', require: false
......
...@@ -49,6 +49,7 @@ GEM ...@@ -49,6 +49,7 @@ GEM
addressable (2.3.8) addressable (2.3.8)
after_commit_queue (1.3.0) after_commit_queue (1.3.0)
activerecord (>= 3.0) activerecord (>= 3.0)
allocations (1.0.1)
annotate (2.6.10) annotate (2.6.10)
activerecord (>= 3.2, <= 4.3) activerecord (>= 3.2, <= 4.3)
rake (~> 10.4) rake (~> 10.4)
...@@ -818,6 +819,7 @@ DEPENDENCIES ...@@ -818,6 +819,7 @@ DEPENDENCIES
acts-as-taggable-on (~> 3.4) acts-as-taggable-on (~> 3.4)
addressable (~> 2.3.8) addressable (~> 2.3.8)
after_commit_queue after_commit_queue
allocations (~> 1.0)
annotate (~> 2.6.0) annotate (~> 2.6.0)
asana (~> 0.4.0) asana (~> 0.4.0)
asciidoctor (~> 1.5.2) asciidoctor (~> 1.5.2)
......
...@@ -16,6 +16,10 @@ module Gitlab ...@@ -16,6 +16,10 @@ module Gitlab
!!Settings.metrics['enabled'] !!Settings.metrics['enabled']
end end
def self.mri?
RUBY_ENGINE == 'ruby'
end
def self.method_call_threshold def self.method_call_threshold
Settings.metrics['method_call_threshold'] || 10 Settings.metrics['method_call_threshold'] || 10
end end
......
...@@ -13,6 +13,12 @@ module Gitlab ...@@ -13,6 +13,12 @@ module Gitlab
@last_minor_gc = Delta.new(GC.stat[:minor_gc_count]) @last_minor_gc = Delta.new(GC.stat[:minor_gc_count])
@last_major_gc = Delta.new(GC.stat[:major_gc_count]) @last_major_gc = Delta.new(GC.stat[:major_gc_count])
if Gitlab::Metrics.mri?
require 'allocations'
Allocations.start
end
end end
def start def start
...@@ -52,9 +58,22 @@ module Gitlab ...@@ -52,9 +58,22 @@ module Gitlab
new('file_descriptors', value: System.file_descriptor_count) new('file_descriptors', value: System.file_descriptor_count)
end end
def sample_objects if Metrics.mri?
ObjectSpace.count_objects.each do |type, count| def sample_objects
@metrics << Metric.new('object_counts', { count: count }, type: type) sample = Allocations.to_hash
counts = sample.each_with_object({}) do |(klass, count), hash|
hash[klass.name] = count
end
# Symbols aren't allocated so we'll need to add those manually.
counts['Symbol'] = Symbol.all_symbols.length
counts.each do |name, count|
@metrics << Metric.new('object_counts', { count: count }, type: name)
end
end
else
def sample_objects
end end
end end
......
...@@ -3,6 +3,10 @@ require 'spec_helper' ...@@ -3,6 +3,10 @@ require 'spec_helper'
describe Gitlab::Metrics::Sampler do describe Gitlab::Metrics::Sampler do
let(:sampler) { described_class.new(5) } let(:sampler) { described_class.new(5) }
after do
Allocations.stop if Gitlab::Metrics.mri?
end
describe '#start' do describe '#start' do
it 'gathers a sample at a given interval' do it 'gathers a sample at a given interval' do
expect(sampler).to receive(:sleep).with(5) expect(sampler).to receive(:sleep).with(5)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment