elastic-apm 0.3.0 → 0.4.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.

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: f6272279575b41ace4dc7581df1d6ea387f46c260d591c338fceb256f0b46ff2
4
- data.tar.gz: f793a0c902a18abfe647e5a3a41c86d96926910dfef21094aa3b1c37deac45eb
3
+ metadata.gz: c00a8dd4ed640c7c98fa3b32f0a252920237e549a10d6592de58d6d4b281ab48
4
+ data.tar.gz: 3fc4f34aab25ace89c0b689747316245b667bc77b348c4d9d2b08605681179ff
5
5
  SHA512:
6
- metadata.gz: 3f16cbdffc10a05005c03ec0d122235c84b56a9bda9f2201fd913e1d3b96925d3f5ef0847cfd2cc369da0b1d1c39c21dccd187579f278d7439218c97b4548a97
7
- data.tar.gz: 4daea6a3d579f4fba6435de9277bdd842889b6afeab63c97da9a9424809d6e4721bd873da4edecae1eeb66281ae43989385027099f0c828a38bff94c4ec3addd
6
+ metadata.gz: 6062baf5ed08855d53781d589ff7266b784af1b231511327b527619229743d570868e319be7cb060770bd436a92df24955807e6c8cfcbdb80151d29ac7e7b9fb
7
+ data.tar.gz: 9516bd876fbfd8c6061b189b603923bb37f740492904d40c10180603f09b0d86a0f97e198962a66570b59851c1fa8e666066f3e4cf51a469ccaa04dfbf5e6955
@@ -0,0 +1,2 @@
1
+ ruby:
2
+ config_file: .rubocop.yml
@@ -2,7 +2,7 @@ ifdef::env-github[]
2
2
  NOTE: For the best reading experience, please view this documentation at https://www.elastic.co/guide/en/apm/agent/ruby[elastic.co]
3
3
  endif::[]
4
4
 
5
- = APM Ruby Agent Reference (Alpha)
5
+ = APM Ruby Agent Reference (Beta)
6
6
 
7
7
  == Introduction
8
8
 
@@ -12,7 +12,6 @@ require 'elastic_apm/instrumenter'
12
12
  require 'elastic_apm/internal_error'
13
13
  require 'elastic_apm/util'
14
14
 
15
- # Metrics
16
15
  require 'elastic_apm/middleware'
17
16
 
18
17
  require 'elastic_apm/railtie' if defined?(::Rails::Railtie)
@@ -63,7 +62,10 @@ module ElasticAPM
63
62
  # @yield [Transaction] Optional block encapsulating transaction
64
63
  # @return [Transaction] Unless block given
65
64
  def self.transaction(name, type = nil, context: nil, &block)
66
- return call_through(&block) unless agent
65
+ unless agent
66
+ return block_given? ? yield : nil
67
+ end
68
+
67
69
  agent.transaction(name, type, context: context, &block)
68
70
  end
69
71
 
@@ -76,7 +78,9 @@ module ElasticAPM
76
78
  # @return [Span] Unless block given
77
79
  def self.span(name, type = nil, context: nil, include_stacktrace: true,
78
80
  &block)
79
- return call_through(&block) unless agent
81
+ unless agent
82
+ return block_given? ? yield : nil
83
+ end
80
84
 
