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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 90b20289f4fcdc5e0c033ee1101814ed215c76d0
4
- data.tar.gz: a5b2d37497b67c1fbca82a7621fd7e410f62d74d
3
+ metadata.gz: a9cacc7a29a63d008cefb04bae669fe266a4f65a
4
+ data.tar.gz: 431dda27e92b753aee879fcc9aebca5c83e1b8d3
5
5
  SHA512:
6
- metadata.gz: 9c6035e3c289fe9ed57ffaf660f199f5a06e94728b1899b82b6d83b053a07c0f67dadbfaa6d1aca91591258ecadfdaddc47933a5c47b9330851d5336f05d39e5
7
- data.tar.gz: c1de8a6d083d0c9a4d059203211b6c63b32a6a49f2391858db255997f33557c62976439e2a2000cdb0edd3de60cbe7220e3d4df74685c37f5cce92d9337602e0
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
- - Testz
10
- - Are all those generators "the way" we want to do things?
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
 
@@ -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
- carrier = {}
22
- OpenTracing.inject(@span.context, OpenTracing::FORMAT_RACK, carrier)
23
- connection.headers = denilize(carrier)
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
- @span =
29
- if $active_span.present?
30
- OpenTracing.start_span(name, child_of: $active_span)
31
- else
32
- OpenTracing.start_span(name)
33
- end
34
- yield if block_given?
35
- @span.finish
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,v| hash[k] = "" if hash[k].nil?}
42
+ hash.each { |k, _v| hash[k] = '' if hash[k].nil? }
42
43
  end
43
44
  end
@@ -24,7 +24,6 @@ module ActiveRecord
24
24
 
25
25
  def sql(tracer: OpenTracing.global_tracer, active_span: nil, args:)
26
26
  _, start, finish, _, payload = *args
27
-
28
27
  span = start_span(payload.fetch(:name),
29
28
  tracer: tracer,
30
29
  active_span: active_span,
@@ -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
@@ -1,3 +1,3 @@
1
1
  module RailsOpentracer
2
- VERSION = "0.1.20"
2
+ VERSION = "0.1.38"
3
3
  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
@@ -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.1"
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.20
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-10-20 00:00:00.000000000 Z
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.1
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.1
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