class Prometheus::Client::MmapedValue
A float protected by a mutex backed by a per-process mmaped file.
Constants
- VALUE_LOCK
Public Class Methods
multiprocess()
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 99 def self.multiprocess true end
new(type, metric_name, name, labels, multiprocess_mode = '')
click to toggle source
# 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
pid_changed?()
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 95 def self.pid_changed? @@pid != Process.pid end
reinitialize_on_pid_change()
click to toggle source
# 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_reinitialize()
click to toggle source
# 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_change()
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 80 def self.reset_on_pid_change if pid_changed? @@pid = Process.pid @@files = {} end end
Public Instance Methods
decrement(amount = 1)
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 39 def decrement(amount = 1) increment(-amount) end
get()
click to toggle source
# 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)
click to toggle source
# 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?()
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 60 def pid_changed? @pid != Process.pid end
set(value)
click to toggle source
# 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)
click to toggle source
method needs to be run in VALUE_LOCK
mutex
# 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
Private Instance Methods
initialize_file()
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 105 def initialize_file VALUE_LOCK.synchronize do unsafe_initialize_file end end
read_value(key)
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 145 def read_value(key) @file.read_value(key) rescue StandardError => e Prometheus::Client.logger.warn("reading value from #{@file.path} failed with #{e}") Prometheus::Client.logger.debug(e.backtrace.join("\n")) 0 end
rebuild_key()
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 131 def rebuild_key keys = @labels.keys.sort values = @labels.values_at(*keys) [@metric_name, @name, keys, values].to_json end
unsafe_initialize_file()
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 111 def unsafe_initialize_file self.class.reset_on_pid_change @pid = Process.pid unless @@files.has_key?(@file_prefix) unless @file.nil? @file.close end mmaped_file = Helper::MmapedFile.open_exclusive_file(@file_prefix) @@files[@file_prefix] = MmapedDict.new(mmaped_file) end @file = @@files[@file_prefix] @key = rebuild_key @value = read_value(@key) end
write_value(key, val)
click to toggle source
# File lib/prometheus/client/mmaped_value.rb, line 138 def write_value(key, val) @file.write_value(key, val) rescue StandardError => e Prometheus::Client.logger.warn("writing value to #{@file.path} failed with #{e}") Prometheus::Client.logger.debug(e.backtrace.join("\n")) end