81
85
  agent.span(
82
86
  name,
@@ -155,16 +159,4 @@ module ElasticAPM
155
159
 
156
160
  agent && agent.add_filter(key, block || callback)
157
161
  end
158
-
159
- class << self
160
- private
161
-
162
- def call_through
163
- unless agent
164
- return yield if block_given?
165
- end
166
-
167
- nil
168
- end
169
- end
170
162
  end
@@ -99,6 +99,7 @@ module ElasticAPM
99
99
  def enqueue_transactions(transactions)
100
100
  data = @serializers.transactions.build_all(transactions)
101
101
  @queue << Worker::Request.new('/v1/transactions', data)
102
+ transactions
102
103
  end
103
104
 
104
105
  def enqueue_errors(errors)
@@ -10,20 +10,32 @@ module ElasticAPM
10
10
  server_url: 'http://localhost:8200',
11
11
  secret_token: nil,
12
12
 
13
- app_name: nil,
14
- environment: nil,
13
+ service_name: nil,
14
+ service_version: nil,
15
+ environment: ENV['RAILS_ENV'] || ENV['RACK_ENV'],
15
16
  framework_name: nil,
16
17
  framework_version: nil,
18
+ hostname: nil,
17
19
 
18
20
  log_path: '-',
19
21
  log_level: Logger::INFO,
20
22
  logger: nil,
21
23
 
24
+ max_queue_size: 500,
25
+ flush_interval: 10,
26
+ transaction_sample_rate: 1.0,
27
+ transaction_max_spans: 500,
28
+
22
29
  http_timeout: 10,
23
30
  http_open_timeout: 10,
24
- transaction_send_interval: 10,
25
31
  debug_transactions: false,
26
32
  debug_http: false,
33
+ verify_server_cert: true,
34
+
35
+ source_lines_error_app_frames: 5,
36
+ source_lines_span_app_frames: 5,
37
+ source_lines_error_library_frames: 0,
38
+ source_lines_span_library_frames: 0,
27
39
 
28
40
  enabled_injectors: %w[net_http json],
29
41
 
@@ -36,52 +48,72 @@ module ElasticAPM
36
48
  }.freeze
37
49
 
38
50
  ENV_TO_KEY = {
39
- 'ELASTIC_APM_APP_NAME' => 'app_name',
40
51
  'ELASTIC_APM_SERVER_URL' => 'server_url',
41
- 'ELASTIC_APM_SECRET_TOKEN' => 'secret_token'
52
+ 'ELASTIC_APM_SECRET_TOKEN' => 'secret_token',
53
+
54
+ 'ELASTIC_APM_SERVICE_NAME' => 'service_name',
55
+ 'ELASTIC_APM_SERVICE_VERSION' => 'service_version',
56
+ 'ELASTIC_APM_ENVIRONMENT' => 'environment',
57
+ 'ELASTIC_APM_FRAMEWORK_NAME' => 'framework_name',
58
+ 'ELASTIC_APM_FRAMEWORK_VERSION' => 'framework_version',
59
+ 'ELASTIC_APM_HOSTNAME' => 'hostname',
60
+
61
+ 'ELASTIC_APM_SOURCE_LINES_ERROR_APP_FRAMES' =>
62
+ [:int, 'source_lines_error_app_frames'],
63
+ 'ELASTIC_APM_SOURCE_LINES_SPAN_APP_FRAMES' =>
64
+ [:int, 'source_lines_span_app_frames'],
65
+ 'ELASTIC_APM_SOURCE_LINES_ERROR_LIBRARY_FRAMES' =>
66
+ [:int, 'source_lines_error_library_frames'],
67
+ 'ELASTIC_APM_SOURCE_LINES_SPAN_LIBRARY_FRAMES' =>
68
+ [:int, 'source_lines_span_library_frames'],
69
+
70
+ 'ELASTIC_APM_MAX_QUEUE_SIZE' => [:int, 'max_queue_size'],
71
+ 'ELASTIC_APM_FLUSH_INTERVAL' => 'flush_interval',
72
+ 'ELASTIC_APM_TRANSACTION_SAMPLE_RATE' =>
73
+ [:float, 'transaction_sample_rate'],
74
+ 'ELASTIC_APM_VERIFY_SERVER_CERT' => [:bool, 'verify_server_cert'],
75
+ 'ELASTIC_APM_TRANSACTION_MAX_SPANS' => [:int, 'transaction_max_spans']
42
76
  }.freeze
43
77
 
44
- # rubocop:disable Metrics/MethodLength
45
78
  def initialize(options = nil)
46
79
  options = {} if options.nil?
47
80
 
48
- # Start with the defaults
49
- DEFAULTS.each do |key, value|
50
- send("#{key}=", value)
51
- end
52
-
53
- # Set options from ENV
54
- ENV_TO_KEY.each do |env_key, key|
55
- next unless (value = ENV[env_key])
56
- send("#{key}=", value)
57
- end
58
-
59
- # Set options from arguments
60
- options.each do |key, value|
61
- send("#{key}=", value)
62
- end
81
+ set_defaults
82
+ set_from_env
83
+ set_from_args(options)
63
84
 
64
85
  yield self if block_given?
65
86
  end
66
- # rubocop:enable Metrics/MethodLength
67
87
 
