elastic-apm 3.1.0 → 3.2.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 +4 -4
- data/.ci/.jenkins_exclude.yml +47 -0
- data/.ci/.jenkins_framework.yml +4 -0
- data/.ci/.jenkins_master_framework.yml +1 -0
- data/.ci/.jenkins_ruby.yml +1 -0
- data/.ci/downstreamTests.groovy +1 -1
- data/.gitignore +2 -1
- data/.rspec +1 -0
- data/CHANGELOG.asciidoc +24 -0
- data/Dockerfile +43 -0
- data/Gemfile +34 -15
- data/README.md +30 -1
- data/bin/dev +54 -0
- data/bin/run-tests +27 -0
- data/docker-compose.yml +32 -0
- data/docs/api.asciidoc +13 -2
- data/docs/configuration.asciidoc +30 -0
- data/docs/getting-started-rack.asciidoc +24 -0
- data/docs/release-notes.asciidoc +1 -1
- data/lib/elastic_apm.rb +12 -1
- data/lib/elastic_apm/agent.rb +15 -3
- data/lib/elastic_apm/central_config.rb +39 -19
- data/lib/elastic_apm/child_durations.rb +42 -0
- data/lib/elastic_apm/config.rb +27 -11
- data/lib/elastic_apm/context/request/socket.rb +1 -1
- data/lib/elastic_apm/context_builder.rb +1 -1
- data/lib/elastic_apm/error.rb +10 -0
- data/lib/elastic_apm/error/exception.rb +7 -0
- data/lib/elastic_apm/grape.rb +48 -0
- data/lib/elastic_apm/instrumenter.rb +77 -4
- data/lib/elastic_apm/logging.rb +0 -2
- data/lib/elastic_apm/metrics.rb +39 -26
- data/lib/elastic_apm/metrics/breakdown_set.rb +14 -0
- data/lib/elastic_apm/metrics/{cpu_mem.rb → cpu_mem_set.rb} +62 -54
- data/lib/elastic_apm/metrics/metric.rb +117 -0
- data/lib/elastic_apm/metrics/set.rb +106 -0
- data/lib/elastic_apm/metrics/span_scoped_set.rb +39 -0
- data/lib/elastic_apm/metrics/transaction_set.rb +11 -0
- data/lib/elastic_apm/metrics/vm_set.rb +44 -0
- data/lib/elastic_apm/metricset.rb +31 -4
- data/lib/elastic_apm/normalizers.rb +6 -0
- data/lib/elastic_apm/normalizers/grape.rb +5 -0
- data/lib/elastic_apm/normalizers/grape/endpoint_run.rb +47 -0
- data/lib/elastic_apm/normalizers/rails/active_record.rb +16 -5
- data/lib/elastic_apm/opentracing.rb +4 -4
- data/lib/elastic_apm/rails.rb +12 -2
- data/lib/elastic_apm/railtie.rb +1 -5
- data/lib/elastic_apm/sinatra.rb +1 -1
- data/lib/elastic_apm/span.rb +15 -10
- data/lib/elastic_apm/spies.rb +0 -1
- data/lib/elastic_apm/sql_summarizer.rb +8 -6
- data/lib/elastic_apm/subscriber.rb +4 -1
- data/lib/elastic_apm/transaction.rb +6 -6
- data/lib/elastic_apm/transport/base.rb +7 -0
- data/lib/elastic_apm/transport/connection.rb +11 -69
- data/lib/elastic_apm/transport/connection/http.rb +43 -35
- data/lib/elastic_apm/transport/connection/proxy_pipe.rb +0 -3
- data/lib/elastic_apm/transport/headers.rb +62 -0
- data/lib/elastic_apm/transport/serializers.rb +0 -2
- data/lib/elastic_apm/transport/serializers/metricset_serializer.rb +19 -6
- data/lib/elastic_apm/transport/serializers/span_serializer.rb +3 -3
- data/lib/elastic_apm/transport/user_agent.rb +31 -0
- data/lib/elastic_apm/transport/worker.rb +1 -2
- data/lib/elastic_apm/version.rb +1 -1
- metadata +20 -6
- data/lib/elastic_apm/metrics/vm.rb +0 -60
- data/lib/elastic_apm/util/prefixed_logger.rb +0 -18
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ElasticAPM
|
4
|
+
module Transport
|
5
|
+
# @api private
|
6
|
+
class Headers
|
7
|
+
HEADERS = {
|
8
|
+
'Content-Type' => 'application/x-ndjson',
|
9
|
+
'Transfer-Encoding' => 'chunked'
|
10
|
+
}.freeze
|
11
|
+
GZIP_HEADERS = HEADERS.merge(
|
12
|
+
'Content-Encoding' => 'gzip'
|
13
|
+
).freeze
|
14
|
+
|
15
|
+
def initialize(config, initial: {})
|
16
|
+
@config = config
|
17
|
+
@hash = build!(initial)
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_accessor :hash
|
21
|
+
|
22
|
+
def [](key)
|
23
|
+
@hash[key]
|
24
|
+
end
|
25
|
+
|
26
|
+
def []=(key, value)
|
27
|
+
@hash[key] = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def merge(other)
|
31
|
+
self.class.new(@config, initial: @hash.merge(other))
|
32
|
+
end
|
33
|
+
|
34
|
+
def merge!(other)
|
35
|
+
@hash.merge!(other)
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_h
|
40
|
+
@hash
|
41
|
+
end
|
42
|
+
|
43
|
+
def chunked
|
44
|
+
merge(
|
45
|
+
@config.http_compression? ? GZIP_HEADERS : HEADERS
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def build!(headers)
|
52
|
+
headers[:'User-Agent'] = UserAgent.new(@config).to_s
|
53
|
+
|
54
|
+
if (token = @config.secret_token)
|
55
|
+
headers[:Authorization] = "Bearer #{token}"
|
56
|
+
end
|
57
|
+
|
58
|
+
headers
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -5,15 +5,28 @@ module ElasticAPM
|
|
5
5
|
module Serializers
|
6
6
|
# @api private
|
7
7
|
class MetricsetSerializer < Serializer
|
8
|
+
# rubocop:disable Metrics/MethodLength
|
8
9
|
def build(metricset)
|
9
|
-
{
|
10
|
-
|
11
|
-
|
12
|
-
tags: keyword_object(metricset.labels),
|
13
|
-
samples: build_samples(metricset.samples)
|
14
|
-
}
|
10
|
+
payload = {
|
11
|
+
timestamp: metricset.timestamp.to_i,
|
12
|
+
samples: build_samples(metricset.samples)
|
15
13
|
}
|
14
|
+
|
15
|
+
if metricset.tags?
|
16
|
+
payload[:tags] = mixed_object(metricset.tags)
|
17
|
+
end
|
18
|
+
|
19
|
+
if metricset.transaction
|
20
|
+
payload[:transaction] = metricset.transaction
|
21
|
+
end
|
22
|
+
|
23
|
+
if metricset.span
|
24
|
+
payload[:span] = metricset.span
|
25
|
+
end
|
26
|
+
|
27
|
+
{ metricset: payload }
|
16
28
|
end
|
29
|
+
# rubocop:enable Metrics/MethodLength
|
17
30
|
|
18
31
|
private
|
19
32
|
|
@@ -13,12 +13,12 @@ module ElasticAPM
|
|
13
13
|
|
14
14
|
attr_reader :context_serializer
|
15
15
|
|
16
|
-
# rubocop:disable Metrics/MethodLength
|
16
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
17
17
|
def build(span)
|
18
18
|
{
|
19
19
|
span: {
|
20
20
|
id: span.id,
|
21
|
-
transaction_id: span.
|
21
|
+
transaction_id: span.transaction.id,
|
22
22
|
parent_id: span.parent_id,
|
23
23
|
name: keyword_field(span.name),
|
24
24
|
type: join_type(span),
|
@@ -30,7 +30,7 @@ module ElasticAPM
|
|
30
30
|
}
|
31
31
|
}
|
32
32
|
end
|
33
|
-
# rubocop:enable Metrics/MethodLength
|
33
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
34
34
|
|
35
35
|
# @api private
|
36
36
|
class ContextSerializer < Serializer
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ElasticAPM
|
4
|
+
module Transport
|
5
|
+
# @api private
|
6
|
+
class UserAgent
|
7
|
+
def initialize(config)
|
8
|
+
@built = build(config)
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
@built
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def build(config)
|
18
|
+
metadata = Metadata.new(config)
|
19
|
+
|
20
|
+
[
|
21
|
+
"elastic-apm-ruby/#{VERSION}",
|
22
|
+
HTTP::Request::USER_AGENT,
|
23
|
+
[
|
24
|
+
metadata.service.runtime.name,
|
25
|
+
metadata.service.runtime.version
|
26
|
+
].join('/')
|
27
|
+
].join(' ')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -25,8 +25,7 @@ module ElasticAPM
|
|
25
25
|
@serializers = serializers
|
26
26
|
@filters = filters
|
27
27
|
|
28
|
-
|
29
|
-
@connection = conn_adapter.new(config, metadata)
|
28
|
+
@connection = conn_adapter.new(config)
|
30
29
|
end
|
31
30
|
|
32
31
|
attr_reader :queue, :filters, :name, :connection, :serializers
|
data/lib/elastic_apm/version.rb
CHANGED
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: 3.
|
4
|
+
version: 3.2.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-
|
11
|
+
date: 2019-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -69,6 +69,7 @@ files:
|
|
69
69
|
- CHANGELOG.md
|
70
70
|
- CODE_OF_CONDUCT.md
|
71
71
|
- CONTRIBUTING.md
|
72
|
+
- Dockerfile
|
72
73
|
- Gemfile
|
73
74
|
- LICENSE
|
74
75
|
- README.md
|
@@ -82,8 +83,11 @@ files:
|
|
82
83
|
- bench/tmp/.gitkeep
|
83
84
|
- bin/build_docs
|
84
85
|
- bin/console
|
86
|
+
- bin/dev
|
87
|
+
- bin/run-tests
|
85
88
|
- bin/setup
|
86
89
|
- bin/with_framework
|
90
|
+
- docker-compose.yml
|
87
91
|
- docs/advanced.asciidoc
|
88
92
|
- docs/api.asciidoc
|
89
93
|
- docs/configuration.asciidoc
|
@@ -106,6 +110,7 @@ files:
|
|
106
110
|
- lib/elastic_apm/agent.rb
|
107
111
|
- lib/elastic_apm/central_config.rb
|
108
112
|
- lib/elastic_apm/central_config/cache_control.rb
|
113
|
+
- lib/elastic_apm/child_durations.rb
|
109
114
|
- lib/elastic_apm/config.rb
|
110
115
|
- lib/elastic_apm/config/bytes.rb
|
111
116
|
- lib/elastic_apm/config/duration.rb
|
@@ -123,6 +128,7 @@ files:
|
|
123
128
|
- lib/elastic_apm/error/exception.rb
|
124
129
|
- lib/elastic_apm/error/log.rb
|
125
130
|
- lib/elastic_apm/error_builder.rb
|
131
|
+
- lib/elastic_apm/grape.rb
|
126
132
|
- lib/elastic_apm/instrumenter.rb
|
127
133
|
- lib/elastic_apm/internal_error.rb
|
128
134
|
- lib/elastic_apm/logging.rb
|
@@ -132,12 +138,19 @@ files:
|
|
132
138
|
- lib/elastic_apm/metadata/system_info.rb
|
133
139
|
- lib/elastic_apm/metadata/system_info/container_info.rb
|
134
140
|
- lib/elastic_apm/metrics.rb
|
135
|
-
- lib/elastic_apm/metrics/
|
136
|
-
- lib/elastic_apm/metrics/
|
141
|
+
- lib/elastic_apm/metrics/breakdown_set.rb
|
142
|
+
- lib/elastic_apm/metrics/cpu_mem_set.rb
|
143
|
+
- lib/elastic_apm/metrics/metric.rb
|
144
|
+
- lib/elastic_apm/metrics/set.rb
|
145
|
+
- lib/elastic_apm/metrics/span_scoped_set.rb
|
146
|
+
- lib/elastic_apm/metrics/transaction_set.rb
|
147
|
+
- lib/elastic_apm/metrics/vm_set.rb
|
137
148
|
- lib/elastic_apm/metricset.rb
|
138
149
|
- lib/elastic_apm/middleware.rb
|
139
150
|
- lib/elastic_apm/naively_hashable.rb
|
140
151
|
- lib/elastic_apm/normalizers.rb
|
152
|
+
- lib/elastic_apm/normalizers/grape.rb
|
153
|
+
- lib/elastic_apm/normalizers/grape/endpoint_run.rb
|
141
154
|
- lib/elastic_apm/normalizers/rails.rb
|
142
155
|
- lib/elastic_apm/normalizers/rails/action_controller.rb
|
143
156
|
- lib/elastic_apm/normalizers/rails/action_mailer.rb
|
@@ -178,6 +191,7 @@ files:
|
|
178
191
|
- lib/elastic_apm/transport/connection/proxy_pipe.rb
|
179
192
|
- lib/elastic_apm/transport/filters.rb
|
180
193
|
- lib/elastic_apm/transport/filters/secrets_filter.rb
|
194
|
+
- lib/elastic_apm/transport/headers.rb
|
181
195
|
- lib/elastic_apm/transport/serializers.rb
|
182
196
|
- lib/elastic_apm/transport/serializers/context_serializer.rb
|
183
197
|
- lib/elastic_apm/transport/serializers/error_serializer.rb
|
@@ -185,11 +199,11 @@ files:
|
|
185
199
|
- lib/elastic_apm/transport/serializers/metricset_serializer.rb
|
186
200
|
- lib/elastic_apm/transport/serializers/span_serializer.rb
|
187
201
|
- lib/elastic_apm/transport/serializers/transaction_serializer.rb
|
202
|
+
- lib/elastic_apm/transport/user_agent.rb
|
188
203
|
- lib/elastic_apm/transport/worker.rb
|
189
204
|
- lib/elastic_apm/util.rb
|
190
205
|
- lib/elastic_apm/util/inflector.rb
|
191
206
|
- lib/elastic_apm/util/lru_cache.rb
|
192
|
-
- lib/elastic_apm/util/prefixed_logger.rb
|
193
207
|
- lib/elastic_apm/util/throttle.rb
|
194
208
|
- lib/elastic_apm/version.rb
|
195
209
|
- vendor/.gitkeep
|
@@ -213,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
227
|
- !ruby/object:Gem::Version
|
214
228
|
version: '0'
|
215
229
|
requirements: []
|
216
|
-
rubygems_version: 3.0.
|
230
|
+
rubygems_version: 3.0.6
|
217
231
|
signing_key:
|
218
232
|
specification_version: 4
|
219
233
|
summary: The official Elastic APM agent for Ruby
|
@@ -1,60 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ElasticAPM
|
4
|
-
module Metrics
|
5
|
-
# @api private
|
6
|
-
class VM
|
7
|
-
include Logging
|
8
|
-
|
9
|
-
def initialize(config)
|
10
|
-
@config = config
|
11
|
-
@total_time = 0
|
12
|
-
@disabled = false
|
13
|
-
end
|
14
|
-
|
15
|
-
attr_reader :config
|
16
|
-
attr_writer :disabled
|
17
|
-
|
18
|
-
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
19
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
20
|
-
def collect
|
21
|
-
return if disabled?
|
22
|
-
|
23
|
-
stat = GC.stat
|
24
|
-
thread_count = Thread.list.count
|
25
|
-
|
26
|
-
sample = {
|
27
|
-
'ruby.gc.count': stat[:count],
|
28
|
-
'ruby.threads': thread_count
|
29
|
-
}
|
30
|
-
|
31
|
-
(live_slots = stat[:heap_live_slots]) &&
|
32
|
-
sample[:'ruby.heap.slots.live'] = live_slots
|
33
|
-
(heap_slots = stat[:heap_free_slots]) &&
|
34
|
-
sample[:'ruby.heap.slots.free'] = heap_slots
|
35
|
-
(allocated = stat[:total_allocated_objects]) &&
|
36
|
-
sample[:'ruby.heap.allocations.total'] = allocated
|
37
|
-
|
38
|
-
return sample unless GC::Profiler.enabled?
|
39
|
-
|
40
|
-
@total_time += GC::Profiler.total_time
|
41
|
-
GC::Profiler.clear
|
42
|
-
sample[:'ruby.gc.time'] = @total_time
|
43
|
-
|
44
|
-
sample
|
45
|
-
rescue TypeError => e
|
46
|
-
error 'VM metrics encountered error: %s', e
|
47
|
-
debug('Backtrace:') { e.backtrace.join("\n") }
|
48
|
-
|
49
|
-
@disabled = true
|
50
|
-
nil
|
51
|
-
end
|
52
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
53
|
-
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
54
|
-
|
55
|
-
def disabled?
|
56
|
-
@disabled
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ElasticAPM
|
4
|
-
# @api private
|
5
|
-
class PrefixedLogger < Logger
|
6
|
-
def initialize(logdev, prefix: '', **args)
|
7
|
-
super(logdev, **args)
|
8
|
-
|
9
|
-
@prefix = prefix
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_reader :prefix
|
13
|
-
|
14
|
-
def add(severity, message = nil, progname = nil, &block)
|
15
|
-
super(severity, message, format('%s%s', prefix, progname), &block)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|