Sha256: b71b7d6d4954cf432968143f2eaad7d122b129ff64e5c318b938bad61261adcc

Contents?: true

Size: 1.48 KB

Versions: 4

Compression:

Stored size: 1.48 KB

Contents

# frozen_string_literal: true

module Datadog
  class Statsd
    class Connection
      def initialize(telemetry)
        @telemetry = telemetry
      end

      # Close the underlying socket
      def close
        begin
          @socket && @socket.close if instance_variable_defined?(:@socket)
        rescue StandardError => boom
          logger.error { "Statsd: #{boom.class} #{boom}" } if logger
        end
        @socket = nil
      end

      def write(payload)
        logger.debug { "Statsd: #{payload}" } if logger

        flush_telemetry = telemetry.flush?

        payload += telemetry.flush if flush_telemetry

        send_message(payload)

        telemetry.reset if flush_telemetry

        telemetry.sent(packets: 1, bytes: payload.length)
      rescue StandardError => boom
        # Try once to reconnect if the socket has been closed
        retries ||= 1
        if retries <= 1 &&
          (boom.is_a?(Errno::ENOTCONN) or
           boom.is_a?(Errno::ECONNREFUSED) or
           boom.is_a?(IOError) && boom.message =~ /closed stream/i)
          retries += 1
          begin
            close
            retry
          rescue StandardError => e
            boom = e
          end
        end

        telemetry.dropped(packets: 1, bytes: payload.length)
        logger.error { "Statsd: #{boom.class} #{boom}" } if logger
        nil
      end

      private
      attr_reader :telemetry
      attr_reader :logger

      def socket
        @socket ||= connect
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dogstatsd-ruby-4.8.3 lib/datadog/statsd/connection.rb
dogstatsd-ruby-4.8.2 lib/datadog/statsd/connection.rb
dogstatsd-ruby-4.8.1 lib/datadog/statsd/connection.rb
dogstatsd-ruby-4.8.0 lib/datadog/statsd/connection.rb