class Opbeat::DataBuilders::Transactions

Public Instance Methods

build(transactions) click to toggle source
# File lib/opbeat/data_builders/transactions.rb, line 4
def build transactions
  reduced = transactions.reduce({ transactions: {}, traces: {} }) do |data, transaction|
    key = [transaction.endpoint, transaction.result, transaction.timestamp]

    if data[:transactions][key].nil?
      data[:transactions][key] = build_transaction(transaction)
    else
      data[:transactions][key][:durations] << ms(transaction.duration)
    end

    combine_traces transaction.traces, data[:traces]

    data
  end.reduce({}) do |data, kv|
    key, collection = kv
    data[key] = collection.values
    data
  end

  reduced[:traces].each do |trace|
    # traces' start time is average across collected
    trace[:start_time] = trace[:start_time].reduce(0, :+) / trace[:start_time].length
  end

  # preserve root
  root = reduced[:traces].shift
  # re-add root
  reduced[:traces].unshift root

  reduced
end

Private Instance Methods

build_trace(trace) click to toggle source
# File lib/opbeat/data_builders/transactions.rb, line 64
def build_trace trace
  {
    transaction: trace.transaction.endpoint,
    signature: trace.signature,
    durations: [[
      ms(trace.duration),
      ms(trace.transaction.duration)
    ]],
    start_time: [ms(trace.relative_start)],
    kind: trace.kind,
    timestamp: trace.timestamp,
    parents: trace.parents && trace.parents.map(&:signature) || [],
    extra: trace.extra
  }
end
build_transaction(transaction) click to toggle source
# File lib/opbeat/data_builders/transactions.rb, line 54
def build_transaction transaction
  {
    transaction: transaction.endpoint,
    result: transaction.result,
    kind: transaction.kind,
    timestamp: transaction.timestamp,
    durations: [ms(transaction.duration)]
  }
end
combine_traces(traces, into) click to toggle source
# File lib/opbeat/data_builders/transactions.rb, line 38
def combine_traces traces, into
  traces.each do |trace|
    key = [trace.transaction.endpoint, trace.signature, trace.timestamp]

    if into[key].nil?
      into[key] = build_trace(trace)
    else
      into[key][:durations] << [
        ms(trace.duration),
        ms(trace.transaction.duration)
      ]
      into[key][:start_time] << ms(trace.relative_start)
    end
  end
end
ms(nanos) click to toggle source
# File lib/opbeat/data_builders/transactions.rb, line 80
def ms nanos
  nanos.to_f / 1_000_000
end