hubstep 2.0.2 → 2.0.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: dc17b38d966a4da5374adfab2125bc135ef15225
4
- data.tar.gz: 662ab0a4133f25505b3d36c0cde44f477d5a295a
3
+ metadata.gz: f9f16b63e7a1bcb313327bc0ce955c9acd971b05
4
+ data.tar.gz: 392c2321669a3a307cd93018ca66c1690d55961d
5
5
  SHA512:
6
- metadata.gz: 1ca97eae3e8cd18851412eff541da7de95105eea3de4965428a6a07062fcac5b3d72ca09a1bb9d738b22b6da5273b3dfdd824509a114f887ce79a51224f1de6a
7
- data.tar.gz: 0f6ed9ff5fb3e1e738eef2875481d5b0e646d4fa531ae59daf1290664345e8a816089e46f4015591a15a56a2c2fb17363d9053ce6738559f5b8a2397596a143e
6
+ metadata.gz: fafcdc535bc8ff9b6ae00b462938585231ef12ba73cbe4c51ccc735d057635eda1f8ac8dd909965242e8f4bc624d5cd3562f16c22cd145764772176e9fd2abdd
7
+ data.tar.gz: 76fc1fbe37fae6b971cd86b6324b68ddc07f2d139a9a56097d0ae640e3ce54fad17a69656e081b7b63318d473d3895811abc88843a59407fad52059d566630f2
data/.rubocop.yml CHANGED
@@ -1,3 +1,5 @@
1
+ inherit_from: .rubocop_upstream.yml
2
+
1
3
  AllCops:
2
4
  DisplayCopNames: true
3
5
  Exclude:
@@ -13,7 +15,7 @@ Metrics/ClassLength:
13
15
  - "test/**/*"
14
16
 
15
17
  Metrics/LineLength:
16
- Max: 100
18
+ Max: 115
17
19
 
18
20
  Metrics/MethodLength:
19
21
  Max: 15
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,11 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2017-05-15 19:07:22 -0400 using RuboCop version 0.46.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 2
10
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
11
+ # URISchemes: http, https
@@ -0,0 +1,30 @@
1
+ # Exclude violations in upstream code
2
+
3
+ # Offense count: 1
4
+ Metrics/AbcSize:
5
+ Max: 16
6
+
7
+ # Offense count: 1
8
+ # Configuration parameters: CountKeywordArgs.
9
+ Metrics/ParameterLists:
10
+ Max: 6
11
+
12
+ # Offense count: 1
13
+ Style/CaseEquality:
14
+ Exclude:
15
+ - 'lib/hubstep/transport/http_json.rb'
16
+
17
+ # Offense count: 1
18
+ # Cop supports --auto-correct.
19
+ # Configuration parameters: SupportedStyles, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
20
+ # SupportedStyles: space, no_space
21
+ Style/SpaceInsideBlockBraces:
22
+ EnforcedStyle: space
23
+
24
+ # Offense count: 6
25
+ # Cop supports --auto-correct.
26
+ # Configuration parameters: EnforcedStyle, SupportedStyles, ConsistentQuotesInMultiline.
27
+ # SupportedStyles: single_quotes, double_quotes
28
+ Style/StringLiterals:
29
+ Exclude:
30
+ - 'lib/hubstep/transport/http_json.rb'
data/hubstep.gemspec CHANGED
@@ -34,4 +34,5 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency "failbot", "~> 2.0.0"
35
35
  spec.add_development_dependency "webmock", "~> 2.3.1"
36
36
  spec.add_development_dependency "pry-byebug"
37
+ spec.add_development_dependency "mocha", "~> 1.2.1"
37
38
  end
@@ -13,9 +13,17 @@ module HubStep
13
13
  # b.adapter(:typhoeus)
14
14
  # end
15
15
  class Middleware < ::Faraday::Middleware
16
- def initialize(app, tracer)
16
+ # Create a Middleware
17
+ #
18
+ # tracer - a HubStep::Tracer instance
19
+ # include_urls - Boolean specifying whether the `http.url` tag should be
20
+ # added to the spans this middleware creates. URLs can
21
+ # contain sensitive information, so they are omitted by
22
+ # default.
23
+ def initialize(app, tracer, include_urls: false)
17
24
  super(app)
18
25
  @tracer = tracer
26
+ @include_urls = include_urls
19
27
  end
20
28
 
21
29
  def call(request_env)
@@ -43,8 +51,13 @@ module HubStep
43
51
  method = request_env[:method].to_s.upcase
44
52
  span.operation_name = "Faraday #{method}"
45
53
  span.set_tag("component", "faraday")
46
- span.set_tag("http.url", request_env[:url])
47
54
  span.set_tag("http.method", method)
