module Datadog::MeasuredBuffer

Health metrics for trace buffers.

Public Class Methods

new(*_) click to toggle source
Calls superclass method
# File lib/ddtrace/buffer.rb, line 218
def initialize(*_)
  super

  @buffer_accepted = 0
  @buffer_accepted_lengths = 0
  @buffer_dropped = 0
  @buffer_spans = 0
end

Public Instance Methods

add!(trace) click to toggle source
Calls superclass method
# File lib/ddtrace/buffer.rb, line 227
def add!(trace)
  super

  # Emit health metrics
  measure_accept(trace)
end
add_all!(traces) click to toggle source
Calls superclass method
# File lib/ddtrace/buffer.rb, line 234
def add_all!(traces)
  super

  # Emit health metrics
  traces.each { |trace| measure_accept(trace) }
end
drain!() click to toggle source

Stored traces are returned and the local buffer is reset.

Calls superclass method
# File lib/ddtrace/buffer.rb, line 252
def drain!
  traces = super
  measure_pop(traces)
  traces
end
measure_accept(trace) click to toggle source
# File lib/ddtrace/buffer.rb, line 258
def measure_accept(trace)
  @buffer_accepted += 1
  @buffer_accepted_lengths += trace.length

  @buffer_spans += trace.length
rescue StandardError => e
  Datadog.logger.debug("Failed to measure queue accept. Cause: #{e.message} Source: #{Array(e.backtrace).first}")
end
measure_drop(trace) click to toggle source
# File lib/ddtrace/buffer.rb, line 267
def measure_drop(trace)
  @buffer_dropped += 1

  @buffer_spans -= trace.length
rescue StandardError => e
  Datadog.logger.debug("Failed to measure queue drop. Cause: #{e.message} Source: #{Array(e.backtrace).first}")
end
measure_pop(traces) click to toggle source
# File lib/ddtrace/buffer.rb, line 275
def measure_pop(traces)
  # Accepted, cumulative totals
  Datadog.health_metrics.queue_accepted(@buffer_accepted)
  Datadog.health_metrics.queue_accepted_lengths(@buffer_accepted_lengths)

  # Dropped, cumulative totals
  Datadog.health_metrics.queue_dropped(@buffer_dropped)
  # TODO: are we missing a +queue_dropped_lengths+ metric?

  # Queue gauges, current values
  Datadog.health_metrics.queue_max_length(@max_size)
  Datadog.health_metrics.queue_spans(@buffer_spans)
  Datadog.health_metrics.queue_length(traces.length)

  # Reset aggregated metrics
  @buffer_accepted = 0
  @buffer_accepted_lengths = 0
  @buffer_dropped = 0
  @buffer_spans = 0
rescue StandardError => e
  Datadog.logger.debug("Failed to measure queue. Cause: #{e.message} Source: #{Array(e.backtrace).first}")
end
replace!(trace) click to toggle source
Calls superclass method
# File lib/ddtrace/buffer.rb, line 241
def replace!(trace)
  discarded_trace = super

  # Emit health metrics
  measure_accept(trace)
  measure_drop(discarded_trace) if discarded_trace

  discarded_trace
end