summaryrefslogtreecommitdiff
path: root/lib/gitlab/metrics
diff options
context:
space:
mode:
authorPawel Chojnacki <pawel@chojnacki.ws>2017-05-09 09:39:28 +0200
committerPawel Chojnacki <pawel@chojnacki.ws>2017-06-02 19:45:57 +0200
commit5bc099c2de1e05fa4dbe45b59caeced209834178 (patch)
tree468e515dfb2327bc89a642e18a3314191141b943 /lib/gitlab/metrics
parentf74b133a7e5621ba3a3e93a4f29489fe28a10ae3 (diff)
downloadgitlab-ce-5bc099c2de1e05fa4dbe45b59caeced209834178.tar.gz
Prometheus metrics first pass
metrics wip
Diffstat (limited to 'lib/gitlab/metrics')
-rw-r--r--lib/gitlab/metrics/dummy_metric.rb29
-rw-r--r--lib/gitlab/metrics/prometheus_sampler.rb51
2 files changed, 80 insertions, 0 deletions
diff --git a/lib/gitlab/metrics/dummy_metric.rb b/lib/gitlab/metrics/dummy_metric.rb
new file mode 100644
index 00000000000..d27bb83854a
--- /dev/null
+++ b/lib/gitlab/metrics/dummy_metric.rb
@@ -0,0 +1,29 @@
+module Gitlab
+ module Metrics
+ # Mocks ::Prometheus::Client::Metric and all derived metrics
+ class DummyMetric
+ def get(*args)
+ raise NotImplementedError
+ end
+
+ def values(*args)
+ raise NotImplementedError
+ end
+
+ # counter
+ def increment(*args)
+ # noop
+ end
+
+ # gauge
+ def set(*args)
+ # noop
+ end
+
+ # histogram / summary
+ def observe(*args)
+ # noop
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/prometheus_sampler.rb b/lib/gitlab/metrics/prometheus_sampler.rb
new file mode 100644
index 00000000000..5f90d4f0b66
--- /dev/null
+++ b/lib/gitlab/metrics/prometheus_sampler.rb
@@ -0,0 +1,51 @@
+module Gitlab
+ module Metrics
+ # Class that sends certain metrics to InfluxDB at a specific interval.
+ #
+ # This class is used to gather statistics that can't be directly associated
+ # with a transaction such as system memory usage, garbage collection
+ # statistics, etc.
+ class PrometheusSamples
+ # interval - The sampling interval in seconds.
+ def initialize(interval = Metrics.settings[:sample_interval])
+ interval_half = interval.to_f / 2
+
+ @interval = interval
+ @interval_steps = (-interval_half..interval_half).step(0.1).to_a
+ end
+
+ def start
+ Thread.new do
+ Thread.current.abort_on_exception = true
+
+ loop do
+ sleep(sleep_interval)
+
+ sample
+ end
+ end
+ end
+
+ def sidekiq?
+ Sidekiq.server?
+ end
+
+ # Returns the sleep interval with a random adjustment.
+ #
+ # The random adjustment is put in place to ensure we:
+ #
+ # 1. Don't generate samples at the exact same interval every time (thus
+ # potentially missing anything that happens in between samples).
+ # 2. Don't sample data at the same interval two times in a row.
+ def sleep_interval
+ while step = @interval_steps.sample
+ if step != @last_step
+ @last_step = step
+
+ return @interval + @last_step
+ end
+ end
+ end
+ end
+ end
+end