signalfx-tracing 1.3.0 → 1.4.1
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 +5 -5
- data/.gitignore +5 -1
- data/README.md +219 -183
- data/Rakefile +8 -0
- data/bin/sfx-rb-trace-bootstrap +3 -3
- data/gem.deps.rb +1 -1
- data/lib/signalfx/tracing.rb +22 -3
- data/lib/signalfx/tracing/instrumentation/faraday.rb +2 -2
- data/lib/signalfx/tracing/instrumentation/redis.rb +1 -1
- data/lib/signalfx/tracing/tags.rb +47 -0
- data/lib/signalfx/tracing/version.rb +1 -1
- data/signalfx-tracing.gemspec +2 -0
- metadata +23 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a97734502b6a3086f287a0b3190e87f955ef504ed7d84e9d52c8daae57775498
|
4
|
+
data.tar.gz: 0c2afab9431d500c0c00ead0c4ce39ab65218816d3c87169a111b8b313664685
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71ef7d2302c154ac3ec32527875864b58c79896e4f78213aeeb12806a2c806b75287980a8143d1f2d5ee3d345af1f1ab8c7892fffba5a596cff423434dfd6b21
|
7
|
+
data.tar.gz: e4f1620cb3c8e2389a2baad58b615fdd5e7a16b8098e8060a69473a1d4d429f546c2edbd073b3ef1157e5201257cd0a4ef157a4964a54ce5e0d0d9a48dca4501
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,157 +1,164 @@
|
|
1
|
-
# SignalFx
|
1
|
+
# SignalFx Tracing Library for Ruby
|
2
2
|
|
3
|
-
|
3
|
+
The SignalFx Tracing Library for Ruby helps you instrument Ruby applications
|
4
|
+
with the OpenTracing API to capture and report distributed traces to SignalFx.
|
4
5
|
|
5
|
-
|
6
|
-
|
6
|
+
The library consists of an auto-instrumentor that works with OpenTracing
|
7
|
+
community-provided instrumentations, and provides a bootstrap utility to help
|
8
|
+
install instrumentations. It also configures and uses a
|
9
|
+
[Jaeger tracer](https://github.com/salemove/jaeger-client-ruby) to send trace
|
10
|
+
data to SignalFx.
|
7
11
|
|
8
|
-
|
9
|
-
```
|
12
|
+
## Requirements and supported software
|
10
13
|
|
11
|
-
|
14
|
+
Here are the requirements and supported software for the library.
|
12
15
|
|
13
|
-
###
|
16
|
+
### Supported runtimes
|
14
17
|
|
15
|
-
|
16
|
-
$ gem install signalfx-tracing
|
17
|
-
```
|
18
|
-
|
19
|
-
The SignalFx Tracing Library for Ruby requires just enough dependencies to allow custom instrumentation for your application, with target library instrumentations needing to be installed manually.
|
20
|
-
The basic installation provides an `sfx-rb-trace-bootstrap` executable to assist with this process, which allows you to specify the desired libraries for instrumentation as a comma-separated list:
|
21
|
-
|
22
|
-
```bash
|
23
|
-
$ sfx-rb-trace-bootstrap --install-deps rack,rails,activerecord,restclient
|
24
|
-
$ # use the --list option to see all available instrumentations
|
25
|
-
$ sfx-rb-trace-bootstrap --list
|
26
|
-
Available target libraries:
|
27
|
-
{"activerecord"=>["activerecord-opentracing", "~> 0.2.1"],
|
28
|
-
< ... >
|
29
|
-
"sinatra"=>["sinatra-instrumentation", "~> 0.1.2"]}
|
30
|
-
```
|
18
|
+
- MRI Ruby (CRuby) 2.0+
|
31
19
|
|
32
|
-
|
20
|
+
### Supported servers
|
33
21
|
|
34
|
-
|
35
|
-
|
36
|
-
$ cd signalfx-ruby-tracing
|
37
|
-
$ bundle install
|
38
|
-
$ gem install -g
|
39
|
-
```
|
40
|
-
|
41
|
-
### Installation in existing application
|
22
|
+
- Puma >= 3.0.0
|
23
|
+
- Passenger >= 5.0.25
|
42
24
|
|
43
|
-
|
25
|
+
### Supported libraries
|
26
|
+
|
27
|
+
| Library | Instrumentation name | Versions Supported |
|
28
|
+
| ------------------------------- | -------------------------------------- | ------------------ |
|
29
|
+
| [ActiveRecord](#active-record) | activerecord-opentracing | ~> 5.0 |
|
30
|
+
| [Elasticsearch](#elasticsearch) | signalfx-elasticsearch-instrumentation | >= 6.0.2 |
|
31
|
+
| [Faraday](#faraday) | signalfx-faraday-instrumentation | >= 0.9.0 |
|
32
|
+
| [Grape](#grape) | grape-instrumentation | >= 0.13.0 |
|
33
|
+
| [Mongo](#mongo) | mongodb-instrumentation | >= 2.1.0 |
|
34
|
+
| [Mysql2](#mysql2) | mysql2-instrumentation | >= 0.4.0 |
|
35
|
+
| [Net::HTTP](#nethttp) | nethttp-instrumentation | Ruby >= 2.0 |
|
36
|
+
| [Pg](#pg) | pg-instrumentation | >= 0.18.0 |
|
37
|
+
| [Rack](#rack) | rack-tracer | >= 0.1 |
|
38
|
+
| [Rails](#rails) | rails-instrumentation | >= 3.0.0 |
|
39
|
+
| [Redis](#redis) | redis-instrumentation | >= 4.0.0 |
|
40
|
+
| [RestClient](#restclient) | restclient-instrumentation | >= 1.5.0 |
|
41
|
+
| [Sequel](#sequel) | sequel-instrumentation | >= 3.47.0 |
|
42
|
+
| [Sidekiq](#sidekiq) | sfx-sidekiq-opentracing | >= 0.7.0 |
|
43
|
+
| [Sinatra](#sinatra) | sinatra-instrumentation | >= 1.0.0 |
|
44
|
+
|
45
|
+
Instrumentation for routes using Puma or Passenger is provided through
|
46
|
+
Rack. If you use a framework that builds on top of Rack, such as Rails or
|
47
|
+
Sinatra, install the `rack-tracer` instrumentation with your dependency manager
|
48
|
+
or with the bootstrap utility. In these cases, the routes through the web
|
49
|
+
server are automatically traced.
|
50
|
+
|
51
|
+
## Install the SignalFx Tracing Library for Ruby
|
52
|
+
|
53
|
+
Follow these steps to install the tracing library. You can either use the
|
54
|
+
bootstrap utility to install the tracing library and its dependencies or
|
55
|
+
manually install everything.
|
56
|
+
|
57
|
+
The bootstrap utility updates your Gemfile and installs the required
|
58
|
+
dependencies for you. For information about the bootstrap utility, see the
|
59
|
+
[sfx-rb-trace-bootstrap](bin/sfx-rb-trace-bootstrap) file.
|
60
|
+
|
61
|
+
The steps assume you have RubyGems and Bundler.
|
62
|
+
|
63
|
+
### Install the library with the bootstrap utility
|
64
|
+
|
65
|
+
1. Install the tracing library:
|
66
|
+
```bash
|
67
|
+
$ gem install signalfx-tracing
|
68
|
+
```
|
69
|
+
2. View the list of instrumentations you can install with the bootstrap utility:
|
70
|
+
```bash
|
71
|
+
$ sfx-rb-trace-bootstrap --list
|
72
|
+
```
|
73
|
+
3. Use the bootstrap utility to install applicable instrumentations for your
|
74
|
+
application. For example, this is how you add Rails and Redis:
|
75
|
+
```bash
|
76
|
+
$ sfx-rb-trace-bootstrap --install-deps rails,redis
|
77
|
+
```
|
78
|
+
For information about instrumentation names, see supported libraries and their
|
79
|
+
current versions in `gem.deps.rb`. If you configure Rails instrumentation, it
|
80
|
+
also configures Active Record instrumentation, so you don't need to instrument both.
|
81
|
+
|
82
|
+
### Manually install the library
|
83
|
+
|
84
|
+
1. Download the [latest release](https://github.com/signalfx/signalfx-ruby-tracing/releases/latest) of the tracing library.
|
85
|
+
2. Add `signalfx-tracing` to your application's Gemfile:
|
86
|
+
```bash
|
87
|
+
$ gem 'signalfx-tracing'
|
88
|
+
```
|
89
|
+
3. Add each applicable instrumentation to your application's Gemfile. For
|
90
|
+
example, this is how you add Rails and Redis:
|
91
|
+
```bash
|
92
|
+
$ gem 'rails-instrumentation'
|
93
|
+
$ gem 'redis-instrumentation'
|
94
|
+
```
|
95
|
+
For information about instrumentation names, see supported libraries and their
|
96
|
+
current versions in `gem.deps.rb`. If you configure Rails instrumentation, it
|
97
|
+
also configures Active Record instrumentation, so you don't need to instrument both.
|
98
|
+
4. Install the gems for the tracing library and instrumentations:
|
99
|
+
```bash
|
100
|
+
$ bundle install
|
101
|
+
```
|
102
|
+
|
103
|
+
## Configure instrumentation for a Ruby application
|
104
|
+
|
105
|
+
Configure the instrumentation anywhere in the setup portion of your code or
|
106
|
+
before importing and using any libraries that need to be traced.
|
107
|
+
|
108
|
+
For example, with Rails, configure instrumentation in `config/initializer/tracing.rb`.
|
109
|
+
|
110
|
+
You can configure instrumentation automatically or manually. Manual
|
111
|
+
instrumentation is convenient when you want to trace only some libraries.
|
112
|
+
|
113
|
+
### Set configuration values
|
114
|
+
|
115
|
+
If the default configuration values don't apply for your environment, override them before running the process you instrument.
|
116
|
+
|
117
|
+
| `configure` parameter | Environment variable | Default | Notes |
|
118
|
+
| ------------------- | --------------------------------- | -------------------------------- | ----- |
|
119
|
+
| tracer | N/A | `nil` | The OpenTracing global tracer. |
|
120
|
+
| ingest_url | SIGNALFX_ENDPOINT_URL | `http://localhost:9080/v1/trace` | The endpoint the tracer sends spans to. Send spans to a Smart Agent, OpenTelemetry Collector, or a SignalFx ingest endpoint. |
|
121
|
+
| service_name | SIGNALFX_SERVICE_NAME | `signalfx-ruby-tracing` | The name to identify the service in SignalFx. |
|
122
|
+
| access_token | SIGNALFX_ACCESS_TOKEN | `''` | The SignalFx organization access token. |
|
123
|
+
| N/A | SIGNALFX_RECORDED_VALUE_MAX_LENGTH | `1200` | Maximum length an attribute value can have. Values longer than this are truncated. |
|
124
|
+
|
125
|
+
### Automatically instrument code:
|
126
|
+
|
127
|
+
Configure the auto-instrumentor to check for modules defined in the code and
|
128
|
+
instrument them if available:
|
44
129
|
|
45
130
|
```ruby
|
46
|
-
|
47
|
-
```
|
48
|
-
|
49
|
-
Then execute the following (or use your desired installation method for your application).
|
131
|
+
require 'signalfx/tracing'
|
50
132
|
|
51
|
-
|
52
|
-
$ bundle install
|
133
|
+
SignalFx::Tracing::Instrumenter.configure(auto_instrument:true)
|
53
134
|
```
|
54
135
|
|
55
|
-
|
56
|
-
|
57
|
-
Configure the instrumentation anywhere in the setup portion of your code or before doing anything
|
58
|
-
that needs to be traced.
|
136
|
+
### Manually specify which libraries to instrument
|
59
137
|
|
60
|
-
|
61
|
-
|
62
|
-
The instrumentation can be done automatically, where the auto-instrumenter will
|
63
|
-
check for modules defined in the code and instrument them if available:
|
138
|
+
Specify which libraries to instrument:
|
64
139
|
|
65
140
|
```ruby
|
66
141
|
require 'signalfx/tracing'
|
67
142
|
|
68
|
-
SignalFx::Tracing::Instrumenter.configure
|
69
|
-
|
70
|
-
|
71
|
-
Manual configuration may be desirable when only some libraries should be traced.
|
72
|
-
These instrumentations to can be selected in a block:
|
73
|
-
|
74
|
-
```ruby
|
75
|
-
SignalFx::Tracing::Instrumenter.configure do |patcher|
|
76
|
-
patcher.instrument(:LibName)
|
143
|
+
SignalFx::Tracing::Instrumenter.configure do |p|
|
144
|
+
p.instrument(<:myLibName>)
|
77
145
|
...
|
78
146
|
end
|
79
147
|
```
|
80
148
|
|
81
|
-
|
82
|
-
|
83
|
-
`configure` accepts several optional parameters:
|
84
|
-
- `tracer`: a preconfigured OpenTracing tracer to use. If one is not provided,
|
85
|
-
a new tracer will be initialized.
|
86
|
-
- Default: `nil`
|
87
|
-
- `ingest_url`: this is the Smart Agent or Smart Gateway endpoint to which spans are sent by the tracer.
|
88
|
-
- Default: `http://localhost:9080/v1/trace`
|
89
|
-
- `service_name`: service name to send spans under.
|
90
|
-
- Default: `signalfx-ruby-tracing`
|
91
|
-
- `access_token`: SignalFx access token for authentication. Unnecessary for most deployments.
|
92
|
-
- Default: `''`
|
93
|
-
|
94
|
-
Environment variables can be used to configure `service_name` and `access_token`
|
95
|
-
if not given to the `configure` method.
|
149
|
+
## Usage information for each library
|
96
150
|
|
97
|
-
|
98
|
-
export SIGNALFX_SERVICE_NAME="<service_name>"
|
99
|
-
export SIGNALFX_ENDPOINT_URL="<url>"
|
100
|
-
export SIGNALFX_ACCESS_TOKEN="<token>"
|
101
|
-
```
|
102
|
-
|
103
|
-
If these environment variables are not set, the values will default to the ones
|
104
|
-
listed above.
|
105
|
-
|
106
|
-
# Instrumentation
|
107
|
-
|
108
|
-
This section contains details and configuration for specific frameworks.
|
109
|
-
|
110
|
-
### Runtimes
|
111
|
-
|
112
|
-
- MRI Ruby (CRuby) 2.0+
|
113
|
-
|
114
|
-
### Web servers
|
115
|
-
|
116
|
-
- Puma >= 3.0.0
|
117
|
-
- Passenger >= 5.0.25
|
151
|
+
Here's information about instrumenting each supported library.
|
118
152
|
|
119
|
-
|
120
|
-
If using a framework that builds on top of Rack, such as Rails or Sinatra, our
|
121
|
-
instrumentation includes Rack instrumentation. In these cases, the routes
|
122
|
-
through the web server will be automatically traced.
|
123
|
-
|
124
|
-
When interfacing with these web servers as a Rack application, please configure
|
125
|
-
[Rack instrumentation](#rack) and insert it as middleware.
|
126
|
-
|
127
|
-
### Libraries/Frameworks
|
128
|
-
|
129
|
-
| Library | Versions Supported |
|
130
|
-
| ----------------------------------- | ------------------ |
|
131
|
-
| [ActiveRecord](#active-record) | ~> 5.0 |
|
132
|
-
| [Elasticsearch](#elasticsearch) | >= 6.0.2 |
|
133
|
-
| [Faraday](#faraday) | >= 0.9.0 |
|
134
|
-
| [Grape](#grape) | >= 0.13.0 |
|
135
|
-
| [Mongo](#mongo) | >= 2.1.0 |
|
136
|
-
| [Mysql2](#mysql2) | >= 0.4.0 |
|
137
|
-
| [Net::HTTP](#nethttp) | Ruby >= 2.0 |
|
138
|
-
| [Pg](#pg) | >= 0.18.0 |
|
139
|
-
| [Rack](#rack) | >= 0.1 |
|
140
|
-
| [Rails](#rails) | >= 3.0.0 |
|
141
|
-
| [Redis](#redis) | >= 4.0.0 |
|
142
|
-
| [RestClient](#restclient) | >= 1.5.0 |
|
143
|
-
| [Sequel](#sequel) | >= 3.47.0 |
|
144
|
-
| [Sidekiq](#sidekiq) | >= 0.7.0 |
|
145
|
-
| [Sinatra](#sinatra) | >= 1.0.0 |
|
146
|
-
|
147
|
-
## Active Record
|
153
|
+
### Active Record
|
148
154
|
|
149
155
|
This instrumentation creates spans for each Active Record query using the Active
|
150
|
-
Support notifications framework.
|
156
|
+
Support notifications framework. If you configure Rails instrumentation, it also configures Active Record instrumentation, so you don't need to instrument both.
|
151
157
|
|
152
|
-
The source for this instrumentation is located
|
158
|
+
The source for this instrumentation is located
|
159
|
+
[here](https://github.com/salemove/ruby-activerecord-opentracing).
|
153
160
|
|
154
|
-
|
161
|
+
#### Usage
|
155
162
|
|
156
163
|
```bash
|
157
164
|
$ # install the instrumentation if not done previously
|
@@ -164,14 +171,15 @@ SignalFx::Tracing::Instrumenter.configure do |p|
|
|
164
171
|
end
|
165
172
|
```
|
166
173
|
|
167
|
-
|
174
|
+
### Elasticsearch
|
168
175
|
|
169
176
|
Elasticsearch queries through the Ruby client are traced using a wrapper around
|
170
177
|
the transport.
|
171
178
|
|
172
|
-
The forked source for the instrumentation is located
|
179
|
+
The forked source for the instrumentation is located
|
180
|
+
[here](https://github.com/signalfx/ruby-elasticsearch-tracer).
|
173
181
|
|
174
|
-
|
182
|
+
#### Usage
|
175
183
|
|
176
184
|
```bash
|
177
185
|
$ # install the instrumentation if not done previously
|
@@ -201,15 +209,16 @@ client.transport = Elasticsearch::Tracer::Transport.new(tracer: OpenTracing.glob
|
|
201
209
|
transport: client.transport)
|
202
210
|
```
|
203
211
|
|
204
|
-
|
212
|
+
### Faraday
|
205
213
|
|
206
214
|
Faraday HTTP client instrumentation automatically creates spans for outgoing
|
207
215
|
requests. If the remote service has instrumentation that is aware of Rack,
|
208
216
|
those spans will be automatically nested with Faraday's spans.
|
209
217
|
|
210
|
-
The source for this instrumentation is located
|
218
|
+
The source for this instrumentation is located
|
219
|
+
[here](https://github.com/opentracing-contrib/ruby-faraday-tracer).
|
211
220
|
|
212
|
-
|
221
|
+
#### Usage
|
213
222
|
|
214
223
|
```bash
|
215
224
|
$ # install the instrumentation if not done previously
|
@@ -232,15 +241,16 @@ end
|
|
232
241
|
|
233
242
|
For more detailed usage, please check the instrumentation's page.
|
234
243
|
|
235
|
-
|
244
|
+
### Grape
|
236
245
|
|
237
246
|
This instrumentation subscribes to ActiveSupport notifications emitted by the
|
238
247
|
Grape API. It patches `Grape::API` to automatically insert the `Rack::Tracer`
|
239
248
|
middleware and trace requests.
|
240
249
|
|
241
|
-
The source for this instrumentation is located
|
250
|
+
The source for this instrumentation is located
|
251
|
+
[here](https://github.com/signalfx/ruby-grape-instrumentation)
|
242
252
|
|
243
|
-
|
253
|
+
#### Usage
|
244
254
|
|
245
255
|
```bash
|
246
256
|
$ # install the instrumentation if not done previously
|
@@ -255,8 +265,10 @@ end
|
|
255
265
|
|
256
266
|
`instrument` takes these optional arguments:
|
257
267
|
- `tracer`: custom tracer to use. Defaults to `OpenTracing.global_tracer`
|
258
|
-
- `parent_span`: parent span to group spans or block that returns a span.
|
259
|
-
|
268
|
+
- `parent_span`: parent span to group spans or block that returns a span.
|
269
|
+
Default: `nil`
|
270
|
+
- `disable_patching`: disable patching if managing the middleware stack
|
271
|
+
manually. Default: `false`
|
260
272
|
|
261
273
|
If patching is disabled, but spans nested by request are still desired, then the
|
262
274
|
Rack middleware must be manually added to the API class.
|
@@ -277,13 +289,15 @@ end
|
|
277
289
|
|
278
290
|
Please see the instrumentation's page for more details.
|
279
291
|
|
280
|
-
|
292
|
+
### Mongo
|
281
293
|
|
282
|
-
Mongo driver instrumentation traces queries performed through the Ruby Mongodb
|
294
|
+
Mongo driver instrumentation traces queries performed through the Ruby Mongodb
|
295
|
+
driver.
|
283
296
|
|
284
|
-
The source for this instrumentation is located
|
297
|
+
The source for this instrumentation is located
|
298
|
+
[here](https://github.com/signalfx/ruby-mongodb-instrumentation)
|
285
299
|
|
286
|
-
|
300
|
+
#### Usage
|
287
301
|
|
288
302
|
```bash
|
289
303
|
$ # install the instrumentation if not done previously
|
@@ -296,13 +310,14 @@ SignalFx::Tracing::Instrumenter.configure do |p|
|
|
296
310
|
end
|
297
311
|
```
|
298
312
|
|
299
|
-
|
313
|
+
### Mysql2
|
300
314
|
|
301
315
|
Mysql2 instrumentation traces all queries performed with the Mysql2 client.
|
302
316
|
|
303
|
-
The source for this instrumentation is located
|
317
|
+
The source for this instrumentation is located
|
318
|
+
[here](https://github.com/signalfx/ruby-mysql2-instrumentation)
|
304
319
|
|
305
|
-
|
320
|
+
#### Usage
|
306
321
|
|
307
322
|
```bash
|
308
323
|
$ # install the instrumentation if not done previously
|
@@ -315,13 +330,14 @@ SignalFx::Tracing::Instrumenter.configure do |p|
|
|
315
330
|
end
|
316
331
|
```
|
317
332
|
|
318
|
-
|
333
|
+
### Net::HTTP
|
319
334
|
|
320
335
|
This automatically traces all requests using Net::HTTP.
|
321
336
|
|
322
|
-
The source for this instrumentation is located
|
337
|
+
The source for this instrumentation is located
|
338
|
+
[here](https://github.com/signalfx/ruby-net-http-instrumentation).
|
323
339
|
|
324
|
-
|
340
|
+
#### Usage
|
325
341
|
|
326
342
|
```ruby
|
327
343
|
SignalFx::Tracing::Instrumenter.configure do |p|
|
@@ -329,15 +345,17 @@ SignalFx::Tracing::Instrumenter.configure do |p|
|
|
329
345
|
end
|
330
346
|
```
|
331
347
|
|
332
|
-
An optional `tracer` named argument can be provided to use a custom tracer.
|
348
|
+
An optional `tracer` named argument can be provided to use a custom tracer.
|
349
|
+
It will default to `OpenTracing.global_tracer` if not provided.
|
333
350
|
|
334
|
-
|
351
|
+
### Pg
|
335
352
|
|
336
353
|
Pg instrumentation traces all queries performed with the pg client.
|
337
354
|
|
338
|
-
The source for this instrumentation is located
|
355
|
+
The source for this instrumentation is located
|
356
|
+
[here](https://github.com/signalfx/ruby-pg-instrumentation)
|
339
357
|
|
340
|
-
|
358
|
+
#### Usage
|
341
359
|
|
342
360
|
```bash
|
343
361
|
$ # install the instrumentation if not done previously
|
@@ -349,15 +367,16 @@ SignalFx::Tracing::Instrumenter.configure do |p|
|
|
349
367
|
p.instrument(:pg)
|
350
368
|
end
|
351
369
|
```
|
352
|
-
|
370
|
+
### Rack
|
353
371
|
|
354
372
|
Rack spans are created using the `rack-tracer` gem. This is enabled
|
355
373
|
automatically for other frameworks that are built on top of Rack, but it can
|
356
374
|
also be separately enabled.
|
357
375
|
|
358
|
-
The source for this instrumentation is located
|
376
|
+
The source for this instrumentation is located
|
377
|
+
[here](https://github.com/opentracing-contrib/ruby-rack-tracer).
|
359
378
|
|
360
|
-
|
379
|
+
#### Usage
|
361
380
|
|
362
381
|
```bash
|
363
382
|
$ # install the instrumentation if not done previously
|
@@ -372,14 +391,15 @@ end
|
|
372
391
|
use Rack::Tracer
|
373
392
|
```
|
374
393
|
|
375
|
-
|
394
|
+
### Rails
|
376
395
|
|
377
396
|
Rails applications can be traced using the notifications provided by ActiveSupport.
|
378
397
|
It will use `rack-tracer` to trace by requests.
|
379
398
|
|
380
|
-
The forked source for this instrumentation is located
|
399
|
+
The forked source for this instrumentation is located
|
400
|
+
[here](https://github.com/signalfx/ruby-rails-instrumentation).
|
381
401
|
|
382
|
-
|
402
|
+
#### Usage
|
383
403
|
|
384
404
|
```bash
|
385
405
|
$ # install the instrumentation if not done previously
|
@@ -408,13 +428,15 @@ Note that if `rack_tracer` is set to `false`, requests propagated to the Rails
|
|
408
428
|
app will not be extracted. For example, if a traced service makes a request to
|
409
429
|
an endpoint served by the Rails app, it will not be automatically nested.
|
410
430
|
|
411
|
-
|
431
|
+
### Redis
|
412
432
|
|
413
|
-
This instrumentation traces commands performed using the
|
433
|
+
This instrumentation traces commands performed using the
|
434
|
+
[Redis client](https://github.com/redis/redis-rb).
|
414
435
|
|
415
|
-
The source for this instrumentation is located
|
436
|
+
The source for this instrumentation is located
|
437
|
+
[here](https://github.com/signalfx/ruby-redis-instrumentation).
|
416
438
|
|
417
|
-
|
439
|
+
#### Usage
|
418
440
|
|
419
441
|
```bash
|
420
442
|
$ # install the instrumentation if not done previously
|
@@ -431,14 +453,15 @@ Arguments:
|
|
431
453
|
- `tracer`: Optional custom tracer to use for this instrumentation
|
432
454
|
- Default: `OpenTracing.global_tracer`
|
433
455
|
|
434
|
-
|
456
|
+
### RestClient
|
435
457
|
|
436
458
|
RestClient requests can be patched to automatically be wrapped in a span. It
|
437
459
|
will also inject the span context so remote services can extract it.
|
438
460
|
|
439
|
-
The source for this instrumentation is located
|
461
|
+
The source for this instrumentation is located
|
462
|
+
[here](https://github.com/signalfx/ruby-restclient-instrumentation).
|
440
463
|
|
441
|
-
|
464
|
+
#### Usage
|
442
465
|
|
443
466
|
```bash
|
444
467
|
$ # install the instrumentation if not done previously
|
@@ -457,13 +480,15 @@ Arguments:
|
|
457
480
|
- `propagate`: Propagate spans to the request endpoint.
|
458
481
|
- Default: `false`
|
459
482
|
|
460
|
-
|
483
|
+
### Sequel
|
461
484
|
|
462
|
-
Sequel instrumentation adds extensions to the Database and Dataset to trace
|
485
|
+
Sequel instrumentation adds extensions to the Database and Dataset to trace
|
486
|
+
queries.
|
463
487
|
|
464
|
-
The source for this instrumentation is located
|
488
|
+
The source for this instrumentation is located
|
489
|
+
[here](https://github.com/signalfx/ruby-sequel-instrumentation).
|
465
490
|
|
466
|
-
|
491
|
+
#### Usage
|
467
492
|
|
468
493
|
```bash
|
469
494
|
$ # install the instrumentation if not done previously
|
@@ -480,16 +505,19 @@ Arguments:
|
|
480
505
|
- `tracer`: Optional custom tracer for this instrumentation
|
481
506
|
- Default: `OpenTracing.global_tracer`
|
482
507
|
|
483
|
-
|
508
|
+
### Sidekiq
|
484
509
|
|
485
|
-
Sidekiq instrumentation traces worker job submissions and execution via
|
486
|
-
|
487
|
-
|
488
|
-
|
510
|
+
Sidekiq instrumentation traces worker job submissions and execution via
|
511
|
+
[Sidekiq middleware](https://github.com/mperham/sidekiq/wiki/Middleware).
|
512
|
+
The instrumenter registers both client and server middleware that use job
|
513
|
+
metadata to represent all job submissions and their invocations. Trace
|
514
|
+
context propagation adds to this job metadata to unifiy distributed client
|
515
|
+
and server requests and processing.
|
489
516
|
|
490
|
-
The source for this instrumentation is located
|
517
|
+
The source for this instrumentation is located
|
518
|
+
[here](https://github.com/signalfx/ruby-sidekiq-tracer).
|
491
519
|
|
492
|
-
|
520
|
+
#### Usage
|
493
521
|
|
494
522
|
```bash
|
495
523
|
$ # install the instrumentation if not done previously
|
@@ -505,20 +533,22 @@ end
|
|
505
533
|
Arguments:
|
506
534
|
- `tracer`: Optional custom tracer for this instrumentation
|
507
535
|
- Default: `OpenTracing.global_tracer`
|
508
|
-
- `propagate`: Optional boolean to enable/disable trace context injection via
|
536
|
+
- `propagate`: Optional boolean to enable/disable trace context injection via
|
537
|
+
job metadata
|
509
538
|
- Default: `true`
|
510
539
|
|
511
540
|
|
512
|
-
|
541
|
+
### Sinatra
|
513
542
|
|
514
543
|
Sinatra instrumentation traces requests and template rendering. The instrumenter
|
515
544
|
registers a Sinatra extension that uses `rack-tracer` to trace requests and
|
516
545
|
monkey-patches to trace view rendering. Rack instrumentation is automatically
|
517
546
|
enabled when using Sinatra instrumentation.
|
518
547
|
|
519
|
-
The source for this instrumentation is located
|
548
|
+
The source for this instrumentation is located
|
549
|
+
[here](https://github.com/signalfx/ruby-sinatra-instrumentation).
|
520
550
|
|
521
|
-
|
551
|
+
#### Usage
|
522
552
|
|
523
553
|
```bash
|
524
554
|
$ # install the instrumentation if not done previously
|
@@ -531,9 +561,10 @@ SignalFx::Tracing::Instrumenter.configure do |p|
|
|
531
561
|
end
|
532
562
|
```
|
533
563
|
|
534
|
-
##
|
564
|
+
## Configure the logger
|
535
565
|
|
536
|
-
The logger, based on the [Ruby Logger](https://ruby-doc.org/stdlib-2.4.0/libdoc/logger/rdoc/Logger.html),
|
566
|
+
The logger, based on the [Ruby Logger](https://ruby-doc.org/stdlib-2.4.0/libdoc/logger/rdoc/Logger.html),
|
567
|
+
can be configured by setting the following environment variables:
|
537
568
|
|
538
569
|
| Environmental Variable Name | Description | Default |
|
539
570
|
|:------------------------------|:----------------------|:-------------------- |
|
@@ -542,8 +573,13 @@ The logger, based on the [Ruby Logger](https://ruby-doc.org/stdlib-2.4.0/libdoc/
|
|
542
573
|
| `SIGNALFX_LOG_SHIFT_SIZE` | The desired maximum size of log files (this only applies when. A new one would be created when the maximum is reached. | `1048576` (1 MB) |
|
543
574
|
| `SIGNALFX_LOG_LEVEL` | The severity criteria for recording logs (from least to most severe). Options: `debug`, `info`, `warn`, `error`, `fatal`, `unknown` | `warn` |
|
544
575
|
|
545
|
-
More information regarding the logging configuration may be found
|
576
|
+
More information regarding the logging configuration may be found
|
577
|
+
[here](https://ruby-doc.org/stdlib-2.4.0/libdoc/logger/rdoc/Logger.html).
|
546
578
|
|
547
579
|
**NB**:
|
548
|
-
- If the default path for `SIGNALFX_LOG_PATH` (that is, `/var/log/signalfx/signalfx-ruby-tracing.log`)
|
549
|
-
|
580
|
+
- If the default path for `SIGNALFX_LOG_PATH` (that is, `/var/log/signalfx/signalfx-ruby-tracing.log`)
|
581
|
+
is to be used, then please create the directory and or file (if necessary)
|
582
|
+
and grant the relevant access permissions to the instrumentation user process.
|
583
|
+
If there are permission issues, the instrumentation will default to logging to
|
584
|
+
the standard error (STDERR) handle, until the path is provided to which logs
|
585
|
+
can be written without any access issues.
|
data/Rakefile
CHANGED
data/bin/sfx-rb-trace-bootstrap
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#!/usr/bin/env ruby -
|
1
|
+
#!/usr/bin/env ruby -rrubygems
|
2
2
|
require 'optparse'
|
3
3
|
require 'ostruct'
|
4
4
|
require 'pp'
|
@@ -14,7 +14,7 @@ instrumentations = {
|
|
14
14
|
"pg" => ["pg-instrumentation", "~> 0.1.0"],
|
15
15
|
"rack" => ["rack-tracer", { git: 'git://github.com/signalfx/ruby-rack-tracer.git', branch: 'sfx_release' }],
|
16
16
|
"rails" => ["rails-instrumentation", "~> 0.1.3"],
|
17
|
-
"redis" => ["redis-instrumentation", "~> 0.
|
17
|
+
"redis" => ["redis-instrumentation", "~> 0.2.0"],
|
18
18
|
"restclient" => ["restclient-instrumentation", "~> 0.1.1"],
|
19
19
|
"sequel" => ["sequel-instrumentation", "~> 0.1.0"],
|
20
20
|
"sidekiq" => ["sfx-sidekiq-opentracing", "~> 0.0.3"],
|
@@ -67,4 +67,4 @@ def install_from_git(target, options)
|
|
67
67
|
end
|
68
68
|
|
69
69
|
parser.parse(ARGV)
|
70
|
-
install_instrumentors(instrumentations, options.target_libraries)
|
70
|
+
install_instrumentors(instrumentations, options.target_libraries)
|
data/gem.deps.rb
CHANGED
@@ -7,7 +7,7 @@ group :instrumentations do
|
|
7
7
|
gem 'pg-instrumentation', '~> 0.1.0'
|
8
8
|
gem 'rack-tracer', git: 'git://github.com/signalfx/ruby-rack-tracer.git', branch: 'sfx_release'
|
9
9
|
gem 'rails-instrumentation', '0.1.3'
|
10
|
-
gem 'redis-instrumentation', '~> 0.
|
10
|
+
gem 'redis-instrumentation', '~> 0.2.0'
|
11
11
|
gem 'restclient-instrumentation', '~> 0.1.1'
|
12
12
|
gem 'sequel-instrumentation', '~> 0.1.0'
|
13
13
|
gem 'sfx-sidekiq-opentracing', '~> 0.0.3'
|
data/lib/signalfx/tracing.rb
CHANGED
@@ -2,6 +2,8 @@ require 'jaeger/client'
|
|
2
2
|
require 'signalfx/tracing/http_sender'
|
3
3
|
require 'signalfx/tracing/register'
|
4
4
|
require 'signalfx/tracing/compat'
|
5
|
+
require 'signalfx/tracing/sfx_logger'
|
6
|
+
require 'signalfx/tracing/tags'
|
5
7
|
require 'thread'
|
6
8
|
|
7
9
|
module SignalFx
|
@@ -25,7 +27,12 @@ module SignalFx
|
|
25
27
|
|
26
28
|
if auto_instrument
|
27
29
|
Register.available_libs.each_pair do |key, value|
|
28
|
-
|
30
|
+
begin
|
31
|
+
value.instrument
|
32
|
+
rescue Exception => e
|
33
|
+
logger.error { "failed to initialize instrumentation '#{key}': #{e.inspect}" }
|
34
|
+
logger.error { e.backtrace }
|
35
|
+
end
|
29
36
|
end
|
30
37
|
else
|
31
38
|
yield self
|
@@ -36,9 +43,14 @@ module SignalFx
|
|
36
43
|
|
37
44
|
def instrument(to_patch, **args)
|
38
45
|
if Register.available_libs[to_patch].nil?
|
39
|
-
|
46
|
+
logger.error { "instrumentation not found: #{to_patch}" }
|
40
47
|
else
|
41
|
-
|
48
|
+
begin
|
49
|
+
Register.available_libs[to_patch].instrument(**args)
|
50
|
+
rescue Exception => e
|
51
|
+
logger.error { "failed to initialize instrumentation '#{to_patch}': #{e.inspect}" }
|
52
|
+
logger.error { e.backtrace }
|
53
|
+
end
|
42
54
|
end
|
43
55
|
end
|
44
56
|
|
@@ -78,6 +90,13 @@ module SignalFx
|
|
78
90
|
def revive
|
79
91
|
set_tracer(service_name: @service_name, access_token: @access_token)
|
80
92
|
end
|
93
|
+
|
94
|
+
def logger()
|
95
|
+
if @_logger == nil
|
96
|
+
@_logger = Logging.logger
|
97
|
+
end
|
98
|
+
return @_logger
|
99
|
+
end
|
81
100
|
end
|
82
101
|
end
|
83
102
|
|
@@ -31,9 +31,9 @@ module SignalFx
|
|
31
31
|
::Faraday::Connection.module_eval do
|
32
32
|
alias_method :initialize_original, :initialize
|
33
33
|
|
34
|
-
def initialize(url = nil, options = nil)
|
34
|
+
def initialize(url = nil, options = nil, &block)
|
35
35
|
# initialize the connection as usual
|
36
|
-
initialize_original(url, options)
|
36
|
+
initialize_original(url, options, &block)
|
37
37
|
|
38
38
|
# before we let go, add the Faraday tracer to the beginning of the stack
|
39
39
|
@builder.insert(0, ::Faraday::Tracer)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'jaeger/span'
|
2
|
+
|
3
|
+
module SignalFx
|
4
|
+
module Tracing
|
5
|
+
module TagBuilder
|
6
|
+
def self.prepended(base)
|
7
|
+
base.singleton_class.prepend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
@@max_attr_length = (ENV['SIGNALFX_RECORDED_VALUE_MAX_LENGTH'] || '1200').to_i
|
12
|
+
|
13
|
+
def self.max_attr_length
|
14
|
+
@@max_attr_length
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.max_attr_length=(v)
|
18
|
+
@@max_attr_length = v
|
19
|
+
end
|
20
|
+
|
21
|
+
def _truncate_value_if_needed(value)
|
22
|
+
if value.is_a? String
|
23
|
+
if @@max_attr_length > 0
|
24
|
+
value = value[0..@@max_attr_length-1]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
return value
|
28
|
+
end
|
29
|
+
|
30
|
+
def build(key, value)
|
31
|
+
tag = super(key, value)
|
32
|
+
if tag.vStr != nil
|
33
|
+
tag.vStr = _truncate_value_if_needed(tag.vStr)
|
34
|
+
end
|
35
|
+
tag
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
module Jaeger
|
44
|
+
class ThriftTagBuilder
|
45
|
+
prepend SignalFx::Tracing::TagBuilder
|
46
|
+
end
|
47
|
+
end
|
data/signalfx-tracing.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: signalfx-tracing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SignalFx, Inc.
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,7 +80,21 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.1.2
|
83
|
-
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: signalfx-faraday-instrumentation~> 0.1.1
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description:
|
84
98
|
email:
|
85
99
|
- info@signalfx.com
|
86
100
|
executables:
|
@@ -118,6 +132,7 @@ files:
|
|
118
132
|
- lib/signalfx/tracing/register.rb
|
119
133
|
- lib/signalfx/tracing/reporter/auto_reviving_async_reporter.rb
|
120
134
|
- lib/signalfx/tracing/sfx_logger.rb
|
135
|
+
- lib/signalfx/tracing/tags.rb
|
121
136
|
- lib/signalfx/tracing/tracer.rb
|
122
137
|
- lib/signalfx/tracing/version.rb
|
123
138
|
- signalfx-tracing.gemspec
|
@@ -125,7 +140,7 @@ homepage: https://github.com/signalfx/signalfx-ruby-tracing
|
|
125
140
|
licenses:
|
126
141
|
- Apache-2.0
|
127
142
|
metadata: {}
|
128
|
-
post_install_message:
|
143
|
+
post_install_message:
|
129
144
|
rdoc_options: []
|
130
145
|
require_paths:
|
131
146
|
- lib
|
@@ -140,9 +155,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
155
|
- !ruby/object:Gem::Version
|
141
156
|
version: '0'
|
142
157
|
requirements: []
|
143
|
-
rubyforge_project:
|
144
|
-
rubygems_version: 2.
|
145
|
-
signing_key:
|
158
|
+
rubyforge_project:
|
159
|
+
rubygems_version: 2.7.6.2
|
160
|
+
signing_key:
|
146
161
|
specification_version: 4
|
147
162
|
summary: Auto-instrumentation framework for Ruby
|
148
163
|
test_files: []
|