elastic-apm 2.6.1 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of elastic-apm might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f64eb5692ec903ccffcb881d4c7de8a725171d5d85d231b00ef3031dd8972768
4
- data.tar.gz: 437ad5c85f6d56cae467c816b6916159a9dd406dcdfd9c7baa4bed4125b62132
3
+ metadata.gz: 37a03e42bbce98f7206216314854dbe171c6964bf757fc9e25f2d990af922d38
4
+ data.tar.gz: c4be66c848b4345e8594a178b8fc2738f585bbcc772a81943734a6f1ad1c8b45
5
5
  SHA512:
6
- metadata.gz: 1def6a88dd72516323da5f9c65a3941679d14e9a8c95b6688f29127c0c155db25dae65bd2574a822114e52f55ea201bb9df0f791476b40f2f86e513dc4cd90ab
7
- data.tar.gz: 5e7b21bbf7f688da977b48b3bcdf1ccaf4d585ec2546214eda20ef158f460175d79cd67adfe8a9705e9946dab226ac1924dad780e0a1f645fd21ab6e5b47999c
6
+ metadata.gz: 81b744b6d0ff9aa3fa1f38b105a9aab42b98da5f15f173e3542882b81b860e3b02139090125f36c429032deba1e638d263469e3bdbf16f060eabf8da7edfcc25
7
+ data.tar.gz: 3070245854f3547326143d7e494f6cee9851985b5d8f2b56d07b914461cdb8f9ebb255d0466054e923b65dc77b21eb142beb477b00b4f6b14d4773eefb24ca42
@@ -5,9 +5,15 @@ AllCops:
5
5
  - 'vendor/**/*'
6
6
  - 'bench/*'
7
7
 
8
+ Layout/AlignArguments:
9
+ EnforcedStyle: with_fixed_indentation
10
+
8
11
  Layout/AlignParameters:
9
12
  EnforcedStyle: with_fixed_indentation
10
13
 
14
+ Layout/IndentFirstParameter:
15
+ Enabled: false
16
+
11
17
  Layout/AlignHash:
12
18
  Exclude:
13
19
  - 'Gemfile'
@@ -21,6 +27,9 @@ Lint/RescueException:
21
27
  Lint/HandleExceptions:
22
28
  Enabled: false
23
29
 
30
+ Lint/NonLocalExitFromIterator:
31
+ Enabled: false
32
+
24
33
  Metrics/BlockLength:
25
34
  Exclude:
26
35
  - 'spec/**/*.rb'