68
88
  attr_accessor :server_url
69
89
  attr_accessor :secret_token
70
90
 
71
- attr_accessor :app_name
72
- attr_reader :environment
91
+ attr_accessor :service_name
92
+ attr_accessor :service_version
93
+ attr_accessor :environment
73
94
  attr_accessor :framework_name
74
95
  attr_accessor :framework_version
96
+ attr_accessor :hostname
75
97
 
76
98
  attr_accessor :log_path
77
99
  attr_accessor :log_level
78
100
 
101
+ attr_accessor :max_queue_size
102
+ attr_accessor :flush_interval
103
+ attr_accessor :transaction_sample_rate
104
+ attr_accessor :transaction_max_spans
105
+ attr_accessor :verify_server_cert
106
+
79
107
  attr_accessor :http_timeout
80
108
  attr_accessor :http_open_timeout
81
- attr_accessor :transaction_send_interval
82
109
  attr_accessor :debug_transactions
83
110
  attr_accessor :debug_http
84
111
 
112
+ attr_accessor :source_lines_error_app_frames
113
+ attr_accessor :source_lines_span_app_frames
114
+ attr_accessor :source_lines_error_library_frames
115
+ attr_accessor :source_lines_span_library_frames
116
+
85
117
  attr_accessor :enabled_injectors
86
118
 
87
119
  attr_accessor :view_paths
@@ -94,28 +126,19 @@ module ElasticAPM
94
126
 
95
127
  attr_reader :logger
96
128
 
97
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
129
+ alias :verify_server_cert? :verify_server_cert
130
+
98
131
  def app=(app)
99
132
  case app_type?(app)
100
133
  when :sinatra
101
- self.app_name = format_name(app_name || app.to_s)
102
- self.framework_name = 'Sinatra'
103
- self.framework_version = Sinatra::VERSION
104
- self.enabled_injectors += %w[sinatra]
105
- self.root_path = Dir.pwd
134
+ set_sinatra(app)
106
135
  when :rails
107
- self.app_name = format_name(app_name || app.class.parent_name)
108
- self.framework_name = 'Ruby on Rails'
109
- self.framework_version = Rails::VERSION::STRING
110
- self.logger = Rails.logger
111
- self.root_path = Rails.root.to_s
112
- self.view_paths = app.config.paths['app/views'].existent
136
+ set_rails(app)
113
137
  else
114
138
  # TODO: define custom?
115
- self.app_name = 'ruby'
139
+ self.service_name = 'ruby'
116
140
  end
117
141
  end
118
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
119
142
 
120
143
  def app_type?(app)
121
144
  if defined?(::Rails) && app.is_a?(Rails::Application)
@@ -133,16 +156,61 @@ module ElasticAPM
133
156
  server_url.start_with?('https')
134
157
  end
135
158
 
136
- def environment=(env)
137
- @environment = env || ENV['RAILS_ENV'] || ENV['RACK_ENV']
138
- end
139
-
140
159
  def logger=(logger)
141
160
  @logger = logger || build_logger(log_path, log_level)
142
161
  end
143
162
 
144
163
  private
145
164
 
165
+ def set_defaults
166
+ DEFAULTS.each do |key, value|
167
+ send("#{key}=", value)
168
+ end
169
+ end
170
+
171
+ # rubocop:disable Metrics/MethodLength
172
+ def set_from_env
173
+ ENV_TO_KEY.each do |env_key, key|
174
+ next unless (value = ENV[env_key])
175
+
176
+ type, key = key if key.is_a? Array
177
+
178
+ value =
179
+ case type
180
+ when :int then value.to_i
181
+ when :float then value.to_f
182
+ when :bool then !%w[0 false].include?(value.strip.downcase)
183
+ else value
184
+ end
185
+
186
+ send("#{key}=", value)
187
+ end
188
+ end
189
+ # rubocop:enable Metrics/MethodLength
190
+
191
+ def set_from_args(options)
192
+ options.each do |key, value|
193
+ send("#{key}=", value)
194
+ end
195
+ end
196
+
197
+ def set_sinatra(app)
198
+ self.service_name = format_name(service_name || app.to_s)
199
+ self.framework_name = framework_name || 'Sinatra'
200
+ self.framework_version = framework_version || Sinatra::VERSION
201
+ self.enabled_injectors += %w[sinatra]
202
+ self.root_path = Dir.pwd
203
+ end
204
+
205
+ def set_rails(app)
206
+ self.service_name = format_name(service_name || app.class.parent_name)
207
+ self.framework_name = 'Ruby on Rails'
208
+ self.framework_version = Rails::VERSION::STRING
209
+ self.logger = Rails.logger
210
+ self.root_path = Rails.root.to_s
211
+ self.view_paths = app.config.paths['app/views'].existent
212
+ end
213
+
146
214
  def build_logger(path, level)
