start_transaction

in lib/elastic_apm/instrumenter.rb [106:144]


    def start_transaction(
      name = nil,
      type = nil,
      config:,
      context: nil,
      trace_context: nil
    )
      return nil unless config.instrument?

      if (transaction = current_transaction)
        raise ExistingTransactionError,
          "Transactions may not be nested.\n" \
          "Already inside #{transaction.inspect}"
      end

      if trace_context
        sampled = trace_context.recorded?
        sample_rate = trace_context.tracestate.sample_rate
      else
        sampled = random_sample?(config)
        sample_rate = sampled ? config.transaction_sample_rate : 0
      end

      transaction =
        Transaction.new(
          name,
          type,
          context: context,
          trace_context: trace_context,
          sampled: sampled,
          sample_rate: sample_rate,
          config: config
        )

      transaction.start

      self.current_transaction = transaction
    end