class Datadog::Statsd::MessageBuffer
Constants
- PAYLOAD_SIZE_TOLERANCE
Attributes
Public Class Methods
Source
# File lib/datadog/statsd/message_buffer.rb, line 8 def initialize(connection, max_payload_size: nil, max_pool_size: DEFAULT_BUFFER_POOL_SIZE, overflowing_stategy: :drop, serializer: ) raise ArgumentError, 'max_payload_size keyword argument must be provided' unless max_payload_size raise ArgumentError, 'max_pool_size keyword argument must be provided' unless max_pool_size @connection = connection @max_payload_size = max_payload_size @max_pool_size = max_pool_size @overflowing_stategy = overflowing_stategy @serializer = serializer @buffer = String.new clear_buffer end
Public Instance Methods
Source
# File lib/datadog/statsd/message_buffer.rb, line 27 def add(message) # Serializes the message if it hasn't been already. Part of the # delay_serialization feature. if message.is_a?(Array) stat, delta, type, tags, sample_rate, cardinality = message message = @serializer.to_stat(stat, delta, type, tags: tags, sample_rate: sample_rate, cardinality: cardinality) end message_size = message.bytesize return nil unless message_size > 0 # to avoid adding empty messages to the buffer return nil unless ensure_sendable!(message_size) flush if should_flush?(message_size) buffer << "\n" unless buffer.empty? buffer << message @message_count += 1 # flush when we're pretty sure that we won't be able # to add another message to the buffer flush if preemptive_flush? true end
Source
# File lib/datadog/statsd/message_buffer.rb, line 59 def flush return if buffer.empty? connection.write(buffer) clear_buffer end
Source
# File lib/datadog/statsd/message_buffer.rb, line 54 def reset clear_buffer connection.reset_telemetry end
Private Instance Methods
Source
# File lib/datadog/statsd/message_buffer.rb, line 101 def bytesize_threshold @bytesize_threshold ||= (max_payload_size - PAYLOAD_SIZE_TOLERANCE * max_payload_size).to_i end
Source
# File lib/datadog/statsd/message_buffer.rb, line 82 def clear_buffer buffer.clear @message_count = 0 end
Source
# File lib/datadog/statsd/message_buffer.rb, line 91 def ensure_sendable!(message_size) return true if message_size <= max_payload_size if overflowing_stategy == :raise raise Error, 'Message too big for payload limit' end false end
Source
# File lib/datadog/statsd/message_buffer.rb, line 87 def preemptive_flush? @message_count == max_pool_size || buffer.bytesize > bytesize_threshold end
Source
# File lib/datadog/statsd/message_buffer.rb, line 76 def should_flush?(message_size) return true if buffer.bytesize + 1 + message_size >= max_payload_size false end