bc-lightstep-ruby 1.1.6

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ae2b58de5cad4cb1d3f95f0392e8e5a2f26bc92d7166f0786973d1db2365c34c
4
+ data.tar.gz: fb76f4e5520ae29ba6c9cf51765ea4ef29b953478edece1d0d613bd38969b7a1
5
+ SHA512:
6
+ metadata.gz: ce9814bbece997fe409cf3bf369a7c4ee086b14c486e9d16eeae7bd10ffe9a9a69b2d60c591dd111587dbfa5d485da82091211b72d829b27fb2ee22e2c21ff41
7
+ data.tar.gz: 6112a5d04acc35a38109cc5541fd88d2571e7ba699ec64a1bde19007bf442ed2c482619de4b65b8ae035a94eb4d5c9554c5dc10c9065891833b6744543074932
@@ -0,0 +1,52 @@
1
+ Changelog for the bc-lightstep-ruby gem.
2
+
3
+ h3. Pending Release
4
+
5
+ h3. 1.1.6
6
+
7
+ - First OSS release
8
+
9
+ h3. 1.1.5
10
+
11
+ - Pin lightstep gem to 0.11.x due to backwards-incompatible change in 0.12.x
12
+
13
+ h3. 1.1.4
14
+
15
+ - Add enabled setting to explicitly disable lightstep at runtime. Can be toggled with LIGHTSTEP_ENABLED ENV var.
16
+
17
+ h3. 1.1.3
18
+
19
+ - Have http1 errors only flag as error if they are 500+ status codes
20
+
21
+ h3. 1.1.2
22
+
23
+ - Prevent span from starting if the reporter is not yet configured, as LightStep gem does not guard this case
24
+
25
+ h3. 1.1.1
26
+
27
+ - Fix issues where Rack/Rails is prepending HTTP_ to headers, ensure right key format into carrier
28
+
29
+ h3. 1.1.0
30
+
31
+ - Add Faraday middleware for automatic tracing of outbound service calls
32
+
33
+ h3. 1.0.5
34
+
35
+ - Do not send GET params in rails controller instrumentation for http.url tag
36
+
37
+ h3. 1.0.4
38
+
39
+ - Rename span tags to fit the BigCommerce standardized tags
40
+ - Handle 500 errors in H1 requests properly
41
+
42
+ h3. 1.0.3
43
+
44
+ - Fix bug where active parent span was persisting between requests in rails controller requests
45
+
46
+ h3. 1.0.2
47
+
48
+ - Add Bigcommerce::Lightstep::Rails::ControllerInstrumentation module for tracing H1 controllers in Rails
49
+
50
+ h3. 1.0.0
51
+
52
+ - Initial public release
@@ -0,0 +1,49 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, and in the interest of
4
+ fostering an open and welcoming community, we pledge to respect all people who
5
+ contribute through reporting issues, posting feature requests, updating
6
+ documentation, submitting pull requests or patches, and other activities.
7
+
8
+ We are committed to making participation in this project a harassment-free
9
+ experience for everyone, regardless of level of experience, gender, gender
10
+ identity and expression, sexual orientation, disability, personal appearance,
11
+ body size, race, ethnicity, age, religion, or nationality.
12
+
13
+ Examples of unacceptable behavior by participants include:
14
+
15
+ * The use of sexualized language or imagery
16
+ * Personal attacks
17
+ * Trolling or insulting/derogatory comments
18
+ * Public or private harassment
19
+ * Publishing other's private information, such as physical or electronic
20
+ addresses, without explicit permission
21
+ * Other unethical or unprofessional conduct
22
+
23
+ Project maintainers have the right and responsibility to remove, edit, or
24
+ reject comments, commits, code, wiki edits, issues, and other contributions
25
+ that are not aligned to this Code of Conduct, or to ban temporarily or
26
+ permanently any contributor for other behaviors that they deem inappropriate,
27
+ threatening, offensive, or harmful.
28
+
29
+ By adopting this Code of Conduct, project maintainers commit themselves to
30
+ fairly and consistently applying these principles to every aspect of managing
31
+ this project. Project maintainers who do not follow or enforce the Code of
32
+ Conduct may be permanently removed from the project team.
33
+
34
+ This code of conduct applies both within project spaces and in public spaces
35
+ when an individual is representing the project or its community.
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
+ reported by contacting a project maintainer at splittingred@gmail.com. All
39
+ complaints will be reviewed and investigated and will result in a response that
40
+ is deemed necessary and appropriate to the circumstances. Maintainers are
41
+ obligated to maintain confidentiality with regard to the reporter of an
42
+ incident.
43
+
44
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
+ version 1.3.0, available at
46
+ [http://contributor-covenant.org/version/1/3/0/][version]
47
+
48
+ [homepage]: http://contributor-covenant.org
49
+ [version]: http://contributor-covenant.org/version/1/3/0/
@@ -0,0 +1,90 @@
1
+ # bc-lightstep-ruby - LightStep distributed tracing
2
+
3
+ [![Build Status](https://travis-ci.com/bigcommerce/bc-lightstep-ruby.svg?token=D3Cc4LCF9BgpUx4dpPpv&branch=master)](https://travis-ci.com/bigcommerce/bc-lightstep-ruby)
4
+
5
+ Adds [LightStep](https://lightstep.com) tracing support for Ruby. This is an extension of the
6
+ [LightStep ruby gem](https://github.com/lightstep/lightstep-tracer-ruby) and adds extra functionality and resiliency.
7
+
8
+ ## Installation
9
+
10
+ ```ruby
11
+ gem 'bc-lightstep-ruby', git: 'git@github.com/bigcommerce/bc-lightstep-ruby'
12
+ ```
13
+
14
+ Then in an initializer or before use:
15
+
16
+ ```ruby
17
+ require 'bigcommerce/lightstep'
18
+ Bigcommerce::Lightstep.configure do |c|
19
+ c.component_name = 'myapp'
20
+ c.access_token = 'abcdefg'
21
+ c.host = 'my.lightstep.service.io'
22
+ c.port = 8080
23
+ c.verbosity = 1
24
+ end
25
+ ```
26
+
27
+ Then in your script:
28
+
29
+ ```ruby
30
+ tracer = Bigcommerce::Lightstep::Tracer.instance
31
+ tracer.start_span('my-span', context: request.headers) do |span|
32
+ span.set_tag('my-tag', 'value')
33
+ # do thing to measure
34
+ end
35
+ ```
36
+
37
+ ### Environment Config
38
+
39
+ bc-lightstep-ruby can be automatically configured from these ENV vars, if you'd rather use that instead:
40
+
41
+ | Name | Description |
42
+ | ---- | ----------- |
43
+ | LIGHTSTEP_ENABLED | Flag to determine whether to broadcast spans. Defaults to 1 (enabled) and 0 will disable.|
44
+ | LIGHTSTEP_COMPONENT_NAME | The component name to use |
45
+ | LIGHTSTEP_ACCESS_TOKEN | The access token to use to connect to the collector |
46
+ | LIGHTSTEP_HOST | Host of the collector. Defaults to `lightstep-collector.linkerd` |
47
+ | LIGHTSTEP_PORT | Port of the collector. Defaults to `4140` |
48
+ | LIGHTSTEP_SSL_VERIFY_PEER | If using 443 as the port, toggle SSL verification. Defaults to true. |
49
+ | LIGHTSTEP_VERBOSITY | The verbosity level of lightstep logs. Defaults to 1. |
50
+
51
+ Most BC systems will only need to customize the component name.
52
+
53
+ ### Instrumenting Rails Controllers
54
+
55
+ Just drop this include into ApplicationController:
56
+
57
+ ```ruby
58
+ include Bigcommerce::Lightstep::RailsControllerInstrumentation
59
+ ```
60
+
61
+ ### Faraday Middleware
62
+
63
+ To use the supplied faraday middleware, simply:
64
+
65
+ ```ruby
66
+ Faraday.new do |faraday|
67
+ faraday.use Bigcommerce::Lightstep::Middleware::Faraday, 'name-of-external-service'
68
+ end
69
+ ```
70
+
71
+ Spans will be built with the external service name. It's generally _not_ a good idea to use the Faraday adapter
72
+ with internal services that are also instrumented with LightStep - use the Faraday adapter on external services
73
+ or systems outside of our instrumenting control.
74
+
75
+ ## License
76
+
77
+ Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
78
+
79
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
80
+ documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
81
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
82
+ persons to whom the Software is furnished to do so, subject to the following conditions:
83
+
84
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
85
+ Software.
86
+
87
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
88
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
89
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
90
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,40 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+ $:.push File.expand_path('../lib', __FILE__)
17
+ require 'bigcommerce/lightstep/version'
18
+
19
+ Gem::Specification.new do |spec|
20
+ spec.name = 'bc-lightstep-ruby'
21
+ spec.version = Bigcommerce::Lightstep::VERSION
22
+ spec.authors = ['Shaun McCormick']
23
+ spec.email = ['shaun.mccormick@bigcommerce.com']
24
+
25
+ spec.summary = %q{Gem for lightstep distributed tracing}
26
+ spec.description = spec.summary
27
+ spec.homepage = 'https://github.com/bigcommerce/bc-lightstep-ruby'
28
+ spec.license = 'MIT'
29
+
30
+ spec.files = Dir['README.md', 'CHANGELOG.md', 'CODE_OF_CONDUCT.md', 'lib/**/*', 'bc-lightstep-ruby.gemspec']
31
+ spec.require_paths = ['lib']
32
+
33
+ spec.add_development_dependency 'bundler', '~> 1.11'
34
+ spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency 'rspec', '~> 3.0'
36
+ spec.add_development_dependency 'pry'
37
+
38
+ spec.add_runtime_dependency 'lightstep', '~> 0.11.2'
39
+ spec.add_runtime_dependency 'faraday', '~> 0.8'
40
+ end
@@ -0,0 +1,93 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+ require 'lightstep'
17
+ require 'faraday'
18
+ require_relative 'lightstep/version'
19
+ require_relative 'lightstep/errors'
20
+ require_relative 'lightstep/configuration'
21
+ require_relative 'lightstep/tracer'
22
+ require_relative 'lightstep/transport_factory'
23
+ require_relative 'lightstep/transport'
24
+ require_relative 'lightstep/rails_controller_instrumentation'
25
+ require_relative 'lightstep/middleware/faraday'
26
+
27
+ ##
28
+ # Main base module
29
+ module Bigcommerce
30
+ ##
31
+ # Lightstep module
32
+ #
33
+ module Lightstep
34
+ extend Configuration
35
+
36
+ def self.start(component_name: nil, transport_factory: nil)
37
+ component_name ||= ::Bigcommerce::Lightstep.component_name
38
+ transport_factory ||= ::Bigcommerce::Lightstep::TransportFactory.new
39
+ ::LightStep.logger = logger
40
+ ::LightStep.configure(
41
+ component_name: component_name,
42
+ transport: transport_factory.build
43
+ )
44
+ end
45
+ end
46
+ end
47
+
48
+ # :nocov:
49
+ module LightStep
50
+ ##
51
+ # Monkey patch of the LightStep library to make it not swallow reporting errors
52
+ #
53
+ class Reporter
54
+ def flush
55
+ reset_on_fork
56
+
57
+ return if @span_records.empty?
58
+
59
+ now = ::LightStep.micros(Time.now)
60
+
61
+ span_records = @span_records.slice!(0, @span_records.length)
62
+ dropped_spans = 0
63
+ @dropped_spans.update do |old|
64
+ dropped_spans = old
65
+ 0
66
+ end
67
+
68
+ report_request = {
69
+ runtime: @runtime,
70
+ oldest_micros: @report_start_time,
71
+ youngest_micros: now,
72
+ span_records: span_records,
73
+ internal_metrics: {
74
+ counts: [
75
+ { name: 'spans.dropped', int64_value: dropped_spans }
76
+ ]
77
+ }
78
+ }
79
+
80
+ @report_start_time = now
81
+
82
+ begin
83
+ @transport.report(report_request)
84
+ rescue StandardError => e
85
+ Bigcommerce::Lightstep.logger.error "Failed to send request to collector: #{e.message}"
86
+ # an error occurs, add the previous dropped_spans and count of spans
87
+ # that would have been recorded
88
+ @dropped_spans.increment(dropped_spans + span_records.length)
89
+ end
90
+ end
91
+ end
92
+ end
93
+ # :nocov:
@@ -0,0 +1,111 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+
17
+ module Bigcommerce
18
+ module Lightstep
19
+ ##
20
+ # General configuration for lightstep integration
21
+ #
22
+ module Configuration
23
+ VALID_CONFIG_KEYS = {
24
+ component_name: '',
25
+ controller_trace_prefix: 'controllers.',
26
+ access_token: '',
27
+ host: 'lightstep-collector.linkerd',
28
+ port: 4140,
29
+ ssl_verify_peer: true,
30
+ open_timeout: 20,
31
+ read_timeout: 20,
32
+ continue_timeout: nil,
33
+ keep_alive_timeout: 2,
34
+ logger: nil,
35
+ verbosity: 1,
36
+ http1_error_code: 500,
37
+ http1_error_code_minimum: 500,
38
+ enabled: true
39
+ }.freeze
40
+
41
+ attr_accessor *VALID_CONFIG_KEYS.keys
42
+
43
+ ##
44
+ # Whenever this is extended into a class, setup the defaults
45
+ #
46
+ def self.extended(base)
47
+ base.reset
48
+ end
49
+
50
+ ##
51
+ # Yield self for ruby-style initialization
52
+ #
53
+ # @yields [Bigcommerce::Instrumentation::Configuration]
54
+ # @return [Bigcommerce::Instrumentation::Configuration]
55
+ #
56
+ def configure
57
+ reset unless @configured
58
+ yield self
59
+ @configured = true
60
+ end
61
+
62
+ ##
63
+ # @return [Boolean]
64
+ #
65
+ def configured?
66
+ @configured
67
+ end
68
+
69
+ ##
70
+ # Return the current configuration options as a Hash
71
+ #
72
+ # @return [Hash]
73
+ #
74
+ def options
75
+ opts = {}
76
+ VALID_CONFIG_KEYS.each_key do |k|
77
+ opts.merge!(k => send(k))
78
+ end
79
+ opts
80
+ end
81
+
82
+ ##
83
+ # Set the default configuration onto the extended class
84
+ #
85
+ def reset
86
+ VALID_CONFIG_KEYS.each do |k, v|
87
+ send("#{k}=".to_sym, v)
88
+ end
89
+ self.component_name = ENV.fetch('LIGHTSTEP_COMPONENT_NAME', '')
90
+ self.access_token = ENV.fetch('LIGHTSTEP_ACCESS_TOKEN', '')
91
+ self.host = ENV.fetch('LIGHTSTEP_HOST', 'lightstep-collector.linkerd')
92
+ self.port = ENV.fetch('LIGHTSTEP_PORT', 4140).to_i
93
+ self.ssl_verify_peer = ENV.fetch('LIGHTSTEP_SSL_VERIFY_PEER', true)
94
+ self.verbosity = ENV.fetch('LIGHTSTEP_VERBOSITY', 1).to_i
95
+ self.logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
96
+ self.enabled = ENV.fetch('LIGHTSTEP_ENABLED', 1).to_i > 0
97
+ end
98
+
99
+ ##
100
+ # Automatically determine environment
101
+ #
102
+ def environment
103
+ if defined?(Rails)
104
+ Rails.env
105
+ else
106
+ ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+ module Bigcommerce
17
+ module Lightstep
18
+ module Errors
19
+ class Error < StandardError; end
20
+ class InvalidAccessToken < Error; end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,111 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+ module Bigcommerce
17
+ module Lightstep
18
+ module Middleware
19
+ # Faraday middleware. It will add appropriate OT tags and trace IDs to outgoing connections done by Faraday
20
+ class Faraday < ::Faraday::Middleware
21
+ HTTP_ERROR_STATUS_THRESHOLD = 400
22
+ HTTP_STATUS_REQUEST_TIMEOUT = 408
23
+ HTTP_STATUS_INTERNAL_ERROR = 500
24
+ HTTP_STATUS_SERVICE_UNAVAIL = 503
25
+
26
+ OT_TAG_TRACE_ID = 'ot-tracer-traceid'.freeze
27
+ OT_TAG_SPAN_ID = 'ot-tracer-spanid'.freeze
28
+ OT_TAG_SAMPLED = 'ot-tracer-sampled'.freeze
29
+
30
+ def initialize(app, service_name = nil)
31
+ @app = app
32
+ @service_name = (service_name || 'external').to_s
33
+ end
34
+
35
+ def call(request_env)
36
+ uri = uri_from_env(request_env)
37
+ tracer = ::Bigcommerce::Lightstep::Tracer.instance
38
+
39
+ tracer.start_span(service_key, context: request_env[:request_headers]) do |span|
40
+ span.set_tag('http.url', uri.to_s.split('?').first)
41
+ span.set_tag('http.method', request_env[:method].to_s.downcase)
42
+ span.set_tag('http.external-service', true)
43
+
44
+ inject_ot_tags!(request_env, span)
45
+
46
+ begin
47
+ response = @app.call(request_env).on_complete do |response_env|
48
+ span.set_tag('http.status_code', response_env[:status].to_s)
49
+ span.set_tag('error', true) if response_env[:status].to_i >= HTTP_ERROR_STATUS_THRESHOLD
50
+ response_env
51
+ end
52
+ rescue ::Net::ReadTimeout
53
+ span.set_tag('error', true)
54
+ span.set_tag('http.status_code', HTTP_STATUS_REQUEST_TIMEOUT)
55
+ raise
56
+ rescue ::Faraday::ConnectionFailed
57
+ span.set_tag('error', true)
58
+ span.set_tag('http.status_code', HTTP_STATUS_SERVICE_UNAVAIL)
59
+ raise
60
+ rescue ::Faraday::ClientError
61
+ span.set_tag('error', true)
62
+ span.set_tag('http.status_code', HTTP_STATUS_INTERNAL_ERROR)
63
+ raise
64
+ end
65
+
66
+ response
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ ##
73
+ # @param [Hash] request_env
74
+ # @param [::LightStep::Span] span
75
+ #
76
+ def inject_ot_tags!(request_env, span)
77
+ request_env[:request_headers].merge!(
78
+ OT_TAG_TRACE_ID => span.span_context.trace_id.to_s,
79
+ OT_TAG_SPAN_ID => span.span_context.id.to_s,
80
+ OT_TAG_SAMPLED => 'true'
81
+ )
82
+ end
83
+
84
+ ##
85
+ # Handle either a URI object (passed by Faraday v0.8.x in testing), or something string-izable
86
+ #
87
+ # @param [Hash] env
88
+ # @return [URI::HTTP]
89
+ #
90
+ def uri_from_env(env)
91
+ env[:url].respond_to?(:host) ? env[:url] : URI.parse(env[:url].to_s)
92
+ end
93
+
94
+ ##
95
+ # @param [URI::HTTP] uri
96
+ # @return [String]
97
+ #
98
+ def path_key_for_uri(uri)
99
+ uri.path.tr('/', '_').reverse.chomp('_').reverse.chomp
100
+ end
101
+
102
+ ##
103
+ # @return [String]
104
+ #
105
+ def service_key
106
+ @service_name.to_s.downcase.tr('-', '_').tr('.', '_')
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,65 @@
1
+ module Bigcommerce
2
+ module Lightstep
3
+ ##
4
+ # Helper module that can be included into Rails controllers to automatically instrument them with LightStep
5
+ #
6
+ module RailsControllerInstrumentation
7
+ OPEN_TRACING_HEADER_KEYS = %w[ot-tracer-traceid ot-tracer-spanid ot-tracer-sampled].freeze
8
+
9
+ def self.included(base)
10
+ base.send(:around_action, :lightstep_trace)
11
+ end
12
+
13
+ protected
14
+
15
+ ##
16
+ # Trace the controller method
17
+ #
18
+ def lightstep_trace
19
+ prefix = ::Bigcommerce::Lightstep.controller_trace_prefix
20
+ key = "#{prefix}#{controller_name}.#{action_name}"
21
+ headers = lightstep_filtered_headers
22
+ tracer = ::Bigcommerce::Lightstep::Tracer.instance
23
+ result = tracer.start_span(key, context: headers) do |span|
24
+ span.set_tag('controller.name', controller_name)
25
+ span.set_tag('action.name', action_name)
26
+ span.set_tag('http.url', request.original_url.split('?').first)
27
+ span.set_tag('http.method', request.method)
28
+ span.set_tag('http.content_type', request.format)
29
+ span.set_tag('http.host', request.host)
30
+ begin
31
+ resp = yield
32
+ rescue StandardError => _
33
+ span.set_tag('error', true)
34
+ span.set_tag('http.status_code', Bigcommerce::Lightstep.http1_error_code)
35
+ tracer.clear_active_span!
36
+ span.finish
37
+ raise # re-raise the error
38
+ end
39
+ span.set_tag('http.status_code', response.status)
40
+ # 400+ HTTP status codes are errors: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
41
+ span.set_tag('error', true) if response.status >= Bigcommerce::Lightstep.http1_error_code_minimum
42
+ resp
43
+ end
44
+ tracer.clear_active_span!
45
+ result
46
+ end
47
+
48
+ ##
49
+ # Get only the open tracing headers
50
+ #
51
+ # @return [Hash]
52
+ #
53
+ def lightstep_filtered_headers
54
+ filtered_ot_headers = {}
55
+ headers = request.headers.to_h
56
+ headers.each do |k, v|
57
+ fk = k.to_s.downcase.gsub('http_', '').tr('_', '-')
58
+ next unless OPEN_TRACING_HEADER_KEYS.include?(fk)
59
+ filtered_ot_headers[fk] = v
60
+ end
61
+ filtered_ot_headers
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,127 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+ module Bigcommerce
17
+ module Lightstep
18
+ ##
19
+ # Global tracer
20
+ #
21
+ class Tracer
22
+ private
23
+
24
+ def initialize; end
25
+
26
+ public
27
+
28
+ include Singleton
29
+
30
+ ##
31
+ # Start a new span
32
+ #
33
+ # @param [String] name The operation name for the Span
34
+ # @param [Hash|::LightStep::SpanContext] context (Optional)
35
+ # @param [Time] start_time (Optional)
36
+ # @param [Hash] tags (Optional)
37
+ #
38
+ def start_span(name, context: nil, start_time: nil, tags: nil)
39
+ if Bigcommerce::Lightstep.enabled
40
+ # enable the tracer (for fork support)
41
+ tracer.enable
42
+ elsif tracer.enabled?
43
+ # We are not enabled and the tracer is currently on
44
+ # https://github.com/lightstep/lightstep-tracer-ruby/blob/master/lib/lightstep/tracer.rb#L129-L130
45
+ tracer.disable(discard: true)
46
+ end
47
+
48
+ # find the currently active span
49
+ last_active_span = active_span
50
+
51
+ # determine who is the actual parent span
52
+ current_parent = determine_parent(context: context)
53
+
54
+ # create new span
55
+ span = ::LightStep.start_span(name, child_of: current_parent, start_time: start_time, tags: tags)
56
+
57
+ # set it as the active span
58
+ self.active_span = span
59
+
60
+ # run the process
61
+ result = yield span
62
+
63
+ # finish this span if the reporter is initialized
64
+ span.finish if reporter_initialized?
65
+
66
+ # now set back the parent as the active span
67
+ self.active_span = last_active_span
68
+
69
+ # return result
70
+ result
71
+ end
72
+
73
+ ##
74
+ # Return the active span
75
+ #
76
+ # @return [::LightStep::Span|NilClass]
77
+ #
78
+ def active_span
79
+ Thread.current[:lightstep_active_span]
80
+ end
81
+
82
+ ##
83
+ # Clear the active span
84
+ #
85
+ def clear_active_span!
86
+ Thread.current[:lightstep_active_span] = nil
87
+ end
88
+
89
+ ##
90
+ # @return [Boolean]
91
+ #
92
+ def reporter_initialized?
93
+ tracer.instance_variable_defined?(:@reporter) && !tracer.instance_variable_get(:@reporter).nil?
94
+ end
95
+
96
+ private
97
+
98
+ ##
99
+ # Determine the active parent
100
+ #
101
+ # @param [Hash|::LightStep::SpanContext] context
102
+ # @return [::LightStep::SpanContext]
103
+ #
104
+ def determine_parent(context:)
105
+ # first attempt to find parent from args, if not, use carrier (headers) to lookup parent
106
+ current_parent = context.is_a?(::LightStep::SpanContext) ? context : tracer.extract(::LightStep::Tracer::FORMAT_TEXT_MAP, context || {})
107
+ # if no passed in parent, use the active thread parent
108
+ current_parent = active_span if current_parent.nil?
109
+ current_parent
110
+ end
111
+
112
+ ##
113
+ # @param [::LightStep::Span] span
114
+ #
115
+ def active_span=(span)
116
+ Thread.current[:lightstep_active_span] = span
117
+ end
118
+
119
+ ##
120
+ # @return [::LightStep::Tracer]
121
+ #
122
+ def tracer
123
+ LightStep.instance
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,123 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+ require 'net/http'
17
+ require 'lightstep/transport/base'
18
+ require 'logger'
19
+
20
+ module Bigcommerce
21
+ module Lightstep
22
+ # This is a transport that sends reports via HTTP in JSON format.
23
+ # It is thread-safe, however it is *not* fork-safe. When forking, all items
24
+ # in the queue will be copied and sent in duplicate.
25
+ class Transport < ::LightStep::Transport::Base
26
+ class InvalidAccessTokenError < StandardError; end
27
+
28
+ ENCRYPTION_TLS = 'tls'.freeze
29
+ ENCRYPTION_NONE = 'none'.freeze
30
+ HEADER_ACCESS_TOKEN = 'LightStep-Access-Token'.freeze
31
+ LIGHTSTEP_HOST = 'collector.lightstep.com'.freeze
32
+ LIGHTSTEP_PORT = 443
33
+ REPORTS_API_ENDPOINT = '/api/v0/reports'.freeze
34
+
35
+ # Initialize the transport
36
+ # @param host [String] host of the domain to the endpoind to push data
37
+ # @param port [Numeric] port on which to connect
38
+ # @param verbose [Numeric] verbosity level. Right now 0-3 are supported
39
+ # @param encryption [ENCRYPTION_TLS, ENCRYPTION_NONE] kind of encryption to use
40
+ # @param ssl_verify_peer [Boolean]
41
+ # @param access_token [String] access token for LightStep server
42
+ # @return [Transport]
43
+ def initialize(
44
+ access_token:,
45
+ host: LIGHTSTEP_HOST,
46
+ port: LIGHTSTEP_PORT,
47
+ verbose: 0,
48
+ encryption: ENCRYPTION_TLS,
49
+ ssl_verify_peer: true,
50
+ open_timeout: 20,
51
+ read_timeout: 20,
52
+ continue_timeout: nil,
53
+ keep_alive_timeout: 2,
54
+ logger: nil
55
+ )
56
+ @host = host
57
+ @port = port
58
+ @verbose = verbose
59
+ @encryption = encryption
60
+ @ssl_verify_peer = ssl_verify_peer
61
+ @open_timeout = open_timeout.to_i
62
+ @read_timeout = read_timeout.to_i
63
+ @continue_timeout = continue_timeout
64
+ @keep_alive_timeout = keep_alive_timeout.to_i
65
+
66
+ raise ::Bigcommerce::Lightstep::Errors::InvalidAccessToken, 'access_token must be a string' unless access_token.is_a?(String)
67
+ raise ::Bigcommerce::Lightstep::Errors::InvalidAccessToken, 'access_token cannot be blank' if access_token.empty?
68
+ @access_token = access_token.to_s
69
+ @logger = logger || ::Logger.new(STDOUT)
70
+ end
71
+
72
+ ##
73
+ # Queue a report for sending
74
+ #
75
+ # @param [Hash] report
76
+ # @return [NilClass]
77
+ #
78
+ def report(report)
79
+ @logger.info report if @verbose >= 3
80
+
81
+ req = build_request(report)
82
+ res = connection.request(req)
83
+
84
+ @logger.info res.to_s if @verbose >= 3
85
+
86
+ nil
87
+ end
88
+
89
+ private
90
+
91
+ ##
92
+ # @param [Hash] report
93
+ # @return [Net::HTTP::Post]
94
+ #
95
+ def build_request(report)
96
+ req = Net::HTTP::Post.new(REPORTS_API_ENDPOINT)
97
+ req[HEADER_ACCESS_TOKEN] = @access_token
98
+ req['Content-Type'] = 'application/json'
99
+ req['Connection'] = 'keep-alive'
100
+ req.body = report.to_json
101
+ req
102
+ end
103
+
104
+ ##
105
+ # @return [Net::HTTP]
106
+ #
107
+ def connection
108
+ unless @connection
109
+ @connection = ::Net::HTTP.new(@host, @port)
110
+ if @port == 443
111
+ @connection.use_ssl = @encryption == ENCRYPTION_TLS
112
+ @connection.verify_mode = ::OpenSSL::SSL::VERIFY_NONE unless @ssl_verify_peer
113
+ end
114
+ @connection.open_timeout = @open_timeout
115
+ @connection.read_timeout = @read_timeout
116
+ @connection.continue_timeout = @continue_timeout
117
+ @connection.keep_alive_timeout = @keep_alive_timeout
118
+ end
119
+ @connection
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,38 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+ module Bigcommerce
17
+ module Lightstep
18
+ ##
19
+ # Build transports for the lightstep connection
20
+ #
21
+ class TransportFactory
22
+ ##
23
+ # @return [::Bigcommerce::Lightstep::Transport]
24
+ #
25
+ def build
26
+ ::Bigcommerce::Lightstep::Transport.new(
27
+ host: ::Bigcommerce::Lightstep.host,
28
+ port: ::Bigcommerce::Lightstep.port.to_i,
29
+ verbose: ::Bigcommerce::Lightstep.verbosity.to_i,
30
+ encryption: ::Bigcommerce::Lightstep.port.to_i == 443 ? ::Bigcommerce::Lightstep::Transport::ENCRYPTION_TLS : ::Bigcommerce::Lightstep::Transport::ENCRYPTION_NONE,
31
+ ssl_verify_peer: ::Bigcommerce::Lightstep.ssl_verify_peer,
32
+ access_token: ::Bigcommerce::Lightstep.access_token,
33
+ logger: ::Bigcommerce::Lightstep.logger
34
+ )
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,20 @@
1
+ # Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4
+ # documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6
+ # persons to whom the Software is furnished to do so, subject to the following conditions:
7
+ #
8
+ # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9
+ # Software.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14
+ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ #
16
+ module Bigcommerce
17
+ module Lightstep
18
+ VERSION = '1.1.6'.freeze
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bc-lightstep-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.6
5
+ platform: ruby
6
+ authors:
7
+ - Shaun McCormick
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-09-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
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: lightstep
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.11.2
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.11.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: faraday
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.8'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.8'
97
+ description: Gem for lightstep distributed tracing
98
+ email:
99
+ - shaun.mccormick@bigcommerce.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - CHANGELOG.md
105
+ - CODE_OF_CONDUCT.md
106
+ - README.md
107
+ - bc-lightstep-ruby.gemspec
108
+ - lib/bigcommerce/lightstep.rb
109
+ - lib/bigcommerce/lightstep/configuration.rb
110
+ - lib/bigcommerce/lightstep/errors.rb
111
+ - lib/bigcommerce/lightstep/middleware/faraday.rb
112
+ - lib/bigcommerce/lightstep/rails_controller_instrumentation.rb
113
+ - lib/bigcommerce/lightstep/tracer.rb
114
+ - lib/bigcommerce/lightstep/transport.rb
115
+ - lib/bigcommerce/lightstep/transport_factory.rb
116
+ - lib/bigcommerce/lightstep/version.rb
117
+ homepage: https://github.com/bigcommerce/bc-lightstep-ruby
118
+ licenses:
119
+ - MIT
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 2.7.7
138
+ signing_key:
139
+ specification_version: 4
140
+ summary: Gem for lightstep distributed tracing
141
+ test_files: []