55
+
56
+ url = request_env[:url]
57
+ span.set_tag("http.url", url) if @include_urls
58
+
59
+ uri = URI.parse(url.to_s)
60
+ span.set_tag("http.domain", uri.host)
48
61
  end
49
62
 
50
63
  def record_response(span, response_env)
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HubStep
4
+ module Internal
5
+ module Instrumenter
6
+ # A memory instrumenter to be used in to test instrumentation. This class records
7
+ # each instrument call in a HubStep::Internal::Instrumenter::Memory::Event instance
8
+ # and stores the instance in an events array.
9
+ class Memory
10
+ class Event # rubocop:disable Style/Documentation
11
+ attr_reader :name, :payload, :result
12
+
13
+ def initialize(name, payload, result)
14
+ @name = name
15
+ @payload = payload
16
+ @result = result
17
+ end
18
+ end
19
+
20
+ def initialize
21
+ @events = []
22
+ end
23
+
24
+ attr_reader :events
25
+
26
+ def instrument(name, payload = {})
27
+ payload = payload.dup
28
+ result = (yield payload if block_given?)
29
+ @events << Event.new(name, payload, result)
30
+ result
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HubStep
4
+ module Internal
5
+ module Instrumenter
6
+ # A noop instrumenter that fulfills the interface for ActiveSupport::Notifications
7
+ # but does nothing. This is the default instrumenter when the client does not pass
8
+ # one in
9
+ class Noop
10
+ def instrument(_name, payload = {})
11
+ yield payload if block_given?
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -3,6 +3,7 @@
3
3
  require "English"
4
4
  require "lightstep"
5
5
  require "singleton"
6
+ require "hubstep/transport/http_json"
6
7
 
7
8
  module HubStep
8
9
  # Tracer wraps LightStep::Tracer. It provides a block-based API for creating
@@ -11,10 +12,13 @@ module HubStep
11
12
  class Tracer
12
13
  # Create a Tracer.
13
14
  #
14
- # tags - Hash of tags to assign to the tracer. These will be
15
- # associated with every span the tracer creates.
16
- # transport - instance of a LightStep::Transport::Base subclass
17
- def initialize(transport: default_transport, tags: {})
15
+ # tags - Hash of tags to assign to the tracer. These will be
16
+ # associated with every span the tracer creates.
17
+ # transport - instance of a LightStep::Transport::Base subclass
18
+ # verbose - Whether or not to emit verbose spans, default true
19
+ def initialize(transport: default_transport, tags: {}, verbose: true)
20
+ @verbose = verbose
21
+
18
22
  name = HubStep.server_metadata.values_at("app", "role").join("-")
19
23
 
