Sha256: 0da8f7f2d8b79df090c95230c3e533f533d1472151843140f0dcf70e8cfffa5a

Contents?: true

Size: 2 KB

Versions: 58

Compression:

Stored size: 2 KB

Contents

# frozen_string_literal: true
# Implements a small and limited StatsD implementation to reduce importing unnecessary dependencies because
# we don't want to require on the bundle which would slow down a CI Queue run

require 'socket'

module Minitest
  module Queue
    class Statsd
      attr_reader :addr, :namespace, :default_tags

      def initialize(addr: nil, default_tags: [], namespace: nil)
        @default_tags = default_tags
        @namespace = namespace
        @addr = addr

        if addr
          host, port = addr.split(':', 2)
          @socket = UDPSocket.new
          @socket.connect(host, Integer(port))
        end
      rescue SocketError
        # No-op, we shouldn't fail CI because of statsd
      end

      def increment(metric, tags: [], value: 1)
        send_metric(type: 'c', value: value, metric: metric, tags: default_tags + tags)
      end

      def measure(metric, duration = nil, tags: [], &block)
        if block_given?
          return_value, duration = Minitest::Queue::Statsd.measure_duration(&block)
        elsif duration.nil?
          raise ArgumentError, "You need to pass a block or pass a float as second argument."
        end
        send_metric(type: 'ms', value: duration, metric: metric, tags: default_tags + tags)
        return_value
      end

      def self.measure_duration
        before = Process.clock_gettime(Process::CLOCK_REALTIME, :millisecond)
        return_value = yield
        after = Process.clock_gettime(Process::CLOCK_REALTIME, :millisecond)

        [return_value, after - before]
      end

      private

      def send_metric(type:, metric:, value:, tags:)
        return unless @socket 
        metric_snippet = namespace.nil? ? metric : "#{namespace}.#{metric}"
        tags_snippet = tags.empty? ? '' : "|##{tags.join(',')}"
        payload = "#{metric_snippet}:#{value}|#{type}#{tags_snippet}"
        @socket.send(payload, 0)
      rescue SystemCallError
        # No-op, we shouldn't fail or spam output due to statsd issues
      end
    end
  end
end

Version data entries

58 entries across 58 versions & 1 rubygems

Version Path
ci-queue-0.62.0 lib/minitest/queue/statsd.rb
ci-queue-0.61.0 lib/minitest/queue/statsd.rb
ci-queue-0.60.0 lib/minitest/queue/statsd.rb
ci-queue-0.59.0 lib/minitest/queue/statsd.rb
ci-queue-0.58.0 lib/minitest/queue/statsd.rb
ci-queue-0.57.0 lib/minitest/queue/statsd.rb
ci-queue-0.56.0 lib/minitest/queue/statsd.rb
ci-queue-0.55.0 lib/minitest/queue/statsd.rb
ci-queue-0.52.0 lib/minitest/queue/statsd.rb
ci-queue-0.51.0 lib/minitest/queue/statsd.rb
ci-queue-0.50.0 lib/minitest/queue/statsd.rb
ci-queue-0.49.0 lib/minitest/queue/statsd.rb
ci-queue-0.48.0 lib/minitest/queue/statsd.rb
ci-queue-0.47.0 lib/minitest/queue/statsd.rb
ci-queue-0.46.0 lib/minitest/queue/statsd.rb
ci-queue-0.45.0 lib/minitest/queue/statsd.rb
ci-queue-0.44.0 lib/minitest/queue/statsd.rb
ci-queue-0.43.0 lib/minitest/queue/statsd.rb
ci-queue-0.42.0 lib/minitest/queue/statsd.rb
ci-queue-0.41.0 lib/minitest/queue/statsd.rb