elastic-apm 2.7.0 → 2.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37a03e42bbce98f7206216314854dbe171c6964bf757fc9e25f2d990af922d38
4
- data.tar.gz: c4be66c848b4345e8594a178b8fc2738f585bbcc772a81943734a6f1ad1c8b45
3
+ metadata.gz: 2395fecd3ead993ac77f072d0b552e0814d2eb09ae985ba3d0b22e7168a9f005
4
+ data.tar.gz: 20e07d3f8444b83bc424de8b7772547c41eba90ac8561d406599cfb36854ebd9
5
5
  SHA512:
6
- metadata.gz: 81b744b6d0ff9aa3fa1f38b105a9aab42b98da5f15f173e3542882b81b860e3b02139090125f36c429032deba1e638d263469e3bdbf16f060eabf8da7edfcc25
7
- data.tar.gz: 3070245854f3547326143d7e494f6cee9851985b5d8f2b56d07b914461cdb8f9ebb255d0466054e923b65dc77b21eb142beb477b00b4f6b14d4773eefb24ca42
6
+ metadata.gz: 341eff39abd1c021aaa61967a56482ada41ac9d94f6dda54a2b480cbaff2844768ffaea7c54c8e2781211cf8209a2b8309631a3360b63bad15c7554fa9705ca6
7
+ data.tar.gz: 4158a60e93bd55f6cd28274e734943e1f5984c4ce963be7ad65be8fa508419f92227e18e12cc46c6813793f4b8baf490bdd52eb240e1a6c6f567057fe254a7ee
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ Gemfile.lock
15
15
  spec/elastic_apm.log
16
16
  spec/ruby-agent-junit.xml
17
17
  .gem
