newrelic-infinite_tracing 8.9.0 → 8.12.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.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/Rakefile +5 -1
- data/lib/infinite_tracing/agent_integrations/agent.rb +6 -6
- data/lib/infinite_tracing/agent_integrations/datastore_segment.rb +1 -2
- data/lib/infinite_tracing/agent_integrations/external_request_segment.rb +1 -2
- data/lib/infinite_tracing/agent_integrations/segment.rb +1 -2
- data/lib/infinite_tracing/agent_integrations.rb +2 -3
- data/lib/infinite_tracing/channel.rb +48 -4
- data/lib/infinite_tracing/client.rb +38 -27
- data/lib/infinite_tracing/config.rb +5 -6
- data/lib/infinite_tracing/connection.rb +15 -15
- data/lib/infinite_tracing/constants.rb +0 -1
- data/lib/infinite_tracing/proto/infinite_tracing_pb.rb +0 -1
- data/lib/infinite_tracing/proto/infinite_tracing_services_pb.rb +0 -2
- data/lib/infinite_tracing/proto.rb +0 -1
- data/lib/infinite_tracing/record_status_handler.rb +28 -23
- data/lib/infinite_tracing/streaming_buffer.rb +31 -20
- data/lib/infinite_tracing/suspended_streaming_buffer.rb +4 -5
- data/lib/infinite_tracing/transformer.rb +3 -4
- data/lib/infinite_tracing/version.rb +0 -1
- data/lib/infinite_tracing/worker.rb +12 -9
- data/lib/infinite_tracing.rb +2 -3
- data/lib/new_relic/infinite_tracing.rb +2 -3
- data/lib/newrelic/infinite_tracing.rb +0 -1
- data/lib/proto/infinite_tracing.proto +1 -2
- data/newrelic-infinite_tracing.gemspec +8 -8
- data/tasks/all.rb +1 -1
- data/tasks/helpers/license.rb +25 -0
- data/tasks/proto.rake +10 -30
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d82f3d8556283da9e25f2789f9e83fac58f65b3df011af7d2adf2fd32894917
|
4
|
+
data.tar.gz: '0995598d2923cafdbc3eb38a663500ea48e37ba207cb6c58a1e8a15dbcb25d58'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2aeb0110716ff65afcc46ef898690cdd951d8318273709840ed303657679dd4fa8110f7dd229fcce0b0a36806d8ced9e16e20297dae1d19f1a4d88093c48f7a2
|
7
|
+
data.tar.gz: d41478145f1891e1f02d5df82bbca1fe711c5d5a99fd352c118e6441635f86cbbf0255b963e791e2d87c1aefb3085a65786306491e89a18032c9907462e6cd0b
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
1
5
|
require 'rubygems'
|
2
6
|
require 'rake/testtask'
|
3
7
|
require "#{File.dirname(__FILE__)}/tasks/all.rb"
|
@@ -12,7 +16,7 @@ task :console do
|
|
12
16
|
end
|
13
17
|
|
14
18
|
Rake::TestTask.new do |t|
|
15
|
-
ROOT = File.join
|
19
|
+
ROOT = File.join(File.dirname(__FILE__))
|
16
20
|
$LOAD_PATH << ROOT
|
17
21
|
|
18
22
|
file_pattern = "#{ROOT}/**/*_test.rb"
|
@@ -1,10 +1,9 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
5
4
|
|
6
5
|
module NewRelic::Agent
|
7
|
-
NewRelic::Agent.logger.debug
|
6
|
+
NewRelic::Agent.logger.debug("Installing Infinite Tracer in Agent")
|
8
7
|
|
9
8
|
Agent.class_eval do
|
10
9
|
def new_infinite_tracer
|
@@ -12,7 +11,7 @@ module NewRelic::Agent
|
|
12
11
|
# entire start up process for the Agent.
|
13
12
|
InfiniteTracing::Client.new.tap do |client|
|
14
13
|
@infinite_tracer_thread = InfiniteTracing::Worker.new(:infinite_tracer) do
|
15
|
-
NewRelic::Agent.logger.debug
|
14
|
+
NewRelic::Agent.logger.debug("Opening Infinite Tracer Stream with gRPC server")
|
16
15
|
client.start_streaming
|
17
16
|
end
|
18
17
|
end
|
@@ -22,18 +21,19 @@ module NewRelic::Agent
|
|
22
21
|
# this clears the data, clears connection attempts, and
|
23
22
|
# waits a while to reconnect.
|
24
23
|
def handle_force_restart(error)
|
25
|
-
::NewRelic::Agent.logger.debug
|
24
|
+
::NewRelic::Agent.logger.debug(error.message)
|
26
25
|
drop_buffered_data
|
27
26
|
@service.force_restart if @service
|
28
27
|
@connect_state = :pending
|
29
28
|
close_infinite_tracer
|
30
|
-
sleep
|
29
|
+
sleep(30)
|
31
30
|
end
|
32
31
|
|
33
32
|
# Whenever we reconnect, close and restart
|
34
33
|
def close_infinite_tracer
|
35
|
-
NewRelic::Agent.logger.debug
|
34
|
+
NewRelic::Agent.logger.debug("Closing infinite tracer threads")
|
36
35
|
return unless @infinite_tracer_thread
|
36
|
+
|
37
37
|
@infinite_tracer_thread.join
|
38
38
|
@infinite_tracer_thread.stop
|
39
39
|
@infinite_tracer_thread = nil
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -12,7 +11,7 @@ module NewRelic
|
|
12
11
|
return if transaction.ignore?
|
13
12
|
|
14
13
|
tracer = ::NewRelic::Agent.agent.infinite_tracer
|
15
|
-
tracer <<
|
14
|
+
tracer << proc { SpanEventPrimitive.for_datastore_segment(self) }
|
16
15
|
end
|
17
16
|
end
|
18
17
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -12,7 +11,7 @@ module NewRelic
|
|
12
11
|
return if transaction.ignore?
|
13
12
|
|
14
13
|
tracer = ::NewRelic::Agent.agent.infinite_tracer
|
15
|
-
tracer <<
|
14
|
+
tracer << proc { SpanEventPrimitive.for_external_request_segment(self) }
|
16
15
|
end
|
17
16
|
end
|
18
17
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -16,7 +15,7 @@ module NewRelic
|
|
16
15
|
return if transaction.ignore?
|
17
16
|
|
18
17
|
tracer = ::NewRelic::Agent.agent.infinite_tracer
|
19
|
-
tracer <<
|
18
|
+
tracer << proc { SpanEventPrimitive.for_segment(self) }
|
20
19
|
end
|
21
20
|
end
|
22
21
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -6,7 +5,7 @@
|
|
6
5
|
module NewRelic::Agent
|
7
6
|
module InfiniteTracing
|
8
7
|
if Config.enabled? || Config.test_framework?
|
9
|
-
NewRelic::Agent.logger.debug
|
8
|
+
NewRelic::Agent.logger.debug("Integrating Infinite Tracer with Agent")
|
10
9
|
|
11
10
|
require_relative 'agent_integrations/agent'
|
12
11
|
require_relative 'agent_integrations/segment'
|
@@ -14,7 +13,7 @@ module NewRelic::Agent
|
|
14
13
|
require_relative 'agent_integrations/external_request_segment'
|
15
14
|
|
16
15
|
else
|
17
|
-
NewRelic::Agent.logger.debug
|
16
|
+
NewRelic::Agent.logger.debug("Skipped Integrating Infinite Tracer with Agent")
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -6,19 +5,55 @@
|
|
6
5
|
module NewRelic::Agent
|
7
6
|
module InfiniteTracing
|
8
7
|
class Channel
|
8
|
+
COMPRESSION_LEVELS = %i[none low medium high].freeze
|
9
|
+
DEFAULT_COMPRESSION_LEVEL = :none
|
10
|
+
|
9
11
|
def stub
|
10
|
-
NewRelic::Agent.logger.debug
|
12
|
+
NewRelic::Agent.logger.debug("Infinite Tracer Opening Channel to #{host_and_port}")
|
11
13
|
|
12
|
-
Com::Newrelic::Trace::V1::IngestService::Stub.new \
|
14
|
+
Com::Newrelic::Trace::V1::IngestService::Stub.new( \
|
13
15
|
host_and_port,
|
14
16
|
credentials,
|
15
|
-
channel_override: channel
|
17
|
+
channel_override: channel,
|
18
|
+
channel_args: channel_args
|
19
|
+
)
|
16
20
|
end
|
17
21
|
|
18
22
|
def channel
|
19
23
|
GRPC::Core::Channel.new(host_and_port, settings, credentials)
|
20
24
|
end
|
21
25
|
|
26
|
+
def channel_args
|
27
|
+
return NewRelic::EMPTY_HASH unless compression_enabled?
|
28
|
+
|
29
|
+
GRPC::Core::CompressionOptions.new(compression_options).to_channel_arg_hash
|
30
|
+
end
|
31
|
+
|
32
|
+
def compression_enabled?
|
33
|
+
compression_level != :none
|
34
|
+
end
|
35
|
+
|
36
|
+
def compression_level
|
37
|
+
@compression_level ||= begin
|
38
|
+
level = if valid_compression_level?(configured_compression_level)
|
39
|
+
configured_compression_level
|
40
|
+
else
|
41
|
+
DEFAULT_COMPRESSION_LEVEL
|
42
|
+
end
|
43
|
+
NewRelic::Agent.logger.debug("Infinite Tracer compression level set to #{level}")
|
44
|
+
level
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def compression_options
|
49
|
+
{default_algorithm: :gzip,
|
50
|
+
default_level: compression_level}
|
51
|
+
end
|
52
|
+
|
53
|
+
def configured_compression_level
|
54
|
+
NewRelic::Agent.config[:'infinite_tracing.compression_level']
|
55
|
+
end
|
56
|
+
|
22
57
|
def credentials
|
23
58
|
# Uses system configured certificates by default
|
24
59
|
GRPC::Core::ChannelCredentials.new
|
@@ -34,6 +69,15 @@ module NewRelic::Agent
|
|
34
69
|
'grpc.enable_deadline_checking' => 0
|
35
70
|
}
|
36
71
|
end
|
72
|
+
|
73
|
+
def valid_compression_level?(level)
|
74
|
+
return true if COMPRESSION_LEVELS.include?(level)
|
75
|
+
|
76
|
+
NewRelic::Agent.logger.error("Invalid compression level '#{level}' specified! Must be one of " \
|
77
|
+
"#{COMPRESSION_LEVELS.join('|')}. Using default level of '#{DEFAULT_COMPRESSION_LEVEL}'")
|
78
|
+
|
79
|
+
false
|
80
|
+
end
|
37
81
|
end
|
38
82
|
end
|
39
83
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -22,15 +21,20 @@ module NewRelic::Agent
|
|
22
21
|
@lock = Mutex.new
|
23
22
|
end
|
24
23
|
|
25
|
-
def <<
|
24
|
+
def <<(segment)
|
26
25
|
buffer << segment
|
27
26
|
end
|
28
27
|
|
28
|
+
def batching_enabled?
|
29
|
+
NewRelic::Agent.config[:'infinite_tracing.batching']
|
30
|
+
end
|
31
|
+
|
29
32
|
# Transfers spans in streaming buffer from previous
|
30
33
|
# client (if any) and returns self (so we chain the call)
|
31
|
-
def transfer
|
34
|
+
def transfer(previous_client)
|
32
35
|
return self unless previous_client
|
33
|
-
|
36
|
+
|
37
|
+
previous_client.buffer.transfer(buffer)
|
34
38
|
self
|
35
39
|
end
|
36
40
|
|
@@ -38,7 +42,7 @@ module NewRelic::Agent
|
|
38
42
|
# client is currently suspended.
|
39
43
|
def new_streaming_buffer
|
40
44
|
buffer_class = suspended? ? SuspendedStreamingBuffer : StreamingBuffer
|
41
|
-
buffer_class.new
|
45
|
+
buffer_class.new(Config.span_events_queue_size)
|
42
46
|
end
|
43
47
|
|
44
48
|
def buffer
|
@@ -50,30 +54,30 @@ module NewRelic::Agent
|
|
50
54
|
end
|
51
55
|
|
52
56
|
# Turns camelcase base class name into upper snake case version of the name.
|
53
|
-
def formatted_class_name
|
57
|
+
def formatted_class_name(class_name)
|
54
58
|
class_name = class_name.split(":")[-1]
|
55
59
|
(class_name.gsub!(/(.)([A-Z])/, '\1_\2') || class_name).upcase
|
56
60
|
end
|
57
61
|
|
58
62
|
# Literal codes are all mapped to unique class names, so we can deduce the
|
59
63
|
# name of the error to report in the metric from the error's class name.
|
60
|
-
def grpc_error_metric_name
|
64
|
+
def grpc_error_metric_name(error)
|
61
65
|
GRPC_ERROR_NAME_METRIC % formatted_class_name(error.class.name)
|
62
66
|
end
|
63
67
|
|
64
68
|
# Reports AND logs general response metric along with a more specific error metric
|
65
|
-
def record_error_metrics_and_log
|
66
|
-
NewRelic::Agent.record_metric
|
67
|
-
if error.is_a?
|
68
|
-
NewRelic::Agent.record_metric
|
69
|
+
def record_error_metrics_and_log(error)
|
70
|
+
NewRelic::Agent.record_metric(RESPONSE_ERROR_METRIC, 0.0)
|
71
|
+
if error.is_a?(GRPC::BadStatus)
|
72
|
+
NewRelic::Agent.record_metric(grpc_error_metric_name(error), 0.0)
|
69
73
|
else
|
70
|
-
NewRelic::Agent.record_metric
|
74
|
+
NewRelic::Agent.record_metric(GRPC_OTHER_ERROR_METRIC, 0.0)
|
71
75
|
end
|
72
|
-
NewRelic::Agent.logger.warn
|
76
|
+
NewRelic::Agent.logger.warn("gRPC response error received.", error)
|
73
77
|
end
|
74
78
|
|
75
|
-
def handle_error
|
76
|
-
record_error_metrics_and_log
|
79
|
+
def handle_error(error)
|
80
|
+
record_error_metrics_and_log(error)
|
77
81
|
|
78
82
|
case error
|
79
83
|
when GRPC::Unavailable then restart
|
@@ -81,7 +85,7 @@ module NewRelic::Agent
|
|
81
85
|
when GRPC::Unimplemented then suspend
|
82
86
|
else
|
83
87
|
# Set exponential backoff to false so we'll reconnect at periodic (15 second) intervals instead
|
84
|
-
start_streaming
|
88
|
+
start_streaming(false)
|
85
89
|
end
|
86
90
|
end
|
87
91
|
|
@@ -95,8 +99,8 @@ module NewRelic::Agent
|
|
95
99
|
# server and re-establish the gRPC bi-directional stream. Useful for the server
|
96
100
|
# to initiate a load-balancing scheme.
|
97
101
|
def handle_close
|
98
|
-
NewRelic::Agent.logger.debug
|
99
|
-
"Restarting the stream."
|
102
|
+
NewRelic::Agent.logger.debug("The gRPC Trace Observer closed the stream with OK response. " \
|
103
|
+
"Restarting the stream.")
|
100
104
|
start_streaming
|
101
105
|
end
|
102
106
|
|
@@ -105,11 +109,12 @@ module NewRelic::Agent
|
|
105
109
|
# The Suspended Streaming Buffer will be installed in this state.
|
106
110
|
def suspend
|
107
111
|
return if suspended?
|
112
|
+
|
108
113
|
@lock.synchronize do
|
109
114
|
@suspended = true
|
110
115
|
@buffer = new_streaming_buffer
|
111
|
-
NewRelic::Agent.logger.warn
|
112
|
-
"No more span events will be sent during this session."
|
116
|
+
NewRelic::Agent.logger.warn("The Trace Observer host signaled to suspend streaming span events. " \
|
117
|
+
"No more span events will be sent during this session.")
|
113
118
|
end
|
114
119
|
end
|
115
120
|
|
@@ -123,7 +128,7 @@ module NewRelic::Agent
|
|
123
128
|
@lock.synchronize do
|
124
129
|
old_buffer = @buffer
|
125
130
|
@buffer = new_streaming_buffer
|
126
|
-
old_buffer.transfer
|
131
|
+
old_buffer.transfer(@buffer)
|
127
132
|
end
|
128
133
|
end
|
129
134
|
|
@@ -135,24 +140,30 @@ module NewRelic::Agent
|
|
135
140
|
|
136
141
|
def stop
|
137
142
|
return unless @response_handler
|
143
|
+
|
138
144
|
@lock.synchronize do
|
139
145
|
@response_handler.stop
|
140
146
|
@response_handler = nil
|
141
147
|
end
|
142
148
|
end
|
143
149
|
|
144
|
-
def start_streaming
|
150
|
+
def start_streaming(exponential_backoff = true)
|
145
151
|
return if suspended?
|
152
|
+
|
146
153
|
Connection.instance.wait_for_agent_connect
|
147
|
-
@lock.synchronize {
|
154
|
+
@lock.synchronize { response_handler(exponential_backoff) }
|
155
|
+
end
|
156
|
+
|
157
|
+
def record_spans(exponential_backoff)
|
158
|
+
RecordStatusHandler.new(self, Connection.record_spans(self, buffer.enumerator, exponential_backoff))
|
148
159
|
end
|
149
160
|
|
150
|
-
def
|
151
|
-
RecordStatusHandler.new
|
161
|
+
def record_span_batches(exponential_backoff)
|
162
|
+
RecordStatusHandler.new(self, Connection.record_span_batches(self, buffer.batch_enumerator, exponential_backoff))
|
152
163
|
end
|
153
164
|
|
154
|
-
def
|
155
|
-
|
165
|
+
def response_handler(backoff)
|
166
|
+
@response_handler = batching_enabled? ? record_span_batches(backoff) : record_spans(backoff)
|
156
167
|
end
|
157
168
|
end
|
158
169
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -48,18 +47,18 @@ module NewRelic::Agent
|
|
48
47
|
end
|
49
48
|
|
50
49
|
# removes the scheme and port from a host entry.
|
51
|
-
def without_scheme_or_port
|
50
|
+
def without_scheme_or_port(url)
|
52
51
|
url.gsub(%r{^https?://|:\d+$}, '')
|
53
52
|
end
|
54
53
|
|
55
54
|
def trace_observer_host
|
56
|
-
without_scheme_or_port
|
55
|
+
without_scheme_or_port(NewRelic::Agent.config[:'infinite_tracing.trace_observer.host'])
|
57
56
|
end
|
58
57
|
|
59
58
|
# If the port is declared on the host entry, it overrides the port entry because otherwise
|
60
59
|
# we'd need to figure out if user supplied the port or if the default source config set
|
61
60
|
# the port. To help with debugging configuration issues, we log whenever the port entry
|
62
|
-
# is
|
61
|
+
# is overridden by the presence of the port on the host entry.
|
63
62
|
def port_from_host_entry
|
64
63
|
port_str = NewRelic::Agent.config[:'infinite_tracing.trace_observer.host'].scan(%r{:(\d+)$}).flatten
|
65
64
|
if port = (port_str[0] and port_str[0].to_i)
|
@@ -75,7 +74,7 @@ module NewRelic::Agent
|
|
75
74
|
end
|
76
75
|
|
77
76
|
# The scheme is based on whether the Trace Observer is running locally or remotely.
|
78
|
-
# Remote unsecure (
|
77
|
+
# Remote unsecure (unencrypted) streaming is disallowed!
|
79
78
|
def trace_observer_scheme
|
80
79
|
local? ? NewRelic::HTTP : NewRelic::HTTPS
|
81
80
|
end
|
@@ -85,7 +84,7 @@ module NewRelic::Agent
|
|
85
84
|
if trace_observer_configured?
|
86
85
|
URI("#{trace_observer_scheme}://#{trace_observer_host_and_port}")
|
87
86
|
else
|
88
|
-
NewRelic::Agent.logger.error
|
87
|
+
NewRelic::Agent.logger.error(TRACE_OBSERVER_NOT_CONFIGURED_ERROR)
|
89
88
|
raise TRACE_OBSERVER_NOT_CONFIGURED_ERROR
|
90
89
|
end
|
91
90
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -25,9 +24,10 @@ module NewRelic::Agent
|
|
25
24
|
begin
|
26
25
|
Connection.instance.notify_agent_started
|
27
26
|
rescue => error
|
28
|
-
NewRelic::Agent.logger.error \
|
27
|
+
NewRelic::Agent.logger.error( \
|
29
28
|
"Error during notify :server_source_configuration_added event",
|
30
29
|
error
|
30
|
+
)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -43,15 +43,15 @@ module NewRelic::Agent
|
|
43
43
|
# RPC calls will pass the calling client instance in. We track this
|
44
44
|
# so we're able to signal the client to restart when connectivity to the
|
45
45
|
# server is disrupted.
|
46
|
-
def record_spans
|
47
|
-
instance.record_spans
|
46
|
+
def record_spans(client, enumerator, exponential_backoff)
|
47
|
+
instance.record_spans(client, enumerator, exponential_backoff)
|
48
48
|
end
|
49
49
|
|
50
50
|
# RPC calls will pass the calling client instance in. We track this
|
51
51
|
# so we're able to signal the client to restart when connectivity to the
|
52
52
|
# server is disrupted.
|
53
|
-
def record_span_batches
|
54
|
-
instance.
|
53
|
+
def record_span_batches(client, enumerator, exponential_backoff)
|
54
|
+
instance.record_span_batches(client, enumerator, exponential_backoff)
|
55
55
|
end
|
56
56
|
|
57
57
|
def metadata
|
@@ -61,17 +61,17 @@ module NewRelic::Agent
|
|
61
61
|
|
62
62
|
# We attempt to connect and record spans with reconnection backoff in order to deal with
|
63
63
|
# unavailable errors coming from the stub being created and record_span call
|
64
|
-
def record_spans
|
64
|
+
def record_spans(client, enumerator, exponential_backoff)
|
65
65
|
@active_clients[client] = client
|
66
|
-
with_reconnection_backoff(exponential_backoff) { rpc.record_span
|
66
|
+
with_reconnection_backoff(exponential_backoff) { rpc.record_span(enumerator, metadata: metadata) }
|
67
67
|
end
|
68
68
|
|
69
69
|
# RPC calls will pass the calling client instance in. We track this
|
70
70
|
# so we're able to signal the client to restart when connectivity to the
|
71
71
|
# server is disrupted.
|
72
|
-
def record_span_batches
|
72
|
+
def record_span_batches(client, enumerator, exponential_backoff)
|
73
73
|
@active_clients[client] = client
|
74
|
-
with_reconnection_backoff(exponential_backoff) { rpc.record_span_batch
|
74
|
+
with_reconnection_backoff(exponential_backoff) { rpc.record_span_batch(enumerator, metadata: metadata) }
|
75
75
|
end
|
76
76
|
|
77
77
|
# Acquires the new channel stub for the RPC calls.
|
@@ -147,21 +147,21 @@ module NewRelic::Agent
|
|
147
147
|
end
|
148
148
|
|
149
149
|
# Continues retrying the connection at backoff intervals until a successful connection is made
|
150
|
-
def with_reconnection_backoff
|
150
|
+
def with_reconnection_backoff(exponential_backoff = true, &block)
|
151
151
|
@connection_attempts = 0
|
152
152
|
begin
|
153
153
|
yield
|
154
154
|
rescue => exception
|
155
155
|
retry_connection_period = retry_connection_period(exponential_backoff)
|
156
|
-
::NewRelic::Agent.logger.error
|
157
|
-
::NewRelic::Agent.logger.info
|
158
|
-
sleep
|
156
|
+
::NewRelic::Agent.logger.error("Error establishing connection with infinite tracing service:", exception)
|
157
|
+
::NewRelic::Agent.logger.info("Will re-attempt infinite tracing connection in #{retry_connection_period} seconds")
|
158
|
+
sleep(retry_connection_period)
|
159
159
|
note_connect_failure
|
160
160
|
retry
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
def retry_connection_period
|
164
|
+
def retry_connection_period(exponential_backoff = true)
|
165
165
|
if exponential_backoff
|
166
166
|
NewRelic::CONNECT_RETRY_PERIODS[@connection_attempts] || NewRelic::MAX_RETRY_PERIOD
|
167
167
|
else
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -6,7 +5,6 @@
|
|
6
5
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
7
6
|
# Source: infinite_tracing.proto for package 'com.newrelic.trace.v1'
|
8
7
|
# Original file comments:
|
9
|
-
# encoding: utf-8
|
10
8
|
# This file is distributed under New Relic's license terms.
|
11
9
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
12
10
|
#
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -6,7 +5,7 @@
|
|
6
5
|
module NewRelic::Agent
|
7
6
|
module InfiniteTracing
|
8
7
|
class RecordStatusHandler
|
9
|
-
def initialize
|
8
|
+
def initialize(client, enumerator)
|
10
9
|
@client = client
|
11
10
|
@enumerator = enumerator
|
12
11
|
@messages_seen = nil
|
@@ -18,34 +17,40 @@ module NewRelic::Agent
|
|
18
17
|
@messages_seen ? @messages_seen.messages_seen : 0
|
19
18
|
end
|
20
19
|
|
21
|
-
def start_handler
|
22
|
-
Worker.new self.class.name do
|
23
|
-
begin
|
24
|
-
@enumerator.each do |response|
|
25
|
-
break if response.nil? || response.is_a?(Exception)
|
26
|
-
@lock.synchronize do
|
27
|
-
@messages_seen = response
|
28
|
-
NewRelic::Agent.logger.debug "gRPC Infinite Tracer Observer saw #{messages_seen} messages"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
NewRelic::Agent.logger.debug "gRPC Infinite Tracer Observer closed the stream"
|
32
|
-
@client.handle_close
|
33
|
-
rescue => error
|
34
|
-
@client.handle_error error
|
35
|
-
end
|
36
|
-
end
|
37
|
-
rescue => error
|
38
|
-
NewRelic::Agent.logger.error "gRPC Worker Error", error
|
39
|
-
end
|
40
|
-
|
41
20
|
def stop
|
42
21
|
return if @worker.nil?
|
22
|
+
|
43
23
|
@lock.synchronize do
|
44
|
-
NewRelic::Agent.logger.debug
|
24
|
+
NewRelic::Agent.logger.debug("gRPC Stopping Response Handler")
|
45
25
|
@worker.stop
|
46
26
|
@worker = nil
|
47
27
|
end
|
48
28
|
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def handle_response
|
33
|
+
@enumerator.each do |response|
|
34
|
+
break if response.nil? || response.is_a?(Exception)
|
35
|
+
|
36
|
+
@lock.synchronize do
|
37
|
+
@messages_seen = response
|
38
|
+
NewRelic::Agent.logger.debug("gRPC Infinite Tracer Observer saw #{messages_seen} messages")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def start_handler
|
44
|
+
Worker.new(self.class.name) do
|
45
|
+
handle_response
|
46
|
+
NewRelic::Agent.logger.debug("gRPC Infinite Tracer Observer closed the stream")
|
47
|
+
@client.handle_close
|
48
|
+
rescue => error
|
49
|
+
@client.handle_error(error)
|
50
|
+
end
|
51
|
+
rescue => error
|
52
|
+
NewRelic::Agent.logger.error("gRPC Worker Error", error)
|
53
|
+
end
|
49
54
|
end
|
50
55
|
end
|
51
56
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -18,10 +17,14 @@ module NewRelic::Agent
|
|
18
17
|
DEFAULT_QUEUE_SIZE = 10_000
|
19
18
|
FLUSH_DELAY = 0.005
|
20
19
|
MAX_FLUSH_WAIT = 3 # three seconds
|
20
|
+
# To ensure that two bits of info for the same transaction
|
21
|
+
# are recognized as belonging together, set a maximum time
|
22
|
+
# in seconds to elapse between batch submissions.
|
23
|
+
MAX_BATCH_HOLD = 5
|
21
24
|
|
22
25
|
attr_reader :queue
|
23
26
|
|
24
|
-
def initialize
|
27
|
+
def initialize(max_size = DEFAULT_QUEUE_SIZE)
|
25
28
|
@max_size = max_size
|
26
29
|
@lock = Mutex.new
|
27
30
|
@queue = Queue.new
|
@@ -30,9 +33,9 @@ module NewRelic::Agent
|
|
30
33
|
|
31
34
|
# Dumps the contents of this streaming buffer onto
|
32
35
|
# the given buffer and closes the queue
|
33
|
-
def transfer
|
36
|
+
def transfer(new_buffer)
|
34
37
|
@lock.synchronize do
|
35
|
-
until @queue.empty? do new_buffer.push
|
38
|
+
until @queue.empty? do new_buffer.push(@queue.pop) end
|
36
39
|
@queue.close
|
37
40
|
end
|
38
41
|
end
|
@@ -45,11 +48,11 @@ module NewRelic::Agent
|
|
45
48
|
# When a restart signal is received, the queue is
|
46
49
|
# locked with a mutex, blocking the push until
|
47
50
|
# the queue has restarted.
|
48
|
-
def <<
|
51
|
+
def <<(segment)
|
49
52
|
@lock.synchronize do
|
50
53
|
clear_queue if @queue.size >= @max_size
|
51
|
-
NewRelic::Agent.increment_metric
|
52
|
-
@queue.push
|
54
|
+
NewRelic::Agent.increment_metric(SPANS_SEEN_METRIC)
|
55
|
+
@queue.push(segment)
|
53
56
|
end
|
54
57
|
end
|
55
58
|
|
@@ -57,19 +60,19 @@ module NewRelic::Agent
|
|
57
60
|
# supportability metric for the event.
|
58
61
|
def clear_queue
|
59
62
|
@queue.clear
|
60
|
-
NewRelic::Agent.increment_metric
|
63
|
+
NewRelic::Agent.increment_metric(QUEUE_DUMPED_METRIC)
|
61
64
|
end
|
62
65
|
|
63
66
|
# Waits for the queue to be fully consumed or for the
|
64
67
|
# waiting consumers to release.
|
65
68
|
def flush_queue
|
66
|
-
@queue.num_waiting.times { @queue.push
|
69
|
+
@queue.num_waiting.times { @queue.push(nil) }
|
67
70
|
close_queue
|
68
71
|
|
69
72
|
# Logs if we're throwing away spans because nothing's
|
70
73
|
# waiting to take them off the queue.
|
71
74
|
if @queue.num_waiting == 0 && !@queue.empty?
|
72
|
-
NewRelic::Agent.logger.warn
|
75
|
+
NewRelic::Agent.logger.warn("Discarding #{@queue.size} segments on Streaming Buffer")
|
73
76
|
return
|
74
77
|
end
|
75
78
|
|
@@ -92,10 +95,11 @@ module NewRelic::Agent
|
|
92
95
|
# application thread.
|
93
96
|
def enumerator
|
94
97
|
return enum_for(:enumerator) unless block_given?
|
98
|
+
|
95
99
|
loop do
|
96
100
|
if segment = @queue.pop(false)
|
97
|
-
NewRelic::Agent.increment_metric
|
98
|
-
yield
|
101
|
+
NewRelic::Agent.increment_metric(SPANS_SENT_METRIC)
|
102
|
+
yield(transform(segment))
|
99
103
|
|
100
104
|
else
|
101
105
|
raise ClosedQueueError
|
@@ -117,18 +121,21 @@ module NewRelic::Agent
|
|
117
121
|
# the gRPC call's thread rather than in the main
|
118
122
|
# application thread.
|
119
123
|
def batch_enumerator
|
120
|
-
return enum_for(:
|
124
|
+
return enum_for(:batch_enumerator) unless block_given?
|
125
|
+
|
126
|
+
last_time = Process.clock_gettime(Process::CLOCK_REALTIME)
|
121
127
|
loop do
|
122
128
|
if proc_or_segment = @queue.pop(false)
|
123
|
-
NewRelic::Agent.increment_metric
|
129
|
+
NewRelic::Agent.increment_metric(SPANS_SENT_METRIC)
|
124
130
|
@batch << transform(proc_or_segment)
|
125
|
-
if
|
126
|
-
yield
|
131
|
+
if batch_ready?(last_time)
|
132
|
+
yield(SpanBatch.new(spans: @batch))
|
133
|
+
last_time = Process.clock_gettime(Process::CLOCK_REALTIME)
|
127
134
|
@batch.clear
|
128
135
|
end
|
129
136
|
|
130
137
|
else
|
131
|
-
yield
|
138
|
+
yield(SpanBatch.new(spans: @batch)) unless @batch.empty?
|
132
139
|
raise ClosedQueueError
|
133
140
|
end
|
134
141
|
end
|
@@ -136,7 +143,11 @@ module NewRelic::Agent
|
|
136
143
|
|
137
144
|
private
|
138
145
|
|
139
|
-
def
|
146
|
+
def batch_ready?(last_time)
|
147
|
+
@batch.size >= BATCH_SIZE || Process.clock_gettime(Process::CLOCK_REALTIME) - last_time >= MAX_BATCH_HOLD
|
148
|
+
end
|
149
|
+
|
150
|
+
def span_event(proc_or_segment)
|
140
151
|
if proc_or_segment.is_a?(Proc)
|
141
152
|
proc_or_segment.call
|
142
153
|
else
|
@@ -144,8 +155,8 @@ module NewRelic::Agent
|
|
144
155
|
end
|
145
156
|
end
|
146
157
|
|
147
|
-
def transform
|
148
|
-
Span.new
|
158
|
+
def transform(proc_or_segment)
|
159
|
+
Span.new(Transformer.transform(span_event(proc_or_segment)))
|
149
160
|
end
|
150
161
|
end
|
151
162
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -13,16 +12,16 @@ module NewRelic::Agent
|
|
13
12
|
extend Forwardable
|
14
13
|
def_delegators :@empty_buffer, :empty?, :push
|
15
14
|
|
16
|
-
def initialize
|
15
|
+
def initialize(max_size = DEFAULT_QUEUE_SIZE)
|
17
16
|
@empty_buffer = NewRelic::EMPTY_ARRAY
|
18
17
|
end
|
19
18
|
|
20
19
|
# updates the seen metric and discards the segment
|
21
|
-
def <<
|
22
|
-
NewRelic::Agent.increment_metric
|
20
|
+
def <<(segment)
|
21
|
+
NewRelic::Agent.increment_metric(SPANS_SEEN_METRIC)
|
23
22
|
end
|
24
23
|
|
25
|
-
def transfer
|
24
|
+
def transfer(new_buffer)
|
26
25
|
# NOOP
|
27
26
|
end
|
28
27
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -8,7 +7,7 @@ module NewRelic::Agent
|
|
8
7
|
module Transformer
|
9
8
|
extend self
|
10
9
|
|
11
|
-
def transform
|
10
|
+
def transform(span_event)
|
12
11
|
intrinsics, user_attributes, agent_attributes = span_event
|
13
12
|
{
|
14
13
|
"trace_id" => intrinsics[NewRelic::Agent::SpanEventPrimitive::TRACE_ID_KEY],
|
@@ -34,11 +33,11 @@ module NewRelic::Agent
|
|
34
33
|
KLASS_TO_ARG[BigDecimal] = :double_value
|
35
34
|
end
|
36
35
|
|
37
|
-
def safe_param_name
|
36
|
+
def safe_param_name(value)
|
38
37
|
KLASS_TO_ARG[value.class] || raise("Unhandled class #{value.class.name}")
|
39
38
|
end
|
40
39
|
|
41
|
-
def hash_to_attributes
|
40
|
+
def hash_to_attributes(values)
|
42
41
|
values.map do |key, value|
|
43
42
|
begin
|
44
43
|
[key, AttributeValue.new(safe_param_name(value) => value)]
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -12,7 +11,7 @@ module NewRelic::Agent
|
|
12
11
|
class Worker
|
13
12
|
attr_reader :name, :error
|
14
13
|
|
15
|
-
def initialize
|
14
|
+
def initialize(name, &job)
|
16
15
|
@name = name
|
17
16
|
@job = job
|
18
17
|
@error = nil
|
@@ -23,8 +22,10 @@ module NewRelic::Agent
|
|
23
22
|
|
24
23
|
def status
|
25
24
|
return "error" if error?
|
25
|
+
|
26
26
|
@lock.synchronize do
|
27
27
|
return "stopped" if @worker_thread.nil?
|
28
|
+
|
28
29
|
@worker_thread.status || "idle"
|
29
30
|
end
|
30
31
|
end
|
@@ -33,16 +34,18 @@ module NewRelic::Agent
|
|
33
34
|
!!@error
|
34
35
|
end
|
35
36
|
|
36
|
-
def join
|
37
|
+
def join(timeout = nil)
|
37
38
|
return unless @worker_thread
|
38
|
-
|
39
|
-
|
39
|
+
|
40
|
+
NewRelic::Agent.logger.debug("joining worker #{@name} thread...")
|
41
|
+
@worker_thread.join(timeout)
|
40
42
|
end
|
41
43
|
|
42
44
|
def stop
|
43
45
|
@lock.synchronize do
|
44
46
|
return unless @worker_thread
|
45
|
-
|
47
|
+
|
48
|
+
NewRelic::Agent.logger.debug("stopping worker #{@name} thread...")
|
46
49
|
@worker_thread.kill
|
47
50
|
@worker_thread = nil
|
48
51
|
end
|
@@ -51,8 +54,8 @@ module NewRelic::Agent
|
|
51
54
|
private
|
52
55
|
|
53
56
|
def start_thread
|
54
|
-
NewRelic::Agent.logger.debug
|
55
|
-
@worker_thread =
|
57
|
+
NewRelic::Agent.logger.debug("starting worker #{@name} thread...")
|
58
|
+
@worker_thread = NewRelic::Agent::Threading::AgentThread.create("infinite_tracing_worker") do
|
56
59
|
catch(:exit) do
|
57
60
|
begin
|
58
61
|
@job.call
|
@@ -63,7 +66,7 @@ module NewRelic::Agent
|
|
63
66
|
end
|
64
67
|
end
|
65
68
|
@worker_thread.abort_on_exception = true
|
66
|
-
if @worker_thread.respond_to?
|
69
|
+
if @worker_thread.respond_to?(:report_on_exception)
|
67
70
|
@worker_thread.report_on_exception = NewRelic::Agent.config[:log_level] == "debug"
|
68
71
|
end
|
69
72
|
end
|
data/lib/infinite_tracing.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -7,7 +6,7 @@ require 'uri'
|
|
7
6
|
|
8
7
|
require 'newrelic_rpm'
|
9
8
|
|
10
|
-
NewRelic::Agent.logger.debug
|
9
|
+
NewRelic::Agent.logger.debug("Detected New Relic Infinite Tracing Gem")
|
11
10
|
|
12
11
|
require 'infinite_tracing/version'
|
13
12
|
require 'infinite_tracing/config'
|
@@ -20,7 +19,7 @@ DependencyDetection.defer do
|
|
20
19
|
end
|
21
20
|
|
22
21
|
executes do
|
23
|
-
NewRelic::Agent.logger.debug
|
22
|
+
NewRelic::Agent.logger.debug("Loading New Relic Infinite Tracing Library")
|
24
23
|
|
25
24
|
require 'infinite_tracing/proto'
|
26
25
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
# frozen_string_literal: true
|
@@ -7,7 +6,7 @@ require 'uri'
|
|
7
6
|
|
8
7
|
require 'newrelic_rpm'
|
9
8
|
|
10
|
-
NewRelic::Agent.logger.debug
|
9
|
+
NewRelic::Agent.logger.debug("Detected New Relic Infinite Tracing Gem")
|
11
10
|
|
12
11
|
require 'new_relic/infinite_tracing/version'
|
13
12
|
require 'new_relic/infinite_tracing/config'
|
@@ -20,7 +19,7 @@ DependencyDetection.defer do
|
|
20
19
|
end
|
21
20
|
|
22
21
|
executes do
|
23
|
-
NewRelic::Agent.logger.debug
|
22
|
+
NewRelic::Agent.logger.debug("Loading New Relic Infinite Tracing Library")
|
24
23
|
|
25
24
|
require 'new_relic/infinite_tracing/proto'
|
26
25
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
// encoding: utf-8
|
2
1
|
// This file is distributed under New Relic's license terms.
|
3
2
|
// See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
3
|
|
@@ -39,4 +38,4 @@ message AttributeValue {
|
|
39
38
|
|
40
39
|
message RecordStatus {
|
41
40
|
uint64 messages_seen = 1;
|
42
|
-
}
|
41
|
+
}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
#-*- coding: utf-8 -*-
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
require 'fileutils'
|
@@ -12,13 +11,13 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
12
11
|
require 'new_relic/version'
|
13
12
|
|
14
13
|
Gem::Specification.new do |s|
|
15
|
-
def self.copy_files
|
16
|
-
subfolder = File.expand_path
|
14
|
+
def self.copy_files(filelist)
|
15
|
+
subfolder = File.expand_path(File.dirname(__FILE__))
|
17
16
|
|
18
17
|
filelist.each do |filename|
|
19
18
|
source_full_filename = File.expand_path(filename)
|
20
19
|
dest_full_filename = File.join(subfolder, File.basename(filename))
|
21
|
-
FileUtils.cp
|
20
|
+
FileUtils.cp(source_full_filename, dest_full_filename)
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
@@ -27,12 +26,12 @@ Gem::Specification.new do |s|
|
|
27
26
|
"../CONTRIBUTING.md"
|
28
27
|
]
|
29
28
|
|
30
|
-
self.copy_files
|
29
|
+
self.copy_files(shared_files)
|
31
30
|
|
32
31
|
s.name = "newrelic-infinite_tracing"
|
33
32
|
s.version = NewRelic::VERSION::STRING
|
34
33
|
s.required_ruby_version = '>= 2.5.0'
|
35
|
-
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to?
|
34
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to?(:required_rubygems_version=)
|
36
35
|
s.authors = ["Tanna McClure", "Kayla Reopelle", "James Bunch", "Hannah Ramadan"]
|
37
36
|
s.licenses = ['Apache-2.0']
|
38
37
|
s.description = <<-EOS
|
@@ -69,7 +68,7 @@ Gem or plugin, hosted on https://github.com/newrelic/newrelic-ruby-agent/
|
|
69
68
|
s.files = file_list
|
70
69
|
|
71
70
|
s.homepage = "https://github.com/newrelic/newrelic-ruby-agent/tree/main/infinite_tracing"
|
72
|
-
s.require_paths = [
|
71
|
+
s.require_paths = %w[lib infinite_tracing]
|
73
72
|
s.summary = "New Relic Infinite Tracing for the Ruby agent"
|
74
73
|
|
75
74
|
s.add_dependency 'newrelic_rpm', NewRelic::VERSION::STRING
|
@@ -78,7 +77,8 @@ Gem or plugin, hosted on https://github.com/newrelic/newrelic-ruby-agent/
|
|
78
77
|
s.add_development_dependency 'rake', '12.3.3'
|
79
78
|
s.add_development_dependency 'rb-inotify', '0.9.10' # locked to support < Ruby 2.3 (and listen 3.0.8)
|
80
79
|
s.add_development_dependency 'listen', '3.0.8' # locked to support < Ruby 2.3
|
81
|
-
s.add_development_dependency 'minitest', '~> 5.
|
80
|
+
s.add_development_dependency 'minitest', '~> 5.15'
|
81
|
+
s.add_development_dependency 'minitest-stub-const', '0.6'
|
82
82
|
s.add_development_dependency 'mocha', '~> 1.9.0'
|
83
83
|
s.add_development_dependency 'pry-nav', '~> 0.3.0'
|
84
84
|
s.add_development_dependency 'pry-stack_explorer', '~> 0.4.9'
|
data/tasks/all.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
# This is required to load in task definitions
|
6
6
|
Dir.glob(File.join(File.dirname(__FILE__), '*.rake')) do |file|
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module License
|
6
|
+
def extract_license_terms(file_contents)
|
7
|
+
text = []
|
8
|
+
text << file_contents.shift while !file_contents.empty? && file_contents[0] =~ /^#/
|
9
|
+
text << ""
|
10
|
+
text
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_license_preamble_and_remove_requires(output_path)
|
14
|
+
gemspec_path = File.expand_path(File.join(output_path, '..', '..', '..', '..', '..'))
|
15
|
+
license_terms = extract_license_terms(File.readlines(File.join(gemspec_path, "Gemfile")))
|
16
|
+
Dir.glob(File.join(output_path, "*.rb")) do |filename|
|
17
|
+
contents = File.readlines(filename)
|
18
|
+
contents.reject! { |r| r =~ /^\s*require\s.*$/ }
|
19
|
+
File.open(filename, 'w') do |output|
|
20
|
+
output.puts license_terms
|
21
|
+
output.puts contents
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/tasks/proto.rake
CHANGED
@@ -1,38 +1,18 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'helpers/license'
|
6
|
+
include License
|
4
7
|
|
5
8
|
namespace :proto do
|
6
9
|
desc "Generate proto files"
|
7
|
-
|
8
10
|
task :generate do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
text << ""
|
13
|
-
text
|
14
|
-
end
|
15
|
-
|
16
|
-
# adds the NewRelic License notice to the top of the generated files
|
17
|
-
# Removes require lines since these are replicated in the proto.rb file.
|
18
|
-
def add_license_preamble_and_remove_requires output_path
|
19
|
-
gemspec_path = File.expand_path(File.join(output_path, '..', '..', '..', '..', '..'))
|
20
|
-
license_terms = extract_license_terms File.readlines(File.join(gemspec_path, "Gemfile"))
|
21
|
-
Dir.glob(File.join output_path, "*.rb") do |filename|
|
22
|
-
contents = File.readlines filename
|
23
|
-
contents.reject! { |r| r =~ /^\s*require\s.*$/ }
|
24
|
-
File.open(filename, 'w') do |output|
|
25
|
-
output.puts license_terms
|
26
|
-
output.puts contents
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
gem_folder = File.expand_path File.join(File.dirname(__FILE__), "..")
|
32
|
-
proto_filename = File.join gem_folder, "lib", "new_relic", "proto", "infinite_tracing.proto"
|
33
|
-
output_path = File.join gem_folder, "lib", "new_relic", "infinite_tracing", "proto"
|
11
|
+
gem_folder = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
12
|
+
proto_filename = File.join(gem_folder, "lib", "new_relic", "proto", "infinite_tracing.proto")
|
13
|
+
output_path = File.join(gem_folder, "lib", "new_relic", "infinite_tracing", "proto")
|
34
14
|
|
35
|
-
FileUtils.mkdir_p
|
15
|
+
FileUtils.mkdir_p(output_path)
|
36
16
|
cmd = [
|
37
17
|
"grpc_tools_ruby_protoc",
|
38
18
|
"-I#{gem_folder}/lib/new_relic/proto",
|
@@ -40,9 +20,9 @@ namespace :proto do
|
|
40
20
|
"--grpc_out=#{output_path} #{proto_filename}"
|
41
21
|
].join(" ")
|
42
22
|
|
43
|
-
if system
|
23
|
+
if system(cmd)
|
44
24
|
puts "Proto file generated!"
|
45
|
-
add_license_preamble_and_remove_requires
|
25
|
+
add_license_preamble_and_remove_requires(output_path)
|
46
26
|
else
|
47
27
|
puts "Failed to generate proto file."
|
48
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: newrelic-infinite_tracing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.
|
4
|
+
version: 8.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tanna McClure
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2022-
|
14
|
+
date: 2022-10-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: newrelic_rpm
|
@@ -19,14 +19,14 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - '='
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 8.
|
22
|
+
version: 8.12.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - '='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 8.
|
29
|
+
version: 8.12.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: grpc
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,14 +89,28 @@ dependencies:
|
|
89
89
|
requirements:
|
90
90
|
- - "~>"
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
version: 5.
|
92
|
+
version: '5.15'
|
93
93
|
type: :development
|
94
94
|
prerelease: false
|
95
95
|
version_requirements: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
97
|
- - "~>"
|
98
98
|
- !ruby/object:Gem::Version
|
99
|
-
version: 5.
|
99
|
+
version: '5.15'
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: minitest-stub-const
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - '='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0.6'
|
107
|
+
type: :development
|
108
|
+
prerelease: false
|
109
|
+
version_requirements: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - '='
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0.6'
|
100
114
|
- !ruby/object:Gem::Dependency
|
101
115
|
name: mocha
|
102
116
|
requirement: !ruby/object:Gem::Requirement
|
@@ -259,6 +273,7 @@ files:
|
|
259
273
|
- lib/proto/infinite_tracing.proto
|
260
274
|
- newrelic-infinite_tracing.gemspec
|
261
275
|
- tasks/all.rb
|
276
|
+
- tasks/helpers/license.rb
|
262
277
|
- tasks/proto.rake
|
263
278
|
homepage: https://github.com/newrelic/newrelic-ruby-agent/tree/main/infinite_tracing
|
264
279
|
licenses:
|