lib/appsignal/transaction.rb in appsignal-1.2.0.alpha.1 vs lib/appsignal/transaction.rb in appsignal-1.2.0.alpha.2

- old
+ new

@@ -1,10 +1,11 @@ module Appsignal class Transaction HTTP_REQUEST = 'http_request'.freeze BACKGROUND_JOB = 'background_job'.freeze FRONTEND = 'frontend'.freeze + BLANK = ''.freeze # Based on what Rails uses + some variables we'd like to show ENV_METHODS = %w(CONTENT_LENGTH AUTH_TYPE GATEWAY_INTERFACE PATH_TRANSLATED REMOTE_HOST REMOTE_IDENT REMOTE_USER REMOTE_ADDR REQUEST_METHOD SERVER_NAME SERVER_PORT SERVER_PROTOCOL REQUEST_URI PATH_INFO @@ -13,10 +14,17 @@ HTTP_X_QUEUE_TIME HTTP_X_HEROKU_QUEUE_WAIT_TIME HTTP_X_APPLICATION_START HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_CONNECTION HTTP_USER_AGENT HTTP_FROM HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_X_FORWARDED_FOR HTTP_CLIENT_IP HTTP_RANGE) + JSON_EXCEPTIONS = [ + IOError, + NotImplementedError, + JSON::GeneratorError, + Encoding::UndefinedConversionError + ].freeze + class << self def create(id, namespace, request, options={}) # Check if we already have a running transaction if Thread.current[:appsignal_transaction] != nil # Log the issue and return the current transaction @@ -41,11 +49,11 @@ ensure Thread.current[:appsignal_transaction] = nil end end - attr_reader :transaction_index, :transaction_id, :namespace, :request, :paused, :tags, :options + attr_reader :ext, :transaction_id, :namespace, :request, :paused, :tags, :options def initialize(transaction_id, namespace, request, options={}) @transaction_id = transaction_id @namespace = namespace @request = request @@ -53,22 +61,22 @@ @tags = {} @store = Hash.new({}) @options = options @options[:params_method] ||= :params - @transaction_index = Appsignal::Extension.start_transaction(@transaction_id, @namespace) + @ext = Appsignal::Extension.start_transaction(@transaction_id, @namespace) end def nil_transaction? false end def complete - if Appsignal::Extension.finish_transaction(transaction_index) + if @ext.finish sample_data end - Appsignal::Extension.complete_transaction(transaction_index) + @ext.complete end def pause! @paused = true end @@ -89,11 +97,11 @@ @tags.merge!(given_tags) end def set_action(action) return unless action - Appsignal::Extension.set_transaction_action(transaction_index, action) + @ext.set_action(action) end def set_http_or_background_action(from=request.params) return unless from group_and_action = [ @@ -103,11 +111,11 @@ set_action(group_and_action.compact.join('#')) end def set_queue_start(start) return unless start - Appsignal::Extension.set_transaction_queue_start(transaction_index, start) + @ext.set_queue_start(start) end def set_http_or_background_queue_start if namespace == HTTP_REQUEST set_queue_start(http_queue_start) @@ -116,22 +124,21 @@ end end def set_metadata(key, value) return unless key && value - Appsignal::Extension.set_transaction_metadata(transaction_index, key, value) + @ext.set_metadata(key, value) end def set_sample_data(key, data) return unless key && data && (data.is_a?(Array) || data.is_a?(Hash)) - Appsignal::Extension.set_transaction_sample_data( - transaction_index, + @ext.set_sample_data( key.to_s, Appsignal::Utils.json_generate(data) ) - rescue JSON::GeneratorError=>e - Appsignal.logger.error("JSON generate error (#{e.message}) for '#{data.inspect}'") + rescue *JSON_EXCEPTIONS => e + Appsignal.logger.error("Error generating JSON (#{e.class}: #{e.message}) for '#{data.inspect}'") end def sample_data { :params => sanitized_params, @@ -148,19 +155,31 @@ return unless error return unless Appsignal.active? return if Appsignal.is_ignored_error?(error) backtrace = cleaned_backtrace(error.backtrace) - Appsignal::Extension.set_transaction_error( - transaction_index, + @ext.set_error( error.class.name, error.message.to_s, backtrace ? Appsignal::Utils.json_generate(backtrace) : '' ) - rescue JSON::GeneratorError=>e - Appsignal.logger.error("JSON generate error (#{e.message}) for '#{backtrace.inspect}'") + rescue *JSON_EXCEPTIONS => e + Appsignal.logger.error("Error generating JSON (#{e.class}: #{e.message}) for '#{backtrace.inspect}'") end alias_method :add_exception, :set_error + + def start_event + @ext.start_event + end + + def finish_event(name, title, body, body_format) + @ext.finish_event( + name, + title || BLANK, + body || BLANK, + body_format || 0 + ) + end class GenericRequest attr_reader :env def initialize(env)