rails_opentracer 0.1.20 → 0.1.38
Sign up to get free protection for your applications and to get access to all the features.
- 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
|