Class: Prometheus::Client::MmapedValue

Inherits:
Object
  • Object
show all
Defined in:
lib/prometheus/client/mmaped_value.rb

Overview

A float protected by a mutex backed by a per-process mmaped file.

Constant Summary collapse

VALUE_LOCK =
Mutex.new
@@files =
{}
@@pid =
-1

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type, metric_name, name, labels, multiprocess_mode = '') ⇒ MmapedValue

Returns a new instance of MmapedValue.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/prometheus/client/mmaped_value.rb', line 14

def initialize(type, metric_name, name, labels, multiprocess_mode = '')
  @file_prefix = type.to_s
  @metric_name = metric_name
  @name = name
  @labels = labels
  if type == :gauge
    @file_prefix += '_' + multiprocess_mode.to_s
  end

  @pid = -1

  @mutex = Mutex.new
  initialize_file
end

Class Method Details

.multiprocessObject



99
100
101
# File 'lib/prometheus/client/mmaped_value.rb', line 99

def self.multiprocess
  true
end

.pid_changed?Boolean

Returns:

  • (Boolean)


95
96
97
# File 'lib/prometheus/client/mmaped_value.rb', line 95

def self.pid_changed?
  @@pid != Process.pid
end

.reinitialize_on_pid_changeObject



87
88
89
90
91
92
93
# File 'lib/prometheus/client/mmaped_value.rb', line 87

def self.reinitialize_on_pid_change
  VALUE_LOCK.synchronize do
    reset_on_pid_change

    ObjectSpace.each_object(MmapedValue, &:unsafe_reinitialize_file)
  end
end

.reset_and_reinitializeObject



69
70
71
72
73
74
75
76
77
78
# File 'lib/prometheus/client/mmaped_value.rb', line 69

def self.reset_and_reinitialize
  VALUE_LOCK.synchronize do
    @@pid = Process.pid
    @@files = {}

    ObjectSpace.each_object(MmapedValue).each do |v|
      v.unsafe_reinitialize_file(false)
    end
  end
end

.reset_on_pid_changeObject



80
81
82
83
84
85
# File 'lib/prometheus/client/mmaped_value.rb', line 80

def self.reset_on_pid_change
  if pid_changed?
    @@pid = Process.pid
    @@files = {}
  end
end

Instance Method Details

#decrement(amount = 1) ⇒ Object



39
40
41
# File 'lib/prometheus/client/mmaped_value.rb', line 39

def decrement(amount = 1)
  increment(-amount)
end

#getObject



53
54
55
56
57
58
# File 'lib/prometheus/client/mmaped_value.rb', line 53

def get
  @mutex.synchronize do
    initialize_file if pid_changed?
    return @value
  end
end

#increment(amount = 1) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'lib/prometheus/client/mmaped_value.rb', line 29

def increment(amount = 1)
  @mutex.synchronize do
    initialize_file if pid_changed?

    @value += amount
    write_value(@key, @value)
    @value
  end
end

#pid_changed?Boolean

Returns:

  • (Boolean)


60
61
62
# File 'lib/prometheus/client/mmaped_value.rb', line 60

def pid_changed?
  @pid != Process.pid
end

#set(value) ⇒ Object



43
44
45
46
47
48
49
50
51
# File 'lib/prometheus/client/mmaped_value.rb', line 43

def set(value)
  @mutex.synchronize do
    initialize_file if pid_changed?

    @value = value
    write_value(@key, @value)
    @value
  end
end

#unsafe_reinitialize_file(check_pid = true) ⇒ Object

method needs to be run in VALUE_LOCK mutex



65
66
67
# File 'lib/prometheus/client/mmaped_value.rb', line 65

def unsafe_reinitialize_file(check_pid = true)
  unsafe_initialize_file if !check_pid || pid_changed?
end