diff --git a/lib/prometheus/client/label_set_validator.rb b/lib/prometheus/client/label_set_validator.rb index 8b28a42d..62c4dd02 100644 --- a/lib/prometheus/client/label_set_validator.rb +++ b/lib/prometheus/client/label_set_validator.rb @@ -7,6 +7,7 @@ module Client class LabelSetValidator # TODO: we might allow setting :instance in the future BASE_RESERVED_LABELS = [:job, :instance, :pid].freeze + LABEL_NAME_REGEX = /\A[a-zA-Z_][a-zA-Z0-9_]*\Z/ class LabelSetError < StandardError; end class InvalidLabelSetError < LabelSetError; end @@ -59,9 +60,16 @@ def validate_symbol(key) end def validate_name(key) - return true unless key.to_s.start_with?('__') + if key.to_s.start_with?('__') + raise ReservedLabelError, "label #{key} must not start with __" + end + + unless key.to_s =~ LABEL_NAME_REGEX + msg = "label name must match /#{LABEL_NAME_REGEX}/" + raise InvalidLabelError, msg + end - raise ReservedLabelError, "label #{key} must not start with __" + true end def validate_reserved_key(key) diff --git a/spec/prometheus/client/label_set_validator_spec.rb b/spec/prometheus/client/label_set_validator_spec.rb index 688a1397..f4d38987 100644 --- a/spec/prometheus/client/label_set_validator_spec.rb +++ b/spec/prometheus/client/label_set_validator_spec.rb @@ -36,6 +36,12 @@ end.to raise_exception(described_class::ReservedLabelError) end + it 'raises InvalidLabelError if a label key contains invalid characters' do + expect do + validator.validate_symbols!(:@foo => 'key') + end.to raise_exception(described_class::InvalidLabelError) + end + it 'raises ReservedLabelError if a label key is reserved' do [:job, :instance, :pid].each do |label| expect do