appsignal 0.10.0.beta.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +7 -2
- data/lib/appsignal/agent.rb +6 -7
- data/lib/appsignal/transaction.rb +14 -1
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/agent_spec.rb +1 -7
- data/spec/lib/appsignal/transaction_spec.rb +26 -1
- data/spec/lib/appsignal/transmitter_spec.rb +10 -17
- metadata +40 -24
- checksums.yaml +0 -7
data/CHANGELOG.md
CHANGED
@@ -6,7 +6,12 @@
|
|
6
6
|
* Use Appsignal.monitor_transaction to instrument and log errors for
|
7
7
|
custom actions
|
8
8
|
* Add option to ignore a specific action
|
9
|
-
|
9
|
+
|
10
|
+
# 0.9.6
|
11
|
+
* Convert to primitives before sending through pipe
|
12
|
+
|
13
|
+
# 0.9.5
|
14
|
+
Yanked
|
10
15
|
|
11
16
|
# 0.9.4
|
12
17
|
* Log Rails and Sinatra version
|
@@ -66,7 +71,7 @@ Yanked
|
|
66
71
|
* Alias tag_request to tag_job, for background jobs
|
67
72
|
* Skip sanitization of env if env is nil
|
68
73
|
* Small bugfix in forking logic
|
69
|
-
* Don't send params if send_params is off in config
|
74
|
+
* Don't send params if send_params is off in config
|
70
75
|
* Remove --repository option in CLI
|
71
76
|
* Name option in appsignal notify_of_deploy CLI
|
72
77
|
* Don't call to_hash on ENV
|
data/lib/appsignal/agent.rb
CHANGED
@@ -2,8 +2,8 @@ module Appsignal
|
|
2
2
|
class Agent
|
3
3
|
ACTION = 'log_entries'.freeze
|
4
4
|
|
5
|
-
attr_accessor :aggregator, :
|
6
|
-
:
|
5
|
+
attr_accessor :aggregator, :thread, :master_pid, :pid, :active, :sleep_time,
|
6
|
+
:transmitter, :subscriber, :paused
|
7
7
|
|
8
8
|
def initialize
|
9
9
|
return unless Appsignal.active?
|
@@ -16,7 +16,6 @@ module Appsignal
|
|
16
16
|
@pid = @master_pid
|
17
17
|
@aggregator = Aggregator.new
|
18
18
|
@transmitter = Transmitter.new(ACTION)
|
19
|
-
@mutex = Mutex.new
|
20
19
|
subscribe
|
21
20
|
start_thread
|
22
21
|
Appsignal.logger.info('Started Appsignal agent')
|
@@ -94,7 +93,7 @@ module Appsignal
|
|
94
93
|
# Replace aggregator while making sure no thread
|
95
94
|
# is adding to it's queue
|
96
95
|
aggregator_to_be_sent = nil
|
97
|
-
|
96
|
+
Thread.exclusive do
|
98
97
|
aggregator_to_be_sent = aggregator
|
99
98
|
@aggregator = Aggregator.new
|
100
99
|
end
|
@@ -113,7 +112,7 @@ module Appsignal
|
|
113
112
|
Appsignal.logger.debug('Clearing queue')
|
114
113
|
# Replace aggregator while making sure no thread
|
115
114
|
# is adding to it's queue
|
116
|
-
|
115
|
+
Thread.exclusive do
|
117
116
|
@aggregator = Aggregator.new
|
118
117
|
end
|
119
118
|
end
|
@@ -121,7 +120,7 @@ module Appsignal
|
|
121
120
|
def forked!
|
122
121
|
Appsignal.logger.info('Forked worker process')
|
123
122
|
@pid = Process.pid
|
124
|
-
|
123
|
+
Thread.exclusive do
|
125
124
|
@aggregator = Aggregator.new
|
126
125
|
end
|
127
126
|
resubscribe
|
@@ -131,7 +130,7 @@ module Appsignal
|
|
131
130
|
def shutdown(send_current_queue=false, reason=nil)
|
132
131
|
Appsignal.logger.info("Shutting down agent (#{reason})")
|
133
132
|
unsubscribe
|
134
|
-
|
133
|
+
stop_thread
|
135
134
|
send_queue if send_current_queue && @aggregator.has_transactions?
|
136
135
|
end
|
137
136
|
|
@@ -85,7 +85,7 @@
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def exception?
|
88
|
-
!!exception
|
88
|
+
!! exception
|
89
89
|
end
|
90
90
|
|
91
91
|
def slow_request?
|
@@ -98,20 +98,32 @@
|
|
98
98
|
end
|
99
99
|
|
100
100
|
def truncate!
|
101
|
+
return if truncated?
|
101
102
|
process_action_event.payload.clear
|
102
103
|
events.clear
|
103
104
|
tags.clear
|
104
105
|
sanitized_environment.clear
|
105
106
|
sanitized_session_data.clear
|
106
107
|
@env = nil
|
108
|
+
@truncated = true
|
109
|
+
end
|
110
|
+
|
111
|
+
def truncated?
|
112
|
+
!! @truncated
|
107
113
|
end
|
108
114
|
|
109
115
|
def convert_values_to_primitives!
|
116
|
+
return if have_values_been_converted_to_primitives?
|
110
117
|
Appsignal::Transaction::ParamsSanitizer.sanitize!(@process_action_event.payload) if @process_action_event
|
111
118
|
@events.map do |o|
|
112
119
|
Appsignal::Transaction::ParamsSanitizer.sanitize(o.payload)
|
113
120
|
end
|
114
121
|
add_sanitized_context!
|
122
|
+
@have_values_been_converted_to_primitives = true
|
123
|
+
end
|
124
|
+
|
125
|
+
def have_values_been_converted_to_primitives?
|
126
|
+
!! @have_values_been_converted_to_primitives
|
115
127
|
end
|
116
128
|
|
117
129
|
def type
|
@@ -129,6 +141,7 @@
|
|
129
141
|
Appsignal.transactions.delete(@request_id)
|
130
142
|
if process_action_event || exception?
|
131
143
|
if Appsignal::Pipe.current
|
144
|
+
convert_values_to_primitives!
|
132
145
|
Appsignal.logger.debug("Writing transaction to pipe: #{@request_id}")
|
133
146
|
Appsignal::Pipe.current.write(self)
|
134
147
|
else
|
data/lib/appsignal/version.rb
CHANGED
@@ -10,12 +10,6 @@ describe Appsignal::Agent do
|
|
10
10
|
|
11
11
|
let(:transaction) { regular_transaction }
|
12
12
|
|
13
|
-
context "supporting objects" do
|
14
|
-
its(:mutex) { should be_a(Mutex) }
|
15
|
-
its(:aggregator) { should be_a(Appsignal::Aggregator) }
|
16
|
-
its(:transmitter) { should be_a(Appsignal::Transmitter) }
|
17
|
-
end
|
18
|
-
|
19
13
|
context "pid" do
|
20
14
|
its(:master_pid) { should == Process.pid }
|
21
15
|
its(:pid) { should == Process.pid }
|
@@ -61,7 +55,7 @@ describe Appsignal::Agent do
|
|
61
55
|
subject.should_receive(:send_queue).at_least(:twice)
|
62
56
|
|
63
57
|
subject.start_thread
|
64
|
-
sleep
|
58
|
+
sleep 2
|
65
59
|
end
|
66
60
|
end
|
67
61
|
|
@@ -234,6 +234,15 @@ describe Appsignal::Transaction do
|
|
234
234
|
subject.process_action_event.payload.should be_empty
|
235
235
|
subject.events.should be_empty
|
236
236
|
subject.tags.should be_empty
|
237
|
+
subject.truncated?.should be_true
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should not truncate twice" do
|
241
|
+
subject.process_action_event.payload.should_receive(:clear).once
|
242
|
+
subject.events.should_receive(:clear).once
|
243
|
+
|
244
|
+
subject.truncate!
|
245
|
+
subject.truncate!
|
237
246
|
end
|
238
247
|
end
|
239
248
|
|
@@ -282,6 +291,14 @@ describe Appsignal::Transaction do
|
|
282
291
|
subject
|
283
292
|
event_payload.should == before
|
284
293
|
end
|
294
|
+
|
295
|
+
it "should not covert to primitives twice" do
|
296
|
+
transaction.convert_values_to_primitives!
|
297
|
+
transaction.have_values_been_converted_to_primitives?.should be_true
|
298
|
+
|
299
|
+
Appsignal::Transaction::ParamsSanitizer.should_not_receive(:sanitize!)
|
300
|
+
transaction.convert_values_to_primitives!
|
301
|
+
end
|
285
302
|
end
|
286
303
|
end
|
287
304
|
|
@@ -355,12 +372,20 @@ describe Appsignal::Transaction do
|
|
355
372
|
|
356
373
|
context 'when using pipes' do
|
357
374
|
let(:pipe) { double }
|
358
|
-
before
|
375
|
+
before do
|
376
|
+
Appsignal::Pipe.stub(:current => pipe)
|
377
|
+
pipe.stub(:write => true)
|
378
|
+
transaction.stub(:convert_values_to_primitives! => true)
|
379
|
+
end
|
359
380
|
|
360
381
|
it "should send itself trough the pipe" do
|
361
382
|
pipe.should_receive(:write).with(transaction)
|
362
383
|
end
|
363
384
|
|
385
|
+
it "should convert itself to primitives" do
|
386
|
+
transaction.should_receive(:convert_values_to_primitives!)
|
387
|
+
end
|
388
|
+
|
364
389
|
after { transaction.complete! }
|
365
390
|
end
|
366
391
|
end
|
@@ -40,25 +40,18 @@ describe Appsignal::Transmitter do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
describe "#http_post" do
|
43
|
-
|
44
|
-
post = double(:post)
|
45
|
-
post.should_receive(:[]=).with(
|
46
|
-
'Content-Type',
|
47
|
-
'application/json; charset=UTF-8'
|
48
|
-
)
|
49
|
-
post.should_receive(:[]=).with(
|
50
|
-
'Content-Encoding',
|
51
|
-
'gzip'
|
52
|
-
)
|
53
|
-
post.should_receive(:body=).with(
|
54
|
-
Zlib::Deflate.deflate("{\"the\":\"payload\"}", Zlib::BEST_SPEED)
|
55
|
-
)
|
43
|
+
before do
|
56
44
|
Socket.stub(:gethostname => 'app1.local')
|
45
|
+
end
|
46
|
+
|
47
|
+
subject { instance.send(:http_post, 'the' => 'payload') }
|
48
|
+
|
49
|
+
its(:body) { should == Zlib::Deflate.deflate("{\"the\":\"payload\"}", Zlib::BEST_SPEED) }
|
50
|
+
its(:path) { should == instance.uri.request_uri }
|
57
51
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
instance.send(:http_post, :the => :payload)
|
52
|
+
it "should have the correct headers" do
|
53
|
+
subject['Content-Type'].should == 'application/json; charset=UTF-8'
|
54
|
+
subject['Content-Encoding'].should == 'gzip'
|
62
55
|
end
|
63
56
|
end
|
64
57
|
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appsignal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.0
|
4
|
+
version: 0.10.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Robert Beekman
|
@@ -12,104 +13,118 @@ authors:
|
|
12
13
|
autorequire:
|
13
14
|
bindir: bin
|
14
15
|
cert_chain: []
|
15
|
-
date: 2014-08-
|
16
|
+
date: 2014-08-13 00:00:00.000000000 Z
|
16
17
|
dependencies:
|
17
18
|
- !ruby/object:Gem::Dependency
|
18
19
|
name: rack
|
19
20
|
requirement: !ruby/object:Gem::Requirement
|
21
|
+
none: false
|
20
22
|
requirements:
|
21
|
-
- -
|
23
|
+
- - ! '>='
|
22
24
|
- !ruby/object:Gem::Version
|
23
25
|
version: '0'
|
24
26
|
type: :runtime
|
25
27
|
prerelease: false
|
26
28
|
version_requirements: !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
27
30
|
requirements:
|
28
|
-
- -
|
31
|
+
- - ! '>='
|
29
32
|
- !ruby/object:Gem::Version
|
30
33
|
version: '0'
|
31
34
|
- !ruby/object:Gem::Dependency
|
32
35
|
name: thread_safe
|
33
36
|
requirement: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
34
38
|
requirements:
|
35
|
-
- -
|
39
|
+
- - ! '>='
|
36
40
|
- !ruby/object:Gem::Version
|
37
41
|
version: '0'
|
38
42
|
type: :runtime
|
39
43
|
prerelease: false
|
40
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
41
46
|
requirements:
|
42
|
-
- -
|
47
|
+
- - ! '>='
|
43
48
|
- !ruby/object:Gem::Version
|
44
49
|
version: '0'
|
45
50
|
- !ruby/object:Gem::Dependency
|
46
51
|
name: rake
|
47
52
|
requirement: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
48
54
|
requirements:
|
49
|
-
- -
|
55
|
+
- - ! '>='
|
50
56
|
- !ruby/object:Gem::Version
|
51
57
|
version: '0'
|
52
58
|
type: :development
|
53
59
|
prerelease: false
|
54
60
|
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
55
62
|
requirements:
|
56
|
-
- -
|
63
|
+
- - ! '>='
|
57
64
|
- !ruby/object:Gem::Version
|
58
65
|
version: '0'
|
59
66
|
- !ruby/object:Gem::Dependency
|
60
67
|
name: rspec
|
61
68
|
requirement: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
62
70
|
requirements:
|
63
|
-
- -
|
71
|
+
- - ~>
|
64
72
|
- !ruby/object:Gem::Version
|
65
73
|
version: 2.14.1
|
66
74
|
type: :development
|
67
75
|
prerelease: false
|
68
76
|
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
69
78
|
requirements:
|
70
|
-
- -
|
79
|
+
- - ~>
|
71
80
|
- !ruby/object:Gem::Version
|
72
81
|
version: 2.14.1
|
73
82
|
- !ruby/object:Gem::Dependency
|
74
83
|
name: pry
|
75
84
|
requirement: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
76
86
|
requirements:
|
77
|
-
- -
|
87
|
+
- - ! '>='
|
78
88
|
- !ruby/object:Gem::Version
|
79
89
|
version: '0'
|
80
90
|
type: :development
|
81
91
|
prerelease: false
|
82
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
83
94
|
requirements:
|
84
|
-
- -
|
95
|
+
- - ! '>='
|
85
96
|
- !ruby/object:Gem::Version
|
86
97
|
version: '0'
|
87
98
|
- !ruby/object:Gem::Dependency
|
88
99
|
name: timecop
|
89
100
|
requirement: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
90
102
|
requirements:
|
91
|
-
- -
|
103
|
+
- - ! '>='
|
92
104
|
- !ruby/object:Gem::Version
|
93
105
|
version: '0'
|
94
106
|
type: :development
|
95
107
|
prerelease: false
|
96
108
|
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
97
110
|
requirements:
|
98
|
-
- -
|
111
|
+
- - ! '>='
|
99
112
|
- !ruby/object:Gem::Version
|
100
113
|
version: '0'
|
101
114
|
- !ruby/object:Gem::Dependency
|
102
115
|
name: webmock
|
103
116
|
requirement: !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
104
118
|
requirements:
|
105
|
-
- -
|
119
|
+
- - ! '>='
|
106
120
|
- !ruby/object:Gem::Version
|
107
121
|
version: '0'
|
108
122
|
type: :development
|
109
123
|
prerelease: false
|
110
124
|
version_requirements: !ruby/object:Gem::Requirement
|
125
|
+
none: false
|
111
126
|
requirements:
|
112
|
-
- -
|
127
|
+
- - ! '>='
|
113
128
|
- !ruby/object:Gem::Version
|
114
129
|
version: '0'
|
115
130
|
description: The official appsignal.com gem
|
@@ -120,8 +135,8 @@ executables:
|
|
120
135
|
extensions: []
|
121
136
|
extra_rdoc_files: []
|
122
137
|
files:
|
123
|
-
-
|
124
|
-
-
|
138
|
+
- .gitignore
|
139
|
+
- .travis.yml
|
125
140
|
- CHANGELOG.md
|
126
141
|
- Gemfile
|
127
142
|
- LICENSE
|
@@ -224,26 +239,27 @@ files:
|
|
224
239
|
homepage: https://github.com/appsignal/appsignal
|
225
240
|
licenses:
|
226
241
|
- MIT
|
227
|
-
metadata: {}
|
228
242
|
post_install_message:
|
229
243
|
rdoc_options: []
|
230
244
|
require_paths:
|
231
245
|
- lib
|
232
246
|
required_ruby_version: !ruby/object:Gem::Requirement
|
247
|
+
none: false
|
233
248
|
requirements:
|
234
|
-
- -
|
249
|
+
- - ! '>='
|
235
250
|
- !ruby/object:Gem::Version
|
236
251
|
version: 1.9.3
|
237
252
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
253
|
+
none: false
|
238
254
|
requirements:
|
239
|
-
- -
|
255
|
+
- - ! '>='
|
240
256
|
- !ruby/object:Gem::Version
|
241
|
-
version:
|
257
|
+
version: '0'
|
242
258
|
requirements: []
|
243
259
|
rubyforge_project:
|
244
|
-
rubygems_version:
|
260
|
+
rubygems_version: 1.8.23
|
245
261
|
signing_key:
|
246
|
-
specification_version:
|
262
|
+
specification_version: 3
|
247
263
|
summary: Logs performance and exception data from your app to appsignal.com
|
248
264
|
test_files:
|
249
265
|
- spec/lib/appsignal/agent_spec.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: eaaf7d6c75bf0cacbef11b40c1931a2cca2c9121
|
4
|
-
data.tar.gz: 1b7b1151ffbde430bc17267d93c7272a224c105d
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 050ba5e12ac07e9f160e6be7711395f18424e4ba7a9ebb4a28cff887db5483d3762a9e70dc693d3bd7be8501663024f5e1f7e01fb67caf338976300d44acd95b
|
7
|
-
data.tar.gz: 05cd41d9e8f821244902433f910be5c42be51174f3d7e42572d84524beefee4e9e2a40bf85a28d876bbe338c89daa0a87e809d18b44a6e17abff406c3585c2b4
|