elastic-apm 3.15.1 → 4.0.0.beta.1

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/.jenkins_ruby.yml +0 -1
  3. data/.rubocop.yml +0 -7
  4. data/CHANGELOG.asciidoc +22 -7
  5. data/Gemfile +3 -1
  6. data/bench/report.rb +1 -1
  7. data/docs/configuration.asciidoc +3 -80
  8. data/lib/elastic_apm/agent.rb +2 -2
  9. data/lib/elastic_apm/central_config.rb +4 -4
  10. data/lib/elastic_apm/config/regexp_list.rb +1 -1
  11. data/lib/elastic_apm/config/wildcard_pattern_list.rb +1 -1
  12. data/lib/elastic_apm/config.rb +1 -88
  13. data/lib/elastic_apm/context/response.rb +1 -3
  14. data/lib/elastic_apm/instrumenter.rb +1 -1
  15. data/lib/elastic_apm/metrics/cpu_mem_set.rb +1 -1
  16. data/lib/elastic_apm/normalizers/rails/active_record.rb +2 -2
  17. data/lib/elastic_apm/normalizers.rb +2 -2
  18. data/lib/elastic_apm/opentracing.rb +3 -2
  19. data/lib/elastic_apm/span_helpers.rb +6 -8
  20. data/lib/elastic_apm/spies/action_dispatch.rb +10 -9
  21. data/lib/elastic_apm/spies/dynamo_db.rb +9 -7
  22. data/lib/elastic_apm/spies/elasticsearch.rb +34 -33
  23. data/lib/elastic_apm/spies/faraday.rb +62 -56
  24. data/lib/elastic_apm/spies/http.rb +34 -32
  25. data/lib/elastic_apm/spies/net_http.rb +51 -52
  26. data/lib/elastic_apm/spies/rake.rb +28 -26
  27. data/lib/elastic_apm/spies/redis.rb +11 -10
  28. data/lib/elastic_apm/spies/resque.rb +18 -21
  29. data/lib/elastic_apm/spies/s3.rb +17 -12
  30. data/lib/elastic_apm/spies/sequel.rb +42 -48
  31. data/lib/elastic_apm/spies/sidekiq.rb +13 -15
  32. data/lib/elastic_apm/spies/sinatra.rb +20 -21
  33. data/lib/elastic_apm/spies/sns.rb +1 -1
  34. data/lib/elastic_apm/spies/sqs.rb +18 -22
  35. data/lib/elastic_apm/spies/tilt.rb +10 -9
  36. data/lib/elastic_apm/sql/tokenizer.rb +2 -2
  37. data/lib/elastic_apm/stacktrace_builder.rb +3 -1
  38. data/lib/elastic_apm/trace_context/traceparent.rb +5 -6
  39. data/lib/elastic_apm/trace_context.rb +5 -13
  40. data/lib/elastic_apm/transport/connection/http.rb +1 -1
  41. data/lib/elastic_apm/transport/connection/proxy_pipe.rb +1 -2
  42. data/lib/elastic_apm/transport/connection.rb +1 -1
  43. data/lib/elastic_apm/transport/filters/hash_sanitizer.rb +5 -23
  44. data/lib/elastic_apm/transport/serializers/metricset_serializer.rb +2 -2
  45. data/lib/elastic_apm/transport/worker.rb +1 -1
  46. data/lib/elastic_apm/util/deep_dup.rb +1 -1
  47. data/lib/elastic_apm/version.rb +1 -1
  48. data/lib/elastic_apm.rb +1 -1
  49. metadata +5 -7
  50. data/lib/elastic_apm/sql.rb +0 -36
  51. data/lib/elastic_apm/sql_summarizer.rb +0 -53
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88a5353924a1308c1ab7d5b3701968ccfbe0b03f2ac24372d3d1c4f90b12158c
4
- data.tar.gz: 8891407bcdb4b5e8251b580e890d5d9f652e11790d5a9e3e2bb1bb378092511b
3
+ metadata.gz: d2edbff5770e48799701579f045a0ed3871da1b65037ec0a951ecd106138202c
4
+ data.tar.gz: 750e7a30a2a69e5c36d35373d842eec64e8e89b5bab66ce6d4c25c69564fb38e
5
5
  SHA512:
