elastic-apm 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/.jenkins_exclude.yml +47 -0
  3. data/.ci/.jenkins_framework.yml +4 -0
  4. data/.ci/.jenkins_master_framework.yml +1 -0
  5. data/.ci/.jenkins_ruby.yml +1 -0
  6. data/.ci/downstreamTests.groovy +1 -1
  7. data/.gitignore +2 -1
  8. data/.rspec +1 -0
  9. data/CHANGELOG.asciidoc +24 -0
  10. data/Dockerfile +43 -0
  11. data/Gemfile +34 -15
  12. data/README.md +30 -1
  13. data/bin/dev +54 -0
  14. data/bin/run-tests +27 -0
  15. data/docker-compose.yml +32 -0
  16. data/docs/api.asciidoc +13 -2
  17. data/docs/configuration.asciidoc +30 -0
  18. data/docs/getting-started-rack.asciidoc +24 -0
  19. data/docs/release-notes.asciidoc +1 -1
  20. data/lib/elastic_apm.rb +12 -1
  21. data/lib/elastic_apm/agent.rb +15 -3
  22. data/lib/elastic_apm/central_config.rb +39 -19
  23. data/lib/elastic_apm/child_durations.rb +42 -0
  24. data/lib/elastic_apm/config.rb +27 -11
  25. data/lib/elastic_apm/context/request/socket.rb +1 -1
  26. data/lib/elastic_apm/context_builder.rb +1 -1
  27. data/lib/elastic_apm/error.rb +10 -0
  28. data/lib/elastic_apm/error/exception.rb +7 -0
  29. data/lib/elastic_apm/grape.rb +48 -0
  30. data/lib/elastic_apm/instrumenter.rb +77 -4
  31. data/lib/elastic_apm/logging.rb +0 -2
  32. data/lib/elastic_apm/metrics.rb +39 -26
  33. data/lib/elastic_apm/metrics/breakdown_set.rb +14 -0
  34. data/lib/elastic_apm/metrics/{cpu_mem.rb → cpu_mem_set.rb} +62 -54
  35. data/lib/elastic_apm/metrics/metric.rb +117 -0
  36. data/lib/elastic_apm/metrics/set.rb +106 -0
  37. data/lib/elastic_apm/metrics/span_scoped_set.rb +39 -0
  38. data/lib/elastic_apm/metrics/transaction_set.rb +11 -0
  39. data/lib/elastic_apm/metrics/vm_set.rb +44 -0
  40. data/lib/elastic_apm/metricset.rb +31 -4
  41. data/lib/elastic_apm/normalizers.rb +6 -0
  42. data/lib/elastic_apm/normalizers/grape.rb +5 -0
  43. data/lib/elastic_apm/normalizers/grape/endpoint_run.rb +47 -0
  44. data/lib/elastic_apm/normalizers/rails/active_record.rb +16 -5
  45. data/lib/elastic_apm/opentracing.rb +4 -4
  46. data/lib/elastic_apm/rails.rb +12 -2
  47. data/lib/elastic_apm/railtie.rb +1 -5
  48. data/lib/elastic_apm/sinatra.rb +1 -1
  49. data/lib/elastic_apm/span.rb +15 -10
  50. data/lib/elastic_apm/spies.rb +0 -1
  51. data/lib/elastic_apm/sql_summarizer.rb +8 -6
  52. data/lib/elastic_apm/subscriber.rb +4 -1
  53. data/lib/elastic_apm/transaction.rb +6 -6
  54. data/lib/elastic_apm/transport/base.rb +7 -0
  55. data/lib/elastic_apm/transport/connection.rb +11 -69
  56. data/lib/elastic_apm/transport/connection/http.rb +43 -35
  57. data/lib/elastic_apm/transport/connection/proxy_pipe.rb +0 -3
  58. data/lib/elastic_apm/transport/headers.rb +62 -0
  59. data/lib/elastic_apm/transport/serializers.rb +0 -2
  60. data/lib/elastic_apm/transport/serializers/metricset_serializer.rb +19 -6
  61. data/lib/elastic_apm/transport/serializers/span_serializer.rb +3 -3
  62. data/lib/elastic_apm/transport/user_agent.rb +31 -0
  63. data/lib/elastic_apm/transport/worker.rb +1 -2
  64. data/lib/elastic_apm/version.rb +1 -1
  65. metadata +20 -6
  66. data/lib/elastic_apm/metrics/vm.rb +0 -60
  67. data/lib/elastic_apm/util/prefixed_logger.rb +0 -18
