class Sentry::TelemetryEventBuffer

@!visibility private
This is used internally by the ‘Sentry::Client`.
and sending them to Sentry in a single envelope.
TelemetryEventBuffer is a base class for buffering telemetry events (logs, metrics, etc.)

def add_item(item)

def add_item(item)
  @mutex.synchronize do
    return unless ensure_thread
    if size >= @max_items_before_drop
      log_debug("[#{self.class}] exceeded max capacity, dropping event")
      @client.transport.record_lost_event(:queue_overflow, @data_category)
    else
      @pending_items << item
    end
    send_items if size >= @max_items
  end
  self
end

def clear!

def clear!
  @pending_items.clear
end

def empty?

def empty?
  @pending_items.empty?
end

def flush

def flush
  @mutex.synchronize do
    return if empty?
    log_debug("[#{self.class}] flushing #{size} #{@event_class}")
    send_items
  end
  self
end

def initialize(configuration, client, event_class:, max_items:, max_items_before_drop:, envelope_type:, envelope_content_type:, before_send:)

def initialize(configuration, client, event_class:, max_items:, max_items_before_drop:, envelope_type:, envelope_content_type:, before_send:)
  super(configuration.sdk_logger, FLUSH_INTERVAL)
  @client = client
  @dsn = configuration.dsn
  @debug = configuration.debug
  @event_class = event_class
  @max_items = max_items
  @max_items_before_drop = max_items_before_drop
  @envelope_type = envelope_type
  @data_category = Sentry::Envelope::Item.data_category(@envelope_type)
  @envelope_content_type = envelope_content_type
  @before_send = before_send
  @pending_items = []
  @mutex = Mutex.new
  log_debug("[#{self.class}] Initialized buffer with max_items=#{@max_items}, flush_interval=#{FLUSH_INTERVAL}s")
end

def send_items

def send_items
  envelope = Envelope.new(
    event_id: Sentry::Utils.uuid,
    sent_at: Sentry.utc_now.iso8601,
    dsn: @dsn,
    sdk: Sentry.sdk_meta
  )
  discarded_count = 0
  envelope_items = []
  if @before_send
    @pending_items.each do |item|
      processed_item = @before_send.call(item)
      if processed_item
        envelope_items << processed_item.to_h
      else
        discarded_count += 1
      end
    end
  else
    envelope_items = @pending_items.map(&:to_h)
  end
  unless discarded_count.zero?
    @client.transport.record_lost_event(:before_send, @data_category, num: discarded_count)
  end
  return if envelope_items.empty?
  envelope.add_item(
    {
      type: @envelope_type,
      item_count: envelope_items.size,
      content_type: @envelope_content_type
    },
    { items: envelope_items }
  )
  @client.send_envelope(envelope)
rescue => e
  log_error("[#{self.class}] Failed to send #{@event_class}", e, debug: @debug)
ensure
  clear!
end

def size

def size
  @pending_items.size
end