class Prometheus::Client::LabelSetValidator

LabelSetValidator ensures that all used label sets comply with the Prometheus specification.

Constants

BASE_RESERVED_LABELS

TODO: we might allow setting :instance in the future

Attributes

expected_labels[R]
reserved_labels[R]

Public Class Methods

new(expected_labels:, reserved_labels: []) click to toggle source
# File lib/prometheus/client/label_set_validator.rb, line 18
def initialize(expected_labels:, reserved_labels: [])
  @expected_labels = expected_labels.sort
  @reserved_labels = BASE_RESERVED_LABELS + reserved_labels
end

Public Instance Methods

validate_labelset!(labelset) click to toggle source
# File lib/prometheus/client/label_set_validator.rb, line 35
def validate_labelset!(labelset)
  begin
    return labelset if keys_match?(labelset)
  rescue ArgumentError
    # If labelset contains keys that are a mixture of strings and symbols, this will
    # raise when trying to sort them, but the error should be the same:
    # InvalidLabelSetError
  end

  raise InvalidLabelSetError, "labels must have the same signature " \
                              "(keys given: #{labelset.keys} vs." \
                              " keys expected: #{expected_labels}"
end
validate_symbols!(labels) click to toggle source
# File lib/prometheus/client/label_set_validator.rb, line 23
def validate_symbols!(labels)
  unless labels.respond_to?(:all?)
    raise InvalidLabelSetError, "#{labels} is not a valid label set"
  end

  labels.all? do |key, _|
    validate_symbol(key)
    validate_name(key)
    validate_reserved_key(key)
  end
end

Private Instance Methods

keys_match?(labelset) click to toggle source
# File lib/prometheus/client/label_set_validator.rb, line 51
def keys_match?(labelset)
  labelset.keys.sort == expected_labels
end
validate_name(key) click to toggle source
# File lib/prometheus/client/label_set_validator.rb, line 61
def validate_name(key)
  return true unless key.to_s.start_with?('__')

  raise ReservedLabelError, "label #{key} must not start with __"
end
validate_reserved_key(key) click to toggle source
# File lib/prometheus/client/label_set_validator.rb, line 67
def validate_reserved_key(key)
  return true unless reserved_labels.include?(key)

  raise ReservedLabelError, "#{key} is reserved"
end
validate_symbol(key) click to toggle source
# File lib/prometheus/client/label_set_validator.rb, line 55
def validate_symbol(key)
  return true if key.is_a?(Symbol)

  raise InvalidLabelError, "label #{key} is not a symbol"
end