@@ -67,7 +67,7 @@ module ElasticAPM
67
67
 
68
68
  # rubocop:disable Metrics/MethodLength
69
69
  def finish(clock_end: Util.monotonic_micros, end_time: nil)
70
- return unless (instrumenter = ElasticAPM.agent&.instrumenter)
70
+ return unless (agent = ElasticAPM.agent)
71
71
 
72
72
  if end_time
73
73
  warn '[ElasticAPM] DEPRECATED: Setting a custom end time as a ' \
@@ -79,12 +79,12 @@ module ElasticAPM
79
79
 
80
80
  case elastic_span
81
81
  when ElasticAPM::Transaction
82
- instrumenter.current_transaction = nil
82
+ agent.instrumenter.current_transaction = nil
83
83
  when ElasticAPM::Span
84
- instrumenter.current_spans.delete(elastic_span)
84
+ agent.instrumenter.current_spans.delete(elastic_span)
85
85
  end
86
86
 
87
- instrumenter.enqueue.call elastic_span
87
+ agent.enqueue elastic_span
88
88
  end
89
89
  # rubocop:enable Metrics/MethodLength
90
90
 
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'elastic_apm/railtie'
3
4
  require 'elastic_apm/subscriber'
4
5
  require 'elastic_apm/normalizers/rails'
5
6
 
@@ -8,6 +9,7 @@ module ElasticAPM
8
9
  # It is recommended to use the Railtie instead.
9
10
  module Rails
10
11
  extend self
12
+
11
13
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
12
14
  # rubocop:disable Metrics/CyclomaticComplexity
13
15
  # Start the ElasticAPM agent and hook into Rails.
@@ -17,11 +19,13 @@ module ElasticAPM
17
19
  # @return [true, nil] true if the agent was started, nil otherwise.
18
20
  def start(config)
19
21
  config = Config.new(config) unless config.is_a?(Config)
22
+
20
23
  if (reason = should_skip?(config))
21
24
  unless config.disable_start_message?
22
25
  config.logger.info "Skipping because: #{reason}. " \
23
26
  "Start manually with `ElasticAPM.start'"
24
27
  end
28
+
25
29
  return
26
30
  end
27
31
 
@@ -35,10 +39,16 @@ module ElasticAPM
35
39
  )
36
40
  require 'elastic_apm/spies/action_dispatch'
37
41
  end
42
+
38
43
  ElasticAPM.running?
39
44
  rescue StandardError => e
40
- config.logger.error format('Failed to start: %s', e.message)
41
- config.logger.debug "Backtrace:\n" + e.backtrace.join("\n")
45
+ if config.disable_start_message?
46
+ config.logger.error format('Failed to start: %s', e.message)
47
+ config.logger.debug "Backtrace:\n" + e.backtrace.join("\n")
48
+ else
49
+ puts format('Failed to start: %s', e.message)
50
+ puts "Backtrace:\n" + e.backtrace.join("\n")
51
+ end
42
52
  end
43
53
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
44
54
  # rubocop:enable Metrics/CyclomaticComplexity
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'elastic_apm/rails'
4
-
5
3
  module ElasticAPM
6
4
  # @api private
7
5
  class Railtie < ::Rails::Railtie
@@ -13,9 +11,7 @@ module ElasticAPM
13
11
  end
14
12
 
15
13
  initializer 'elastic_apm.initialize' do |app|
16
- config = Config.new(app.config.elastic_apm).tap do |c|
17
- c.app = app
18
-
14
+ config = Config.new(app.config.elastic_apm.merge(app: app)).tap do |c|
19
15
  # Prepend Rails.root to log_path if present
20
16
  if c.log_path && !c.log_path.start_with?('/')
21
17
  c.log_path = ::Rails.root.join(c.log_path)
@@ -9,7 +9,7 @@ module ElasticAPM
9
9
  # @param app [Sinatra::Base] A Sinatra app.
