Sha256: ba2436eeac353f2004e66b26c380629e271f59971bac3d5eff23668bd7ff89a0

Contents?: true

Size: 1.74 KB

Versions: 6

Compression:

Stored size: 1.74 KB

Contents

# frozen_string_literal: true

# The Datagram class parses and inspects a StatsD datagrams
#
# @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

  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

6 entries across 6 versions & 1 rubygems

Version Path
statsd-instrument-3.0.0 lib/statsd/instrument/datagram.rb
statsd-instrument-3.0.0.pre2 lib/statsd/instrument/datagram.rb
statsd-instrument-2.9.2 lib/statsd/instrument/datagram.rb
statsd-instrument-3.0.0.pre1 lib/statsd/instrument/datagram.rb
statsd-instrument-2.9.1 lib/statsd/instrument/datagram.rb
statsd-instrument-2.9.0 lib/statsd/instrument/datagram.rb