rails-tracer 0.1.1 → 0.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/README.md +46 -4
- data/lib/rails/active_record/tracer.rb +48 -0
- data/lib/rails/tracer.rb +1 -0
- data/rails-tracer.gemspec +7 -1
- metadata +72 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 341252ba5950c2280f05fa00ebfd31a96b7a1e67
|
4
|
+
data.tar.gz: 3e6a3ff67203d73dbc3d3e2306abe460ac7d7d19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8ab55c727d3fd0c1b3c77db108b0ed0e8e6b252613aa3777c1f1307312444d9809383d638120557b6699b0e87e00ba34f073b82e883f1f40dd2e9eb2f64b33c
|
7
|
+
data.tar.gz: 27d5c6b05ea339a549dad913e37fd05cb857ceefe8539b241eccca877fafd6134451486f8b15930fd3725641a31ad34cf24af74162da099dc693fbf9074d8138
|
data/README.md
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
This gem is an attempt to introduce OpenTracing instrumentation into Rails. It's in a very early stage.
|
4
4
|
|
5
|
-
|
6
|
-
It's not perfect. You need to dig into the trace to understand with what url it's related.
|
5
|
+
The following instrumentation is supported:
|
7
6
|
|
8
|
-
|
7
|
+
* ActionDispatch - The library introduces a rack middleware, which is intended to be used together with `rack-tracer`, to generate more informative operation names based on information supplied by ActionDispatch.
|
8
|
+
* ActiveRecord - The library hooks up into Rails, and instruments all ActiveRecord query.
|
9
9
|
|
10
10
|
## Installation
|
11
11
|
|
@@ -23,7 +23,14 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
$ gem install rails-tracer
|
25
25
|
|
26
|
-
##
|
26
|
+
## ActionDispatch
|
27
|
+
|
28
|
+
When you use `rack-tracer`, the generated operation name corresponds to the request's http method e.g. GET, POST etc.
|
29
|
+
It's not perfect. You need to dig into the trace to understand with what url it's related.
|
30
|
+
|
31
|
+
The `rails-tracer` introduces another rack middleware, which is intended to be used together with `rack-tracer`, to generate more informative operation names in the form `ControllerName#action`.
|
32
|
+
|
33
|
+
### Usage
|
27
34
|
|
28
35
|
```ruby
|
29
36
|
require 'rack/tracer'
|
@@ -33,6 +40,41 @@ Rails.configuration.middleware.use(Rack::Tracer)
|
|
33
40
|
Rails.configuration.middleware.insert_after(Rack::Tracer, Rails::Rack::Tracer)
|
34
41
|
```
|
35
42
|
|
43
|
+
## ActiveRecord
|
44
|
+
|
45
|
+
The library hooks up into Rails using `ActiveSupport::Notifications`, and instruments all `ActiveRecord` query.
|
46
|
+
|
47
|
+
### Usage
|
48
|
+
|
49
|
+
Auto-instrumentation example.
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
require 'rails/tracer'
|
53
|
+
|
54
|
+
ActiveRecord::Tracer.instrument(tracer: OpenTracing.global_tracer, active_span: -> { OpenTracing.global_tracer.active_span })
|
55
|
+
```
|
56
|
+
|
57
|
+
There are times when you might want to skip ActiveRecord's magic, and use connection directly. Still the library
|
58
|
+
can help you with span creation. Instead of auto-instrumenting you can manually call `ActiveRecord::Tracer.start_span` as shown below.
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
def q(name, sql)
|
62
|
+
span = ActiveRecord::Tracer.start_span(name,
|
63
|
+
tracer: OpenTracing.global_tracer,
|
64
|
+
active_span: -> { OpenTracing.global_tracer.active_span },
|
65
|
+
sql: sql)
|
66
|
+
ActiveRecord::Base.
|
67
|
+
connection.
|
68
|
+
raw_connection.
|
69
|
+
query(sql).
|
70
|
+
each(as: :hash)
|
71
|
+
ensure
|
72
|
+
span&.finish
|
73
|
+
end
|
74
|
+
|
75
|
+
q("FirstUser", "SELECT * FROM users LIMIT 1")
|
76
|
+
```
|
77
|
+
|
36
78
|
## Development
|
37
79
|
|
38
80
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Tracer
|
3
|
+
DEFAULT_OPERATION_NAME = "sql.query".freeze
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def instrument(tracer: OpenTracing.global_tracer, active_span: nil)
|
7
|
+
::ActiveSupport::Notifications.subscribe('sql.active_record') do |*args|
|
8
|
+
ActiveRecord::Tracer.sql(tracer: tracer, active_span: active_span, args: args)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def sql(tracer: OpenTracing.global_tracer, active_span: nil, args:)
|
13
|
+
_, start, finish, _, payload = *args
|
14
|
+
|
15
|
+
span = start_span(payload.fetch(:name),
|
16
|
+
tracer: tracer,
|
17
|
+
active_span: active_span,
|
18
|
+
start_time: start,
|
19
|
+
sql: payload.fetch(:sql),
|
20
|
+
cached: payload.fetch(:cached, false),
|
21
|
+
connection_id: payload.fetch(:connection_id))
|
22
|
+
|
23
|
+
span.finish(end_time: finish)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def start_span(operation_name, tracer: OpenTracing.global_tracer, active_span: nil, start_time: Time.now, **fields)
|
28
|
+
connection_config = ::ActiveRecord::Base.connection_config
|
29
|
+
|
30
|
+
span = tracer.start_span(operation_name || DEFAULT_OPERATION_NAME,
|
31
|
+
child_of: active_span.respond_to?(:call) ? active_span.call : active_span,
|
32
|
+
start_time: start_time,
|
33
|
+
tags: {
|
34
|
+
'component' => 'ActiveRecord',
|
35
|
+
'span.kind' => 'client',
|
36
|
+
'db.user' => connection_config.fetch(:username, 'unknown'),
|
37
|
+
'db.instance' => connection_config.fetch(:database),
|
38
|
+
'db.vendor' => connection_config.fetch(:adapter),
|
39
|
+
'db.connection_id' => fields.fetch(:connection_id, 'unknown'),
|
40
|
+
'db.cached' => fields.fetch(:cached, false),
|
41
|
+
'db.statement' => fields.fetch(:sql),
|
42
|
+
'db.type' => 'sql'
|
43
|
+
})
|
44
|
+
span
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/rails/tracer.rb
CHANGED
data/rails-tracer.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "rails-tracer"
|
7
|
-
spec.version = "0.
|
7
|
+
spec.version = "0.2.0"
|
8
8
|
spec.authors = ["iaintshine"]
|
9
9
|
spec.email = ["bodziomista@gmail.com"]
|
10
10
|
|
@@ -22,6 +22,12 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_dependency 'opentracing', '~> 0.3.1'
|
23
23
|
spec.add_dependency "rack-tracer", "~> 0.3.0"
|
24
24
|
|
25
|
+
spec.add_development_dependency "rails", "~> 5.1.3"
|
26
|
+
spec.add_development_dependency "sqlite3"
|
27
|
+
spec.add_development_dependency "puma", "~> 3.7"
|
28
|
+
spec.add_development_dependency "rspec-rails", "~> 3.6"
|
29
|
+
spec.add_development_dependency "database_cleaner", "~> 1.6"
|
30
|
+
|
25
31
|
spec.add_development_dependency "test-tracer", "~> 1.1"
|
26
32
|
spec.add_development_dependency "bundler", "~> 1.15"
|
27
33
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iaintshine
|
@@ -38,6 +38,76 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.3.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rails
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 5.1.3
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 5.1.3
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sqlite3
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: puma
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.7'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.7'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec-rails
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.6'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.6'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: database_cleaner
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.6'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.6'
|
41
111
|
- !ruby/object:Gem::Dependency
|
42
112
|
name: test-tracer
|
43
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -153,6 +223,7 @@ files:
|
|
153
223
|
- Rakefile
|
154
224
|
- bin/console
|
155
225
|
- bin/setup
|
226
|
+
- lib/rails/active_record/tracer.rb
|
156
227
|
- lib/rails/rack/tracer.rb
|
157
228
|
- lib/rails/tracer.rb
|
158
229
|
- rails-tracer.gemspec
|