147
215
  logger = Logger.new(path == '-' ? STDOUT : path)
148
216
  logger.level = level
@@ -34,7 +34,7 @@ module ElasticAPM
34
34
  private
35
35
 
36
36
  def add_stacktrace(error, kind, backtrace)
37
- return unless (stacktrace = Stacktrace.build(@config, backtrace))
37
+ return unless (stacktrace = Stacktrace.build(@config, backtrace, :error))
38
38
 
39
39
  case kind
40
40
  when :exception
@@ -91,6 +91,7 @@ module ElasticAPM
91
91
 
92
92
  http = Net::HTTP.new server_uri.host, server_uri.port
93
93
  http.use_ssl = @config.use_ssl?
94
+ http.verify_mode = verify_mode
94
95
  http.read_timeout = @config.http_timeout
95
96
  http.open_timeout = @config.http_open_timeout
96
97
 
@@ -104,5 +105,13 @@ module ElasticAPM
104
105
  def server_uri
105
106
  @uri ||= URI(@config.server_url)
106
107
  end
108
+
109
+ def verify_mode
110
+ if @config.use_ssl? && @config.verify_server_cert?
111
+ OpenSSL::SSL::VERIFY_PEER
112
+ else
113
+ OpenSSL::SSL::VERIFY_NONE
114
+ end
115
+ end
107
116
  end
108
117
  end
@@ -64,6 +64,14 @@ module ElasticAPM
64
64
  return transaction
65
65
  end
66
66
 
67
+ sample = rand <= config.transaction_sample_rate
68
+
69
+ if args.last.is_a? Hash
70
+ args.last[:sampled] = sample
71
+ else
72
+ args.push(sampled: sample)
73
+ end
74
+
67
75
  transaction = Transaction.new self, *args
68
76
 
69
77
  self.current_transaction = transaction
@@ -108,7 +116,11 @@ module ElasticAPM
108
116
  end
109
117
 
110
118
  def should_flush_transactions?
111
- return true unless (interval = config.transaction_send_interval)
119
+ interval = config.flush_interval
120
+
121
+ return true if interval.nil?
122
+ return true if @pending_transactions.length >= config.max_queue_size
123
+
112
124
  Time.now.utc - @last_sent_transactions >= interval
113
125
  end
114
126
 
@@ -8,9 +8,11 @@ module ElasticAPM
8
8
  end
9
9
 
10
10
  def build
11
+ pid = $PID || Process.pid
12
+ return unless pid
11
13
  {
12
14
  argv: ARGV,
13
- pid: $PID,
15
+ pid: pid,
14
16
  title: $PROGRAM_NAME
15
17
  }
16
18
  end
@@ -6,7 +6,7 @@ module ElasticAPM
6
6
  class Transactions < Serializer
7
7
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
8
8
  def build(transaction)
