Class: Gitlab::Metrics::Metric

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/metrics/metric.rb

Overview

Class for storing details of a single metric (label, value, etc).

Constant Summary collapse

JITTER_RANGE =
0.000001..0.001

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(series, values, tags = {}) ⇒ Metric

series - The name of the series (as a String) to store the metric in. values - A Hash containing the values to store. tags - A Hash containing extra tags to add to the metrics.


12
13
14
15
16
17
# File 'lib/gitlab/metrics/metric.rb', line 12

def initialize(series, values, tags = {})
  @values     = values
  @series     = series
  @tags       = tags
  @created_at = Time.now.utc
end

Instance Attribute Details

#created_atObject (readonly)

Returns the value of attribute created_at


7
8
9
# File 'lib/gitlab/metrics/metric.rb', line 7

def created_at
  @created_at
end

#seriesObject (readonly)

Returns the value of attribute series


7
8
9
# File 'lib/gitlab/metrics/metric.rb', line 7

def series
  @series
end

#tagsObject (readonly)

Returns the value of attribute tags


7
8
9
# File 'lib/gitlab/metrics/metric.rb', line 7

def tags
  @tags
end

#valuesObject (readonly)

Returns the value of attribute values


7
8
9
# File 'lib/gitlab/metrics/metric.rb', line 7

def values
  @values
end

Instance Method Details

#to_hashObject

Returns a Hash in a format that can be directly written to InfluxDB.


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
# File 'lib/gitlab/metrics/metric.rb', line 20

def to_hash
  # InfluxDB overwrites an existing point if a new point has the same
  # series, tag set, and timestamp. In a highly concurrent environment
  # this means that using the number of seconds since the Unix epoch is
  # inevitably going to collide with another timestamp. For example, two
  # Rails requests processed by different processes may end up generating
  # metrics using the _exact_ same timestamp (in seconds).
  #
  # Due to the way InfluxDB is set up there's no solution to this problem,
  # all we can do is lower the amount of collisions. We do this by using
  # Time#to_f which returns the seconds as a Float providing greater
  # accuracy. We then add a small random value that is large enough to
  # distinguish most timestamps but small enough to not alter the amount
  # of seconds.
  #
  # See https://gitlab.com/gitlab-com/operations/issues/175 for more
  # information.
  time = @created_at.to_f + rand(JITTER_RANGE)

  {
    series:    @series,
    tags:      @tags,
    values:    @values,
    timestamp: (time * 1_000_000_000).to_i
  }
end