@@ -4,7 +4,24 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## 2.6.1
7
+ ## 2.7.0 (2019-05-07)
8
+
9
+ ### Added
10
+
11
+ - Added `disable_start_message` for those wanting complete silence on boot ([#397](https://github.com/elastic/apm-agent-ruby/pull/397))
12
+
13
+ ### Changed
14
+
15
+ - Attempt to strip secrets from `request.env` ([#410](https://github.com/elastic/apm-agent-ruby/pull/410))
16
+
17
+ ### Fixed
18
+
19
+ - Rewritten most of the internal transport code, streaming events to APM Server ([#372](https://github.com/elastic/apm-agent-ruby/pull/372))
20
+ - Re-added `default_tags` ([#395](https://github.com/elastic/apm-agent-ruby/pull/395))
21
+ - A bug in the Faraday spy when disabling the Net::HTTP spy ([#396](https://github.com/elastic/apm-agent-ruby/pull/396))
22
+ - Fix disabling the ActionDispatch spy ([#399](https://github.com/elastic/apm-agent-ruby/pull/399))
23
+
24
+ ## 2.6.1 (2019-03-28)
8
25
 
9
26
  ### Fixed
10
27
 
@@ -17,6 +17,7 @@ pipeline {
17
17
  PIPELINE_LOG_LEVEL='INFO'
18
18
  NOTIFY_TO = credentials('notify-to')
19
19
  JOB_GCS_BUCKET = credentials('gcs-bucket')
20
+ CODECOV_SECRET = 'secret/apm-team/ci/apm-agent-ruby-codecov'
20
21
  }
21
22
  options {
22
23
  timeout(time: 2, unit: 'HOURS')
@@ -82,9 +83,6 @@ pipeline {
82
83
  beforeAgent true
83
84
  allOf {
84
85
  anyOf {
85
- not {
86
- changeRequest()
87
- }
88
86
  branch 'master'
89
87
  branch "\\d+\\.\\d+"
90
88
  branch "v\\d?"
@@ -139,9 +137,6 @@ pipeline {
139
137
  beforeAgent true
140
138
  allOf {
141
139
  anyOf {
142
- not {
143
- changeRequest()
144
- }
145
140
  branch 'master'
146
141
  branch "\\d+\\.\\d+"
147
142
  branch "v\\d?"
@@ -214,7 +209,8 @@ class RubyParallelTaskGenerator extends DefaultParallelTaskGenerator {
214
209
  steps.junit(allowEmptyResults: false,
215
210
  keepLongStdio: true,
216
211
  testResults: "**/spec/ruby-agent-junit.xml")
217
- steps.codecov(repo: 'apm-agent-ruby', basedir: "${steps.env.BASE_DIR}")
212
+ steps.codecov(repo: 'apm-agent-ruby', basedir: "${steps.env.BASE_DIR}",
213
+ secret: "${steps.env.CODECOV_SECRET}")
218
214
  }
219
215
  }
220
216
  }
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # elastic-apm
2
2
  ## Elastic APM agent for ♦️Ruby
3
3
 
4
- [![Jenkins](https://apm-ci.elastic.co/buildStatus/icon?job=apm-agent-ruby/apm-agent-ruby-mbp/master)](https://apm-ci.elastic.co/job/apm-agent-ruby/apm-agent-ruby-mbp/master) [![Gem](https://img.shields.io/gem/v/elastic-apm.svg)](https://rubygems.org/gems/elastic-apm) [![codecov](https://codecov.io/gh/elastic/apm-agent-ruby/branch/master/graph/badge.svg)](https://codecov.io/gh/elastic/apm-agent-ruby)
4
+ [![Jenkins](https://apm-ci.elastic.co/buildStatus/icon?job=apm-agent-ruby/apm-agent-ruby-mbp/master)](https://apm-ci.elastic.co/job/apm-agent-ruby/job/apm-agent-ruby-mbp/job/master/) [![Gem](https://img.shields.io/gem/v/elastic-apm.svg)](https://rubygems.org/gems/elastic-apm) [![codecov](https://codecov.io/gh/elastic/apm-agent-ruby/branch/master/graph/badge.svg)](https://codecov.io/gh/elastic/apm-agent-ruby)
5
5
 
6
6
  The official Rubygem for [Elastic][] [APM][].
7
7
 
@@ -244,6 +244,9 @@ Add a tag to the current transaction.
244
244
  Tags are basic key-value pairs that are indexed in your Elasticsearch database
245
245
  and therefore searchable.
246
246
 
247
+ TIP: Before using custom tags, ensure you understand the different types of
248
+ {apm-overview-ref-v}/metadata.html[metadata] that are available.
249
+
247
250
  [source,ruby]
248
251
  ----
249
252
  before_action do
@@ -268,6 +271,9 @@ Add custom context to the current transaction.
268
271
  Use this to further specify a context that will help you track or diagnose what's
269
272
  going on inside your app.
270
273
 
274
+ TIP: Before using custom context, ensure you understand the different types of
275
+ {apm-overview-ref-v}/metadata.html[metadata] that are available.
276
+
271
277
  If called several times during a transaction the custom context will be destructively
272
278
  merged with `merge!`.
273
279
 
@@ -248,12 +248,22 @@ WARNING: Be aware that tags are indexed in Elasticsearch. Using too many unique
248
248
  [[config-disable-send]]
249
249
  ==== `disable_send`
250
250
  |============
251
- | Environment | `Config` key | Default
252
- | N/A | `disable_send` | `false`
251
+ | Environment | `Config` key | Default
252
+ | `ELASTIC_APM_DISABLE_SEND` | `disable_send` | `false`
253
253
  |============
254
254
 
255
255
  Disables sending payloads to APM Server.
256
256
 
257
+ [float]
258
+ [[config-disable-start-message]]
259
+ ==== `disable_start_message`
260
+ |============
261
+ | Environment | `Config` key | Default
262
+ | `ELASTIC_APM_DISABLE_START_MESSAGE` | `disable_start_message` | `false`
263
+ |============
264
+
265
+ Disables the agent's startup message announcing itself.
266
+
257
267
  [float]
258
268
  [[config-disabled-spies]]
259
269
  ==== `disabled_spies`
@@ -458,8 +468,8 @@ the worker pool size might help.
458
468
 
459
469
  [options="header"]
460
470
  |============
461
- | Environment | `Config` key | Default | Example
462
- | N/A | `proxy_address` | `nil` | `"example.com"`
471
+ | Environment | `Config` key | Default | Example
472
+ | `ELASTIC_APM_PROXY_ADDRESS` | `proxy_address` | `nil` | `"example.com"`
463
473
  |============
464
474
 
465
475
  An address to use as a proxy for the HTTP client.
@@ -472,6 +482,8 @@ Options available are:
472
482
  - `proxy_port`
473
483
  - `proxy_username`
474
484
 
485
+ There are also `ENV` version of these following the same pattern of putting `ELASTIC_APM_` in front.
486
+
475
487
  See https://github.com/httprb/http/wiki/Proxy-Support[Http.rb's docs].
476
488
 
477
489
  [float]
@@ -18,7 +18,7 @@ Create a file `config/elastic_apm.yml`:
18
18
 
19
19
  [source,yaml]
20
20
  ----
21
- server_url: http://localhost:8100
21
+ server_url: http://localhost:8200
22
22
  secret_token: ''
23
23
  ----
24
24
 
@@ -21,7 +21,7 @@ Create a file `config/elastic_apm.yml`:
21
21
 
22
22
  [source,yaml]
23
23
  ----
24
- server_url: http://localhost:8100
24
+ server_url: http://localhost:8200
25
25
  secret_token: ''
26
26
  ----
27
27
 
@@ -26,3 +26,5 @@ include::./supported-technologies.asciidoc[]
26
26
 
27
27
  include::./api.asciidoc[]
28
28
 
29
+ include::./release-notes.asciidoc[]
30
+
@@ -0,0 +1,4 @@
1
+ [[release-notes]]
2
+ == Release notes
3
+
4
+ Release notes are published in the https://github.com/elastic/apm-agent-ruby/blob/master/CHANGELOG.md[changelog].
@@ -33,7 +33,7 @@ module ElasticAPM
33
33
 
34
34
  unless config.active?
35
35
  config.logger.debug format(
36
- '%sAgent disabled with active: false',
36
+ "%sAgent disabled with `active: false'",
37
37
  Logging::PREFIX
38
38
  )
39
39
  return
@@ -75,26 +75,31 @@ module ElasticAPM
75
75
  attr_reader :config, :transport, :instrumenter,
76
76
  :stacktrace_builder, :context_builder, :error_builder, :metrics
77
77
 
78
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
78
79
  def start
79
- info '[%s] Starting agent, reporting to %s', VERSION, config.server_url
80
+ unless config.disable_start_message
81
+ info '[%s] Starting agent, reporting to %s', VERSION, config.server_url
82
+ end
80
83
 
81
84
  transport.start
82
85
  instrumenter.start
83
86
  metrics.start
84
87
 
85
88
  config.enabled_spies.each do |lib|
89
+ debug "Requiring spy: #{lib}"
86
90
  require "elastic_apm/spies/#{lib}"
87
91
  end
88
92
 
89
93
  self
90
94
  end
95
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
91
96
 
92
97
  def stop
93
98
  debug 'Stopping agent'
94
99
 
100
+ metrics.stop
95
101
  instrumenter.stop
96
102
  transport.stop
97
- metrics.stop
98
103
 
99
104
  self
100
105
  end
@@ -32,6 +32,7 @@ module ElasticAPM
32
32
  custom_key_filters: [],
33
33
  default_tags: {},
34
34
  disable_send: false,
35
+ disable_start_message: false,
35
36
  disabled_spies: %w[json],
36
37
  environment: ENV['RAILS_ENV'] || ENV['RACK_ENV'],
37
38
  filter_exception_types: [],
@@ -72,6 +73,7 @@ module ElasticAPM
72
73
  'ELASTIC_APM_DEFAULT_TAGS' => [:dict, 'default_tags'],
73
74
  'ELASTIC_APM_DISABLED_SPIES' => [:list, 'disabled_spies'],
74
75
  'ELASTIC_APM_DISABLE_SEND' => [:bool, 'disable_send'],
76
+ 'ELASTIC_APM_DISABLE_START_MESSAGE' => [:bool, 'disable_start_message'],
75
77
  'ELASTIC_APM_ENVIRONMENT' => 'environment',
76
78
  'ELASTIC_APM_FRAMEWORK_NAME' => 'framework_name',
77
79
  'ELASTIC_APM_FRAMEWORK_VERSION' => 'framework_version',
@@ -151,6 +153,7 @@ module ElasticAPM
151
153
  attr_accessor :current_user_username_method
152
154
  attr_accessor :default_tags
153
155
  attr_accessor :disable_send
156
+ attr_accessor :disable_start_message
154
157
  attr_accessor :disabled_spies
155
158
  attr_accessor :environment
156
159
  attr_accessor :filter_exception_types
@@ -197,6 +200,7 @@ module ElasticAPM
197
200
  alias :capture_headers? :capture_headers
198
201
  alias :capture_env? :capture_env
199
202
  alias :disable_send? :disable_send
203
+ alias :disable_start_message? :disable_start_message
200
204
  alias :http_compression? :http_compression
201
205
  alias :instrument? :instrument
202
206
  alias :verify_server_cert? :verify_server_cert
@@ -243,7 +247,6 @@ module ElasticAPM
243
247
  # rubocop:disable Metrics/MethodLength
244
248
  def available_spies
245
249
  %w[
246
- action_dispatch
247
250
  delayed_job
248
251
  elasticsearch
249
252
  faraday
@@ -11,6 +11,8 @@ module ElasticAPM
11
11
  error = Error.new context: context || Context.new
12
12
  error.exception = Error::Exception.new(exception, handled: handled)
13
13
 
14
+ Util.reverse_merge!(error.context.tags, @agent.config.default_tags)
15
+
14
16
  if exception.backtrace
15
17
  add_stacktrace error, :exception, exception.backtrace
16
18
  end
@@ -63,6 +63,7 @@ module ElasticAPM
63
63
  end
64
64
 
65
65
  def subscriber=(subscriber)
66
+ debug 'Registering subscriber'
66
67
  @subscriber = subscriber
67
68
  @subscriber.register!
68
69
  end
@@ -99,7 +100,8 @@ module ElasticAPM
99
100
  type,
100
101
  context: context,
101
102
  trace_context: trace_context,
102
- sampled: sampled
103
+ sampled: sampled,
104
+ tags: config.default_tags
103
105
  )
104
106
 
105
107
  transaction.start
@@ -13,10 +13,10 @@ module ElasticAPM
13
13
 
14
14
  container_info = ContainerInfo.read!
15
15
  @container = container_info.container
16
- @kupernetes = container_info.kupernetes
16
+ @kubernetes = container_info.kubernetes
17
17
  end
18
18
 
19
- attr_reader :hostname, :architecture, :platform, :container, :kupernetes
19
+ attr_reader :hostname, :architecture, :platform, :container, :kubernetes
20
20
 
21
21
  private
22
22
 
@@ -5,10 +5,10 @@ module ElasticAPM
5
5
  class SystemInfo
6
6
  # @api private
7
7
  class ContainerInfo
8
- CGROUP_PATH = '/proc/pid/cgroup'
8
+ CGROUP_PATH = '/proc/self/cgroup'
9
9
 
10
- attr_accessor :container_id, :kupernetes_namespace,
11
- :kupernetes_node_name, :kupernetes_pod_name, :kupernetes_pod_uid
10
+ attr_accessor :container_id, :kubernetes_namespace,
11
+ :kubernetes_node_name, :kubernetes_pod_name, :kubernetes_pod_uid
12
12
 
13
13
  def initialize(cgroup_path: CGROUP_PATH)
14
14
  @cgroup_path = cgroup_path
@@ -34,32 +34,36 @@ module ElasticAPM
34
34
  end
35
35
  end
36
36
 
37
- def kupernetes
38
- @kupernetes =
37
+ # rubocop:disable Metrics/MethodLength
38
+ def kubernetes
39
+ @kubernetes =
39
40
  begin
40
- kupernetes = {}
41
-
42
- kupernetes[:namespace] = kupernetes_namespace
43
- kupernetes[:node_name] = kupernetes_node_name
44
- kupernetes[:pod_name] = kupernetes_pod_name
45
- kupernetes[:pod_uid] = kupernetes_pod_uid
46
- return nil if kupernetes.values.all?(&:nil?)
47
-
48
- kupernetes
41
+ kubernetes = {
42
+ namespace: kubernetes_namespace,
43
+ node: { name: kubernetes_node_name },
44
+ pod: {
45
+ name: kubernetes_pod_name,
46
+ uid: kubernetes_pod_uid
47
+ }
48
+ }
49
+ return nil if kubernetes.values.all?(&:nil?)
50
+
51
+ kubernetes
49
52
  end
50
53
  end
54
+ # rubocop:enable Metrics/MethodLength
51
55
 
52
56
  private
53
57
 
54
58
  def read_from_env!
55
- self.kupernetes_namespace =
56
- ENV.fetch('KUBERNETES_NAMESPACE', kupernetes_namespace)
57
- self.kupernetes_node_name =
58
- ENV.fetch('KUBERNETES_NODE_NAME', kupernetes_node_name)
59
- self.kupernetes_pod_name =
60
- ENV.fetch('KUBERNETES_POD_NAME', kupernetes_pod_name)
61
- self.kupernetes_pod_uid =
62
- ENV.fetch('KUBERNETES_POD_UID', kupernetes_pod_uid)
59
+ self.kubernetes_namespace =
60
+ ENV.fetch('KUBERNETES_NAMESPACE', kubernetes_namespace)
61
+ self.kubernetes_node_name =
62
+ ENV.fetch('KUBERNETES_NODE_NAME', kubernetes_node_name)
63
+ self.kubernetes_pod_name =
64
+ ENV.fetch('KUBERNETES_POD_NAME', kubernetes_pod_name)
65
+ self.kubernetes_pod_uid =
66
+ ENV.fetch('KUBERNETES_POD_UID', kubernetes_pod_uid)
63
67
  end
64
68
 
65
69
  CONTAINER_ID_REGEX = /^[0-9A-Fa-f]{64}$/.freeze
@@ -103,7 +107,7 @@ module ElasticAPM
103
107
  pod_id = kubepods_match[1] || kubepods_match[2]
104
108
 
105
109
  self.container_id = container_id
106
- self.kupernetes_pod_uid = pod_id
110
+ self.kubernetes_pod_uid = pod_id
107
111
  elsif CONTAINER_ID_REGEX.match(container_id)
108
112
  self.container_id = container_id
109
113
  end
@@ -24,7 +24,10 @@ module ElasticAPM
24
24
  def initialize(config, tags: nil, &block)
25
25
  @config = config
26
26
  @tags = tags
27
- @samplers = [CpuMem].map { |kls| kls.new(config) }
27
+ @samplers = [CpuMem].map do |kls|
28
+ debug "Adding metrics collector '#{kls}'"
29
+ kls.new(config)
30
+ end
28
31
  @callback = block
29
32
  end
30
33
 
@@ -32,7 +35,12 @@ module ElasticAPM
32
35
 
33
36
  # rubocop:disable Metrics/MethodLength
34
37
  def start
35
- return unless config.collect_metrics?
38
+ unless config.collect_metrics?
39
+ debug 'Skipping metrics'
40
+ return
41
+ end
42
+
43
+ debug 'Starting metrics'
36
44
 
37
45
  @timer_task = Concurrent::TimerTask.execute(
38
46
  run_now: true,
@@ -40,6 +48,7 @@ module ElasticAPM
40
48
  timeout_interval: TIMEOUT_INTERVAL
41
49
  ) do
42
50
  begin
51
+ debug 'Collecting metrics'
43
52
  collect_and_send
44
53
  true
45
54
  rescue StandardError => e
@@ -56,6 +65,8 @@ module ElasticAPM
56
65
  def stop
57
66
  return unless running?
58
67
 
68
+ debug 'Stopping metrics'
69
+
59
70
  @timer_task.shutdown
60
71
  @running = false
61
72
  end