vault-tools 0.6.2 → 0.6.3

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: adc8f6e6c5ee7e9b6541bf1c2b648da32c3f3a41
4
- data.tar.gz: f7693d48d7884ef6a6c19e4c55363f5ace6a96be
3
+ metadata.gz: 003733a1fd2fb3c6924f3e69236f295bc838f5b2
4
+ data.tar.gz: 818aaedd087e4b62fab37ff04565b79ed2bb6731
5
5
  SHA512:
6
- metadata.gz: 49408781a862dc065024224e91dcbae3525cc523f411bfd544425665549f4879b68f78fb29fd06912e490c83e5cfc61f2cc7ea177e7160a16135d87589894530
7
- data.tar.gz: 5a999f0230917d765be377582ccd72005e8675c7da04b2b269894a385ca4d52aaf5c364ce235f6a30bb3539ce2ca3da40cf0a70c30a2c207db26a2498cf21900
6
+ metadata.gz: 424c9254b97085ec0c34f91d360e664ac7c0df66a77a7428db89acaf8277700db0a33c267ffb98f8e12d87b53766b8b2117b93e08dfda2a7aab040df4054c970
7
+ data.tar.gz: d21141eed390e9785e789e9dccf1c29bf77c2b52302240c04b61980af5dbc8d7631fe93387276396b8192087f07394676ddfe749aff9d469a2ae1574d2748ef0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vault-tools (0.6.2)
4
+ vault-tools (0.6.3)
5
5
  aws-sdk (~> 1.0)
6
6
  coderay
7
7
  excon
@@ -26,6 +26,7 @@ GEM
26
26
  nokogiri (~> 1)
27
27
  coderay (1.1.2)
28
28
  concurrent-ruby (1.0.5)
29
+ connection_pool (2.2.1)
29
30
  dotenv (2.0.0)
30
31
  excon (0.60.0)
31
32
  faraday (0.14.0)
@@ -61,12 +62,18 @@ GEM
61
62
  rack (>= 1.0)
62
63
  rake (10.4.2)
63
64
  rdoc (6.0.1)
65
+ redis (4.0.1)
64
66
  rollbar (2.7.1)
65
67
  multi_json
66
68
  rr (1.1.2)
67
69
  scrolls (0.9.0)
68
70
  shotgun (0.9.1)
69
71
  rack (>= 1.0)
72
+ sidekiq (5.1.1)
73
+ concurrent-ruby (~> 1.0)
74
+ connection_pool (~> 2.2, >= 2.2.0)
75
+ rack-protection (>= 1.5.0)
76
+ redis (>= 3.3.5, < 5)
70
77
  sinatra (1.4.8)
71
78
  rack (~> 1.5)
72
79
  rack-protection (~> 1.4)
@@ -108,6 +115,7 @@ DEPENDENCIES
108
115
  rake
109
116
  rdoc
110
117
  shotgun
118
+ sidekiq
111
119
  vault-test-tools
112
120
  vault-tools!
113
121
  yard
@@ -101,4 +101,6 @@ require 'vault-tools/time'
101
101
  require 'vault-tools/s3'
102
102
  require 'vault-tools/statement_store'
103
103
  require 'vault-tools/rollbar_helper'
104
+ require 'vault-tools/tracing/sidekiq_client'
105
+ require 'vault-tools/tracing/sidekiq_server'
104
106
  require 'vault-tools/tracing'
@@ -1,8 +1,11 @@
1
+ require 'zipkin-tracer'
2
+
1
3
  module Vault
2
4
  module Tracing
3
5
  ZIPKIN_API_HOST_STAGING = 'https://zipkin-staging.heroku.tools'.freeze
4
6
 
5
- # Injects the zipkin middleware into the Web class.
7
+ # Injects the zipkin middleware into the Web class, add Zipkin middleware to
8
+ # Excon, and adds Zipkin middleware to Sidekiq.
6
9
  #
7
10
  # @example
