newrelic_rpm 3.1.2 → 3.2.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of newrelic_rpm might be problematic. Click here for more details.
- data/CHANGELOG +9 -0
- data/lib/new_relic/agent.rb +12 -3
- data/lib/new_relic/agent/agent.rb +99 -97
- data/lib/new_relic/agent/database.rb +203 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +2 -0
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +2 -0
- data/lib/new_relic/agent/instrumentation/authlogic.rb +2 -0
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +2 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +2 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +23 -13
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +2 -1
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +2 -0
- data/lib/new_relic/agent/instrumentation/metric_frame.rb +7 -1
- data/lib/new_relic/agent/instrumentation/metric_frame/pop.rb +1 -0
- data/lib/new_relic/agent/instrumentation/net.rb +2 -0
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +2 -0
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +63 -36
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +2 -0
- data/lib/new_relic/agent/instrumentation/rails/active_record_instrumentation.rb +5 -2
- data/lib/new_relic/agent/instrumentation/rails/errors.rb +4 -2
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +56 -2
- data/lib/new_relic/agent/instrumentation/rails3/active_record_instrumentation.rb +5 -2
- data/lib/new_relic/agent/instrumentation/rails3/errors.rb +3 -1
- data/lib/new_relic/agent/instrumentation/sunspot.rb +2 -0
- data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +2 -1
- data/lib/new_relic/agent/shim_agent.rb +1 -0
- data/lib/new_relic/agent/sql_sampler.rb +230 -0
- data/lib/new_relic/agent/stats_engine/transactions.rb +10 -0
- data/lib/new_relic/agent/transaction_sampler.rb +11 -6
- data/lib/new_relic/collection_helper.rb +7 -4
- data/lib/new_relic/commands/deployments.rb +1 -1
- data/lib/new_relic/commands/install.rb +2 -13
- data/lib/new_relic/control/class_methods.rb +4 -3
- data/lib/new_relic/control/configuration.rb +21 -0
- data/lib/new_relic/control/frameworks/rails.rb +1 -1
- data/lib/new_relic/control/logging_methods.rb +17 -6
- data/lib/new_relic/delayed_job_injection.rb +1 -1
- data/lib/new_relic/local_environment.rb +8 -14
- data/lib/new_relic/rack/developer_mode.rb +1 -0
- data/lib/new_relic/stats.rb +1 -0
- data/lib/new_relic/transaction_sample.rb +5 -60
- data/lib/new_relic/transaction_sample/segment.rb +7 -82
- data/lib/new_relic/version.rb +3 -3
- data/newrelic_rpm.gemspec +8 -3
- data/test/new_relic/agent/agent/connect_test.rb +95 -0
- data/test/new_relic/agent/agent/start_test.rb +0 -85
- data/test/new_relic/agent/agent/start_worker_thread_test.rb +1 -0
- data/test/new_relic/agent/agent_test.rb +0 -73
- data/test/new_relic/agent/browser_monitoring_test.rb +1 -1
- data/test/new_relic/agent/database_test.rb +160 -0
- data/test/new_relic/agent/instrumentation/metric_frame/pop_test.rb +3 -0
- data/test/new_relic/agent/memcache_instrumentation_test.rb +14 -15
- data/test/new_relic/agent/sql_sampler_test.rb +135 -0
- data/test/new_relic/agent/transaction_sampler_test.rb +12 -3
- data/test/new_relic/collection_helper_test.rb +4 -4
- data/test/new_relic/control/configuration_test.rb +31 -0
- data/test/new_relic/control/logging_methods_test.rb +20 -4
- data/test/new_relic/delayed_job_injection_test.rb +1 -1
- data/test/new_relic/rack/developer_mode_helper_test.rb +141 -0
- data/test/new_relic/stats_test.rb +3 -3
- data/test/new_relic/transaction_sample/segment_test.rb +4 -92
- data/test/new_relic/transaction_sample_test.rb +1 -1
- data/test/test_helper.rb +1 -1
- data/ui/helpers/developer_mode_helper.rb +14 -8
- data/ui/helpers/google_pie_chart.rb +0 -1
- data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection.rb +5 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/mem_cache.rb +11 -11
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/view.rb +4 -0
- metadata +15 -10
@@ -51,91 +51,6 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
|
|
51
51
|
log_app_names
|
52
52
|
end
|
53
53
|
|
54
|
-
def test_apdex_f
|
55
|
-
NewRelic::Control.instance.expects(:apdex_t).returns(10)
|
56
|
-
assert_equal 40, apdex_f
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_apdex_f_threshold_positive
|
60
|
-
self.expects(:sampler_config).returns({'transaction_threshold' => 'apdex_f'})
|
61
|
-
assert apdex_f_threshold?
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_apdex_f_threshold_negative
|
65
|
-
self.expects(:sampler_config).returns({'transaction_threshold' => 'WHEE'})
|
66
|
-
assert !apdex_f_threshold?
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_set_sql_recording_default
|
70
|
-
self.expects(:sampler_config).returns({})
|
71
|
-
self.expects(:log_sql_transmission_warning?)
|
72
|
-
set_sql_recording!
|
73
|
-
assert_equal :obfuscated, @record_sql, " should default to :obfuscated, was #{@record_sql}"
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_set_sql_recording_off
|
77
|
-
self.expects(:sampler_config).returns({'record_sql' => 'off'})
|
78
|
-
self.expects(:log_sql_transmission_warning?)
|
79
|
-
set_sql_recording!
|
80
|
-
assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_set_sql_recording_none
|
84
|
-
self.expects(:sampler_config).returns({'record_sql' => 'none'})
|
85
|
-
self.expects(:log_sql_transmission_warning?)
|
86
|
-
set_sql_recording!
|
87
|
-
assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_set_sql_recording_raw
|
91
|
-
self.expects(:sampler_config).returns({'record_sql' => 'raw'})
|
92
|
-
self.expects(:log_sql_transmission_warning?)
|
93
|
-
set_sql_recording!
|
94
|
-
assert_equal :raw, @record_sql, "should be set to :raw, was #{@record_sql}"
|
95
|
-
end
|
96
|
-
|
97
|
-
def test_set_sql_recording_falsy
|
98
|
-
self.expects(:sampler_config).returns({'record_sql' => false})
|
99
|
-
self.expects(:log_sql_transmission_warning?)
|
100
|
-
set_sql_recording!
|
101
|
-
assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_log_sql_transmission_warning_negative
|
105
|
-
log = mocked_log
|
106
|
-
@record_sql = :obfuscated
|
107
|
-
log.expects(:warn).never
|
108
|
-
log_sql_transmission_warning?
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_log_sql_transmission_warning_positive
|
112
|
-
log = mocked_log
|
113
|
-
@record_sql = :raw
|
114
|
-
log.expects(:send).with(:warn, 'Agent is configured to send raw SQL to the service')
|
115
|
-
log_sql_transmission_warning?
|
116
|
-
end
|
117
|
-
|
118
|
-
def test_sampler_config
|
119
|
-
control = mocked_control
|
120
|
-
control.expects(:fetch).with('transaction_tracer', {})
|
121
|
-
sampler_config
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_config_transaction_tracer
|
125
|
-
fake_sampler_config = mock('sampler config')
|
126
|
-
self.expects(:sampler_config).times(5).returns(fake_sampler_config)
|
127
|
-
fake_sampler_config.expects(:fetch).with('enabled', true)
|
128
|
-
fake_sampler_config.expects(:fetch).with('random_sample', false)
|
129
|
-
fake_sampler_config.expects(:fetch).with('explain_threshold', 0.5)
|
130
|
-
fake_sampler_config.expects(:fetch).with('explain_enabled', true)
|
131
|
-
self.expects(:set_sql_recording!)
|
132
|
-
|
133
|
-
fake_sampler_config.expects(:fetch).with('transaction_threshold', 2.0)
|
134
|
-
self.expects(:apdex_f_threshold?).returns(true)
|
135
|
-
self.expects(:apdex_f)
|
136
|
-
config_transaction_tracer
|
137
|
-
end
|
138
|
-
|
139
54
|
def test_check_config_and_start_agent_disabled
|
140
55
|
self.expects(:monitoring?).returns(false)
|
141
56
|
check_config_and_start_agent
|
@@ -8,6 +8,7 @@ class NewRelic::Agent::Agent::StartWorkerThreadTest < Test::Unit::TestCase
|
|
8
8
|
self.expects(:connect).with('connection_options')
|
9
9
|
@connected = true
|
10
10
|
self.expects(:check_transaction_sampler_status)
|
11
|
+
self.expects(:check_sql_sampler_status)
|
11
12
|
self.expects(:log_worker_loop_start)
|
12
13
|
self.expects(:create_and_run_worker_loop)
|
13
14
|
deferred_work!('connection_options')
|
@@ -129,79 +129,6 @@ module NewRelic
|
|
129
129
|
@agent.merge_data_from([{}, [], []])
|
130
130
|
end
|
131
131
|
|
132
|
-
def test_sql_normalization
|
133
|
-
|
134
|
-
# basic statement
|
135
|
-
assert_equal "INSERT INTO X values(?,?, ? , ?)",
|
136
|
-
@agent.send(:default_sql_obfuscator, "INSERT INTO X values('test',0, 1 , 2)")
|
137
|
-
|
138
|
-
# escaped literals
|
139
|
-
assert_equal "INSERT INTO X values(?, ?,?, ? , ?)",
|
140
|
-
@agent.send(:default_sql_obfuscator, "INSERT INTO X values('', 'jim''s ssn',0, 1 , 'jim''s son''s son')")
|
141
|
-
|
142
|
-
# multiple string literals
|
143
|
-
assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
|
144
|
-
@agent.send(:default_sql_obfuscator, "INSERT INTO X values('jim''s ssn','x',0, 1 , 2)")
|
145
|
-
|
146
|
-
# empty string literal
|
147
|
-
# NOTE: the empty string literal resolves to empty string, which for our purposes is acceptable
|
148
|
-
assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
|
149
|
-
@agent.send(:default_sql_obfuscator, "INSERT INTO X values('','x',0, 1 , 2)")
|
150
|
-
|
151
|
-
# try a select statement
|
152
|
-
assert_equal "select * from table where name=? and ssn=?",
|
153
|
-
@agent.send(:default_sql_obfuscator, "select * from table where name='jim gochee' and ssn=0012211223")
|
154
|
-
|
155
|
-
# number literals embedded in sql - oh well
|
156
|
-
assert_equal "select * from table_? where name=? and ssn=?",
|
157
|
-
@agent.send(:default_sql_obfuscator, "select * from table_007 where name='jim gochee' and ssn=0012211223")
|
158
|
-
end
|
159
|
-
|
160
|
-
def test_sql_normalization__single_quotes
|
161
|
-
assert_equal "INSERT ? into table",
|
162
|
-
@agent.send(:default_sql_obfuscator, "INSERT 'this isn''t a real value' into table")
|
163
|
-
assert_equal "INSERT ? into table",
|
164
|
-
@agent.send(:default_sql_obfuscator, %q[INSERT '"' into table])
|
165
|
-
assert_equal "INSERT ? into table",
|
166
|
-
@agent.send(:default_sql_obfuscator, %q[INSERT ' "some text" \" ' into table])
|
167
|
-
# could not get this one licked. no biggie
|
168
|
-
# assert_equal "INSERT ? into table",
|
169
|
-
# @agent.send(:default_sql_obfuscator, %q[INSERT '\'' into table])
|
170
|
-
assert_equal "INSERT ? into table",
|
171
|
-
@agent.send(:default_sql_obfuscator, %q[INSERT ''' ' into table])
|
172
|
-
end
|
173
|
-
def test_sql_normalization__double_quotes
|
174
|
-
assert_equal "INSERT ? into table",
|
175
|
-
@agent.send(:default_sql_obfuscator, %q[INSERT "this isn't a real value" into table])
|
176
|
-
assert_equal "INSERT ? into table",
|
177
|
-
@agent.send(:default_sql_obfuscator, %q[INSERT "'" into table])
|
178
|
-
assert_equal "INSERT ? into table",
|
179
|
-
@agent.send(:default_sql_obfuscator, %q[INSERT " \" " into table])
|
180
|
-
assert_equal "INSERT ? into table",
|
181
|
-
@agent.send(:default_sql_obfuscator, %q[INSERT " 'some text' " into table])
|
182
|
-
end
|
183
|
-
def test_sql_obfuscation_filters
|
184
|
-
@agent.set_sql_obfuscator(:replace) do |string|
|
185
|
-
"1" + string
|
186
|
-
end
|
187
|
-
|
188
|
-
sql = "SELECT * FROM TABLE 123 'jim'"
|
189
|
-
|
190
|
-
assert_equal "1" + sql, @agent.obfuscator.call(sql)
|
191
|
-
|
192
|
-
@agent.set_sql_obfuscator(:before) do |string|
|
193
|
-
"2" + string
|
194
|
-
end
|
195
|
-
|
196
|
-
assert_equal "12" + sql, @agent.obfuscator.call(sql)
|
197
|
-
|
198
|
-
@agent.set_sql_obfuscator(:after) do |string|
|
199
|
-
string + "3"
|
200
|
-
end
|
201
|
-
|
202
|
-
assert_equal "12" + sql + "3", @agent.obfuscator.call(sql)
|
203
|
-
end
|
204
|
-
|
205
132
|
def test_should_not_log_log_file_location_if_no_log_file
|
206
133
|
NewRelic::Control.instance.stubs(:log_file).returns('/vasrkjn4b3b4')
|
207
134
|
@agent.expects(:log).never
|
@@ -100,7 +100,7 @@ var e=document.createElement("script");'
|
|
100
100
|
license_bytes = [];
|
101
101
|
("a" * 13).each_byte {|byte| license_bytes << byte}
|
102
102
|
config = NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file", "license_bytes" => license_bytes})
|
103
|
-
config.expects(:license_bytes).returns(license_bytes)
|
103
|
+
config.expects(:license_bytes).returns(license_bytes).at_least_once
|
104
104
|
NewRelic::Agent.instance.expects(:beacon_configuration).returns(config).at_least_once
|
105
105
|
footer = browser_timing_footer
|
106
106
|
beginning_snippet = '<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..',
|
2
|
+
'test_helper'))
|
3
|
+
require 'new_relic/agent/database'
|
4
|
+
class NewRelic::Agent::DatabaseTest < Test::Unit::TestCase
|
5
|
+
def teardown
|
6
|
+
NewRelic::Agent::Database::Obfuscator.instance.reset
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_process_resultset
|
10
|
+
resultset = [["column"]]
|
11
|
+
assert_equal([nil, [["column"]]],
|
12
|
+
NewRelic::Agent::Database.process_resultset(resultset))
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_explain_sql_select_with_mysql_connection
|
16
|
+
config = {:adapter => 'mysql'}
|
17
|
+
config.default('val')
|
18
|
+
sql = 'SELECT foo'
|
19
|
+
connection = mock('connection')
|
20
|
+
plan = {
|
21
|
+
"select_type"=>"SIMPLE", "key_len"=>nil, "table"=>"blogs", "id"=>"1",
|
22
|
+
"possible_keys"=>nil, "type"=>"ALL", "Extra"=>"", "rows"=>"2",
|
23
|
+
"ref"=>nil, "key"=>nil
|
24
|
+
}
|
25
|
+
result = mock('explain plan')
|
26
|
+
result.expects(:each_hash).yields(plan)
|
27
|
+
# two rows, two columns
|
28
|
+
connection.expects(:execute).with('EXPLAIN SELECT foo').returns(result)
|
29
|
+
NewRelic::Agent::Database.expects(:get_connection).with(config).returns(connection)
|
30
|
+
|
31
|
+
result = NewRelic::Agent::Database.explain_sql(sql, config)
|
32
|
+
assert_equal(plan.keys.sort, result[0].sort)
|
33
|
+
assert_equal(plan.values.compact.sort, result[1][0].compact.sort)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_explain_sql_one_select_with_pg_connection
|
37
|
+
config = {:adapter => 'postgresql'}
|
38
|
+
config.default('val')
|
39
|
+
sql = 'select count(id) from blogs limit 1'
|
40
|
+
connection = mock('connection')
|
41
|
+
plan = [{"QUERY PLAN"=>"Limit (cost=11.75..11.76 rows=1 width=4)"},
|
42
|
+
{"QUERY PLAN"=>" -> Aggregate (cost=11.75..11.76 rows=1 width=4)"},
|
43
|
+
{"QUERY PLAN"=>" -> Seq Scan on blogs (cost=0.00..11.40 rows=140 width=4)"}]
|
44
|
+
connection.expects(:execute).returns(plan)
|
45
|
+
NewRelic::Agent::Database.expects(:get_connection).with(config).returns(connection)
|
46
|
+
assert_equal([['QUERY PLAN'],
|
47
|
+
[["Limit (cost=11.75..11.76 rows=1 width=4)"],
|
48
|
+
[" -> Aggregate (cost=11.75..11.76 rows=1 width=4)"],
|
49
|
+
[" -> Seq Scan on blogs (cost=0.00..11.40 rows=140 width=4)"]]],
|
50
|
+
NewRelic::Agent::Database.explain_sql(sql, config))
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_explain_sql_no_sql
|
54
|
+
assert_equal(nil, NewRelic::Agent::Database.explain_sql(nil, nil))
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_explain_sql_no_connection_config
|
58
|
+
assert_equal(nil, NewRelic::Agent::Database.explain_sql('select foo', nil))
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_explain_sql_non_select
|
62
|
+
assert_equal([], NewRelic::Agent::Database.explain_sql('foo',
|
63
|
+
mock('config')))
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_explain_sql_one_select_no_connection
|
67
|
+
# NB this test raises an error in the log, much as it might if a
|
68
|
+
# user supplied a config that was not valid. This is generally
|
69
|
+
# expected behavior - the get_connection method shouldn't allow
|
70
|
+
# errors to percolate up.
|
71
|
+
config = mock('config')
|
72
|
+
config.stubs(:[]).returns(nil)
|
73
|
+
assert_equal([], NewRelic::Agent::Database.explain_sql('SELECT', config))
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_handle_exception_in_explain
|
77
|
+
fake_error = Exception.new('a message')
|
78
|
+
NewRelic::Control.instance.log.expects(:error).with('Error getting query plan: a message')
|
79
|
+
# backtrace can be basically any string, just should get logged
|
80
|
+
NewRelic::Control.instance.log.expects(:debug).with(instance_of(String))
|
81
|
+
|
82
|
+
NewRelic::Agent::Database.handle_exception_in_explain do
|
83
|
+
raise(fake_error)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_sql_normalization
|
88
|
+
# basic statement
|
89
|
+
assert_equal "INSERT INTO X values(?,?, ? , ?)",
|
90
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('test',0, 1 , 2)")
|
91
|
+
|
92
|
+
# escaped literals
|
93
|
+
assert_equal "INSERT INTO X values(?, ?,?, ? , ?)",
|
94
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('', 'jim''s ssn',0, 1 , 'jim''s son''s son')")
|
95
|
+
|
96
|
+
# multiple string literals
|
97
|
+
assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
|
98
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('jim''s ssn','x',0, 1 , 2)")
|
99
|
+
|
100
|
+
# empty string literal
|
101
|
+
# NOTE: the empty string literal resolves to empty string, which for our purposes is acceptable
|
102
|
+
assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
|
103
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT INTO X values('','x',0, 1 , 2)")
|
104
|
+
|
105
|
+
# try a select statement
|
106
|
+
assert_equal "select * from table where name=? and ssn=?",
|
107
|
+
NewRelic::Agent::Database.obfuscate_sql("select * from table where name='jim gochee' and ssn=0012211223")
|
108
|
+
|
109
|
+
# number literals embedded in sql - oh well
|
110
|
+
assert_equal "select * from table_? where name=? and ssn=?",
|
111
|
+
NewRelic::Agent::Database.obfuscate_sql("select * from table_007 where name='jim gochee' and ssn=0012211223")
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_sql_normalization__single_quotes
|
115
|
+
assert_equal "INSERT ? into table",
|
116
|
+
NewRelic::Agent::Database.obfuscate_sql("INSERT 'this isn''t a real value' into table")
|
117
|
+
assert_equal "INSERT ? into table",
|
118
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT '"' into table])
|
119
|
+
assert_equal "INSERT ? into table",
|
120
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT ' "some text" \" ' into table])
|
121
|
+
# could not get this one licked. no biggie
|
122
|
+
# assert_equal "INSERT ? into table",
|
123
|
+
# @agent.send(:default_sql_obfuscator, %q[INSERT '\'' into table])
|
124
|
+
assert_equal "INSERT ? into table",
|
125
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT ''' ' into table])
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_sql_normalization__double_quotes
|
129
|
+
assert_equal "INSERT ? into table",
|
130
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT "this isn't a real value" into table])
|
131
|
+
assert_equal "INSERT ? into table",
|
132
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT "'" into table])
|
133
|
+
assert_equal "INSERT ? into table",
|
134
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT " \" " into table])
|
135
|
+
assert_equal "INSERT ? into table",
|
136
|
+
NewRelic::Agent::Database.obfuscate_sql(%q[INSERT " 'some text' " into table])
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_sql_obfuscation_filters
|
140
|
+
NewRelic::Agent::Database.set_sql_obfuscator(:replace) do |string|
|
141
|
+
"1" + string
|
142
|
+
end
|
143
|
+
|
144
|
+
sql = "SELECT * FROM TABLE 123 'jim'"
|
145
|
+
|
146
|
+
assert_equal "1" + sql, NewRelic::Agent::Database.obfuscate_sql(sql)
|
147
|
+
|
148
|
+
NewRelic::Agent::Database.set_sql_obfuscator(:before) do |string|
|
149
|
+
"2" + string
|
150
|
+
end
|
151
|
+
|
152
|
+
assert_equal "12" + sql, NewRelic::Agent::Database.obfuscate_sql(sql)
|
153
|
+
|
154
|
+
NewRelic::Agent::Database.set_sql_obfuscator(:after) do |string|
|
155
|
+
string + "3"
|
156
|
+
end
|
157
|
+
|
158
|
+
assert_equal "12" + sql + "3", NewRelic::Agent::Database.obfuscate_sql(sql)
|
159
|
+
end
|
160
|
+
end
|
@@ -5,10 +5,12 @@ class NewRelic::Agent::Instrumentation::MetricFrame::PopTest < Test::Unit::TestC
|
|
5
5
|
|
6
6
|
attr_reader :agent
|
7
7
|
attr_reader :transaction_sampler
|
8
|
+
attr_reader :sql_sampler
|
8
9
|
|
9
10
|
def setup
|
10
11
|
@agent = mock('agent')
|
11
12
|
@transaction_sampler = mock('transaction sampler')
|
13
|
+
@sql_sampler = mock('sql sampler')
|
12
14
|
end
|
13
15
|
|
14
16
|
def teardown
|
@@ -39,6 +41,7 @@ class NewRelic::Agent::Instrumentation::MetricFrame::PopTest < Test::Unit::TestC
|
|
39
41
|
|
40
42
|
def test_notice_scope_empty
|
41
43
|
transaction_sampler.expects(:notice_scope_empty)
|
44
|
+
sql_sampler.expects(:notice_scope_empty)
|
42
45
|
notice_scope_empty
|
43
46
|
end
|
44
47
|
|
@@ -2,10 +2,10 @@ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper
|
|
2
2
|
|
3
3
|
memcached_ready = false
|
4
4
|
classes = {
|
5
|
-
# 'memcache' => 'MemCache'
|
6
|
-
# 'dalli' => 'Dalli::Client'
|
7
|
-
|
8
|
-
|
5
|
+
# 'memcache' => 'MemCache',
|
6
|
+
# 'dalli' => 'Dalli::Client',
|
7
|
+
'memcached' => 'Memcached'
|
8
|
+
# 'spymemcached' => 'Spymemcached'
|
9
9
|
}
|
10
10
|
begin
|
11
11
|
TCPSocket.new('localhost', 11211)
|
@@ -25,7 +25,7 @@ end
|
|
25
25
|
|
26
26
|
class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
27
27
|
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
28
|
-
|
28
|
+
|
29
29
|
def setup
|
30
30
|
NewRelic::Agent.manual_start
|
31
31
|
@engine = NewRelic::Agent.instance.stats_engine
|
@@ -43,7 +43,7 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def teardown
|
46
|
-
if MEMCACHED_CLASS.name == '
|
46
|
+
if MEMCACHED_CLASS.name == 'Memcached'
|
47
47
|
@cache.flush
|
48
48
|
elsif MEMCACHED_CLASS.name == 'Spymemcached'
|
49
49
|
@cache.flush
|
@@ -73,7 +73,7 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
73
73
|
commands.each do |method|
|
74
74
|
if @cache.class.method_defined?(method)
|
75
75
|
_call_test_method_in_web_transaction(method)
|
76
|
-
compare_metrics ["
|
76
|
+
compare_metrics ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"],
|
77
77
|
@engine.metrics.select{|m| m =~ /^memcache.*/i}
|
78
78
|
end
|
79
79
|
end
|
@@ -83,7 +83,7 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
83
83
|
%w[delete].each do |method|
|
84
84
|
if @cache.class.method_defined?(method)
|
85
85
|
_call_test_method_in_web_transaction(method)
|
86
|
-
expected_metrics = ["
|
86
|
+
expected_metrics = ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"]
|
87
87
|
compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
|
88
88
|
end
|
89
89
|
end
|
@@ -91,7 +91,7 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
91
91
|
%w[set add].each do |method|
|
92
92
|
@cache.delete(@key) rescue nil
|
93
93
|
if @cache.class.method_defined?(method)
|
94
|
-
expected_metrics = ["
|
94
|
+
expected_metrics = ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"]
|
95
95
|
_call_test_method_in_web_transaction(method, 'value')
|
96
96
|
compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
|
97
97
|
end
|
@@ -104,7 +104,7 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
104
104
|
commands.each do |method|
|
105
105
|
if @cache.class.method_defined?(method)
|
106
106
|
_call_test_method_in_background_task(method)
|
107
|
-
compare_metrics ["
|
107
|
+
compare_metrics ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"],
|
108
108
|
@engine.metrics.select{|m| m =~ /^memcache.*/i}
|
109
109
|
end
|
110
110
|
end
|
@@ -112,7 +112,7 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
112
112
|
|
113
113
|
def test_writes__background
|
114
114
|
%w[delete].each do |method|
|
115
|
-
expected_metrics = ["
|
115
|
+
expected_metrics = ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
|
116
116
|
if @cache.class.method_defined?(method)
|
117
117
|
_call_test_method_in_background_task(method)
|
118
118
|
compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
|
@@ -121,7 +121,7 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
121
121
|
|
122
122
|
%w[set add].each do |method|
|
123
123
|
@cache.delete(@key) rescue nil
|
124
|
-
expected_metrics = ["
|
124
|
+
expected_metrics = ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
|
125
125
|
if @cache.class.method_defined?(method)
|
126
126
|
_call_test_method_in_background_task(method, 'value')
|
127
127
|
compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
|
@@ -130,7 +130,7 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
130
130
|
end
|
131
131
|
|
132
132
|
def test_handles_cas
|
133
|
-
expected_metrics = ["
|
133
|
+
expected_metrics = ["Memcache/cas", "Memcache/allOther", "Memcache/cas:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
|
134
134
|
if @cache.class.method_defined?(:cas)
|
135
135
|
@engine.clear_stats
|
136
136
|
perform_action_with_newrelic_trace(:name => 'bg_task', :category => :task) do
|
@@ -139,6 +139,5 @@ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
|
|
139
139
|
compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
|
140
140
|
assert_equal 3, @cache.get(@key)
|
141
141
|
end
|
142
|
-
end
|
143
|
-
|
142
|
+
end
|
144
143
|
end if memcached_ready
|