Sha256: d7ccbce4e28d64f8220627af7c35073ad58a853b44b9bcd53cdf8192a8a93a47

Contents?: true

Size: 1.9 KB

Versions: 4

Compression:

Stored size: 1.9 KB

Contents

# frozen_string_literal: true

module ElasticAPM
  # @api private
  class ErrorBuilder
    def initialize(agent)
      @agent = agent
    end

    def build_exception(exception, context: nil, handled: true)
      error = Error.new context: context || Context.new
      error.exception =
        Error::Exception.from_exception(exception, handled: handled)

      Util.reverse_merge!(error.context.labels, @agent.config.default_labels)

      if exception.backtrace
        add_stacktrace error, :exception, exception.backtrace
      end

      add_current_transaction_fields error, ElasticAPM.current_transaction

      error
    end

    def build_log(message, context: nil, backtrace: nil, **attrs)
      error = Error.new context: context || Context.new
      error.log = Error::Log.new(message, **attrs)

      if backtrace
        add_stacktrace error, :log, backtrace
      end

      add_current_transaction_fields error, ElasticAPM.current_transaction

      error
    end

    private

    def add_stacktrace(error, kind, backtrace)
      stacktrace =
        @agent.stacktrace_builder.build(backtrace, type: :error)
      return unless stacktrace

      case kind
      when :exception
        error.exception.stacktrace = stacktrace
      when :log
        error.log.stacktrace = stacktrace
      end

      error.culprit = stacktrace.frames.first&.function
    end

    def add_current_transaction_fields(error, transaction)
      return unless transaction

      error.transaction_id = transaction.id
      error.transaction = {
        sampled: transaction.sampled?,
        type: transaction.type
      }
      error.trace_id = transaction.trace_id
      error.parent_id = ElasticAPM.current_span&.id || transaction.id

      return unless transaction.context

      Util.reverse_merge!(error.context.labels, transaction.context.labels)
      Util.reverse_merge!(error.context.custom, transaction.context.custom)
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
elastic-apm-3.6.0 lib/elastic_apm/error_builder.rb
elastic-apm-3.5.0 lib/elastic_apm/error_builder.rb
elastic-apm-3.4.0 lib/elastic_apm/error_builder.rb
elastic-apm-3.3.0 lib/elastic_apm/error_builder.rb