8
11
  # Vault::Tracing.configure
@@ -13,6 +16,31 @@ module Vault
13
16
 
14
17
  Vault::Web.instance_eval { require 'zipkin-tracer' }
15
18
  Vault::Web.use ZipkinTracer::RackHandler, config
19
+ setup_excon
20
+ setup_sidekiq
21
+ end
22
+
23
+ # Traces a local component. Useful to track down long running implementation
24
+ # methods within an app, instead of only tracing external calls.
25
+ #
26
+ # @param name [String] the name of the span to record in Zipkin.
27
+ # @param tracer [Constant] the const that should respond to :local_component_span
28
+ # @param options [Hash] the options to create a message with.
29
+ #
30
+ # @example
31
+ # Vault::Tracing.trace_local 'cashier_middleware_x', internal: true do
32
+ # # some expensive task
33
+ # end
34
+ #
35
+ # @yield [the_block_passed_in]
36
+ def self.trace_local(name, tracer = ZipkinTracer::TraceClient, **options)
37
+ return yield unless Vault::Tracing.enabled?
38
+
39
+ tracer.local_component_span(name) do |span|
40
+ span.name = name
41
+ span.record_tag('options', options.to_s) unless options.empty?
42
+ yield
43
+ end
16
44
  end
17
45
 
18
46
  # Configuration options for the Zipkin RackHandler.
@@ -20,7 +48,7 @@ module Vault
20
48
  # @return [Hash] config options for Zipkin tracer
21
49
  def self.config
