68 lines
1.9 KiB
Ruby
68 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Released under the MIT License.
|
|
# Copyright, 2021-2024, by Samuel Williams.
|
|
|
|
require_relative "../metric"
|
|
|
|
module Metrics
|
|
module Backend
|
|
module Test
|
|
VALID_METRIC_NAME = /\A[a-z0-9\-_\.]{1,128}\Z/i
|
|
VALID_TAG = /\A[a-z][a-z0-9\-_\.:\\]{0,127}\Z/i
|
|
|
|
class Metric < Metrics::Metric
|
|
def emit(value, tags: nil, sample_rate: 1.0)
|
|
unless value.is_a?(Numeric)
|
|
raise ArgumentError, "Value must be numeric!"
|
|
end
|
|
|
|
tags&.each do |tag|
|
|
raise ArgumentError, "Invalid tag (must be String): #{tag.inspect}!" unless tag.is_a?(String)
|
|
|
|
# We should let the underlying backend handle any tag limitations, e.g. converting invalid characters to underscores, etc.
|
|
#
|
|
# unless tag =~ VALID_TAG
|
|
# raise ArgumentError, "Invalid tag (must match #{VALID_TAG}): #{tag.inspect}!"
|
|
# end
|
|
end
|
|
end
|
|
end
|
|
|
|
module Interface
|
|
def metric(name, type, description: nil, unit: nil, &block)
|
|
unless name.is_a?(String)
|
|
raise ArgumentError, "Invalid name (must be String): #{name.inspect}!"
|
|
end
|
|
|
|
unless name =~ VALID_METRIC_NAME
|
|
raise ArgumentError, "Invalid name (must match #{VALID_METRIC_NAME}): #{name.inspect}!"
|
|
end
|
|
|
|
unless type.is_a?(Symbol)
|
|
raise ArgumentError, "Invalid type (must be Symbol): #{type.inspect}!"
|
|
end
|
|
|
|
# Description is optional but must be string if given:
|
|
if description
|
|
unless description.is_a?(String)
|
|
raise ArgumentError, "Invalid description (must be String): #{description.inspect}!"
|
|
end
|
|
end
|
|
|
|
# Unit is optional but must be string if given:
|
|
if unit
|
|
unless unit.is_a?(String)
|
|
raise ArgumentError, "Invalid unit (must be String): #{unit.inspect}!"
|
|
end
|
|
end
|
|
|
|
return Metric.new(name, type, description, unit)
|
|
end
|
|
end
|
|
end
|
|
|
|
Interface = Test::Interface
|
|
end
|
|
end
|