Class: Appsignal::Transaction
Defined Under Namespace
Classes: GenericRequest, NilTransaction
Constant Summary
collapse
- HTTP_REQUEST =
'http_request'.freeze
- BACKGROUND_JOB =
'background_job'.freeze
- FRONTEND =
'frontend'.freeze
- BLANK =
''.freeze
- ENV_METHODS =
Based on what Rails uses + some variables we’d like to show
%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
HTTP_X_REQUEST_START HTTP_X_MIDDLEWARE_START HTTP_X_QUEUE_START
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
HTTP_X_AUTH_TOKEN)
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#complete ⇒ Object
-
#discard! ⇒ Object
-
#discarded? ⇒ Boolean
-
#finish_event(name, title, body, body_format = Appsignal::EventFormatter::DEFAULT) ⇒ Object
-
#initialize(transaction_id, namespace, request, options = {}) ⇒ Transaction
constructor
A new instance of Transaction.
-
#instrument(name, title = nil, body = nil, body_format = Appsignal::EventFormatter::DEFAULT) ⇒ Object
-
#nil_transaction? ⇒ Boolean
-
#pause! ⇒ Object
-
#paused? ⇒ Boolean
-
#record_event(name, title, body, duration, body_format = Appsignal::EventFormatter::DEFAULT) ⇒ Object
-
#restore! ⇒ Object
-
#resume! ⇒ Object
-
#sample_data ⇒ Object
-
#set_action(action) ⇒ Object
-
#set_error(error) ⇒ Object
(also: #add_exception)
-
#set_http_or_background_action(from = request.params) ⇒ Object
-
#set_http_or_background_queue_start ⇒ Object
-
#set_metadata(key, value) ⇒ Object
-
#set_queue_start(start) ⇒ Object
-
#set_sample_data(key, data) ⇒ Object
-
#set_tags(given_tags = {}) ⇒ Object
-
#start_event ⇒ Object
-
#store(key) ⇒ Object
Constructor Details
#initialize(transaction_id, namespace, request, options = {}) ⇒ Transaction
Returns a new instance of Transaction.
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# File 'lib/appsignal/transaction.rb', line 61
def initialize(transaction_id, namespace, request, options={})
@transaction_id = transaction_id
@namespace = namespace
@request = request
@paused = false
@discarded = false
@tags = {}
@store = Hash.new({})
@options = options
@options[:params_method] ||= :params
@ext = Appsignal::Extension.start_transaction(
@transaction_id,
@namespace,
self.class.garbage_collection_profiler.total_time
)
end
|
Instance Attribute Details
#discarded ⇒ Object
Returns the value of attribute discarded.
59
60
61
|
# File 'lib/appsignal/transaction.rb', line 59
def discarded
@discarded
end
|
Returns the value of attribute ext.
59
60
61
|
# File 'lib/appsignal/transaction.rb', line 59
def ext
@ext
end
|
#namespace ⇒ Object
Returns the value of attribute namespace.
59
60
61
|
# File 'lib/appsignal/transaction.rb', line 59
def namespace
@namespace
end
|
Returns the value of attribute options.
59
60
61
|
# File 'lib/appsignal/transaction.rb', line 59
def options
@options
end
|
Returns the value of attribute paused.
59
60
61
|
# File 'lib/appsignal/transaction.rb', line 59
def paused
@paused
end
|
Returns the value of attribute request.
59
60
61
|
# File 'lib/appsignal/transaction.rb', line 59
def request
@request
end
|
Returns the value of attribute tags.
59
60
61
|
# File 'lib/appsignal/transaction.rb', line 59
def tags
@tags
end
|
#transaction_id ⇒ Object
Returns the value of attribute transaction_id.
59
60
61
|
# File 'lib/appsignal/transaction.rb', line 59
def transaction_id
@transaction_id
end
|
Class Method Details
.complete_current! ⇒ Object
46
47
48
49
50
51
52
|
# File 'lib/appsignal/transaction.rb', line 46
def complete_current!
current.complete
rescue => e
Appsignal.logger.error("Failed to complete transaction ##{current.transaction_id}. #{e.message}")
ensure
Thread.current[:appsignal_transaction] = nil
end
|
.create(id, namespace, request, options = {}) ⇒ Object
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
# File 'lib/appsignal/transaction.rb', line 23
def create(id, namespace, request, options={})
if options.include?(:force) && options[:force]
Thread.current[:appsignal_transaction] = nil
end
if Thread.current[:appsignal_transaction] != nil
Appsignal.logger.debug("Trying to start new transaction #{id} but #{current.transaction_id} is already running. Using #{current.transaction_id}")
current
else
Thread.current[:appsignal_transaction] = Appsignal::Transaction.new(id, namespace, request, options)
end
end
|
42
43
44
|
# File 'lib/appsignal/transaction.rb', line 42
def current
Thread.current[:appsignal_transaction] || NilTransaction.new
end
|
.garbage_collection_profiler ⇒ Object
Instance Method Details
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/appsignal/transaction.rb', line 83
def complete
if discarded?
Appsignal.logger.debug('Skipping transaction because it was manually discarded.'.freeze)
return
end
if @ext.finish(self.class.garbage_collection_profiler.total_time)
sample_data
end
@ext.complete
end
|
106
107
108
|
# File 'lib/appsignal/transaction.rb', line 106
def discard!
@discarded = true
end
|
#discarded? ⇒ Boolean
114
115
116
|
# File 'lib/appsignal/transaction.rb', line 114
def discarded?
@discarded == true
end
|
#finish_event(name, title, body, body_format = Appsignal::EventFormatter::DEFAULT) ⇒ Object
200
201
202
203
204
205
206
207
208
|
# File 'lib/appsignal/transaction.rb', line 200
def finish_event(name, title, body, body_format=Appsignal::EventFormatter::DEFAULT)
@ext.finish_event(
name,
title || BLANK,
body || BLANK,
body_format || Appsignal::EventFormatter::DEFAULT,
self.class.garbage_collection_profiler.total_time
)
end
|
#instrument(name, title = nil, body = nil, body_format = Appsignal::EventFormatter::DEFAULT) ⇒ Object
221
222
223
224
225
226
|
# File 'lib/appsignal/transaction.rb', line 221
def instrument(name, title=nil, body=nil, body_format=Appsignal::EventFormatter::DEFAULT)
start_event
r = yield
finish_event(name, title, body, body_format)
r
end
|
#nil_transaction? ⇒ Boolean
79
80
81
|
# File 'lib/appsignal/transaction.rb', line 79
def nil_transaction?
false
end
|
94
95
96
|
# File 'lib/appsignal/transaction.rb', line 94
def pause!
@paused = true
end
|
#paused? ⇒ Boolean
102
103
104
|
# File 'lib/appsignal/transaction.rb', line 102
def paused?
@paused == true
end
|
#record_event(name, title, body, duration, body_format = Appsignal::EventFormatter::DEFAULT) ⇒ Object
210
211
212
213
214
215
216
217
218
219
|
# File 'lib/appsignal/transaction.rb', line 210
def record_event(name, title, body, duration, body_format=Appsignal::EventFormatter::DEFAULT)
@ext.record_event(
name,
title || BLANK,
body || BLANK,
duration,
body_format || Appsignal::EventFormatter::DEFAULT,
self.class.garbage_collection_profiler.total_time
)
end
|
110
111
112
|
# File 'lib/appsignal/transaction.rb', line 110
def restore!
@discarded = false
end
|
98
99
100
|
# File 'lib/appsignal/transaction.rb', line 98
def resume!
@paused = false
end
|
#sample_data ⇒ Object
170
171
172
173
174
175
176
177
178
179
180
|
# File 'lib/appsignal/transaction.rb', line 170
def sample_data
{
:params => sanitized_params,
:environment => sanitized_environment,
:session_data => sanitized_session_data,
:metadata => metadata,
:tags => sanitized_tags
}.each do |key, data|
set_sample_data(key, data)
end
end
|
#set_action(action) ⇒ Object
126
127
128
129
|
# File 'lib/appsignal/transaction.rb', line 126
def set_action(action)
return unless action
@ext.set_action(action)
end
|
#set_error(error) ⇒ Object
Also known as:
add_exception
#set_http_or_background_action(from = request.params) ⇒ Object
131
132
133
134
135
136
137
138
|
# File 'lib/appsignal/transaction.rb', line 131
def set_http_or_background_action(from=request.params)
return unless from
group_and_action = [
from[:controller] || from[:class],
from[:action] || from[:method]
]
set_action(group_and_action.compact.join('#'))
end
|
#set_http_or_background_queue_start ⇒ Object
147
148
149
150
151
152
153
|
# File 'lib/appsignal/transaction.rb', line 147
def set_http_or_background_queue_start
if namespace == HTTP_REQUEST
set_queue_start(http_queue_start)
elsif namespace == BACKGROUND_JOB
set_queue_start(background_queue_start)
end
end
|
155
156
157
158
|
# File 'lib/appsignal/transaction.rb', line 155
def set_metadata(key, value)
return unless key && value
@ext.set_metadata(key, value)
end
|
#set_queue_start(start) ⇒ Object
140
141
142
143
144
145
|
# File 'lib/appsignal/transaction.rb', line 140
def set_queue_start(start)
return unless start
@ext.set_queue_start(start)
rescue RangeError
Appsignal.logger.warn("Queue start value #{start} is too big")
end
|
#set_sample_data(key, data) ⇒ Object
160
161
162
163
164
165
166
167
168
|
# File 'lib/appsignal/transaction.rb', line 160
def set_sample_data(key, data)
return unless key && data && (data.is_a?(Array) || data.is_a?(Hash))
@ext.set_sample_data(
key.to_s,
Appsignal::Utils.data_generate(data)
)
rescue RuntimeError => e
Appsignal.logger.error("Error generating data (#{e.class}: #{e.message}) for '#{data.inspect}'")
end
|
122
123
124
|
# File 'lib/appsignal/transaction.rb', line 122
def set_tags(given_tags={})
@tags.merge!(given_tags)
end
|
#start_event ⇒ Object
196
197
198
|
# File 'lib/appsignal/transaction.rb', line 196
def start_event
@ext.start_event(self.class.garbage_collection_profiler.total_time)
end
|
#store(key) ⇒ Object
118
119
120
|
# File 'lib/appsignal/transaction.rb', line 118
def store(key)
@store[key]
end
|