6
- metadata.gz: 5eb9e1fec293b2008d083a3bc53a8458773c04e96efbe37d170591dda5faa33ef10bcadc980d7423053704fba131575c94ff3d410b8f3ab19311f94717acaade
7
- data.tar.gz: 037b3327a8b9e2db344301eb001817dc89500a74065f605dc335b1c8ecf51b01a026ea0f4f46ee4326e2fc6eb50202eece5bba64b8c77060c4cd1f62ff69be77
6
+ metadata.gz: 6add102bc8f803850243de2c7ef517f0be8ab57b8cc89f0d251034b86d83d5073685b3266123b3813496fd1c57fbc7f9c8855df63c5bcf8c35c807a746800803
7
+ data.tar.gz: fadf416339fa263a2bae03832fa9d46038953f563117c1bfb0623118364bc0bd40d75ca31585cb775d2d69cf708c0848e033c4b7dcae231b2832b6f83da41918
@@ -4,7 +4,6 @@ RUBY_VERSION:
4
4
  - ruby:2.6
5
5
  - ruby:2.5
6
6
  - ruby:2.4
7
- - ruby:2.3
8
7
  - jruby:9.2
9
8
  - docker.elastic.co/observability-ci/jruby:9.2-13-jdk
10
9
  - docker.elastic.co/observability-ci/jruby:9.2-11-jdk
data/.rubocop.yml CHANGED
@@ -132,10 +132,3 @@ Style/StringConcatenation:
132
132
 
133
133
  Style/DocumentDynamicEvalDefinition:
134
134
  Enabled: false
135
-
136
- # Applies to > ruby 2.3, enable when 2.3 support is dropped
137
- Performance/RegexpMatch:
138
- Enabled: false
139
-
140
- Style/HashTransformValues:
141
- Enabled: false
data/CHANGELOG.asciidoc CHANGED
@@ -32,17 +32,32 @@ endif::[]
32
32
  ==== Unreleased
33
33
  ////
34
34
 
35
- [[release-notes-3.x]]
36
- === Ruby Agent version 3.x
35
+ [[release-notes-4.x]]
36
+ === Ruby Agent version 4.x
37
37
 
38
- [[release-notes-3.15.1]]
39
- ==== 3.15.1 (2021-04-06)
38
+ [[release-notes-4.0.0]]
39
+ ==== 4.0.0.beta.1
40
40
 
41
41
  [float]