9
- {
9
+ base = {
10
10
  id: transaction.id,
11
11
  name: transaction.name,
12
12
  type: transaction.type,
@@ -17,6 +17,12 @@ module ElasticAPM
17
17
  sampled: transaction.sampled,
18
18
  context: transaction.context.to_h
19
19
  }
20
+
21
+ if transaction.dropped_spans > 0
22
+ base[:span_count] = { dropped: { total: transaction.dropped_spans } }
23
+ end
24
+
25
+ base
20
26
  end
21
27
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
22
28
 
@@ -10,7 +10,7 @@ module ElasticAPM
10
10
  # rubocop:disable Metrics/MethodLength
11
11
  def build
12
12
  base = {
13
- name: @config.app_name,
13
+ name: @config.service_name,
14
14
  environment: @config.environment,
15
15
  agent: {
16
16
  name: 'ruby',
@@ -22,7 +22,7 @@ module ElasticAPM
22
22
  version: RUBY_VERSION
23
23
  },
24
24
  runtime: runtime,
25
- version: git_sha
25
+ version: @config.service_version || Util.git_sha
26
26
  }
27
27
 
28
28
  if @config.framework_name
@@ -42,13 +42,6 @@ module ElasticAPM
42
42
 
43
43
  private
44
44
 
45
- def git_sha
46
- sha = `git rev-parse --verify HEAD 2>&1`.chomp
47
- return sha if $?.success? # rubocop:disable Style/SpecialGlobalVars
48
-
49
- nil
50
- end
51
-
52
45
  def runtime
53
46
  case RUBY_ENGINE
54
47
  when 'ruby'
@@ -14,17 +14,17 @@ module ElasticAPM
14
14
 
15
15
  attr_reader :frames
16
16
 
17
- def self.build(config, backtrace)
17
+ def self.build(config, backtrace, type)
18
18
  return nil unless backtrace
19
19
 
20
20
  stack = new(backtrace)
21
- stack.build_frames(config)
21
+ stack.build_frames(config, type)
22
22
  stack
23
23
  end
24
24
 
25
- def build_frames(config)
25
+ def build_frames(config, type)
26
26
  @frames = @backtrace.map do |line|
27
- build_frame(config, line)
27
+ build_frame(config, line, type)
28
28
  end
29
29
  end
30
30
 
@@ -56,20 +56,24 @@ module ElasticAPM
56
56
  [file, number, method, module_name]
57
57
  end
58
58
 
59
- def build_frame(config, line)
59
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
60
+ def build_frame(config, line, type)
60
61
  abs_path, lineno, function, _module_name = parse_line(line)
62
+ library_frame = !(abs_path && abs_path.start_with?(config.root_path))
61
63
 
62
64
  frame = Frame.new
63
65
  frame.abs_path = abs_path
64
66
  frame.filename = strip_load_path(abs_path)
65
67
  frame.function = function
66
68
  frame.lineno = lineno.to_i
67
- frame.build_context 3
68
- frame.library_frame =
69
- !(abs_path && abs_path.start_with?(config.root_path))
69
+ frame.library_frame = library_frame
70
+
71
+ line_count = context_lines_for(config, type, library_frame: library_frame)
72
+ frame.build_context line_count
70
73
 
71
74
  frame
72
75
  end
76
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
73
77
 
74
78
  def strip_load_path(path)
75
79
  return nil unless path
@@ -85,5 +89,10 @@ module ElasticAPM
85
89
 
86
90
  path[prefix.chomp(File::SEPARATOR).length + 1..-1]
87
91
  end
92
+
93
+ def context_lines_for(config, type, library_frame:)
94
+ key = "source_lines_#{type}_#{library_frame ? 'library' : 'app'}_frames"
95
+ config.send(key.to_sym)
96
+ end
88
97
  end
89
98
  end
@@ -20,17 +20,20 @@ module ElasticAPM
20
20
  :colno
21
21
  )
22
22
 
23
+ # rubocop:disable Metrics/AbcSize
23
24
  def build_context(context_line_count)
24
- return unless abs_path
25
+ return unless abs_path && context_line_count > 0
25
26
 
26
- from = (lineno - context_line_count - 1)
27
- to = (lineno + context_line_count)
27
+ padding = (context_line_count - 1) / 2
28
+ from = lineno - padding - 1
29
+ to = lineno + padding - 1
28
30
  file_lines = read_lines(abs_path, from..to)
29
31
 
30
- self.context_line = file_lines[context_line_count]
31
- self.pre_context = file_lines.first(context_line_count)
32
- self.post_context = file_lines.last(context_line_count)
32
+ self.context_line = file_lines[padding]
33
+ self.pre_context = file_lines.first(padding)
34
+ self.post_context = file_lines.last(padding)
33
35
  end
36
+ # rubocop:enable Metrics/AbcSize
34
37
 
35
38
  private
36
39
 
@@ -3,11 +3,13 @@
3
3
  module ElasticAPM
4
4
  # @api private
5
5
  class SystemInfo
6
- def initialize(_config); end
6
+ def initialize(config)
7
+ @config = config
8
+ end
7
9
 
8
10
  def build
