wd_newrelic_rpm 3.5.5 → 3.5.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/CHANGELOG +60 -0
- data/Rakefile +14 -18
- data/gem-public_cert.pem +20 -0
- data/lib/new_relic/agent.rb +3 -0
- data/lib/new_relic/agent/agent.rb +86 -97
- data/lib/new_relic/agent/agent_logger.rb +9 -1
- data/lib/new_relic/agent/busy_calculator.rb +5 -0
- data/lib/new_relic/agent/configuration/defaults.rb +3 -3
- data/lib/new_relic/agent/configuration/manager.rb +12 -0
- data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -0
- data/lib/new_relic/agent/configuration/yaml_source.rb +5 -1
- data/lib/new_relic/agent/cross_process_monitoring.rb +164 -20
- data/lib/new_relic/agent/error_collector.rb +13 -2
- data/lib/new_relic/agent/event_listener.rb +39 -0
- data/lib/new_relic/agent/instrumentation/browser_monitoring_timings.rb +18 -8
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sinatra.rb +8 -1
- data/lib/new_relic/agent/new_relic_service.rb +90 -10
- data/lib/new_relic/agent/pipe_service.rb +9 -0
- data/lib/new_relic/agent/sql_sampler.rb +10 -3
- data/lib/new_relic/agent/stats_engine/transactions.rb +1 -0
- data/lib/new_relic/agent/thread_profiler.rb +20 -7
- data/lib/new_relic/agent/worker_loop.rb +2 -1
- data/lib/new_relic/coerce.rb +37 -0
- data/lib/new_relic/commands/deployments.rb +1 -1
- data/lib/new_relic/control/frameworks/rails.rb +29 -5
- data/lib/new_relic/control/frameworks/rails3.rb +2 -11
- data/lib/new_relic/control/instance_methods.rb +11 -7
- data/lib/new_relic/control/server_methods.rb +5 -37
- data/lib/new_relic/latest_changes.rb +31 -0
- data/lib/new_relic/local_environment.rb +1 -1
- data/lib/new_relic/metric_data.rb +13 -2
- data/lib/new_relic/noticed_error.rb +8 -1
- data/lib/new_relic/rack/agent_hooks.rb +20 -0
- data/lib/new_relic/rack/error_collector.rb +11 -1
- data/lib/new_relic/recipes.rb +32 -10
- data/lib/new_relic/transaction_sample.rb +12 -3
- data/lib/new_relic/transaction_sample/segment.rb +6 -3
- data/lib/new_relic/version.rb +10 -15
- data/newrelic.yml +12 -19
- data/newrelic_rpm.gemspec +22 -464
- data/test/multiverse/.gitignore +1 -0
- data/test/multiverse/lib/multiverse/environment.rb +1 -1
- data/test/multiverse/lib/multiverse/suite.rb +2 -0
- data/test/multiverse/suites/active_record/Envfile +3 -3
- data/test/multiverse/suites/active_record/ar_method_aliasing.rb +1 -1
- data/test/multiverse/suites/active_record/config/newrelic.yml +2 -2
- data/test/multiverse/suites/agent_only/Envfile +2 -1
- data/test/multiverse/suites/agent_only/config/newrelic.yml +3 -1
- data/test/multiverse/suites/agent_only/cross_process_test.rb +56 -0
- data/test/multiverse/suites/{logging → agent_only}/logging_test.rb +42 -22
- data/test/multiverse/suites/agent_only/no_dns_resolv.rb +17 -0
- data/test/multiverse/suites/{rum_auto_instrumentation/sanity_test.rb → agent_only/rum_instrumentation_test.rb} +25 -46
- data/test/multiverse/suites/agent_only/service_timeout_test.rb +6 -3
- data/test/multiverse/suites/agent_only/ssl_test.rb +22 -0
- data/test/multiverse/suites/{no_load → agent_only}/start_up_test.rb +9 -2
- data/test/multiverse/suites/agent_only/testing_app.rb +17 -0
- data/test/multiverse/suites/agent_only/thread_profiling_test.rb +6 -5
- data/test/multiverse/suites/datamapper/config/newrelic.yml +1 -1
- data/test/multiverse/suites/{rails_3_queue_time → rails}/Envfile +3 -0
- data/test/multiverse/suites/rails/app.rb +49 -0
- data/test/multiverse/suites/{rails_3_views → rails}/app/views/foos/_foo.html.haml +0 -0
- data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/_a_partial.html.erb +0 -0
- data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/_mid_partial.html.erb +0 -0
- data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/_top_partial.html.erb +0 -0
- data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/deep_partial.html.erb +0 -0
- data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/haml_view.html.haml +0 -0
- data/test/multiverse/suites/{rails_3_views/app/views/test → rails/app/views/views}/index.html.erb +0 -0
- data/test/multiverse/suites/rails/config/newrelic.yml +32 -0
- data/test/multiverse/suites/{rails_3_error_tracing → rails}/error_tracing_test.rb +51 -88
- data/test/multiverse/suites/rails/gc_instrumentation_test.rb +79 -0
- data/test/multiverse/suites/{rails_3_queue_time → rails}/queue_time_test.rb +3 -23
- data/test/multiverse/suites/{rails_3_views → rails}/view_instrumentation_test.rb +21 -61
- data/test/multiverse/suites/resque/Envfile +7 -4
- data/test/multiverse/suites/resque/Rakefile +8 -0
- data/test/multiverse/suites/resque/config/newrelic.yml +1 -1
- data/test/multiverse/suites/resque/instrumentation_test.rb +118 -41
- data/test/multiverse/suites/resque/resque_setup.rb +15 -0
- data/test/multiverse/suites/sinatra/config/newrelic.yml +1 -2
- data/test/multiverse/suites/sinatra/sinatra_error_tracing_test.rb +38 -0
- data/test/multiverse/suites/sinatra/sinatra_test.rb +17 -0
- data/test/multiverse/test/suite_examples/one/a/config/newrelic.yml +1 -1
- data/test/multiverse/test/suite_examples/one/b/config/newrelic.yml +1 -1
- data/test/new_relic/agent/agent/connect_test.rb +24 -100
- data/test/new_relic/agent/agent/start_worker_thread_test.rb +3 -3
- data/test/new_relic/agent/agent_test.rb +126 -31
- data/test/new_relic/agent/browser_monitoring_test.rb +1 -1
- data/test/new_relic/agent/busy_calculator_test.rb +8 -0
- data/test/new_relic/agent/configuration/manager_test.rb +28 -0
- data/test/new_relic/agent/configuration/yaml_source_test.rb +12 -2
- data/test/new_relic/agent/cross_process_monitoring_test.rb +144 -31
- data/test/new_relic/agent/error_collector_test.rb +16 -0
- data/test/new_relic/agent/event_listener_test.rb +46 -0
- data/test/new_relic/agent/instrumentation/browser_monitoring_timings_test.rb +57 -30
- data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +1 -0
- data/test/new_relic/agent/new_relic_service_test.rb +95 -2
- data/test/new_relic/agent/pipe_channel_manager_test.rb +3 -3
- data/test/new_relic/agent/pipe_service_test.rb +21 -1
- data/test/new_relic/agent/rpm_agent_test.rb +1 -1
- data/test/new_relic/agent/sql_sampler_test.rb +20 -0
- data/test/new_relic/agent/thread_profiler_test.rb +53 -8
- data/test/new_relic/agent/worker_loop_test.rb +19 -16
- data/test/new_relic/agent_test.rb +1 -2
- data/test/new_relic/coerce_test.rb +65 -0
- data/test/new_relic/command/deployments_test.rb +1 -1
- data/test/new_relic/control_test.rb +23 -44
- data/test/new_relic/fake_collector.rb +34 -6
- data/test/new_relic/local_environment_test.rb +1 -1
- data/test/new_relic/metric_data_test.rb +29 -0
- data/test/new_relic/noticed_error_test.rb +8 -0
- data/test/new_relic/rack/agent_hooks_test.rb +30 -0
- data/test/new_relic/rack/error_collector_test.rb +16 -0
- data/test/new_relic/transaction_sample/segment_test.rb +7 -0
- data/test/new_relic/transaction_sample_test.rb +36 -8
- data/test/new_relic/version_number_test.rb +6 -30
- data/test/script/ci.sh +6 -5
- data/test/test_contexts.rb +2 -1
- data/test/test_helper.rb +23 -6
- data/ui/helpers/google_pie_chart.rb +1 -0
- metadata +68 -67
- data/newrelic_rpm.gemspec.erb +0 -54
- data/test/fixtures/gemspec_no_build.rb +0 -442
- data/test/fixtures/gemspec_with_build.rb +0 -442
- data/test/fixtures/gemspec_with_build_and_stage.rb +0 -442
- data/test/multiverse/suites/logging/Envfile +0 -4
- data/test/multiverse/suites/logging/config/newrelic.yml +0 -22
- data/test/multiverse/suites/monitor_mode_false/Envfile +0 -2
- data/test/multiverse/suites/monitor_mode_false/config/newrelic.yml +0 -25
- data/test/multiverse/suites/monitor_mode_false/no_dns_resolv.rb +0 -29
- data/test/multiverse/suites/no_load/Envfile +0 -2
- data/test/multiverse/suites/no_load/config/newrelic.yml +0 -22
- data/test/multiverse/suites/rails_3_error_tracing/Envfile +0 -15
- data/test/multiverse/suites/rails_3_error_tracing/config/newrelic.yml +0 -165
- data/test/multiverse/suites/rails_3_gc/Envfile +0 -8
- data/test/multiverse/suites/rails_3_gc/config/newrelic.yml +0 -167
- data/test/multiverse/suites/rails_3_gc/instrumentation_test.rb +0 -92
- data/test/multiverse/suites/rails_3_queue_time/config/newrelic.yml +0 -165
- data/test/multiverse/suites/rails_3_views/.gitignore +0 -3
- data/test/multiverse/suites/rails_3_views/Envfile +0 -16
- data/test/multiverse/suites/rails_3_views/config/newrelic.yml +0 -164
- data/test/multiverse/suites/resque/dump.rdb +0 -0
- data/test/multiverse/suites/rum_auto_instrumentation/Envfile +0 -4
- data/test/multiverse/suites/rum_auto_instrumentation/config/newrelic.yml +0 -24
- data/test/multiverse/suites/rum_auto_instrumentation/responses/worst_case_small.html +0 -5000
- data/test/new_relic/fake_service.rb +0 -53
@@ -149,7 +149,7 @@ DependencyDetection.defer do
|
|
149
149
|
|
150
150
|
def render_with_newrelic(context, options)
|
151
151
|
# This is needed for rails 3.2 compatibility
|
152
|
-
@details = extract_details(options) if respond_to? :extract_details
|
152
|
+
@details = extract_details(options) if respond_to? :extract_details, true
|
153
153
|
identifier = determine_template(options) ? determine_template(options).identifier : nil
|
154
154
|
str = "View/#{NewRelic::Agent::Instrumentation::Rails3::ActionView::NewRelic.template_metric(identifier, options)}/Rendering"
|
155
155
|
trace_execution_scoped str do
|
@@ -45,7 +45,14 @@ module NewRelic
|
|
45
45
|
perform_action_with_newrelic_trace(:category => :sinatra,
|
46
46
|
:name => txn_name,
|
47
47
|
:params => @request.params) do
|
48
|
-
dispatch_without_newrelic
|
48
|
+
result = dispatch_without_newrelic
|
49
|
+
|
50
|
+
# Will only see an error raised if :show_exceptions is true, but
|
51
|
+
# will always see them in the env hash if they occur
|
52
|
+
had_error = env.has_key?('sinatra.error')
|
53
|
+
::NewRelic::Agent.notice_error(env['sinatra.error']) if had_error
|
54
|
+
|
55
|
+
result
|
49
56
|
end
|
50
57
|
end
|
51
58
|
|
@@ -29,7 +29,16 @@ module NewRelic
|
|
29
29
|
Agent.config.register_callback(:'audit_log.enabled') do |enabled|
|
30
30
|
@audit_logger.enabled = enabled
|
31
31
|
end
|
32
|
-
|
32
|
+
Agent.config.register_callback(:ssl) do |ssl|
|
33
|
+
if !ssl
|
34
|
+
::NewRelic::Agent.logger.warn("Agent is configured not to use SSL when communicating with New Relic's servers")
|
35
|
+
elsif !Agent.config[:verify_certificate]
|
36
|
+
::NewRelic::Agent.logger.warn("Agent is configured to use SSL but to skip certificate validation when communicating with New Relic's servers")
|
37
|
+
else
|
38
|
+
::NewRelic::Agent.logger.debug("Agent is configured to use SSL")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
33
42
|
Agent.config.register_callback(:marshaller) do |marshaller|
|
34
43
|
begin
|
35
44
|
if marshaller == 'json'
|
@@ -106,6 +115,73 @@ module NewRelic
|
|
106
115
|
[data, encoding]
|
107
116
|
end
|
108
117
|
|
118
|
+
# One session with the service's endpoint. In this case the session
|
119
|
+
# represents 1 tcp connection which may transmit multiple HTTP requests
|
120
|
+
# via keep-alive.
|
121
|
+
def session(&block)
|
122
|
+
raise ArgumentError, "#{self.class}#shared_connection must be passed a block" unless block_given?
|
123
|
+
|
124
|
+
http = create_http_connection
|
125
|
+
|
126
|
+
# Immediately open a TCP connection to the server and leave it open for
|
127
|
+
# multiple requests.
|
128
|
+
::NewRelic::Agent.logger.debug("Opening TCP connection to #{http.address}:#{http.port}")
|
129
|
+
http.start
|
130
|
+
begin
|
131
|
+
@shared_tcp_connection = http
|
132
|
+
block.call
|
133
|
+
ensure
|
134
|
+
@shared_tcp_connection = nil
|
135
|
+
# Close the TCP socket
|
136
|
+
::NewRelic::Agent.logger.debug("Closing TCP connection to #{http.address}:#{http.port}")
|
137
|
+
http.finish
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# Return a Net::HTTP connection object to make a call to the collector.
|
142
|
+
# We'll reuse the same handle for cases where we're using keep-alive, or
|
143
|
+
# otherwise create a new one.
|
144
|
+
def http_connection
|
145
|
+
@shared_tcp_connection || create_http_connection
|
146
|
+
end
|
147
|
+
|
148
|
+
# Return the Net::HTTP with proxy configuration given the NewRelic::Control::Server object.
|
149
|
+
def create_http_connection
|
150
|
+
proxy_server = control.proxy_server
|
151
|
+
# Proxy returns regular HTTP if @proxy_host is nil (the default)
|
152
|
+
http_class = Net::HTTP::Proxy(proxy_server.name, proxy_server.port,
|
153
|
+
proxy_server.user, proxy_server.password)
|
154
|
+
|
155
|
+
http = http_class.new((@collector.ip || @collector.name), @collector.port)
|
156
|
+
if Agent.config[:ssl]
|
157
|
+
begin
|
158
|
+
# Jruby 1.6.8 requires a gem for full ssl support and will throw
|
159
|
+
# an error when use_ssl=(true) is called and jruby-openssl isn't
|
160
|
+
# installed
|
161
|
+
http.use_ssl = true
|
162
|
+
if Agent.config[:verify_certificate]
|
163
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
164
|
+
http.ca_file = cert_file_path
|
165
|
+
else
|
166
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
167
|
+
end
|
168
|
+
rescue StandardError, LoadError
|
169
|
+
msg = "Agent is configured to use SSL, but SSL is not available in the environment. "
|
170
|
+
msg << "Either disable SSL in the agent configuration, or install SSL support."
|
171
|
+
raise UnrecoverableAgentException.new(msg)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
::NewRelic::Agent.logger.debug("Created net/http handle to #{http.address}:#{http.port}")
|
175
|
+
http
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
# The path to the certificate file used to verify the SSL
|
180
|
+
# connection if verify_peer is enabled
|
181
|
+
def cert_file_path
|
182
|
+
File.expand_path(File.join(control.newrelic_root, 'cert', 'cacert.pem'))
|
183
|
+
end
|
184
|
+
|
109
185
|
private
|
110
186
|
|
111
187
|
# A shorthand for NewRelic::Control.instance
|
@@ -183,31 +259,33 @@ module NewRelic
|
|
183
259
|
request.content_type = "application/octet-stream"
|
184
260
|
request.body = opts[:data]
|
185
261
|
|
186
|
-
::NewRelic::Agent.logger.debug "Connect to #{opts[:collector]}#{opts[:uri]}"
|
187
|
-
|
188
262
|
response = nil
|
189
|
-
http =
|
263
|
+
http = http_connection
|
190
264
|
http.read_timeout = nil
|
191
265
|
begin
|
192
266
|
NewRelic::TimerLib.timeout(@request_timeout) do
|
267
|
+
::NewRelic::Agent.logger.debug "Sending request to #{opts[:collector]}#{opts[:uri]}"
|
193
268
|
response = http.request(request)
|
194
269
|
end
|
195
270
|
rescue Timeout::Error
|
196
271
|
::NewRelic::Agent.logger.warn "Timed out trying to post data to New Relic (timeout = #{@request_timeout} seconds)" unless @request_timeout < 30
|
197
272
|
raise
|
198
273
|
end
|
199
|
-
|
274
|
+
case response
|
275
|
+
when Net::HTTPSuccess
|
276
|
+
true # fall through
|
277
|
+
when Net::HTTPUnauthorized
|
200
278
|
raise LicenseException, 'Invalid license key, please contact support@newrelic.com'
|
201
|
-
|
279
|
+
when Net::HTTPServiceUnavailable
|
202
280
|
raise ServerConnectionException, "Service unavailable (#{response.code}): #{response.message}"
|
203
|
-
|
281
|
+
when Net::HTTPGatewayTimeOut
|
204
282
|
::NewRelic::Agent.logger.warn("Timed out getting response: #{response.message}")
|
205
283
|
raise Timeout::Error, response.message
|
206
|
-
|
284
|
+
when Net::HTTPRequestEntityTooLarge
|
207
285
|
raise UnrecoverableServerException, '413 Request Entity Too Large'
|
208
|
-
|
286
|
+
when Net::HTTPUnsupportedMediaType
|
209
287
|
raise UnrecoverableServerException, '415 Unsupported Media Type'
|
210
|
-
|
288
|
+
else
|
211
289
|
raise ServerConnectionException, "Unexpected response from server (#{response.code}): #{response.message}"
|
212
290
|
end
|
213
291
|
response
|
@@ -216,6 +294,8 @@ module NewRelic
|
|
216
294
|
raise NewRelic::Agent::ServerConnectionException, "Recoverable error connecting to the server: #{e}"
|
217
295
|
end
|
218
296
|
|
297
|
+
|
298
|
+
|
219
299
|
# Decompresses the response from the server, if it is gzip
|
220
300
|
# encoded, otherwise returns it verbatim
|
221
301
|
def decompress_response(response)
|
@@ -39,6 +39,13 @@ module NewRelic
|
|
39
39
|
write_to_pipe('EOF')
|
40
40
|
NewRelic::Agent::PipeChannelManager.channels[@channel_id].close
|
41
41
|
end
|
42
|
+
|
43
|
+
# Invokes the block it is passed. This is used to implement HTTP
|
44
|
+
# keep-alive in the NewRelicService, and is a required interface for any
|
45
|
+
# Service class.
|
46
|
+
def session
|
47
|
+
yield
|
48
|
+
end
|
42
49
|
|
43
50
|
private
|
44
51
|
|
@@ -52,6 +59,8 @@ module NewRelic
|
|
52
59
|
|
53
60
|
def write_to_pipe(data)
|
54
61
|
NewRelic::Agent::PipeChannelManager.channels[@channel_id].write(data)
|
62
|
+
rescue => e
|
63
|
+
NewRelic::Agent.logger.error("#{e.message}: Unable to send data to parent process, please see https://newrelic.com/docs/ruby/resque-instrumentation for more information.")
|
55
64
|
end
|
56
65
|
end
|
57
66
|
end
|
@@ -189,7 +189,7 @@ module NewRelic
|
|
189
189
|
@params = {} #FIXME
|
190
190
|
@sql_id = consistent_hash(normalized_query)
|
191
191
|
set_primary slow_sql, path, uri
|
192
|
-
record_data_point
|
192
|
+
record_data_point(float(slow_sql.duration))
|
193
193
|
end
|
194
194
|
|
195
195
|
def set_primary(slow_sql, path, uri)
|
@@ -207,7 +207,7 @@ module NewRelic
|
|
207
207
|
set_primary slow_sql, path, uri
|
208
208
|
end
|
209
209
|
|
210
|
-
record_data_point
|
210
|
+
record_data_point(float(slow_sql.duration))
|
211
211
|
end
|
212
212
|
|
213
213
|
def prepare_to_send
|
@@ -223,8 +223,15 @@ module NewRelic
|
|
223
223
|
Agent.config[:'slow_sql.explain_enabled']
|
224
224
|
end
|
225
225
|
|
226
|
+
include NewRelic::Coerce
|
227
|
+
|
226
228
|
def to_collector_array(encoder)
|
227
|
-
[ @path,
|
229
|
+
[ string(@path),
|
230
|
+
string(@url),
|
231
|
+
int(@sql_id),
|
232
|
+
string(@sql),
|
233
|
+
string(@database_metric_name),
|
234
|
+
int(@call_count),
|
228
235
|
Helper.time_to_millis(@total_call_time),
|
229
236
|
Helper.time_to_millis(@min_call_time),
|
230
237
|
Helper.time_to_millis(@max_call_time),
|
@@ -202,6 +202,8 @@ EOF
|
|
202
202
|
|
203
203
|
THREAD_PROFILER_NODES = 20_000
|
204
204
|
|
205
|
+
include NewRelic::Coerce
|
206
|
+
|
205
207
|
def to_collector_array(encoder)
|
206
208
|
prune!(THREAD_PROFILER_NODES)
|
207
209
|
|
@@ -212,11 +214,15 @@ EOF
|
|
212
214
|
"BACKGROUND" => @traces[:background].map{|t| t.to_array }
|
213
215
|
}
|
214
216
|
|
215
|
-
[[
|
216
|
-
@
|
217
|
-
@
|
218
|
-
|
219
|
-
@
|
217
|
+
[[
|
218
|
+
int(@profile_id),
|
219
|
+
float(@start_time),
|
220
|
+
float(@stop_time),
|
221
|
+
int(@poll_count),
|
222
|
+
string(encoder.encode(traces)),
|
223
|
+
int(@sample_count),
|
224
|
+
0
|
225
|
+
]]
|
220
226
|
end
|
221
227
|
|
222
228
|
def now_in_millis
|
@@ -280,9 +286,16 @@ EOF
|
|
280
286
|
[-runnable_count, depth] <=> [-y.runnable_count, y.depth]
|
281
287
|
end
|
282
288
|
|
289
|
+
include NewRelic::Coerce
|
290
|
+
|
283
291
|
def to_array
|
284
|
-
[[
|
285
|
-
|
292
|
+
[[
|
293
|
+
string(@file),
|
294
|
+
string(@method),
|
295
|
+
int(@line_no)
|
296
|
+
],
|
297
|
+
int(@runnable_count),
|
298
|
+
0,
|
286
299
|
@children.map {|c| c.to_array}]
|
287
300
|
end
|
288
301
|
|
@@ -12,7 +12,7 @@ module NewRelic
|
|
12
12
|
@should_run = true
|
13
13
|
@next_invocation_time = Time.now
|
14
14
|
@period = 60.0
|
15
|
-
@
|
15
|
+
@duration = opts[:duration] if opts[:duration]
|
16
16
|
@limit = opts[:limit] if opts[:limit]
|
17
17
|
@iterations = 0
|
18
18
|
end
|
@@ -26,6 +26,7 @@ module NewRelic
|
|
26
26
|
# call periods. The caller is responsible for creating the thread
|
27
27
|
# that runs this worker loop. This will run the task immediately.
|
28
28
|
def run(period=nil, &block)
|
29
|
+
@deadline = Time.now + @duration if @duration
|
29
30
|
@period = period if period
|
30
31
|
@next_invocation_time = (Time.now + @period)
|
31
32
|
@task = block
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module NewRelic
|
2
|
+
# We really don't want to send bad values to the collector, and it doesn't
|
3
|
+
# accept types like Rational that have occasionally slipped into our data.
|
4
|
+
#
|
5
|
+
# These methods are intended to safely coerce things into the form we want,
|
6
|
+
# to provide documentation of expected types on to_collector_array methods,
|
7
|
+
# and to log failures if totally invalid data gets into outgoing data
|
8
|
+
module Coerce
|
9
|
+
def int(value, context=nil)
|
10
|
+
Integer(value)
|
11
|
+
rescue => error
|
12
|
+
log_failure(value, Integer, context, error)
|
13
|
+
0
|
14
|
+
end
|
15
|
+
|
16
|
+
def float(value, context=nil)
|
17
|
+
Float(value)
|
18
|
+
rescue => error
|
19
|
+
log_failure(value, Float, context, error)
|
20
|
+
0.0
|
21
|
+
end
|
22
|
+
|
23
|
+
def string(value, context=nil)
|
24
|
+
return value if value.nil?
|
25
|
+
String(value)
|
26
|
+
rescue => error
|
27
|
+
log_failure(value.class, String, context, error)
|
28
|
+
""
|
29
|
+
end
|
30
|
+
|
31
|
+
def log_failure(value, type, context, error)
|
32
|
+
msg = "Unable to convert '#{value}' to #{type}"
|
33
|
+
msg += " in context '#{context}'" if context
|
34
|
+
NewRelic::Agent.logger.warn(msg, error)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -54,7 +54,7 @@ class NewRelic::Command::Deployments < NewRelic::Command
|
|
54
54
|
}.each do |k, v|
|
55
55
|
create_params["deployment[#{k}]"] = v unless v.nil? || v == ''
|
56
56
|
end
|
57
|
-
http =
|
57
|
+
http = ::NewRelic::Agent::NewRelicService.new(nil, control.api_server).http_connection
|
58
58
|
|
59
59
|
uri = "/deployments.xml"
|
60
60
|
|
@@ -10,14 +10,24 @@ module NewRelic
|
|
10
10
|
def env
|
11
11
|
@env ||= RAILS_ENV.dup
|
12
12
|
end
|
13
|
+
|
14
|
+
# Rails can return an empty string from this method, causing
|
15
|
+
# the agent not to start even when it is properly in a rails 3
|
16
|
+
# application, so we test the value to make sure it actually
|
17
|
+
# has contents, and bail to the parent class if it is empty.
|
13
18
|
def root
|
14
|
-
|
15
|
-
|
19
|
+
root = rails_root.to_s
|
20
|
+
if !root.empty?
|
21
|
+
root
|
16
22
|
else
|
17
23
|
super
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
27
|
+
def rails_root
|
28
|
+
RAILS_ROOT if defined?(RAILS_ROOT)
|
29
|
+
end
|
30
|
+
|
21
31
|
def rails_config
|
22
32
|
if defined?(::Rails) && ::Rails.respond_to?(:configuration)
|
23
33
|
::Rails.configuration
|
@@ -46,8 +56,22 @@ module NewRelic
|
|
46
56
|
::NewRelic::Agent.logger.info("New Relic Agent not running.")
|
47
57
|
else
|
48
58
|
::NewRelic::Agent.logger.info("Starting the New Relic Agent.")
|
49
|
-
install_developer_mode
|
59
|
+
install_developer_mode(rails_config) if Agent.config[:developer_mode]
|
50
60
|
install_browser_monitoring(rails_config)
|
61
|
+
install_agent_hooks(rails_config)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def install_agent_hooks(config)
|
66
|
+
return if @agent_hooks_installed
|
67
|
+
@agent_hooks_installed = true
|
68
|
+
return if config.nil? || !config.respond_to?(:middleware)
|
69
|
+
begin
|
70
|
+
require 'new_relic/rack/agent_hooks'
|
71
|
+
config.middleware.use NewRelic::Rack::AgentHooks
|
72
|
+
::NewRelic::Agent.logger.debug("Installed New Relic Agent Hooks middleware")
|
73
|
+
rescue => e
|
74
|
+
::NewRelic::Agent.logger.warn("Error installing New Relic Agent Hooks middleware", e)
|
51
75
|
end
|
52
76
|
end
|
53
77
|
|
@@ -60,7 +84,7 @@ module NewRelic
|
|
60
84
|
config.middleware.use NewRelic::Rack::BrowserMonitoring
|
61
85
|
::NewRelic::Agent.logger.debug("Installed New Relic Browser Monitoring middleware")
|
62
86
|
rescue => e
|
63
|
-
::NewRelic::Agent.logger.warn("Error installing New Relic Browser Monitoring middleware
|
87
|
+
::NewRelic::Agent.logger.warn("Error installing New Relic Browser Monitoring middleware", e)
|
64
88
|
end
|
65
89
|
end
|
66
90
|
|
@@ -80,7 +104,7 @@ module NewRelic
|
|
80
104
|
::NewRelic::Agent.logger.debug("To view performance information, go to http://localhost#{port}/newrelic")
|
81
105
|
end
|
82
106
|
rescue => e
|
83
|
-
::NewRelic::Agent.logger.warn("Error installing New Relic Developer Mode
|
107
|
+
::NewRelic::Agent.logger.warn("Error installing New Relic Developer Mode", e)
|
84
108
|
end
|
85
109
|
elsif rails_config
|
86
110
|
::NewRelic::Agent.logger.warn("Developer mode not available for Rails versions prior to 2.2")
|
@@ -14,17 +14,8 @@ module NewRelic
|
|
14
14
|
@env ||= ::Rails.env.to_s
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
# application, so we test the value to make sure it actually
|
20
|
-
# has contents, and bail to the parent class if it is empty.
|
21
|
-
def root
|
22
|
-
value = ::Rails.root.to_s
|
23
|
-
if value.empty?
|
24
|
-
super
|
25
|
-
else
|
26
|
-
value
|
27
|
-
end
|
17
|
+
def rails_root
|
18
|
+
::Rails.root.to_s
|
28
19
|
end
|
29
20
|
|
30
21
|
def init_config(options={})
|
@@ -49,7 +49,10 @@ module NewRelic
|
|
49
49
|
|
50
50
|
Agent.config.replace_or_add_config(Agent::Configuration::ManualSource.new(options), 1)
|
51
51
|
|
52
|
-
|
52
|
+
# Be sure to only create once! RUBY-1020
|
53
|
+
if ::NewRelic::Agent.logger.is_startup_logger?
|
54
|
+
::NewRelic::Agent.logger = NewRelic::Agent::AgentLogger.new(Agent.config, root, options.delete(:log))
|
55
|
+
end
|
53
56
|
|
54
57
|
# Merge the stringified options into the config as overrides:
|
55
58
|
environment_name = options.delete(:env) and self.env = environment_name
|
@@ -93,13 +96,19 @@ module NewRelic
|
|
93
96
|
end
|
94
97
|
|
95
98
|
def settings
|
96
|
-
NewRelic::Agent.config.
|
99
|
+
NewRelic::Agent.config.to_collector_hash
|
97
100
|
end
|
98
101
|
|
99
102
|
def dispatcher
|
100
103
|
NewRelic::Agent.config[:dispatcher]
|
101
104
|
end
|
102
105
|
|
106
|
+
# Delegates to the class method newrelic_root, implemented by
|
107
|
+
# each subclass
|
108
|
+
def newrelic_root
|
109
|
+
self.class.newrelic_root
|
110
|
+
end
|
111
|
+
|
103
112
|
protected
|
104
113
|
|
105
114
|
# Append framework specific environment information for uploading to
|
@@ -130,11 +139,6 @@ module NewRelic
|
|
130
139
|
'.'
|
131
140
|
end
|
132
141
|
|
133
|
-
# Delegates to the class method newrelic_root, implemented by
|
134
|
-
# each subclass
|
135
|
-
def newrelic_root
|
136
|
-
self.class.newrelic_root
|
137
|
-
end
|
138
142
|
end
|
139
143
|
include InstanceMethods
|
140
144
|
end
|