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)