20
24
  default_tags = {
@@ -24,6 +28,7 @@ module HubStep
24
28
  @tracer = LightStep::Tracer.new(component_name: name,
25
29
  transport: transport,
26
30
  tags: default_tags.merge(tags))
31
+
27
32
  @spans = []
28
33
  self.enabled = false
29
34
  end
@@ -57,6 +62,10 @@ module HubStep
57
62
  span || InertSpan.instance
58
63
  end
59
64
 
65
+ def should_emit?(verbose)
66
+ @verbose || !verbose
67
+ end
68
+
60
69
  # Record a span representing the execution of the given block
61
70
  #
62
71
  # operation_name - short human-readable String identifying the work done by the span
@@ -65,11 +74,14 @@ module HubStep
65
74
  # finish - Boolean indicating whether to "finish" (i.e., record the
66
75
  # span's end time and submit it to the collector).
67
76
  # Defaults to true.
77
+ # verbose - Boolean indicating this is a ancilary span, only
78
+ # emitted when the tracer has verbose enabled, default
79
+ # false
68
80
  #
69
81
  # Yields a LightStep::Span or InertSpan to the block. Returns the block's
70
82
  # return value.
71
- def span(operation_name, start_time: nil, tags: nil, finish: true)
72
- unless enabled?
83
+ def span(operation_name, start_time: nil, tags: nil, finish: true, verbose: false)
84
+ unless enabled? && should_emit?(verbose)
73
85
  return yield InertSpan.instance
74
86
  end
75
87
 
@@ -124,11 +136,11 @@ module HubStep
124
136
  access_token = ENV["LIGHTSTEP_ACCESS_TOKEN"]
125
137
 
126
138
  if host && port && encryption && access_token
127
- LightStep::Transport::HTTPJSON.new(host: host,
128
- port: port.to_i,
129
- encryption: encryption,
130
- verbose: verbosity,
131
- access_token: access_token)
139
+ HubStep::Transport::HTTPJSON.new(host: host,
140
+ port: port.to_i,
141
+ encryption: encryption,
142
+ verbose: verbosity,
143
+ access_token: access_token)
132
144
  else
133
145
  LightStep::Transport::Nil.new
134
146
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "English"
4
+ require "net/http"
5
+
6
+ unless LightStep::VERSION == '0.10.9'
7
+ raise <<-MSG
8
+ This monkey patch needs to be reviewed for LightStep versions other than 0.10.9.
9
+ To review, diff the changes between the `LightStep::Transport::HTTPJSON#report`
10
+ method and the `HubStep::Transport::HTTPJSON#report` method below and port any
11
+ changes that seem necessary.
12
+ MSG
13
+ end
14
+
15
+ module HubStep
16
+ module Transport
17
+ # HTTPJSON is a transport that sends reports via HTTP in JSON format.
18
+ # It is thread-safe, however it is *not* fork-safe. When forking, all items
19
+ # in the queue will be copied and sent in duplicate.
20
+ #
21
+ # When forking, you should first `disable` the tracer, then `enable` it from
22
+ # within the fork (and in the parent post-fork). See
23
+ # `examples/fork_children/main.rb` for an example.
24
+ class HTTPJSON < LightStep::Transport::HTTPJSON
25
+ # Queue a report for sending
26
+ def report(report) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
27
+ p report if @verbose >= 3
28
+
29
+ HubStep.instrumenter.instrument('lightstep.transport.report', {}) do |payload|
30
+ https = Net::HTTP.new(@host, @port)
31
+ https.use_ssl = @encryption == ENCRYPTION_TLS
32
+ req = Net::HTTP::Post.new('/api/v0/reports')
33
+ req['LightStep-Access-Token'] = @access_token
34
+ req['Content-Type'] = 'application/json'
35
+ req['Connection'] = 'keep-alive'
36
+ req.body = report.to_json
37
+ res = https.request(req)
38
+
39
+ payload[:request_body] = req.body
40
+
41
+ puts res.to_s, res.body if @verbose >= 3
42
+
43
+ payload[:response] = res
44
+ end
45
+
46
+ nil
47
+ rescue => e
48
+ HubStep.instrumenter.instrument('lightstep.transport.error', error: e)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module HubStep
3
- VERSION = "2.0.2"
3
+ VERSION = "2.0.3"
4
4
  end
data/lib/hubstep.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "hubstep/tracer"
4
+ require "hubstep/internal/instrumenter/noop"
4
5
  require "hubstep/version"
5
6
 
6
7
  require "socket"
@@ -26,4 +27,23 @@ module HubStep
26
27
  {}.freeze
27
28
  end
28
29
  end
30
+
31
+ # setter for instrumenter that defaults to the Noop instrumenter
32
+ #
33
+ # instrumenter - an object that responds to the ActiveSupport::Notifications
34
+ # interface, when omitted the Noop instrumenter will be used
35
+ #
36
+ def self.instrumenter=(instrumenter)
37
+ @instrumenter = instrumenter
38
+ end
39
+
40
+ # getter for the instrumenter ivar. When the ivar isn't set it will
41
+ # default to the Noop instrumenter
42
+ #
43
+ # instrumenter - an object that responds to the ActiveSupport::Notifications
44
+ # interface, when omitted the Noop instrumenter will be used
45
+ #
46
+ def self.instrumenter(instrumenter: nil)
47
+ @instrumenter ||= (instrumenter || HubStep::Internal::Instrumenter::Noop.new)
48
+ end
29
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hubstep
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-12 00:00:00.000000000 Z
11
+ date: 2017-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lightstep
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: mocha
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 1.2.1
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 1.2.1
167
181
  description: Makes it easy to trace Sinatra and Ruby apps that use GitHub conventions.
168
182
  email:
169
183
  - engineering@github.com
@@ -173,6 +187,8 @@ extra_rdoc_files: []
173
187
  files:
174
188
  - ".gitignore"
175
189
  - ".rubocop.yml"
190
+ - ".rubocop_todo.yml"
191
+ - ".rubocop_upstream.yml"
176
192
  - ".ruby-version"
177
193
  - ".travis.yml"
178
194
  - CODE_OF_CONDUCT.md
@@ -186,8 +202,11 @@ files:
186
202
  - lib/hubstep/failbot.rb
187
203
  - lib/hubstep/faraday/middleware.rb
188
204
  - lib/hubstep/instrumenter.rb
205
+ - lib/hubstep/internal/instrumenter/memory.rb
206
+ - lib/hubstep/internal/instrumenter/noop.rb
189
207
  - lib/hubstep/rack/middleware.rb
190
208
  - lib/hubstep/tracer.rb
209
+ - lib/hubstep/transport/http_json.rb
191
210
  - lib/hubstep/version.rb
192
211
  - script/bootstrap
193
212
  - script/console