class StatsD::Instrument::Backends::UDPBackend::DogStatsDProtocol

Constants

SERVICE_CHECK_STATUSES
SUPPORTED_METRIC_TYPES

Public Instance Methods

generate_packet(metric) click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 14
def generate_packet(metric)
  packet = +""

  if metric.type == :_e
    escaped_title = metric.name.gsub("\n", "\\n")
    escaped_text = metric.value.gsub("\n", "\\n")

    packet << "_e{#{escaped_title.size},#{escaped_text.size}}:#{escaped_title}|#{escaped_text}"
    packet << "|h:#{metric.metadata[:hostname]}" if metric.metadata[:hostname]
    packet << "|d:#{metric.metadata[:timestamp].to_i}" if metric.metadata[:timestamp]
    packet << "|k:#{metric.metadata[:aggregation_key]}" if metric.metadata[:aggregation_key]
    packet << "|p:#{metric.metadata[:priority]}" if metric.metadata[:priority]
    packet << "|s:#{metric.metadata[:source_type_name]}" if metric.metadata[:source_type_name]
    packet << "|t:#{metric.metadata[:alert_type]}" if metric.metadata[:alert_type]
    packet << "|##{metric.tags.join(',')}" if metric.tags

  elsif metric.type == :_sc
    status = metric.value.is_a?(Integer) ? metric.value : SERVICE_CHECK_STATUSES.fetch(metric.value.to_sym)

    packet << "_sc|#{metric.name}|#{status}"
    packet << "|h:#{metric.metadata[:hostname]}" if metric.metadata[:hostname]
    packet << "|d:#{metric.metadata[:timestamp].to_i}" if metric.metadata[:timestamp]
    packet << "|##{metric.tags.join(',')}" if metric.tags
    packet << "|m:#{metric.metadata[:message]}" if metric.metadata[:message]

  else
    packet << "#{metric.name}:#{metric.value}|#{metric.type}"
    packet << "|@#{metric.sample_rate}" if metric.sample_rate < 1
    packet << "|##{metric.tags.join(',')}" if metric.tags
  end

  packet
end