elastic-apm 2.1.2 → 2.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.
Potentially problematic release.
This version of elastic-apm might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile +1 -0
- data/docs/advanced.asciidoc +9 -1
- data/docs/api.asciidoc +8 -2
- data/docs/configuration.asciidoc +44 -1
- data/docs/getting-started-rack.asciidoc +6 -0
- data/docs/getting-started-rails.asciidoc +6 -0
- data/docs/index.asciidoc +1 -0
- data/docs/introduction.asciidoc +5 -5
- data/docs/opentracing.asciidoc +94 -0
- data/docs/supported-technologies.asciidoc +5 -0
- data/lib/elastic_apm.rb +53 -11
- data/lib/elastic_apm/agent.rb +17 -8
- data/lib/elastic_apm/config.rb +18 -1
- data/lib/elastic_apm/context.rb +2 -1
- data/lib/elastic_apm/context/user.rb +21 -7
- data/lib/elastic_apm/context_builder.rb +13 -6
- data/lib/elastic_apm/instrumenter.rb +41 -33
- data/lib/elastic_apm/middleware.rb +4 -6
- data/lib/elastic_apm/opentracing.rb +346 -0
- data/lib/elastic_apm/span.rb +26 -29
- data/lib/elastic_apm/span/context.rb +4 -2
- data/lib/elastic_apm/spies/faraday.rb +2 -3
- data/lib/elastic_apm/spies/http.rb +4 -7
- data/lib/elastic_apm/spies/net_http.rb +2 -5
- data/lib/elastic_apm/sql_summarizer.rb +1 -1
- data/lib/elastic_apm/{traceparent.rb → trace_context.rb} +31 -11
- data/lib/elastic_apm/transaction.rb +18 -16
- data/lib/elastic_apm/transport/filters/secrets_filter.rb +1 -0
- data/lib/elastic_apm/transport/serializers/context_serializer.rb +1 -1
- data/lib/elastic_apm/transport/serializers/span_serializer.rb +4 -5
- data/lib/elastic_apm/version.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 556f800e5882b54fe89a4249a6ca5ce98bdfe04b9148f813b75ff17087834c70
|
4
|
+
data.tar.gz: 073241c2a7c78fbebd32434791339a321548e12de242f72598bc11c9bda833b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b53f5c630ce8313593d4ecb0485d48bd3d552e672217409ce2cef9366aa06f881e633108c421d670b77df050fb2069eab09cb5b297a89a977ba0a7fcbe22b5e1
|
7
|
+
data.tar.gz: 7216c6d7628565b4e7295267ebba268461d693edecc5806fd83a92e9d2917aaf77ee075c0bcca20e0f67fdd9a90b3068d4fdabe5ddebbaa2a50353fd0a102169
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,23 @@ 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.2.0 (2019-01-22)
|
8
|
+
|
9
|
+
### Added
|
10
|
+
|
11
|
+
- Support for [OpenTracing](https://opentracing.io) ([#273](https://github.com/elastic/apm-agent-ruby/pull/273))
|
12
|
+
- Add capture_* options ([#279](https://github.com/elastic/apm-agent-ruby/pull/279))
|
13
|
+
- Evaluate the config file as ERB ([#288](https://github.com/elastic/apm-agent-ruby/pull/288))
|
14
|
+
|
15
|
+
### Changed
|
16
|
+
|
17
|
+
- Rename `Traceparent` object to `TraceContext` ([#271](https://github.com/elastic/apm-agent-ruby/pull/271))
|
18
|
+
|
19
|
+
### Fixed
|
20
|
+
|
21
|
+
- An issue where Spans would not get Stacktraces attached ([#282](https://github.com/elastic/apm-agent-ruby/pull/282))
|
22
|
+
- Skip `caller` unless needed ([#287](https://github.com/elastic/apm-agent-ruby/pull/283))
|
23
|
+
|
7
24
|
## 2.1.2 (2018-12-07)
|
8
25
|
|
9
26
|
### Fixed
|
data/Gemfile
CHANGED
data/docs/advanced.asciidoc
CHANGED
@@ -1,8 +1,16 @@
|
|
1
|
+
ifdef::env-github[]
|
2
|
+
NOTE: For the best reading experience,
|
3
|
+
please view this documentation at
|
4
|
+
https://www.elastic.co/guide/en/apm/agent/ruby/current/introduction.html[elastic.co]
|
5
|
+
endif::[]
|
6
|
+
|
1
7
|
[[advanced]]
|
2
8
|
== Advanced Topics
|
3
9
|
|
4
10
|
* <<context>>
|
5
11
|
* <<custom-instrumentation>>
|
12
|
+
* <<opentracing>>
|
6
13
|
|
7
14
|
include::./context.asciidoc[]
|
8
|
-
include::./custom-instrumentation.asciidoc[]
|
15
|
+
include::./custom-instrumentation.asciidoc[]
|
16
|
+
include::./opentracing.asciidoc[]
|
data/docs/api.asciidoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
ifdef::env-github[]
|
2
|
+
NOTE: For the best reading experience,
|
3
|
+
please view this documentation at
|
4
|
+
https://www.elastic.co/guide/en/apm/agent/ruby/current/introduction.html[elastic.co]
|
5
|
+
endif::[]
|
6
|
+
|
1
7
|
[[api]]
|
2
8
|
== Public API
|
3
9
|
|
@@ -76,7 +82,7 @@ Arguments:
|
|
76
82
|
* `type`: A `type` for your transaction eg. `db.postgresql.sql`.
|
77
83
|
* `context:`: An optional <<api-context,Context>> used to enrich the
|
78
84
|
transaction with information about the current request.
|
79
|
-
* `
|
85
|
+
* `trace_context:`: An optional `TraceContext` object for Distributed Tracing.
|
80
86
|
|
81
87
|
Returns the transaction.
|
82
88
|
|
@@ -111,7 +117,7 @@ Arguments:
|
|
111
117
|
* `type`: A `type` for your transaction eg. `db.postgresql.sql`.
|
112
118
|
* `context:`: An optional <<api-context,Context>> used to enrich the
|
113
119
|
transaction with information about the current request.
|
114
|
-
* `
|
120
|
+
* `trace_context:`: An optional `TraceContext` object for Distributed Tracing.
|
115
121
|
* `&block`: A block to wrap. Optionally yields the transaction.
|
116
122
|
|
117
123
|
Returns the return value of the given block.
|
data/docs/configuration.asciidoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
ifdef::env-github[]
|
2
|
+
NOTE: For the best reading experience,
|
3
|
+
please view this documentation at
|
4
|
+
https://www.elastic.co/guide/en/apm/agent/ruby/current/introduction.html[elastic.co]
|
5
|
+
endif::[]
|
6
|
+
|
1
7
|
[[configuration]]
|
2
8
|
== Configuration
|
3
9
|
|
@@ -10,7 +16,7 @@ The recommended way to configure Elastic APM is to create a file
|
|
10
16
|
----
|
11
17
|
---
|
12
18
|
server_url: 'http://localhost:8200'
|
13
|
-
secret_token:
|
19
|
+
secret_token: <%= ENV["VERY_SECRET_TOKEN"] %>
|
14
20
|
----
|
15
21
|
|
16
22
|
Options are applied in the following order (last one wins):
|
@@ -70,6 +76,13 @@ eg `ELASTIC_APM_ENABLED_ENVIRONMENTS=development,production`.
|
|
70
76
|
|
71
77
|
Path to the configuration YAML-file.
|
72
78
|
Elastic APM will load config options from this if the file exists.
|
79
|
+
The file will be evaluated as ERB, so you can include `ENV` variables like in
|
80
|
+
your `database.yml`, eg:
|
81
|
+
|
82
|
+
[source,ruby]
|
83
|
+
----
|
84
|
+
secret_token: <%= ENV['VERY_SECRET_TOKEN'] %>
|
85
|
+
----
|
73
86
|
|
74
87
|
[float]
|
75
88
|
[[config-server-url]]
|
@@ -149,6 +162,36 @@ APM Server has its own limit of 30 seconds before it will close requests.
|
|
149
162
|
|
150
163
|
It has to be provided in *<<config-format-duration, duration format>>*.
|
151
164
|
|
165
|
+
[float]
|
166
|
+
[[config-capture-body]]
|
167
|
+
==== `capture_body`
|
168
|
+
|============
|
169
|
+
| Environment | `Config` key | Default
|
170
|
+
| `ELASTIC_APM_CAPTURE_BODY` | `capture_body` | `true`
|
171
|
+
|============
|
172
|
+
|
173
|
+
Whether or not to attach the request body to transactions and errors.
|
174
|
+
|
175
|
+
[float]
|
176
|
+
[[config-capture-headers]]
|
177
|
+
==== `capture_headers`
|
178
|
+
|============
|
179
|
+
| Environment | `Config` key | Default
|
180
|
+
| `ELASTIC_APM_CAPTURE_HEADERS` | `capture_headers` | `true`
|
181
|
+
|============
|
182
|
+
|
183
|
+
Whether or not to attach the request headers to transactions and errors.
|
184
|
+
|
185
|
+
[float]
|
186
|
+
[[config-capture-env]]
|
187
|
+
==== `capture_env`
|
188
|
+
|============
|
189
|
+
| Environment | `Config` key | Default
|
190
|
+
| `ELASTIC_APM_CAPTURE_ENV` | `capture_env` | `true`
|
191
|
+
|============
|
192
|
+
|
193
|
+
Whether or not to attach `ENV` from Rack to transactions and errors.
|
194
|
+
|
152
195
|
[float]
|
153
196
|
[[config-custom-key-filters]]
|
154
197
|
==== `custom_key_filters`
|
data/docs/index.asciidoc
CHANGED
data/docs/introduction.asciidoc
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
[[introduction]]
|
2
|
-
|
3
1
|
ifdef::env-github[]
|
4
2
|
NOTE: For the best reading experience,
|
5
3
|
please view this documentation at
|
6
4
|
https://www.elastic.co/guide/en/apm/agent/ruby/current/introduction.html[elastic.co]
|
7
5
|
endif::[]
|
8
6
|
|
7
|
+
[[introduction]]
|
8
|
+
|
9
9
|
== Introduction
|
10
10
|
|
11
11
|
Welcome to the APM Ruby Agent documentation.
|
@@ -19,8 +19,8 @@ It has built-in support for <<getting-started-rails,Ruby on Rails>> and other
|
|
19
19
|
[[additional-components]]
|
20
20
|
=== Additional Components
|
21
21
|
|
22
|
-
APM Agents work in conjunction with the {apm-server-ref}/index.html[APM Server], {ref}/index.html[Elasticsearch], and {kibana-ref}/index.html[Kibana].
|
23
|
-
Please view the {apm-
|
22
|
+
APM Agents work in conjunction with the {apm-server-ref-v}/index.html[APM Server], {ref}/index.html[Elasticsearch], and {kibana-ref}/index.html[Kibana].
|
23
|
+
Please view the {apm-overview-ref-v}/index.html[APM Overview] for details on how these components work together.
|
24
24
|
|
25
25
|
[float]
|
26
26
|
[[framework-support]]
|
@@ -30,4 +30,4 @@ The Elastic APM Ruby Agent officially supports Ruby on Rails versions 4.x on
|
|
30
30
|
onwards, see <<getting-started-rails,Getting started with Ruby on Rails>>.
|
31
31
|
|
32
32
|
For Sinatra and other Rack compatible frameworks, see
|
33
|
-
<<getting-started-rack,Getting started with Rack>>.
|
33
|
+
<<getting-started-rack,Getting started with Rack>>.
|
@@ -0,0 +1,94 @@
|
|
1
|
+
ifdef::env-github[]
|
2
|
+
NOTE: For the best reading experience,
|
3
|
+
please view this documentation at https://www.elastic.co/guide/en/apm/agent/ruby[elastic.co]
|
4
|
+
endif::[]
|
5
|
+
|
6
|
+
[[opentracing]]
|
7
|
+
=== OpenTracing bridge
|
8
|
+
|
9
|
+
The Elastic APM OpenTracing bridge allows to create Elastic APM `Transactions` and `Spans`,
|
10
|
+
using the OpenTracing API.
|
11
|
+
In other words,
|
12
|
+
it translates the calls to the OpenTracing API to Elastic APM and thus allows for reusing existing instrumentation.
|
13
|
+
|
14
|
+
The first span of a service will be converted to an Elastic APM `Transaction`,
|
15
|
+
subsequent spans are mapped to Elastic APM `Span`.
|
16
|
+
|
17
|
+
[float]
|
18
|
+
[[operation-modes]]
|
19
|
+
=== Operation Modes
|
20
|
+
|
21
|
+
This bridge allows for different operation modes in combination with the Elastic APM Agent.
|
22
|
+
|
23
|
+
- Noop +
|
24
|
+
If no Elastic APM agent is running, the bridge is in noop mode and does not actually record and report spans.
|
25
|
+
- Mix and Match +
|
26
|
+
If you want to leverage the auto instrumentation of Elastic APM,
|
27
|
+
but also want do create custom spans or use the OpenTracing API to add custom tags to the spans created by Elastic APM,
|
28
|
+
you can just do that.
|
29
|
+
The OpenTracing bridge and the standard Elastic APM API interact seamlessly.
|
30
|
+
- Manual instrumentation +
|
31
|
+
If you don't want Elastic APM to auto-instrument known frameworks,
|
32
|
+
but instead only rely on manual instrumentation,
|
33
|
+
disable the auto instrumentation setting the configuration option <<config-instrument,`instrument`>> to `false`.
|
34
|
+
|
35
|
+
[float]
|
36
|
+
[[getting-started]]
|
37
|
+
=== Getting started
|
38
|
+
Either `require 'elastic_apm/opentracing'` during the boot of your app or specify the `require:` argument to your `Gemfile`, eg. `gem 'elastic_apm', require: 'elastic_apm/opentracing'`.
|
39
|
+
|
40
|
+
[float]
|
41
|
+
[[init-tracer]]
|
42
|
+
=== Set Elastic APM as the global tracer
|
43
|
+
|
44
|
+
[source,ruby]
|
45
|
+
----
|
46
|
+
::OpenTracing.global_tracer = ElasticAPM::OpenTracing::Tracer.new
|
47
|
+
----
|
48
|
+
|
49
|
+
[float]
|
50
|
+
[[elastic-apm-tags]]
|
51
|
+
=== Elastic APM specific tags
|
52
|
+
|
53
|
+
Elastic APM defines some tags which are not included in the OpenTracing API but are relevant in the context of Elastic APM.
|
54
|
+
|
55
|
+
- `type` - sets the type of the transaction,
|
56
|
+
for example `request`, `ext` or `db`
|
57
|
+
- `user.id` - sets the user id,
|
58
|
+
appears in the "User" tab in the transaction details in the Elastic APM UI
|
59
|
+
- `user.email` - sets the user email,
|
60
|
+
appears in the "User" tab in the transaction details in the Elastic APM UI
|
61
|
+
- `user.username` - sets the user name,
|
62
|
+
appears in the "User" tab in the transaction details in the Elastic APM UI
|
63
|
+
- `result` - sets the result of the transaction. Overrides the default value of `success`.
|
64
|
+
If the `error` tag is set to `true`, the default value is `error`.
|
65
|
+
|
66
|
+
[float]
|
67
|
+
[[unsupported]]
|
68
|
+
=== Caveats
|
69
|
+
Not all features of the OpenTracing API are supported.
|
70
|
+
|
71
|
+
[float]
|
72
|
+
[[propagation]]
|
73
|
+
==== Context propagation
|
74
|
+
This bridge only supports the format `OpenTracing::FORMAT_RACK`, using HTTP headers with capitalized names, prefixed with `HTTP_` as Rack does it.
|
75
|
+
|
76
|
+
`OpenTracing::FORMAT_BINARY` is currently not supported.
|
77
|
+
|
78
|
+
[float]
|
79
|
+
[[references]]
|
80
|
+
==== Span References
|
81
|
+
Currently, this bridge only supports `child_of` references.
|
82
|
+
Other references,
|
83
|
+
like `follows_from` are not supported yet.
|
84
|
+
|
85
|
+
[float]
|
86
|
+
[[baggage]]
|
87
|
+
==== Baggage
|
88
|
+
The `Span.set_baggage` method is not supported.
|
89
|
+
Baggage items are dropped with a warning log message.
|
90
|
+
|
91
|
+
[float]
|
92
|
+
[[logs]]
|
93
|
+
==== Logs
|
94
|
+
Logs are currently not supported.
|
data/lib/elastic_apm.rb
CHANGED
@@ -84,6 +84,7 @@ module ElasticAPM # rubocop:disable Metrics/ModuleLength
|
|
84
84
|
|
85
85
|
deprecate :transaction, :with_transaction
|
86
86
|
|
87
|
+
# rubocop:disable Metrics/MethodLength
|
87
88
|
# Start a new transaction
|
88
89
|
#
|
89
90
|
# @param name [String] A description of the transaction, eg
|
@@ -96,15 +97,23 @@ module ElasticAPM # rubocop:disable Metrics/ModuleLength
|
|
96
97
|
name = nil,
|
97
98
|
type = nil,
|
98
99
|
context: nil,
|
100
|
+
trace_context: nil,
|
99
101
|
traceparent: nil
|
100
102
|
)
|
103
|
+
if traceparent
|
104
|
+
trace_context ||= traceparent
|
105
|
+
warn "[ElasticAPM] [DEPRECATED] `start_transaction' with" \
|
106
|
+
"`traceparent:' has been renamed. Use `trace_context:' instead."
|
107
|
+
end
|
108
|
+
|
101
109
|
agent&.start_transaction(
|
102
110
|
name,
|
103
111
|
type,
|
104
112
|
context: context,
|
105
|
-
|
113
|
+
trace_context: trace_context
|
106
114
|
)
|
107
115
|
end
|
116
|
+
# rubocop:enable Metrics/MethodLength
|
108
117
|
|
109
118
|
# Ends the current transaction with `result`
|
110
119
|
#
|
@@ -124,12 +133,24 @@ module ElasticAPM # rubocop:disable Metrics/ModuleLength
|
|
124
133
|
# @param context [Context] An optional [Context]
|
125
134
|
# @yield [Transaction]
|
126
135
|
# @return result of block
|
127
|
-
def with_transaction(
|
136
|
+
def with_transaction(
|
137
|
+
name = nil,
|
138
|
+
type = nil,
|
139
|
+
context: nil,
|
140
|
+
trace_context: nil,
|
141
|
+
traceparent: nil
|
142
|
+
)
|
128
143
|
unless block_given?
|
129
144
|
raise ArgumentError,
|
130
145
|
'expected a block. Do you want `start_transaction\' instead?'
|
131
146
|
end
|
132
147
|
|
148
|
+
if traceparent
|
149
|
+
trace_context ||= traceparent
|
150
|
+
warn "[ElasticAPM] [DEPRECATED] `with_transaction' with " \
|
151
|
+
"`traceparent:' has been renamed. Use `trace_context:' instead."
|
152
|
+
end
|
153
|
+
|
133
154
|
return yield(nil) unless agent
|
134
155
|
|
135
156
|
begin
|
@@ -138,7 +159,7 @@ module ElasticAPM # rubocop:disable Metrics/ModuleLength
|
|
138
159
|
name,
|
139
160
|
type,
|
140
161
|
context: context,
|
141
|
-
|
162
|
+
trace_context: trace_context
|
142
163
|
)
|
143
164
|
yield transaction
|
144
165
|
ensure
|
@@ -156,15 +177,20 @@ module ElasticAPM # rubocop:disable Metrics/ModuleLength
|
|
156
177
|
# @yield [Span] Optional block encapsulating span
|
157
178
|
# @return [Span] Unless block given
|
158
179
|
# @deprecated See `with_span` or `start_span`
|
159
|
-
def span(
|
180
|
+
def span(
|
181
|
+
name,
|
182
|
+
type = nil,
|
183
|
+
context: nil,
|
184
|
+
include_stacktrace: true,
|
185
|
+
&block
|
186
|
+
)
|
160
187
|
return (block_given? ? yield : nil) unless agent
|
161
188
|
|
162
189
|
if block_given?
|
163
190
|
with_span(
|
164
191
|
name,
|
165
192
|
type,
|
166
|
-
context:
|
167
|
-
context,
|
193
|
+
context: context,
|
168
194
|
include_stacktrace: include_stacktrace,
|
169
195
|
&block
|
170
196
|
)
|
@@ -188,13 +214,24 @@ module ElasticAPM # rubocop:disable Metrics/ModuleLength
|
|
188
214
|
# @param context [Span::Context] Context information about the span
|
189
215
|
# @param include_stacktrace [Boolean] Whether or not to capture a stacktrace
|
190
216
|
# @return [Span]
|
191
|
-
def start_span(
|
217
|
+
def start_span(
|
218
|
+
name,
|
219
|
+
type = nil,
|
220
|
+
context: nil,
|
221
|
+
include_stacktrace: true,
|
222
|
+
trace_context: nil
|
223
|
+
)
|
192
224
|
agent&.start_span(
|
193
225
|
name,
|
194
226
|
type,
|
195
227
|
context: context,
|
196
|
-
|
197
|
-
)
|
228
|
+
trace_context: trace_context
|
229
|
+
).tap do |span|
|
230
|
+
break unless span && include_stacktrace
|
231
|
+
break unless agent.config.span_frames_min_duration?
|
232
|
+
|
233
|
+
span.original_backtrace ||= caller
|
234
|
+
end
|
198
235
|
end
|
199
236
|
|
200
237
|
# Ends the current span
|
@@ -217,7 +254,8 @@ module ElasticAPM # rubocop:disable Metrics/ModuleLength
|
|
217
254
|
name,
|
218
255
|
type = nil,
|
219
256
|
context: nil,
|
220
|
-
include_stacktrace: true
|
257
|
+
include_stacktrace: true,
|
258
|
+
trace_context: nil
|
221
259
|
)
|
222
260
|
unless block_given?
|
223
261
|
raise ArgumentError,
|
@@ -229,7 +267,11 @@ module ElasticAPM # rubocop:disable Metrics/ModuleLength
|
|
229
267
|
begin
|
230
268
|
span =
|
231
269
|
start_span(
|
232
|
-
name,
|
270
|
+
name,
|
271
|
+
type,
|
272
|
+
context: context,
|
273
|
+
include_stacktrace: include_stacktrace,
|
274
|
+
trace_context: trace_context
|
233
275
|
)
|
234
276
|
yield span
|
235
277
|
ensure
|