Sha256: 288460dad81331553292833e63f65314a1f4eb694eb5ae74dc1ef3a8d7a90218

Contents?: true

Size: 1.77 KB

Versions: 3

Compression:

Stored size: 1.77 KB

Contents

# frozen_string_literal: true

# The Datagram class parses and inspects a StatsD datagrans
#
# @note This class is part of the new Client implementation that is intended
#   to become the new default in the next major release of this library.
class StatsD::Instrument::Datagram
  attr_reader :source

  def initialize(source)
    @source = source
  end

  # @return [Float] The sample rate at which this datagram was emitted, between 0 and 1.
  def sample_rate
    parsed_datagram[:sample_rate] ? Float(parsed_datagram[:sample_rate]) : 1.0
  end

  def type
    @type ||= parsed_datagram[:type].to_sym
  end

  def name
    parsed_datagram[:name]
  end

  def value
    @value ||= case type
    when :c
      Integer(parsed_datagram[:value])
    when :g, :h, :d, :kv, :ms
      Float(parsed_datagram[:value])
    when :s
      String(parsed_datagram[:value])
    else
      parsed_datagram[:value]
    end
  end

  def tags
    @tags ||= parsed_datagram[:tags] ? parsed_datagram[:tags].split(',') : nil
  end

  def inspect
    "#<#{self.class.name}:\"#{@source}\">"
  end

  def hash
    source.hash
  end

  def eql?(other)
    case other
    when StatsD::Instrument::Datagram
      source == other.source
    when String
      source == other
    else
      false
    end
  end

  alias_method :==, :eql?

  private

  PARSER = %r{
    \A
    (?<name>[^\:\|\@]+)\:(?<value>[^\:\|\@]+)\|(?<type>c|ms|g|s|h|d)
    (?:\|\@(?<sample_rate>\d*(?:\.\d*)?))?
    (?:\|\#(?<tags>(?:[^\|,]+(?:,[^\|,]+)*)))?
    \n? # In some implementations, the datagram may include a trailing newline.
    \z
  }x
  private_constant :PARSER

  def parsed_datagram
    @parsed ||= if (match_info = PARSER.match(@source))
      match_info
    else
      raise ArgumentError, "Invalid StatsD datagram: #{@source}"
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
statsd-instrument-2.8.0 lib/statsd/instrument/datagram.rb
statsd-instrument-2.7.1 lib/statsd/instrument/datagram.rb
statsd-instrument-2.7.0 lib/statsd/instrument/datagram.rb