42
- ===== Fixed
42
+ ===== Removed
43
+
44
+ - Removed support for Ruby 2.3 and JRuby 9.1 {pull}901[#901]
45
+ - Config option `active`, see `enabled` {pull}900[#900]
46
+ - Config option `custom_key_filters`, see `sanitize_field_names` {pull}900[#900]
47
+ - Config option `default_tags`, see `global_labels` {pull}900[#900]
48
+ - Config option `default_labels`, see `global_labels` {pull}900[#900]
49
+ - Config option `ignore_url_patterns`, see `transaction_ignore_urls` {pull}900[#900]
50
+ - Config option `use_legacy_sql_parser`, legacy parser no longer included {pull}900[#900]
43
51
 
44
- - AWS S3 spy accepts symbol bucket names {pull}998[#998]
45
- - AWS S3 spy passing on blocks {pull}998[#998]
52
+ [float]
53
+ ===== Changed
54
+
55
+ - Integrations (Spies) use Module#prepend over class_eval {pull}890[#890]
56
+ - The secrets filter no longer filters based on values, see `sanitize_field_names` {pull}900[#900]
57
+ - The secrets filter is aligned with other agents, see `sanitize_field_names` {pull}900[#900]
58
+
59
+ [[release-notes-3.x]]
60
+ === Ruby Agent version 3.x
46
61
 
47
62
  [[release-notes-3.15.0]]
48
63
  ==== 3.15.0 (2021-03-22)
data/Gemfile CHANGED
@@ -26,6 +26,8 @@ gem 'cucumber', require: false
26
26
  gem 'rack-test'
27
27
  gem 'rspec', '~> 3'
28
28
  gem 'rspec-its'
29
+ gem 'rubocop', require: false
30
+ gem 'rubocop-performance', require: false
29
31
  gem 'timecop'
30
32
  gem 'webmock'
31
33
 
@@ -91,7 +93,7 @@ frameworks_versions.each do |framework, version|
91
93
  end
92
94
 
93
95
  if frameworks_versions.key?('rails')
94
- unless frameworks_versions['rails'] =~ /^(main|6)/
96
+ unless /^(main|6)/.match?(frameworks_versions['rails'])
95
97
  gem 'delayed_job', require: nil
96
98
  end
97
99
  end
data/bench/report.rb CHANGED
@@ -18,7 +18,7 @@ end
18
18
  meta = {
19
19
  executed_at: Time.new.iso8601,
20
20
  'git.commit' => git_sha,
21
- 'git.date' => String(git_date).strip != '' && Time.parse(git_date).iso8601,
21
+ 'git.date' => (String(git_date).strip != '' && Time.parse(git_date).iso8601) || Time.now.iso8601,
22
22
  'git.subject' => git_msg,
23
23
  hostname: `hostname`.chomp,
24
24
  engine: RUBY_ENGINE,
@@ -176,19 +176,6 @@ APM server in version 7.6.
176
176
 
177
177
  WARNING: Api keys only provide any real security if your APM server uses TLS.
178
178
 
179
- [float]
180
- [[config-active]]
181
- ==== `active` deprecated:[3.7.0,See <<config-enabled>> instead.]
182
- |============
183
- | Environment | `Config` key | Default
184
- | `ELASTIC_APM_ACTIVE` | `active` | `true`
185
- |============
186
-
187
- Whether or not to start the agent.
188
- If `active` is `false`, `ElasticAPM.start` will do nothing and all calls to the root API will return `nil`.
189
-
190
- NOTE: This option is being removed. See <<config-enabled>> instead.
191
-
192
179
  [float]
193
180
  [[config-api-buffer-size]]
194
181
  ==== `api_buffer_size`
@@ -339,57 +326,6 @@ If set to `"none"`, no cloud metadata will be collected.
339
326
  If set to any of `"aws"`, `"gcp"`, or `"azure"`,
340
327
  attempts to collect metadata will only be performed from the chosen provider.
341
328
 
342
- [float]
343
- [[config-custom-key-filters]]
344
- ==== `custom_key_filters` deprecated:[3.5.0,See <<config-sanitize-field-names>> instead.]
345
- [options="header"]
346
- |============
347
- | Environment | `Config` key | Default | Example
348
- | `ELASTIC_APM_CUSTOM_KEY_FILTERS` | `custom_key_filters` | `[]` | `['MyAuthHeader']`
349
- |============
350
-
351
- Elastic APM strips
352
- https://github.com/elastic/apm-agent-ruby/blob/1.x/lib/elastic_apm/filters/secrets_filter.rb[
353
- what looks like confidential information] from the request/response headers.
354
- Use this option to add your own custom header keys to the list of filtered keys.
355
-
356
- When setting this option via `ENV`, use a comma separated string.
357
- Eg. `ELASTIC_APM_CUSTOM_KEY_FILTERS="a,b" # => [/a/, /b/]`
358
-
359
- NOTE: This option is being removed. See <<config-sanitize-field-names>> instead.
360
-
361
- [float]
362
- [[config-default-tags]]
363
- ==== `default_tags`
364
-
365
- [options="header"]
366
- |============
367
- | Environment | `Config` key | Default | Example
368
- | `ELASTIC_APM_DEFAULT_LABELS` | `default_labels` | `{}` | `region=us1`
369
- |============
370
-
371
- Add default labels to every transaction. Note that this will eventually be deprecated in favor of `global_labels`.
372
-
373
- WARNING: Be aware that labels are indexed in Elasticsearch. Using too many unique keys will result in *https://www.elastic.co/blog/found-crash-elasticsearch#mapping-explosion[Mapping explosion]*.
374
-
375
- NOTE: `global_labels` are supported as of APM server version 7.2. `default_tags` and `default_labels` will eventually be
376
- deprecated so please transition to using `global_labels` instead. In the meantime, any `default_labels`
377
- that are set will override `global_labels`.
378
-
379
- [options="header"]
380
- |============
381
- | Environment | `Config` key | Default | Example
382
- | `ELASTIC_APM_DEFAULT_TAGS` | `default_tags` | `{}` | `region=us1`
383
- |============
384
-
385
- Add default tags to add to every transaction. Note that this option has been deprecated in favor of `default_labels`.
386
-
387
- WARNING: Be aware that tags are indexed in Elasticsearch. Using too many unique keys will result in *https://www.elastic.co/blog/found-crash-elasticsearch#mapping-explosion[Mapping explosion]*.
388
-
389
- NOTE: `global_labels` are supported as of APM server version 7.2. `default_tags` and `default_labels` will eventually be
390
- deprecated so please transition to using `global_labels` instead. In the meantime, any `default_tags`
391
- that are set will override `global_labels`.
392
-
393
329
  [float]
394
330
  [[config-disable_metrics]]
395
331
  ==== `disable_metrics`
@@ -520,9 +456,7 @@ otherwise, the default is `nil`.
520
456
  Labels added to all events, with the format key=value[,key=value[,...]].
521
457
 
522
458
  NOTE: This option requires APM Server 7.2 or greater, and will have no effect when using older
523
- server versions. `default_tags` will eventually be deprecated but in the meantime, their value
524
- will override any `global_labels`. Please transition to using `global_labels` instead of
525
- `default_tags` in light of this deprecation.
459
+ server versions.
526
460
 
527
461
  [float]
528
462
  [[config-hostname]]
@@ -701,8 +635,8 @@ when this option is false.
701
635
 
702
636
  [options="header"]
703
637
  |============
704
- | Environment | `Config` key | Default | Example
705
- | `ELASTIC_APM_SANITIZE_FIELD_NAMES` | `sanitize_field_names` | `[]` | `Auth*tion,abc*,*xyz`
638
+ | Environment | `Config` key | Default | Example
639
+ | `ELASTIC_APM_SANITIZE_FIELD_NAMES` | `sanitize_field_names` | `"password,passwd,pwd,secret,*key,*token*,*session*,*credit*,*card*,authorization,set-cookie"` | `Auth*tion,abc*,*xyz`
706
640
  |============
707
641
 
708
642
  Sometimes it is necessary to sanitize the data sent to Elastic APM, e.g. remove sensitive data.
@@ -872,17 +806,6 @@ We still record overall time and the result for unsampled transactions, but no
872
806
  context information, tags, or spans.
873
807
  Note that the sample rate will be rounded to 4 digits of precision.
874
808
 
875
- [float]
876
- [[config-use-experimental-sql-parser]]
877
- ==== `use_legacy_sql_parser`
878
- |============
879
- | Environment | `Config` key | Default
880
- | `ELASTIC_APM_USE_LEGACY_SQL_PARSER` | `use_legacy_sql_parser` | `false`
881
- |============
882
-
883
- Use the older, less precise approach to generating summaries of your app's SQL statements.
884
- Try this if you're experiencing trouble using the new default.
885
-
886
809
  [float]
887
810
  [[config-verify-server-cert]]
888
811
  ==== `verify_server_cert`
@@ -127,7 +127,7 @@ module ElasticAPM
127
127
  end
128
128
 
129
129
  def stop
130
- debug 'Stopping agent'
130
+ info 'Stopping agent'
131
131
 
132
132
  central_config.stop
133
133
  metrics.stop
@@ -276,7 +276,7 @@ module ElasticAPM
276
276
  def detect_forking!
277
277
  return if @pid == Process.pid
278
278
 
279
- config.logger.debug "Detected forking,
279
+ config.logger.debug "Forked process detected,
280
280
  restarting threads in process [PID:#{Process.pid}]"
281
281
 
282
282
  central_config.handle_forking!
@@ -66,9 +66,9 @@ module ElasticAPM
66
66
  def fetch_and_apply_config
67
67
  @promise =
68
68
  Concurrent::Promise
69
- .execute(&method(:fetch_config))
70
- .on_success(&method(:handle_success))
71
- .rescue(&method(:handle_error))
69
+ .execute { fetch_config }
70
+ .on_success { |resp| handle_success(resp) }
71
+ .rescue { |err| handle_error(err) }
72
72
  end
73
73
 
74
74
  def fetch_config
@@ -182,7 +182,7 @@ module ElasticAPM
182
182
 
183
183
  @scheduled_task =
184
184
  Concurrent::ScheduledTask
185
- .execute(seconds, &method(:fetch_and_apply_config))
185
+ .execute(seconds) { fetch_and_apply_config }
186
186
  end
187
187
  end
188
188
  end
@@ -23,7 +23,7 @@ module ElasticAPM
23
23
  class RegexpList
24
24
  def call(value)
25
25
  value = value.is_a?(String) ? value.split(',') : Array(value)
26
- value.map(&Regexp.method(:new))
26
+ value.map { |p| Regexp.new(p) }
27
27
  end
28
28
  end
29
29
  end
@@ -59,7 +59,7 @@ module ElasticAPM
59
59
 
60
60
  def call(value)
61
61
  value = value.is_a?(String) ? value.split(',') : Array(value)
62
- value.map(&WildcardPattern.method(:new))
62
+ value.map { |p| WildcardPattern.new(p) }
63
63
  end
64
64
  end
65
65
  end
@@ -30,14 +30,8 @@ module ElasticAPM
30
30
  class Config
31
31
  extend Options
32
32
 
33
- DEPRECATED_OPTIONS = %i[].freeze
34
-
35
- # DEPRECATED: To align with other agents, change on next major bump to:
36
- # "password, passwd, pwd, secret, *key, *token*, *session*, *credit*,
37
- # *card*, authorization, set-cookie"
38
33
  SANITIZE_FIELD_NAMES_DEFAULT =
39
- %w[*password* *passwd* *pwd* *secret* *key* *token* *session*
40
- *credit* *card* *authorization* *set-cookie*].freeze
34
+ %w[password passwd pwd secret *key *token* *session* *credit* *card* authorization set-cookie].freeze
41
35
 
42
36
  # rubocop:disable Layout/LineLength, Layout/ExtraSpacing
43
37
  option :config_file, type: :string, default: 'config/elastic_apm.yml'
@@ -101,7 +95,6 @@ module ElasticAPM
101
95
  option :transaction_max_spans, type: :int, default: 500
102
96
  option :transaction_sample_rate, type: :float, default: 1.0, converter: RoundFloat.new
103
97
  option :use_elastic_traceparent_header, type: :bool, default: true
104
- option :use_legacy_sql_parser, type: :bool, default: false
105
98
  option :verify_server_cert, type: :bool, default: true
106
99
 
107
100
  # rubocop:enable Layout/LineLength, Layout/ExtraSpacing
@@ -168,11 +161,6 @@ module ElasticAPM
168
161
  available_instrumentations - disable_instrumentations
169
162
  end
170
163
 
171
- def method_missing(name, *args)
172
- return super unless DEPRECATED_OPTIONS.include?(name)
173
- warn "The option `#{name}' has been removed."
174
- end
175
-
176
164
  def replace_options(new_options)
177
165
  return if new_options.nil? || new_options.empty?
178
166
  options_copy = @options.dup
@@ -201,15 +189,6 @@ module ElasticAPM
201
189
  metrics_interval > 0
202
190
  end
203
191
 
204
- # DEPRECATED: Remove this in next major version
205
- def sanitize_field_names=(value)
206
- list = WildcardPatternList.new.call(value)
207
- defaults = WildcardPatternList.new.call(SANITIZE_FIELD_NAMES_DEFAULT)
208
- # use regex pattern for comparisons
209
- get(:sanitize_field_names).value =
210
- defaults.concat(list).uniq(&:pattern)
211
- end
212
-
213
192
  def span_frames_min_duration?
214
193
  span_frames_min_duration != 0
215
194
  end
@@ -248,72 +227,6 @@ module ElasticAPM
248
227
  super.split.first + '>'
249
228
  end
250
229
 
251
- # Deprecations
252
-
253
- def default_tags=(value)
254
- warn '[DEPRECATED] The option default_tags has been renamed to ' \
255
- 'default_labels.'
256
- self.default_labels = value
257
- end
258
-
259
- def ignore_url_patterns=(value)
260
- unless value == self.class.schema[:ignore_url_patterns][:default]
261
- warn '[DEPRECATED] The option ignore_url_patterns is being removed. ' \
262
- 'Consider using transaction_ignore_urls instead.'
263
- end
264
-
265
- set(:ignore_url_patterns, value)
266
- end
267
-
268
- def custom_key_filters=(value)
269
- unless value == self.class.schema[:custom_key_filters][:default]
270
- warn '[DEPRECATED] The option custom_key_filters is being removed. ' \
271
- 'See sanitize_field_names for an alternative.'
272
- end
273
-
274
- set(:custom_key_filters, value)
275
- end
276
-
277
- def disabled_instrumentations
278
- disable_instrumentations
279
- end
280
-
281
- def active
282
- enabled
283
- end
284
- alias active? active
285
-
286
- def server_ca_cert
287
- server_ca_cert_file
288
- end
289
-
290
- def disabled_instrumentations=(value)
291
- warn '[DEPRECATED] The option disabled_instrumentations has been ' \
292
- 'renamed to disable_instrumentations to align with other agents.'
293
- self.disable_instrumentations = value
294
- end
295
-
296
- def use_experimental_sql_parser=(_value)
297
- warn '[DEPRECATED] The new SQL parser is now the default. To use the ' \
298
- 'old one, use use_legacy_sql_parser and please report why you ' \
299
- 'wish to do so.'
300
- end
301
-
302
- def active=(value)
303
- warn '[DEPRECATED] The option active has been renamed to enabled ' \
304
- 'to align with other agents and with the remote config.'
305
- self.enabled = value
306
- end
307
-
308
- def server_ca_cert=(value)
309
- unless value == self.class.schema[:server_ca_cert_file][:default]
310
- warn '[DEPRECATED] The option server_ca_cert has been ' \
311
- 'renamed to server_ca_cert_file to align with other agents.'
312
- end
313
-
314
- self.server_ca_cert_file = value
315
- end
316
-
317
230
  private
318
231
 
319
232
  def load_config_file
@@ -38,9 +38,7 @@ module ElasticAPM
38
38
  attr_reader :headers
39
39
 
40
40
  def headers=(headers)
41
- @headers = headers&.each_with_object({}) do |(k, v), hsh|
42
- hsh[k] = v.to_s
43
- end
41
+ @headers = headers&.transform_values { |v| v.to_s }
44
42
  end
45
43
  end
46
44
  end
@@ -89,7 +89,7 @@ module ElasticAPM
89
89
  end
90
90
 
91
91
  def subscriber=(subscriber)
92
- debug 'Registering subscriber'
92
+ debug 'Registering ActiveSupport::Notifications subscriber'
93
93
  @subscriber = subscriber
94
94
  @subscriber.register!
95
95
  end
@@ -79,7 +79,7 @@ module ElasticAPM
79
79
  case platform
80
80
  when :linux then Linux.new
81
81
  else
82
- warn "Unsupported platform '#{platform}' - Disabling system metrics"
82
+ warn "Disabling system metrics, unsupported platform '#{platform}'"
83
83
  disable!
84
84
  nil
85
85
  end
@@ -17,7 +17,7 @@
17
17
 
18
18
  # frozen_string_literal: true
19
19
 
20
- require 'elastic_apm/sql'
20
+ require 'elastic_apm/sql/signature'
21
21
 
22
22
  module ElasticAPM
23
23
  module Normalizers
@@ -34,7 +34,7 @@ module ElasticAPM
34
34
  def initialize(*args)
35
35
  super
36
36
 
37
- @summarizer = Sql.summarizer
37
+ @summarizer = Sql::Signature::Summarizer.new
38
38
 
39
39
  @adapters = {}
40
40
  end
@@ -39,8 +39,8 @@ module ElasticAPM # :nodoc:
39
39
  end
40
40
 
41
41
  def self.build(config)
42
- normalizers = @registered.each_with_object({}) do |(name, klass), built|
43
- built[name] = klass.new(config)
42
+ normalizers = @registered.transform_values do |klass|
43
+ klass.new(config)
44
44
  end
45
45
 
46
46
  Collection.new(normalizers)
@@ -129,8 +129,9 @@ module ElasticAPM
129
129
  def self.from_header(header)
130
130
  return unless header
131
131
 
132
- trace_context = ElasticAPM::TraceContext.parse(header)
133
- return unless trace_context
132
+ trace_context = TraceContext.new(
133
+ traceparent: TraceContext::Traceparent.parse(header)
134
+ )
134
135
 
135
136
  trace_context.traceparent.id = trace_context.parent_id
136
137
  trace_context.traceparent.parent_id = nil
@@ -36,19 +36,17 @@ module ElasticAPM
36
36
  name ||= method.to_s
37
37
  type ||= Span::DEFAULT_TYPE
38
38
 
39
- klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
40
- alias :"__without_apm_#{method}" :"#{method}"
41
-
42
- def #{method}(*args, &block)
39
+ klass.prepend(Module.new do
40
+ define_method(method) do |*args|
43
41
  unless ElasticAPM.current_transaction
44
- return __without_apm_#{method}(*args, &block)
42
+ return super(*args)
45
43
  end
46
44
 
47
- ElasticAPM.with_span "#{name}", "#{type}" do
48
- __without_apm_#{method}(*args, &block)
45
+ ElasticAPM.with_span name.to_s, type.to_s do
46
+ super(*args)
49
47
  end
50
48
  end
51
- RUBY
49
+ end)
52
50
  end
53
51
  end
54
52
 
@@ -22,18 +22,19 @@ module ElasticAPM
22
22
  module Spies
23
23
  # @api private
24
24
  class ActionDispatchSpy
25
- def install
26
- ::ActionDispatch::ShowExceptions.class_eval do
27
- alias render_exception_without_apm render_exception
28
-
29
- def render_exception(env, exception)
30
- context = ElasticAPM.build_context(rack_env: env, for_type: :error)
31
- ElasticAPM.report(exception, context: context, handled: false)
25
+ # @api private
26
+ module Ext
27
+ def render_exception(env, exception)
28
+ context = ElasticAPM.build_context(rack_env: env, for_type: :error)
29
+ ElasticAPM.report(exception, context: context, handled: false)
32
30
 
33
- render_exception_without_apm env, exception
34
- end
31
+ super(env, exception)
35
32
  end
36
33
  end
34
+
35
+ def install
36
+ ::ActionDispatch::ShowExceptions.prepend(Ext)
37
+ end
37
38
  end
38
39
 
39
40
  register(
@@ -49,12 +49,11 @@ module ElasticAPM
49
49
  end
50
50
  end
51
51
 
52
- def install
53
- ::Aws::DynamoDB::Client.class_eval do
52
+ # @api private
53
+ module Ext
54
+ def self.prepended(mod)
54
55
  # Alias all available operations
55
- api.operation_names.each do |operation_name|
56
- alias :"#{operation_name}_without_apm" :"#{operation_name}"
57
-
56
+ mod.api.operation_names.each do |operation_name|
58
57
  define_method(operation_name) do |params = {}, options = {}|
59
58
  cloud = ElasticAPM::Span::Context::Destination::Cloud.new(region: config.region)
60
59
 
@@ -79,14 +78,17 @@ module ElasticAPM
79
78
  context: context
80
79
  ) do
81
80
  ElasticAPM::Spies::DynamoDBSpy.without_net_http do
82
- original_method = method("#{operation_name}_without_apm")
83
- original_method.call(params, options)
81
+ super(params, options)
84
82
  end
85
83
  end
86
84
  end
87
85
  end
88
86
  end
89
87
  end
88
+
89
+ def install
90
+ ::Aws::DynamoDB::Client.prepend(Ext)
91
+ end
90
92
  end
91
93
 
92
94
  register(
@@ -37,47 +37,48 @@ module ElasticAPM
37
37
  end
38
38
  end
39
39
 
40
- def install
41
- ::Elasticsearch::Transport::Client.class_eval do
42
- alias perform_request_without_apm perform_request
43
-
44
- def perform_request(method, path, *args, &block)
45
- unless ElasticAPM.current_transaction
46
- return perform_request_without_apm(method, path, *args, &block)
47
- end
40
+ # @api private
41
+ module Ext
42
+ def perform_request(method, path, *args, &block)
43
+ unless ElasticAPM.current_transaction
44
+ return super(method, path, *args, &block)
45
+ end
48
46
 
49
- name = format(NAME_FORMAT, method, path)
50
- statement = []
47
+ name = format(NAME_FORMAT, method, path)
48
+ statement = []
51
49
 
52
- statement << { params: args&.[](0) }
50
+ statement << { params: args&.[](0) }
53
51
 
54
- if ElasticAPM.agent.config.capture_elasticsearch_queries
55
- unless args[1].nil? || args[1].empty?
56
- statement << {
57
- body: ElasticAPM::Spies::ElasticsearchSpy
58
- .sanitizer.strip_from(args[1])
59
- }
60
- end
52
+ if ElasticAPM.agent.config.capture_elasticsearch_queries
53
+ unless args[1].nil? || args[1].empty?
54
+ body =
55
+ ElasticAPM::Spies::ElasticsearchSpy
56
+ .sanitizer.strip_from(args[1])
57
+ statement << { body: body }
61
58
  end
59
+ end
62
60
 
63
- context = Span::Context.new(
64
- db: { statement: statement.reduce({}, :merge).to_json },
65
- destination: {
66
- name: SUBTYPE,
67
- resource: SUBTYPE,
68
- type: TYPE
69
- }
70
- )
61
+ context = Span::Context.new(
62
+ db: { statement: statement.reduce({}, :merge).to_json },
63
+ destination: {
64
+ name: SUBTYPE,
65
+ resource: SUBTYPE,
66
+ type: TYPE
67
+ }
68
+ )
71
69
 
72
- ElasticAPM.with_span(
73
- name,
74
- TYPE,
75
- subtype: SUBTYPE,
76
- context: context
77
- ) { perform_request_without_apm(method, path, *args, &block) }
78
- end
70
+ ElasticAPM.with_span(
71
+ name,
72
+ TYPE,
73
+ subtype: SUBTYPE,
74
+ context: context
75
+ ) { super(method, path, *args, &block) }
79
76
  end
80
77
  end
78
+
79
+ def install
80
+ ::Elasticsearch::Transport::Client.prepend(Ext)
81
+ end
81
82
  end
82
83
 
83
84
  register(