22
50
  {
23
- service_name: Config.app_name,
51
+ service_name: "#{Config.app_name}.herokuapp.com",
24
52
  service_port: 443,
25
53
  json_api_host: Config[:zipkin_api_host],
26
54
  sample_rate: (Config[:zipkin_sample_rate] || 0.1).to_f,
@@ -36,5 +64,54 @@ module Vault
36
64
  Config[:zipkin_enabled] == 'true' &&
37
65
  Config[:zipkin_api_host]
38
66
  end
67
+
68
+ # Adds ZipkinTracer::ExconHandler to Excon's default middlewares if Excon is
69
+ # defined
70
+ #
71
+ # @private
72
+ #
73
+ # @return nil
74
+ def self.setup_excon
75
+ if add_to_excon_middlewares?
76
+ Excon.defaults[:middlewares].push(ZipkinTracer::ExconHandler)
77
+ end
78
+ end
79
+ private_class_method :setup_excon
80
+
81
+ # Adds our SidekiqClient and SidekiqServer middlware to Sidekiq
82
+ #
83
+ # @private
84
+ #
85
+ # @return nil
86
+ def self.setup_sidekiq(sidekiq = Sidekiq)
87
+ return unless defined?(sidekiq)
88
+ sidekiq.configure_client do |config|
89
+ config.client_middleware do |chain|
90
+ chain.add Vault::Tracing::SidekiqClient
91
+ end
92
+ end
93
+
94
+ sidekiq.configure_server do |config|
95
+ config.client_middleware do |chain|
96
+ chain.add Vault::Tracing::SidekiqClient
97
+ end
98
+ config.server_middleware do |chain|
99
+ chain.add Vault::Tracing::SidekiqServer, Vault::Tracing.config
100
+ end
101
+ end
102
+ end
103
+ private_class_method :setup_excon
104
+
105
+ # Checks to see if Excon is defined and if the Zipkin middleware has already
106
+ # been inserted.
107
+ #
108
+ # @private
109
+ #
110
+ # @return [true] if Excon is defined and the middleware is not already
111
+ # inserted
112
+ def self.add_to_excon_middlewares?
113
+ defined?(Excon) && !Excon.defaults[:middlewares].include?(ZipkinTracer::ExconHandler)
114
+ end
115
+ private_class_method :add_to_excon_middlewares?
39
116
  end
40
117
  end
@@ -0,0 +1,37 @@
1
+ module Vault
2
+ module Tracing
3
+ # Tracing info for sidekiq, adding them as params
4
+ # This was lifted straight out of heroku/coal_car
5
+ class SidekiqClient
6
+ def trace_information(trace_id)
7
+ {
8
+ "trace_id" => trace_id.trace_id,
9
+ "parent_id" => trace_id.parent_id,
10
+ "span_id" => trace_id.span_id,
11
+ "sampled" => trace_id.sampled,
12
+ "flags" => trace_id.flags
13
+ }
14
+ end
15
+
16
+ def call(worker_class, job, _queue)
17
+ trace_id = ::ZipkinTracer::TraceGenerator.new.next_trace_id
18
+ ::ZipkinTracer::TraceContainer.with_trace_id(trace_id) do
19
+ job["zipkin_trace_information"] = trace_information(trace_id)
20
+ if trace_id.sampled?
21
+ ::Trace.tracer.with_new_span(trace_id, "sidekiq") do |span|
22
+ local_endpoint = Trace.default_endpoint
23
+ klass = job["wrapped".freeze] || worker_class
24
+ span.record_tag("job_class",
25
+ klass,
26
+ ::Trace::BinaryAnnotation::Type::STRING,
27
+ local_endpoint)
28
+ yield
29
+ end
30
+ else
31
+ yield
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,54 @@
1
+ module Vault
2
+ module Tracing
3
+ # Tracing info for sidekiq
4
+ # This was lifted straight out of heroku/coal_car
5
+ class SidekiqServer
6
+ def initialize(config = nil)
7
+ @config = ZipkinTracer::Config.new(nil, config).freeze
8
+ @tracer = ZipkinTracer::TracerFactory.new.tracer(@config)
9
+ end
10
+
11
+ def call(worker, job, _queue)
12
+ result = nil
13
+ id = trace_id(job)
14
+ klass = job["wrapped".freeze] || worker.class.to_s
15
+ ::ZipkinTracer::TraceContainer.with_trace_id(id) do
16
+ if id.sampled?
17
+ @tracer.with_new_span(id, klass) do |span|
18
+ span.record("sidekiq.start")
19
+ result = yield
20
+ span.record("sidekiq.end")
21
+ end
22
+ else
23
+ yield
24
+ end
25
+ end
26
+ ::Trace.tracer.flush! if ::Trace.tracer.respond_to?(:flush!)
27
+ result
28
+ end
29
+
30
+ private
31
+
32
+ def trace_id(job)
33
+ info = job["zipkin_trace_information"]
34
+ if info
35
+ trace_id = info["trace_id"]
36
+ span_id = info["span_id"]
37
+ parent_span_id = info["parent_id"]
38
+ sampled = info["sampled"]
39
+ flags = info["flags"].to_i
40
+ else
41
+ trace_id = span_id = ::Trace.generate_id
42
+ parent_span_id = nil
43
+ sampled = sample?
44
+ flags = ::Trace::Flags::EMPTY
45
+ end
46
+ ::Trace::TraceId.new(trace_id, parent_span_id, span_id, sampled, flags)
47
+ end
48
+
49
+ def sample?
50
+ rand < @config.sample_rate
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,5 +1,5 @@
1
1
  module Vault
2
2
  module Tools
3
- VERSION = '0.6.2'
3
+ VERSION = '0.6.3'
4
4
  end
5
5
  end
@@ -1,4 +1,5 @@
1
1
  require 'helper'
2
+ require 'sidekiq'
2
3
 
3
4
  class TracingTest < Vault::TestCase
4
5
  # Anonymous Web Frontend
@@ -37,6 +38,10 @@ class TracingTest < Vault::TestCase
37
38
  set_env('ZIPKIN_ENABLED', nil)
38
39
  end
39
40
 
41
+ def test_service_name_gets_herokuapp
42
+ assert_equal 'test_app.herokuapp.com', Vault::Tracing.config[:service_name]
43
+ end
44
+
40
45
  def test_configure_enabled
41
46
  Vault::Tracing.configure
42
47
  middleware_constants = app.middleware.map(&:first)
@@ -50,6 +55,23 @@ class TracingTest < Vault::TestCase
50
55
  'Vault::Tracing.configure should return nil when not enabled'
51
56
  end
52
57
 
58
+ def test_excon
59
+ enable
60
+ Vault::Tracing.configure
61
+ assert Excon.defaults[:middlewares].include?(ZipkinTracer::ExconHandler),
62
+ "Vault::Tracing.setup_excon should add ZipkinTracer::ExconHandler to excon's middleware"
63
+ end
64
+
65
+ def test_sidekiq
66
+ enable
67
+ sidekiq_mock = Minitest::Mock.new
68
+ sidekiq_mock.expect :configure_server, true
69
+ sidekiq_mock.expect :configure_client, true
70
+ Vault::Tracing.setup_sidekiq(sidekiq_mock)
71
+ assert sidekiq_mock.verify,
72
+ 'Vault::Tracing.setup_sidekiq should call ::configure_server, and ::configure_client on Sidekiq'
73
+ end
74
+
53
75
  def test_enabled_true
54
76
  assert Vault::Tracing.enabled?,
55
77
  'Vault::Tracing.enabled? should return true when enabled'
@@ -60,4 +82,17 @@ class TracingTest < Vault::TestCase
60
82
  refute Vault::Tracing.enabled?,
61
83
  'Vault::Tracing.enabled? should return false when not enabled'
62
84
  end
85
+
86
+ def test_trace_local_yield
87
+ result = Vault::Tracing.trace_local('testing', opt: 'foo') { 1 + 1 }
88
+ assert_equal 2, result, 'trace_local should yield the result of the block given'
89
+ end
90
+
91
+ def test_trace_local_calls_tracer
92
+ tracer_mock = Minitest::Mock.new
93
+ tracer_mock.expect :local_component_span, true, ['testing']
94
+ Vault::Tracing.trace_local('testing', tracer_mock, opt: 'foo') { 1 + 1 }
95
+ assert tracer_mock.verify,
96
+ 'trace_local should call :local_component_span on the tracer'
97
+ end
63
98
  end
@@ -33,5 +33,6 @@ Gem::Specification.new do |gem|
33
33
  gem.add_development_dependency 'dotenv'
34
34
  gem.add_development_dependency 'pry'
35
35
  gem.add_development_dependency 'rdoc'
36
+ gem.add_development_dependency 'sidekiq'
36
37
  gem.add_development_dependency 'yard'
37
38
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vault-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Continanza
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-03-01 00:00:00.000000000 Z
12
+ date: 2018-03-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: scrolls
@@ -221,6 +221,20 @@ dependencies:
221
221
  - - ">="
222
222
  - !ruby/object:Gem::Version
223
223
  version: '0'
224
+ - !ruby/object:Gem::Dependency
225
+ name: sidekiq
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
224
238
  - !ruby/object:Gem::Dependency
225
239
  name: yard
226
240
  requirement: !ruby/object:Gem::Requirement
@@ -273,6 +287,8 @@ files:
273
287
  - lib/vault-tools/text_processor.rb
274
288
  - lib/vault-tools/time.rb
275
289
  - lib/vault-tools/tracing.rb
290
+ - lib/vault-tools/tracing/sidekiq_client.rb
291
+ - lib/vault-tools/tracing/sidekiq_server.rb
276
292
  - lib/vault-tools/usage_db_tasks.rb
277
293
  - lib/vault-tools/user.rb
278
294
  - lib/vault-tools/vault_db_tasks.rb
@@ -313,7 +329,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
313
329
  version: '0'
314
330
  requirements: []
315
331
  rubyforge_project:
316
- rubygems_version: 2.6.13
332
+ rubygems_version: 2.5.2.1
317
333
  signing_key:
318
334
  specification_version: 4
319
335
  summary: Test classes, base web classes, and helpers - oh my!