9
11
  {
10
- hostname: `hostname`,
12
+ hostname: @config.hostname || `hostname`,
11
13
  architecture: platform.cpu,
12
14
  platform: platform.os
13
15
  }
@@ -4,7 +4,13 @@ module ElasticAPM
4
4
  # @api private
5
5
  class Transaction
6
6
  # rubocop:disable Metrics/MethodLength
7
- def initialize(instrumenter, name, type = 'custom', context: nil)
7
+ def initialize(
8
+ instrumenter,
9
+ name,
10
+ type = 'custom',
11
+ context: nil,
12
+ sampled: true
13
+ )
8
14
  @id = SecureRandom.uuid
9
15
  @instrumenter = instrumenter
10
16
  @name = name
@@ -13,22 +19,22 @@ module ElasticAPM
13
19
  @timestamp = Util.micros
14
20
 
15
21
  @spans = []
16
- @notifications = []
17
22
  @span_id_ticker = -1
23
+ @dropped_spans = 0
18
24
 
19
25
  @notifications = [] # for AS::Notifications
20
26
 
21
27
  @context = context || Context.new
22
28
 
23
- @sampled = true
29
+ @sampled = sampled
24
30
 
25
31
  yield self if block_given?
26
32
  end
27
33
  # rubocop:enable Metrics/MethodLength
28
34
 
29
35
  attr_accessor :id, :name, :result, :type
30
- attr_reader :context, :duration, :root_span, :timestamp, :spans,
31
- :notifications, :sampled, :instrumenter
36
+ attr_reader :context, :duration, :dropped_spans, :root_span, :timestamp,
37
+ :spans, :notifications, :sampled, :instrumenter
32
38
 
33
39
  def release
34
40
  @instrumenter.current_transaction = nil
@@ -63,13 +69,19 @@ module ElasticAPM
63
69
 
64
70
  # rubocop:disable Metrics/MethodLength
65
71
  def span(name, type = nil, backtrace: nil, context: nil)
66
- span = next_span(name, type, context)
67
- spans << span
72
+ unless sampled?
73
+ return yield if block_given?
74
+ return
75
+ end
68
76
 
69
- span.stacktrace =
70
- backtrace && Stacktrace.build(@instrumenter.config, backtrace)
77
+ if spans.length >= instrumenter.config.transaction_max_spans
78
+ @dropped_spans += 1
71
79
 
72
- span.start
80
+ return yield if block_given?
81
+ return
82
+ end
83
+
84
+ span = build_and_start_span(name, type, context, backtrace)
73
85
 
74
86
  return span unless block_given?
75
87
 
@@ -83,10 +95,24 @@ module ElasticAPM
83
95
  end
84
96
  # rubocop:enable Metrics/MethodLength
85
97
 
98
+ def build_and_start_span(name, type, context, backtrace)
99
+ span = next_span(name, type, context)
100
+ spans << span
101
+
102
+ span.stacktrace =
103
+ backtrace && Stacktrace.build(@instrumenter.config, backtrace, :span)
104
+
105
+ span.start
106
+ end
107
+
86
108
  def current_span
87
109
  spans.reverse.lazy.find(&:running?)
88
110
  end
89
111
 
112
+ def sampled?
113
+ !!sampled
114
+ end
115
+
90
116
  def inspect
91
117
  "<ElasticAPM::Transaction id:#{id}>"
92
118
  end
@@ -14,6 +14,11 @@ module ElasticAPM
14
14
  def self.inspect_transaction(transaction)
15
15
  Inspector.new.transaction transaction
16
16
  end
17
+
18
+ def self.git_sha
19
+ sha = `git rev-parse --verify HEAD 2>&1`.chomp
20
+ $? && $?.success? ? sha : nil # rubocop:disable Style/SpecialGlobalVars
21
+ end
17
22
  end
18
23
  end
19
24
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ElasticAPM
4
- VERSION = '0.3.0'.freeze
4
+ VERSION = '0.4.0'.freeze
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: 0.3.0
4
+ version: 0.4.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: 2018-01-22 00:00:00.000000000 Z
11
+ date: 2018-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -32,6 +32,7 @@ extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
34
  - ".gitignore"
35
+ - ".hound.yml"
35
36
  - ".rspec"
36
37
  - ".rubocop.yml"
37
38
  - ".travis.yml"