10
10
  # @param config [Config, Hash] An instance of Config or a Hash config.
11
11
  # @return [true, nil] true if the agent was started, nil otherwise.
12
- def start(app, config)
12
+ def start(app, config = {})
13
13
  config = Config.new(config) unless config.is_a?(Config)
14
14
  configure_app(app, config)
15
15
 
@@ -1,24 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'securerandom'
4
- require 'forwardable'
5
-
6
3
  require 'elastic_apm/span/context'
7
4
 
8
5
  module ElasticAPM
9
6
  # @api private
10
7
  class Span
11
8
  extend Forwardable
12
-
13
- def_delegators :@trace_context, :trace_id, :parent_id, :id
9
+ include ChildDurations::Methods
14
10
 
15
11
  DEFAULT_TYPE = 'custom'
16
12
 
17
13
  # rubocop:disable Metrics/ParameterLists, Metrics/MethodLength
18
14
  def initialize(
19
15
  name:,
20
- transaction_id:,
16
+ transaction:,
21
17
  trace_context:,
18
+ parent:,
22
19
  type: nil,
23
20
  subtype: nil,
24
21
  action: nil,
@@ -35,14 +32,17 @@ module ElasticAPM
35
32
  @action = action
36
33
  end
37
34
 
38
- @transaction_id = transaction_id
39
- @trace_context = trace_context
35
+ @transaction = transaction
36
+ @parent = parent
37
+ @trace_context = trace_context || parent.trace_context.child
40
38
 
41
39
  @context = context || Span::Context.new
42
40
  @stacktrace_builder = stacktrace_builder
43
41
  end
44
42
  # rubocop:enable Metrics/ParameterLists, Metrics/MethodLength
45
43
 
44
+ def_delegators :@trace_context, :trace_id, :parent_id, :id
45
+
46
46
  attr_accessor(
47
47
  :action,
48
48
  :name,
@@ -54,9 +54,11 @@ module ElasticAPM
54
54
  attr_reader(
55
55
  :context,
56
56
  :duration,
57
+ :parent,
58
+ :self_time,
57
59
  :stacktrace,
58
60
  :timestamp,
59
- :transaction_id
61
+ :transaction
60
62
  )
61
63
 
62
64
  # life cycle
@@ -64,11 +66,14 @@ module ElasticAPM
64
66
  def start(clock_start = Util.monotonic_micros)
65
67
  @timestamp = Util.micros
66
68
  @clock_start = clock_start
69
+ @parent.child_started
67
70
  self
68
71
  end
69
72
 
70
73
  def stop(clock_end = Util.monotonic_micros)
71
74
  @duration ||= (clock_end - @clock_start)
75
+ @parent.child_stopped
76
+ @self_time = @duration - child_durations.duration
72
77
  self
73
78
  end
74
79
 
@@ -96,7 +101,7 @@ module ElasticAPM
96
101
  # relations
97
102
 
98
103
  def inspect
99
- "<ElasticAPM::Span id:#{id}" \
104
+ "<ElasticAPM::Span id:#{trace_context&.id}" \
100
105
  " name:#{name.inspect}" \
101
106
  " type:#{type.inspect}" \
102
107
  '>'
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
4
3
  require 'elastic_apm/util/inflector'
5
4
 
6
5
  module ElasticAPM
@@ -9,21 +9,23 @@ module ElasticAPM
9
9
  TABLE_REGEX = %{["'`]?([A-Za-z0-9_]+)["'`]?}
10
10
 
11
11
  REGEXES = {
12
- /^BEGIN/i => 'BEGIN',
13
- /^COMMIT/i => 'COMMIT',
14
- /^SELECT .* FROM #{TABLE_REGEX}/i => 'SELECT FROM ',
15
- /^INSERT INTO #{TABLE_REGEX}/i => 'INSERT INTO ',
16
- /^UPDATE #{TABLE_REGEX}/i => 'UPDATE ',
17
- /^DELETE FROM #{TABLE_REGEX}/i => 'DELETE FROM '
12
+ /^BEGIN/iu => 'BEGIN',
13
+ /^COMMIT/iu => 'COMMIT',
14
+ /^SELECT .* FROM #{TABLE_REGEX}/iu => 'SELECT FROM ',
15
+ /^INSERT INTO #{TABLE_REGEX}/iu => 'INSERT INTO ',
16
+ /^UPDATE #{TABLE_REGEX}/iu => 'UPDATE ',
17
+ /^DELETE FROM #{TABLE_REGEX}/iu => 'DELETE FROM '
18
18
  }.freeze
19
19
 
20
20
  FORMAT = '%s%s'
21
+ UTF8 = 'UTF-8'
21
22
 
22
23
  def self.cache
23
24
  @cache ||= Util::LruCache.new
24
25
  end
25
26
 
26
27
  def summarize(sql)
28
+ sql = sql.encode(UTF8, invalid: :replace, undef: :replace)
27
29
  self.class.cache[sql] ||=
28
30
  REGEXES.find do |regex, sig|
29
31
  if (match = sql[0...1000].match(regex))
@@ -54,7 +54,7 @@ module ElasticAPM
54
54
  end
55
55
  # rubocop:enable Metrics/MethodLength
56
56
 
57
- def finish(_name, id, _payload)
57
+ def finish(name, id, payload)
58
58
  # debug "AS::Notification#finish:#{name}:#{id}"
59
59
  return unless (transaction = @agent.current_transaction)
60
60
 
@@ -62,6 +62,9 @@ module ElasticAPM
62
62
  next unless notification.id == id
63
63
 
64
64
  if (span = notification.span)
65
+ if @agent.config.span_frames_min_duration?
66
+ span.original_backtrace ||= @normalizers.backtrace(name, payload)
67
+ end
65
68
  @agent.end_span if span == @agent.current_span
66
69
  end
67
70
  return
@@ -1,19 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'securerandom'
4
- require 'forwardable'
5
-
6
3
  module ElasticAPM
7
4
  # @api private
8
5
  class Transaction
9
6
  extend Forwardable
7
+ include ChildDurations::Methods
10
8
 
11
9
  def_delegators :@trace_context,
12
10
  :trace_id, :parent_id, :id, :ensure_parent_id
13
11
 
14
12
  DEFAULT_TYPE = 'custom'
15
13
 
16
- # rubocop:disable Metrics/ParameterLists, Metrics/MethodLength
14
+ # rubocop:disable Metrics/MethodLength, Metrics/ParameterLists
17
15
  def initialize(
18
16
  name = nil,
19
17
  type = nil,
@@ -40,12 +38,12 @@ module ElasticAPM
40
38
 
41
39
  @notifications = [] # for AS::Notifications
42
40
  end
43
- # rubocop:enable Metrics/ParameterLists, Metrics/MethodLength
41
+ # rubocop:enable Metrics/MethodLength, Metrics/ParameterLists
44
42
 
45
43
  attr_accessor :name, :type, :result
46
44
 
47
45
  attr_reader :context, :duration, :started_spans, :dropped_spans,
48
- :timestamp, :trace_context, :notifications, :config
46
+ :timestamp, :trace_context, :notifications, :self_time, :config
49
47
 
50
48
  def sampled?
51
49
  @sampled
@@ -66,6 +64,8 @@ module ElasticAPM
66
64
  def stop(clock_end = Util.monotonic_micros)
67
65
  raise 'Transaction not yet start' unless timestamp
68
66
  @duration = clock_end - @clock_start
67
+ @self_time = @duration - child_durations.duration
68
+
69
69
  self
70
70
  end
71
71
 
@@ -1,10 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'elastic_apm/metadata'
4
+ require 'elastic_apm/transport/user_agent'
5
+ require 'elastic_apm/transport/headers'
4
6
  require 'elastic_apm/transport/connection'
5
7
  require 'elastic_apm/transport/worker'
6
8
  require 'elastic_apm/transport/serializers'
7
9
  require 'elastic_apm/transport/filters'
10
+ require 'elastic_apm/transport/connection/http'
11
+
8
12
  require 'elastic_apm/util/throttle'
9
13
 
10
14
  module ElasticAPM
@@ -39,6 +43,8 @@ module ElasticAPM
39
43
 
40
44
  ensure_watcher_running
41
45
  ensure_worker_count
46
+
47
+ @stopped.make_false unless @stopped.false?
42
48
  end
43
49
 
44
50
  def stop
@@ -54,6 +60,7 @@ module ElasticAPM
54
60
  def submit(resource)
55
61
  if @stopped.true?
56
62
  warn '%s: Transport stopping, no new events accepted', pid_str
63
+ debug 'Dropping: %s', resource.inspect
57
64
  return false
58
65
  end
59
66
 
@@ -1,13 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent'
4
- require 'zlib'
5
-
6
- require 'elastic_apm/transport/connection/http'
7
-
8
3
  module ElasticAPM
9
4
  module Transport
10
- # rubocop:disable Metrics/ClassLength
11
5
  # @api private
12
6
  class Connection
13
7
  include Logging
@@ -24,20 +18,14 @@ module ElasticAPM
24
18
  # with ongoing write requests to `http`, write and close
25
19
  # requests have to be synchronized.
26
20
 
27
- HEADERS = {
28
- 'Content-Type' => 'application/x-ndjson',
29
- 'Transfer-Encoding' => 'chunked'
30
- }.freeze
31
- GZIP_HEADERS = HEADERS.merge(
32
- 'Content-Encoding' => 'gzip'
33
- ).freeze
34
-
35
- def initialize(config, metadata)
21
+ def initialize(config)
36
22
  @config = config
37
- @headers = build_headers(metadata)
38
- @metadata = JSON.fast_generate(metadata)
23
+ @metadata = JSON.fast_generate(
24
+ Serializers::MetadataSerializer.new(config).build(
25
+ Metadata.new(config)
26
+ )
27
+ )
39
28
  @url = config.server_url + '/intake/v2/events'
40
- @ssl_context = build_ssl_context
41
29
  @mutex = Mutex.new
42
30
  end
43
31
 
@@ -81,9 +69,8 @@ module ElasticAPM
81
69
 
82
70
  def inspect
83
71
  format(
84
- '@%s http connection closed? :%s>',
85
- super.split.first,
86
- http.closed?
72
+ '<%s url:%s closed:%s >',
73
+ super.split.first, url, http&.closed?
87
74
  )
88
75
  end
89
76
 
@@ -93,11 +80,9 @@ module ElasticAPM
93
80
  schedule_closing if @config.api_request_time
94
81
 
95
82
  @http =
96
- Http.open(
97
- @config, @url,
98
- headers: @headers,
99
- ssl_context: @ssl_context
100
- ).tap { |http| http.write(@metadata) }
83
+ Http.open(@config, @url).tap do |http|
84
+ http.write(@metadata)
85
+ end
101
86
  end
102
87
  # rubocop:enable
103
88
 
@@ -108,49 +93,6 @@ module ElasticAPM
108
93
  flush(:timeout)
109
94
  end
110
95
  end
111
-
112
- def build_headers(metadata)
113
- (
114
- @config.http_compression? ? GZIP_HEADERS : HEADERS
115
- ).dup.tap do |headers|
116
- headers['User-Agent'] = build_user_agent(metadata)
117
-
118
- if (token = @config.secret_token)
119
- headers['Authorization'] = "Bearer #{token}"
120
- end
121
- end
122
- end
123
-
124
- def build_user_agent(metadata)
125
- runtime = metadata.dig(:metadata, :service, :runtime)
126
-
127
- [
128
- "elastic-apm-ruby/#{VERSION}",
129
- HTTP::Request::USER_AGENT,
130
- [runtime[:name], runtime[:version]].join('/')
131
- ].join(' ')
132
- end
133
-
134
- def build_ssl_context # rubocop:disable Metrics/MethodLength
135
- return unless @config.use_ssl?
136
-
137
- OpenSSL::SSL::SSLContext.new.tap do |context|
138
- if @config.server_ca_cert
139
- context.ca_file = @config.server_ca_cert
140
- else
141
- context.cert_store =
142
- OpenSSL::X509::Store.new.tap(&:set_default_paths)
143
- end
144
-
145
- context.verify_mode =
146
- if @config.verify_server_cert
147
- OpenSSL::SSL::VERIFY_PEER
148
- else
149
- OpenSSL::SSL::VERIFY_NONE
150
- end
151
- end
152
- end
153
96
  end
154
- # rubocop:enable Metrics/ClassLength
155
97
  end
156
98
  end
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'http'
4
- require 'concurrent'
5
- require 'zlib'
6
-
7
3
  require 'elastic_apm/transport/connection/proxy_pipe'
8
4
 
9
5
  module ElasticAPM
@@ -13,23 +9,43 @@ module ElasticAPM
13
9
  class Http
14
10
  include Logging
15
11
 
16
- def initialize(config)
12
+ def initialize(config, headers: nil)
17
13
  @config = config
18
- @closed = Concurrent::AtomicBoolean.new
19
-
20
- @rd, @wr = ProxyPipe.pipe(compress: @config.http_compression?)
14
+ @headers = headers || Headers.new(config)
15
+ @client = build_client
16
+ @closed = Concurrent::AtomicBoolean.new(true)
21
17
  end
22
18
 
23
- def open(url, headers: {}, ssl_context: nil)
24
- @request = open_request_in_thread(url, headers, ssl_context)
19
+ def open(url)
20
+ @closed.make_false
21
+ @rd, @wr = ProxyPipe.pipe(compress: @config.http_compression?)
22
+ @request = open_request_in_thread(url)
25
23
  end
26
24
 
27
- def self.open(config, url, headers: {}, ssl_context: nil)
25
+ def self.open(config, url)
28
26
  new(config).tap do |http|
29
- http.open(url, headers: headers, ssl_context: ssl_context)
27
+ http.open(url)
30
28
  end
31
29
  end
32
30
 
31
+ def post(url, body: nil, headers: nil)
32
+ request(:post, url, body: body, headers: headers)
33
+ end
34
+
35
+ def get(url, headers: nil)
36
+ request(:get, url, headers: headers)
37
+ end
38
+
39
+ def request(method, url, body: nil, headers: nil)
40
+ @client.send(
41
+ method,
42
+ url,
43
+ body: body,
44
+ headers: (headers ? @headers.merge(headers) : @headers).to_h,
45
+ ssl_context: @config.ssl_context
46
+ ).flush
47
+ end
48
+
33
49
  def write(str)
34
50
  @wr.write(str)
35
51
  @wr.bytes_sent
@@ -69,23 +85,29 @@ module ElasticAPM
69
85
  format('[THREAD:%s]', Thread.current.object_id)
70
86
  end
71
87
 
72
- # rubocop:disable Metrics/LineLength
73
- def open_request_in_thread(url, headers, ssl_context)
74
- client = build_client(headers)
75
-
88
+ # rubocop:disable Metrics/MethodLength
89
+ def open_request_in_thread(url)
76
90
  debug '%s: Opening new request', thread_str
77
91
  Thread.new do
78
92
  begin
79
- post(client, url, ssl_context)
93
+ resp = post(url, body: @rd, headers: @headers.chunked.to_h)
94
+
95
+ if resp&.status == 202
96
+ debug 'APM Server responded with status 202'
97
+ elsif resp
98
+ error "APM Server responded with an error:\n%p", resp.body.to_s
99
+ end
80
100
  rescue Exception => e
81
- error "Couldn't establish connection to APM Server:\n%p", e.inspect
101
+ error(
102
+ "Couldn't establish connection to APM Server:\n%p", e.inspect
103
+ )
82
104
  end
83
105
  end
84
106
  end
85
- # rubocop:enable Metrics/LineLength
107
+ # rubocop:enable Metrics/MethodLength
86
108
 
87
- def build_client(headers)
88
- client = HTTP.headers(headers)
109
+ def build_client
110
+ client = HTTP.headers(@headers)
89
111
  return client unless @config.proxy_address && @config.proxy_port
90
112
 
91
113
  client.via(
@@ -96,20 +118,6 @@ module ElasticAPM
96
118
  @config.proxy_headers
97
119
  )
98
120
  end
99
-
100
- def post(client, url, ssl_context)
101
- resp = client.post(
102
- url,
103
- body: @rd,
104
- ssl_context: ssl_context
105
- ).flush
106
-
107
- if resp&.status == 202
108
- debug 'APM Server responded with status 202'
109
- elsif resp
110
- error "APM Server responded with an error:\n%p", resp.body.to_s
111
- end
112
- end
113
121
  end
114
122
  end
115
123
  end