18
+ *.bulk
@@ -4,6 +4,21 @@ 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.8.0 (2019-05-20)
8
+
9
+ ### Added
10
+
11
+ - The option `stack_trace_limit` ([#424](https://github.com/elastic/apm-agent-ruby/pull/424))
12
+
13
+ ### Changed
14
+
15
+ - Use standardized User-Agent ([#419](https://github.com/elastic/apm-agent-ruby/pull/419))
16
+
17
+ ### Fixed
18
+
19
+ - `error.culprit` is properly truncated to 1024 characters ([#418](https://github.com/elastic/apm-agent-ruby/pull/418))
20
+ - Force convert `transaction.context.response.status_code` to integer ([#423](https://github.com/elastic/apm-agent-ruby/pull/423))
21
+
7
22
  ## 2.7.0 (2019-05-07)
8
23
 
9
24
  ### Added
@@ -74,10 +74,10 @@ should "Squash and merge".
74
74
 
75
75
  To do a full test run, use either `bundle exec rspec` or `rake spec`. Individual specs should also run as expected. The Mongo test needs a Mongo instance running, but will start one itself if Docker is installed.
76
76
 
77
- To test other platform, use the Docker setup and scripts like `spec.sh RUBY FRAMEWORK`.
77
+ To test other platform, use the Docker setup and scripts like `spec.sh RUBY_DOCKER_IMAGE FRAMEWORK`.
78
78
 
79
79
  ```sh
80
- $ spec/scripts/spec.sh ruby-2.6 rails-5.2
80
+ $ spec/scripts/spec.sh ruby:2.6 rails-5.2
81
81
  ```
82
82
 
83
83
  ### Releasing
@@ -18,6 +18,8 @@ pipeline {
18
18
  NOTIFY_TO = credentials('notify-to')
19
19
  JOB_GCS_BUCKET = credentials('gcs-bucket')
20
20
  CODECOV_SECRET = 'secret/apm-team/ci/apm-agent-ruby-codecov'
21
+ DOCKER_REGISTRY = 'docker.elastic.co'
22
+ DOCKER_SECRET = 'secret/apm-team/ci/docker-registry/prod'
21
23
  }
22
24
  options {
23
25
  timeout(time: 2, unit: 'HOURS')
@@ -185,11 +187,11 @@ pipeline {
185
187
  Parallel task generator for the integration tests.
186
188
  */
187
189
  class RubyParallelTaskGenerator extends DefaultParallelTaskGenerator {
188
-
190
+
189
191
  public RubyParallelTaskGenerator(Map params){
190
192
  super(params)
191
193
  }
192
-
194
+
193
195
  /**
194
196
  build a clousure that launch and agent and execute the corresponding test script,
195
197
  then store the results.
@@ -198,13 +200,15 @@ class RubyParallelTaskGenerator extends DefaultParallelTaskGenerator {
198
200
  return {
199
201
  steps.sleep steps.randomNumber(min:10, max: 30)
200
202
  steps.node('linux && immutable'){
203
+ // Label is transformed to avoid using the internal docker registry in the x coordinate
204
+ // TODO: def label = "${tag}:${x?.drop(x?.lastIndexOf('/')+1)}#${y}"
201
205
  def label = "${tag}:${x}#${y}"
202
206
  try {
203
207
  steps.runScript(label: label, ruby: x, framework: y)
204
208
  saveResult(x, y, 1)
205
209
  } catch(e){
206
210
  saveResult(x, y, 0)
207
- error("${label} tests failed : ${e.toString()}\n")
211
+ steps.error("${label} tests failed : ${e.toString()}\n")
208
212
  } finally {
209
213
  steps.junit(allowEmptyResults: false,
210
214
  keepLongStdio: true,
@@ -232,6 +236,7 @@ def runScript(Map params = [:]){
232
236
  dir("${BASE_DIR}"){
233
237
  retry(2){
234
238
  sleep randomNumber(min:10, max: 30)
239
+ dockerLogin(secret: "${DOCKER_SECRET}", registry: "${DOCKER_REGISTRY}")
235
240
  sh("./spec/scripts/spec.sh ${ruby} ${framework}")
236
241
  }
237
242
  }
@@ -243,17 +248,25 @@ def runScript(Map params = [:]){
243
248
  def runBenchmark(version){
244
249
  return {
245
250
  node('metal'){
246
- env.HOME = "${env.WORKSPACE}/${version}"
247
- dir("${version}"){
251
+ // Transform the versions like:
252
+ // - docker.elastic.co/observability-ci/jruby:9.2-12-jdk to jruby-9.2-12-jdk
253
+ // - jruby:9.1 to jruby-9.1
254
+ def transformedVersion = version.replaceAll('.*/', '').replaceAll(':', '-')
255
+ env.HOME = "${env.WORKSPACE}/${transformedVersion}"
256
+ dir("${transformedVersion}"){
248
257
  deleteDir()
249
258
  unstash 'source'
250
259
  dir("${BASE_DIR}"){
260
+ retry(2){
261
+ sleep randomNumber(min:10, max: 30)
262
+ dockerLogin(secret: "${DOCKER_SECRET}", registry: "${DOCKER_REGISTRY}")
263
+ }
251
264
  try{
252
265
  sh "./spec/scripts/benchmarks.sh ${version}"
253
266
  } catch(e){
254
267
  throw e
255
268
  } finally {
256
- sendBenchmarks(file: "benchmark-${version}.bulk",
269
+ sendBenchmarks(file: "benchmark-${transformedVersion}.bulk",
257
270
  index: "benchmark-ruby", archive: true)
258
271
  }
259
272
  }
data/README.md CHANGED
@@ -11,7 +11,7 @@ The official Rubygem for [Elastic][] [APM][].
11
11
 
12
12
  ## Documentation
13
13
 
14
- [Full documentation at Elasti.co](https://www.elastic.co/guide/en/apm/agent/ruby/2.x/index.html).
14
+ [Full documentation at elastic.co](https://www.elastic.co/guide/en/apm/agent/ruby/2.x/index.html).
15
15
 
16
16
  <ul>
17
17
  <li><a href="https://www.elastic.co/guide/en/apm/agent/ruby/2.x/introduction.html">Introduction</a></li>
@@ -111,7 +111,7 @@ ElasticAPM.with_transaction 'Do things' do |transaction|
111
111
  end
112
112
  ----
113
113
 
114
- Arguments:
114
+ Arguments:
115
115
 
116
116
  * `name`: A name for your transaction. Transactions are grouped by name. **Required**.
117
117
  * `type`: A `type` for your transaction eg. `db.postgresql.sql`.
@@ -234,6 +234,7 @@ Arguments:
234
234
  Returns `[ElasticAPM::Error]`.
235
235
 
236
236
  [float]
237
+ [[api-context]]
237
238
  === Context
238
239
 
239
240
  [float]
@@ -395,7 +396,3 @@ See the {apm-rum-ref}[JavaScript RUM agent documentation] for more information.
395
396
 
396
397
  - `name`: String
397
398
  - `type`: String
398
-
399
- [float]
400
- [[api-context]]
401
- === Context
@@ -49,6 +49,7 @@ module ElasticAPM
49
49
  source_lines_span_app_frames: 5,
50
50
  source_lines_span_library_frames: 0,
51
51
  span_frames_min_duration: '5ms',
52
+ stack_trace_limit: 999_999,
52
53
  transaction_max_spans: 500,
53
54
  transaction_sample_rate: 1.0,
54
55
  verify_server_cert: true,
@@ -103,6 +104,7 @@ module ElasticAPM
103
104
  'ELASTIC_APM_SOURCE_LINES_SPAN_LIBRARY_FRAMES' =>
104
105
  [:int, 'source_lines_span_library_frames'],
105
106
  'ELASTIC_APM_SPAN_FRAMES_MIN_DURATION' => 'span_frames_min_duration',
107
+ 'ELASTIC_APM_STACK_TRACE_LIMIT' => [:int, 'stack_trace_limit'],
106
108
  'ELASTIC_APM_TRANSACTION_MAX_SPANS' => [:int, 'transaction_max_spans'],
107
109
  'ELASTIC_APM_TRANSACTION_SAMPLE_RATE' =>
108
110
  [:float, 'transaction_sample_rate'],
@@ -180,6 +182,7 @@ module ElasticAPM
180
182
  attr_accessor :source_lines_error_library_frames
181
183
  attr_accessor :source_lines_span_app_frames
182
184
  attr_accessor :source_lines_span_library_frames
185
+ attr_accessor :stack_trace_limit
183
186
  attr_accessor :transaction_max_spans
184
187
  attr_accessor :transaction_sample_rate
185
188
  attr_accessor :verify_server_cert
@@ -51,7 +51,7 @@ module ElasticAPM
51
51
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
52
52
 
53
53
  def should_skip?(_config)
54
- if Rails.const_defined? :Console
54
+ if Rails.const_defined? 'Rails::Console'
55
55
  return 'Rails console'
56
56
  end
57
57
 
@@ -21,7 +21,7 @@ module ElasticAPM
21
21
 
22
22
  def build(backtrace, type:)
23
23
  Stacktrace.new.tap do |s|
24
- s.frames = backtrace.map do |line|
24
+ s.frames = backtrace[0...config.stack_trace_limit].map do |line|
25
25
  @cache[[line, type]]
26
26
  end
27
27
  end
@@ -33,9 +33,9 @@ module ElasticAPM
33
33
 
34
34
  def initialize(config, metadata)
35
35
  @config = config
36
+ @headers = build_headers(metadata)
36
37
  @metadata = JSON.fast_generate(metadata)
37
38
  @url = config.server_url + '/intake/v2/events'
38
- @headers = build_headers
39
39
  @ssl_context = build_ssl_context
40
40
  @mutex = Mutex.new
41
41
  end
@@ -108,16 +108,28 @@ module ElasticAPM
108
108
  end
109
109
  end
110
110
 
111
- def build_headers
111
+ def build_headers(metadata)
112
112
  (
113
113
  @config.http_compression? ? GZIP_HEADERS : HEADERS
114
114
  ).dup.tap do |headers|
115
+ headers['User-Agent'] = build_user_agent(metadata)
116
+
115
117
  if (token = @config.secret_token)
116
118
  headers['Authorization'] = "Bearer #{token}"
117
119
  end
118
120
  end
119
121
  end
120
122
 
123
+ def build_user_agent(metadata)
124
+ runtime = metadata.dig(:metadata, :service, :runtime)
125
+
126
+ [
127
+ "elastic-apm-ruby/#{VERSION}",
128
+ HTTP::Request::USER_AGENT,
129
+ [runtime[:name], runtime[:version]].join('/')
130
+ ].join(' ')
131
+ end
132
+
121
133
  def build_ssl_context
122
134
  return unless @config.use_ssl? && @config.server_ca_cert
123
135
 
@@ -6,6 +6,8 @@ module ElasticAPM
6
6
  module Transport
7
7
  # @api private
8
8
  module Filters
9
+ SKIP = :skip
10
+
9
11
  def self.new(config)
10
12
  Container.new(config)
11
13
  end
@@ -27,7 +29,7 @@ module ElasticAPM
27
29
  def apply!(payload)
28
30
  @filters.reduce(payload) do |result, (_key, filter)|
29
31
  result = filter.call(result)
30
- break if result.nil?
32
+ break SKIP if result.nil?
31
33
  result
32
34
  end
33
35
  end
@@ -40,7 +40,7 @@ module ElasticAPM
40
40
  return unless response
41
41
 
42
42
  {
43
- status_code: response.status_code,
43
+ status_code: response.status_code.to_i,
44
44
  headers: response.headers,
45
45
  headers_sent: response.headers_sent,
46
46
  finished: response.finished
@@ -18,7 +18,7 @@ module ElasticAPM
18
18
  trace_id: error.trace_id,
19
19
  parent_id: error.parent_id,
20
20
 
21
- culprit: error.culprit,
21
+ culprit: keyword_field(error.culprit),
22
22
  timestamp: error.timestamp
23
23
  }
24
24
 
@@ -58,7 +58,10 @@ module ElasticAPM
58
58
 
59
59
  def serialize_and_filter(resource)
60
60
  serialized = serializers.serialize(resource)
61
- @filters.apply!(serialized)
61
+
62
+ # if a filter returns nil, it means skip the event
63
+ return nil if @filters.apply!(serialized) == Filters::SKIP
64
+
62
65
  JSON.fast_generate(serialized)
63
66
  rescue Exception
64
67
  error format('Failed converting event to JSON: %s', resource.inspect)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ElasticAPM
4
- VERSION = '2.7.0'
4
+ VERSION = '2.8.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic-apm
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikkel Malmberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-07 00:00:00.000000000 Z
11
+ date: 2019-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby