rails_opentracer 0.1.20 → 0.1.38
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 +7 -21
- data/lib/rails_opentracer.rb +24 -23
- data/lib/rails_opentracer/active_record/rails_opentracer.rb +0 -1
- data/lib/rails_opentracer/middleware.rb +63 -0
- data/lib/rails_opentracer/version.rb +1 -1
- data/lib/rails_opentracer/zipkin_config.rb +19 -0
- data/rails_opentracer.gemspec +5 -1
- metadata +62 -7
- data/lib/generators/rails_opentracer/install_generator.rb +0 -20
- data/lib/generators/templates/rails_opentracer_initializer.rb +0 -30
- data/lib/generators/templates/tracer.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9cacc7a29a63d008cefb04bae669fe266a4f65a
|
4
|
+
data.tar.gz: 431dda27e92b753aee879fcc9aebca5c83e1b8d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4915681e41a6ce227dec39fd686bdcdd06941f3a51f720b65ad93e22a3b3974236969ecf428ddf1e7b79a6cd6f0da3c912f6b333d35030bfdcb06e417f26f64
|
7
|
+
data.tar.gz: 513f453c113d70cca0adb7e0224b6e67ee3328f808f9e8b7835688292cdec517ae1c57a1409b853b21da353ee76d169163ac177a04074ec8177ecfdbcc1393ca
|
data/README.md
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
# RailsOpentracer
|
2
2
|
|
3
|
-
Gem is in active development. If you see this then us devs aren't quite done yet.
|
4
|
-
|
5
3
|
This gem instruments an application to be used with a tracing client. At this stage it is configured to be used with Zipkin only, but
|
6
|
-
this can be changed at a later stage.
|
4
|
+
this can be changed at a later stage. While there are other gems that offer very similar functionality, the idea here was to instrument
|
5
|
+
an application with OpenTracing with the absolute minimum amount of instrumentation/configuration.
|
7
6
|
|
8
7
|
TODO:
|
9
|
-
-
|
10
|
-
-
|
11
|
-
- Adding middleware is still done in development.rb for now
|
8
|
+
- Investigate performance impact
|
9
|
+
- Investigate cause of lone .js spans
|
12
10
|
|
13
11
|
## Installation
|
14
12
|
|
@@ -22,20 +20,6 @@ And then execute:
|
|
22
20
|
|
23
21
|
$ bundle
|
24
22
|
|
25
|
-
Or install it yourself as:
|
26
|
-
|
27
|
-
$ gem install rails_opentracer
|
28
|
-
|
29
|
-
Generate files required by gem:
|
30
|
-
|
31
|
-
$ rails g rails_opentracer:install
|
32
|
-
|
33
|
-
Add the following to development.rb:
|
34
|
-
|
35
|
-
```ruby
|
36
|
-
config.middleware.use Tracer
|
37
|
-
```
|
38
|
-
|
39
23
|
## Usage
|
40
24
|
|
41
25
|
To run Zipkin locally, do:
|
@@ -44,7 +28,9 @@ To run Zipkin locally, do:
|
|
44
28
|
|
45
29
|
You will need to set an environment variable with the Zipkin client URL. Locally this would be:
|
46
30
|
|
47
|
-
`ENV['ZIPKIN_SERVICE_URL']='http://localhost:9411'
|
31
|
+
`ENV['ZIPKIN_SERVICE_URL']='http://localhost:9411'`, and
|
32
|
+
|
33
|
+
`ENV['RAILS_OPENTRACER_ENABLED']='yes'`.
|
48
34
|
|
49
35
|
Whenever a request is made to another application, do:
|
50
36
|
|
data/lib/rails_opentracer.rb
CHANGED
@@ -1,43 +1,44 @@
|
|
1
1
|
require 'rails_opentracer/active_record/rails_opentracer.rb'
|
2
|
+
require 'rails_opentracer/zipkin_config'
|
2
3
|
require 'rails_opentracer/span_helpers'
|
4
|
+
require 'rails_opentracer/middleware'
|
3
5
|
require 'rails_opentracer/version'
|
6
|
+
require 'opentracing'
|
4
7
|
require 'faraday'
|
8
|
+
require 'zipkin'
|
5
9
|
|
6
10
|
module RailsOpentracer
|
7
|
-
class << self
|
8
|
-
def instrument(tracer: OpenTracing.global_tracer, active_span: nil, active_record: true)
|
9
|
-
ActiveRecord::RailsOpentracer.instrument(tracer: tracer, active_span: active_span) if active_record
|
10
|
-
end
|
11
|
-
|
12
|
-
def disable
|
13
|
-
ActiveRecord::RailsOpentracer.disable
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
11
|
def get(url)
|
18
12
|
connection = Faraday.new do |con|
|
19
13
|
con.use Faraday::Adapter::NetHttp
|
20
14
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
15
|
+
if ZipkinConfig.opentracer_enabled_and_zipkin_url_present?
|
16
|
+
carrier = {}
|
17
|
+
OpenTracing.inject(@span.context, OpenTracing::FORMAT_RACK, carrier)
|
18
|
+
connection.headers = denilize(carrier)
|
19
|
+
elsif ZipkinConfig.opentracer_enabled?
|
20
|
+
Rails.logger.error 'TRACER_ERROR: `ZIPKIN_SERVICE_URL` environment variable is not defined'
|
21
|
+
end
|
24
22
|
connection.get(url)
|
25
23
|
end
|
26
24
|
|
27
25
|
def with_span(name)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
26
|
+
if ZipkinConfig.opentracer_enabled_and_zipkin_url_present?
|
27
|
+
@span =
|
28
|
+
if $active_span.present?
|
29
|
+
OpenTracing.start_span(name, child_of: $active_span)
|
30
|
+
else
|
31
|
+
OpenTracing.start_span(name)
|
32
|
+
end
|
33
|
+
yield if block_given?
|
34
|
+
@span.finish
|
35
|
+
else
|
36
|
+
yield if block_given?
|
37
|
+
end
|
36
38
|
end
|
37
39
|
|
38
40
|
private
|
39
|
-
|
40
41
|
def denilize(hash)
|
41
|
-
hash.each {|k,
|
42
|
+
hash.each { |k, _v| hash[k] = '' if hash[k].nil? }
|
42
43
|
end
|
43
44
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'zipkin'
|
2
|
+
require 'rails_opentracer/zipkin_config'
|
3
|
+
|
4
|
+
module RailsOpentracer
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
initializer 'rails_opentracer.configure_rack_middleware' do
|
7
|
+
Rails.application.middleware.use Middleware
|
8
|
+
end
|
9
|
+
initializer 'rails_opentracer.configure_initializer' do
|
10
|
+
if ZipkinConfig.opentracer_enabled_and_zipkin_url_present?
|
11
|
+
OpenTracing.global_tracer = Zipkin::Tracer.build(url: ZipkinConfig.zipkin_url, service_name: Rails.application.class.parent_name)
|
12
|
+
ActiveRecord::RailsOpentracer.instrument(tracer: OpenTracing.global_tracer, active_span: -> { $active_span })
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Middleware
|
18
|
+
def initialize(app)
|
19
|
+
@app = app
|
20
|
+
end
|
21
|
+
|
22
|
+
def call(env)
|
23
|
+
span = nil
|
24
|
+
if ZipkinConfig.opentracer_enabled_and_zipkin_url_present?
|
25
|
+
begin
|
26
|
+
extracted_ctx = OpenTracing.extract(OpenTracing::FORMAT_RACK, env)
|
27
|
+
span_name = env['REQUEST_PATH']
|
28
|
+
span =
|
29
|
+
if extracted_ctx.nil?
|
30
|
+
OpenTracing.start_span(span_name)
|
31
|
+
else
|
32
|
+
OpenTracing.start_span(span_name, child_of: extracted_ctx)
|
33
|
+
end
|
34
|
+
$active_span = span # yuck
|
35
|
+
rescue StandardError => e
|
36
|
+
Rails.logger.error "TRACER_ERROR: #{error_message(e)}"
|
37
|
+
return @app.call(env)
|
38
|
+
end
|
39
|
+
|
40
|
+
status, headers, response = @app.call(env)
|
41
|
+
|
42
|
+
begin
|
43
|
+
carrier = {}
|
44
|
+
OpenTracing.inject(span.context, OpenTracing::FORMAT_RACK, carrier)
|
45
|
+
span.finish
|
46
|
+
[status, headers , response]
|
47
|
+
rescue StandardError => e
|
48
|
+
Rails.logger.error "TRACER_ERROR: #{error_message(e)}"
|
49
|
+
[status, headers, response]
|
50
|
+
end
|
51
|
+
else
|
52
|
+
if ZipkinConfig.opentracer_enabled?
|
53
|
+
Rails.logger.error 'TRACER_ERROR: `ZIPKIN_SERVICE_URL` environment variable is not defined'
|
54
|
+
end
|
55
|
+
return @app.call(env)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def error_message(e)
|
60
|
+
"#{e}\n#{e.backtrace[0, 10].join("\n\t")}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RailsOpentracer
|
2
|
+
class ZipkinConfig
|
3
|
+
def self.opentracer_enabled?
|
4
|
+
ENV['RAILS_OPENTRACER_ENABLED'] == 'yes'
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.opentracer_enabled_and_zipkin_url_present?
|
8
|
+
ENV['RAILS_OPENTRACER_ENABLED'] == 'yes' && ENV['ZIPKIN_SERVICE_URL'].present?
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.zipkin_url
|
12
|
+
if Rails.env.test? || Rails.env.development?
|
13
|
+
'http://localhost:9411'
|
14
|
+
else
|
15
|
+
ENV['ZIPKIN_SERVICE_URL']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/rails_opentracer.gemspec
CHANGED
@@ -32,8 +32,12 @@ Gem::Specification.new do |spec|
|
|
32
32
|
|
33
33
|
spec.add_dependency "faraday", "~> 0.13.1"
|
34
34
|
spec.add_dependency "opentracing", "~> 0.3.1"
|
35
|
-
spec.add_dependency "zipkin", "~> 0.4.
|
35
|
+
spec.add_dependency "zipkin", "~> 0.4.2"
|
36
36
|
|
37
|
+
spec.add_development_dependency "rails"
|
38
|
+
spec.add_development_dependency "pry"
|
39
|
+
spec.add_development_dependency "sqlite3"
|
40
|
+
spec.add_development_dependency 'combustion', '~> 0.7.0'
|
37
41
|
spec.add_development_dependency "bundler", "~> 1.15"
|
38
42
|
spec.add_development_dependency "rake", "~> 10.0"
|
39
43
|
spec.add_development_dependency "minitest", "~> 5.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_opentracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.38
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Erasmus
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -44,14 +44,70 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.4.
|
47
|
+
version: 0.4.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.4.
|
54
|
+
version: 0.4.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rails
|
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: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: sqlite3
|
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
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: combustion
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.7.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.7.0
|
55
111
|
- !ruby/object:Gem::Dependency
|
56
112
|
name: bundler
|
57
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,13 +166,12 @@ files:
|
|
110
166
|
- Rakefile
|
111
167
|
- bin/console
|
112
168
|
- bin/setup
|
113
|
-
- lib/generators/rails_opentracer/install_generator.rb
|
114
|
-
- lib/generators/templates/rails_opentracer_initializer.rb
|
115
|
-
- lib/generators/templates/tracer.rb
|
116
169
|
- lib/rails_opentracer.rb
|
117
170
|
- lib/rails_opentracer/active_record/rails_opentracer.rb
|
171
|
+
- lib/rails_opentracer/middleware.rb
|
118
172
|
- lib/rails_opentracer/span_helpers.rb
|
119
173
|
- lib/rails_opentracer/version.rb
|
174
|
+
- lib/rails_opentracer/zipkin_config.rb
|
120
175
|
- rails_opentracer.gemspec
|
121
176
|
homepage: https://github.com/nuclearnic/rails_opentracer
|
122
177
|
licenses:
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'rails/generators'
|
2
|
-
|
3
|
-
module RailsOpentracer
|
4
|
-
module Generators
|
5
|
-
class InstallGenerator < Rails::Generators::Base
|
6
|
-
source_root File.expand_path("../../templates", __FILE__)
|
7
|
-
desc "Creates rails_opentracer initializer for your application"
|
8
|
-
|
9
|
-
def copy_initializer
|
10
|
-
template "rails_opentracer_initializer.rb", "config/initializers/rails_opentracer.rb"
|
11
|
-
puts "Initializer rails_opentracer added successfully"
|
12
|
-
end
|
13
|
-
|
14
|
-
def copy_tracer_middleware
|
15
|
-
template "tracer.rb", "app/middleware/tracer.rb"
|
16
|
-
puts "Tracer middleware added successfully"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'opentracing'
|
2
|
-
require 'zipkin'
|
3
|
-
|
4
|
-
class Zipkin::JsonClient
|
5
|
-
# temporary monkey patch for a HTTPS related issue,
|
6
|
-
# remove this once fix has been made to
|
7
|
-
def emit_batch(spans)
|
8
|
-
return if spans.empty?
|
9
|
-
|
10
|
-
http = Net::HTTP.new(@spans_uri.host, @spans_uri.port)
|
11
|
-
http.use_ssl = true if @spans_uri.scheme == 'https'
|
12
|
-
puts "@spans_uri: #{@spans_uri} request_uri #{@spans_uri.request_uri}"
|
13
|
-
request = Net::HTTP::Post.new(@spans_uri.request_uri, {
|
14
|
-
'Content-Type' => 'application/json'
|
15
|
-
})
|
16
|
-
request.body = JSON.dump(spans)
|
17
|
-
response = http.request(request)
|
18
|
-
|
19
|
-
if response.code != 202
|
20
|
-
STDERR.puts(response.body)
|
21
|
-
end
|
22
|
-
rescue => e
|
23
|
-
STDERR.puts("Error emitting spans batch: #{e.message}\n#{e.backtrace.join("\n")}")
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
if ENV.key?('ZIPKIN_SERVICE_URL')
|
28
|
-
OpenTracing.global_tracer = Zipkin::Tracer.build(url: ENV['ZIPKIN_SERVICE_URL'], service_name: Rails.application.class.parent_name)
|
29
|
-
ActiveRecord::RailsOpentracer.instrument(tracer: OpenTracing.global_tracer, active_span: -> { $active_span })
|
30
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'zipkin'
|
2
|
-
|
3
|
-
class Tracer
|
4
|
-
def initialize(app)
|
5
|
-
@app = app
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(env)
|
9
|
-
span = nil
|
10
|
-
begin
|
11
|
-
extracted_ctx = OpenTracing.extract(OpenTracing::FORMAT_RACK, env)
|
12
|
-
span_name = env['REQUEST_PATH']
|
13
|
-
span =
|
14
|
-
if extracted_ctx.nil?
|
15
|
-
OpenTracing.start_span(span_name)
|
16
|
-
else
|
17
|
-
OpenTracing.start_span(span_name, child_of: extracted_ctx)
|
18
|
-
end
|
19
|
-
$active_span = span # yuck
|
20
|
-
rescue StandardError => e
|
21
|
-
Rails.logger.error "TRACER_ERROR: #{error_message(e)}"
|
22
|
-
return @app.call(env)
|
23
|
-
end
|
24
|
-
|
25
|
-
status, headers, response = @app.call(env)
|
26
|
-
|
27
|
-
begin
|
28
|
-
carrier = {}
|
29
|
-
OpenTracing.inject(span.context, OpenTracing::FORMAT_RACK, carrier)
|
30
|
-
span.finish
|
31
|
-
[status, headers , response]
|
32
|
-
rescue StandardError => e
|
33
|
-
Rails.logger.error "TRACER_ERROR: #{error_message(e)}"
|
34
|
-
[status, headers, response]
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def error_message(e)
|
39
|
-
"#{e}\n#{e.backtrace[0, 10].join("\n\t")}"
|
40
|
-
end
|
41
|
-
end
|