bc-lightstep-ruby 1.4.0 → 1.5.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/bigcommerce/lightstep.rb +1 -0
- data/lib/bigcommerce/lightstep/configuration.rb +2 -0
- data/lib/bigcommerce/lightstep/interceptors/base.rb +36 -0
- data/lib/bigcommerce/lightstep/interceptors/env.rb +74 -0
- data/lib/bigcommerce/lightstep/interceptors/registry.rb +125 -0
- data/lib/bigcommerce/lightstep/tracer.rb +6 -2
- data/lib/bigcommerce/lightstep/version.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08af660ec2183d4ec8eaff0050ce5d6476a7147b108d4ca69dfcec92f68c99e3'
|
4
|
+
data.tar.gz: d6ccbfa3aece6cc5b339ff0e45e05e078d822ec4f42e5d4894fee48ce66f0129
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e4232a04e274587f4c04f4544b6926e039ec8b1619bc0cb82405fdf46764f3da8433340aac51afba064426342a7bb64f5c1be271f6758a262a6afd72e5cd305
|
7
|
+
data.tar.gz: c4a7bc4b47f07343ba1cc2131ea508c1bcd43b4b24c45e410700d51f4485a5334e1051d885ba2d64027b45f777299b201116eb8206eb31809121c6be533aed18
|
data/CHANGELOG.md
CHANGED
@@ -19,6 +19,7 @@ require 'lightstep'
|
|
19
19
|
require 'faraday'
|
20
20
|
require_relative 'lightstep/version'
|
21
21
|
require_relative 'lightstep/errors'
|
22
|
+
require_relative 'lightstep/interceptors/registry'
|
22
23
|
require_relative 'lightstep/configuration'
|
23
24
|
require_relative 'lightstep/tracer'
|
24
25
|
require_relative 'lightstep/transport_factory'
|
@@ -27,6 +27,7 @@ module Bigcommerce
|
|
27
27
|
controller_trace_prefix: 'controllers.',
|
28
28
|
access_token: '',
|
29
29
|
host: 'lightstep-collector.linkerd',
|
30
|
+
interceptors: nil,
|
30
31
|
port: 4140,
|
31
32
|
ssl_verify_peer: true,
|
32
33
|
open_timeout: 20,
|
@@ -106,6 +107,7 @@ module Bigcommerce
|
|
106
107
|
self.verbosity = ENV.fetch('LIGHTSTEP_VERBOSITY', 1).to_i
|
107
108
|
self.logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
|
108
109
|
self.enabled = ENV.fetch('LIGHTSTEP_ENABLED', 1).to_i.positive?
|
110
|
+
self.interceptors = ::Bigcommerce::Lightstep::Interceptors::Registry.new
|
109
111
|
end
|
110
112
|
|
111
113
|
##
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
6
|
+
# documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
7
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
8
|
+
# persons to whom the Software is furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
11
|
+
# Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
14
|
+
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
15
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
16
|
+
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
17
|
+
#
|
18
|
+
module Bigcommerce
|
19
|
+
module Lightstep
|
20
|
+
module Interceptors
|
21
|
+
##
|
22
|
+
# Hydrates span tags with specified ENV vars
|
23
|
+
#
|
24
|
+
class Base
|
25
|
+
def initialize(*); end
|
26
|
+
|
27
|
+
##
|
28
|
+
# @param [::LightStep::Span] span
|
29
|
+
#
|
30
|
+
def call(*)
|
31
|
+
raise NotImplementedError, 'Please implement .call on your subclassed interceptor'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2018-present, BigCommerce Pty. Ltd. All rights reserved
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
6
|
+
# documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
7
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
8
|
+
# persons to whom the Software is furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
11
|
+
# Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
14
|
+
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
15
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
16
|
+
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
17
|
+
#
|
18
|
+
module Bigcommerce
|
19
|
+
module Lightstep
|
20
|
+
module Interceptors
|
21
|
+
##
|
22
|
+
# Hydrates span tags with specified ENV vars
|
23
|
+
#
|
24
|
+
class Env < Base
|
25
|
+
PRESET_NOMAD = {
|
26
|
+
'container.cpu': 'NOMAD_CPU_LIMIT',
|
27
|
+
'container.mem': 'NOMAD_MEMORY_LIMIT',
|
28
|
+
'git.sha': 'NOMAD_META_SHA',
|
29
|
+
'nomad.task_name': 'NOMAD_TASK_NAME',
|
30
|
+
'provider.region': 'NOMAD_REGION',
|
31
|
+
'provider.datacenter': 'NOMAD_DC'
|
32
|
+
}.freeze
|
33
|
+
|
34
|
+
##
|
35
|
+
# @param [Hash] keys A hash of span->env key mappings
|
36
|
+
# @param [ENV] env The ENV class to get variables from
|
37
|
+
# @param [Array<Symbol>] presets Specify presets that automatically setup keys
|
38
|
+
#
|
39
|
+
def initialize(keys: nil, env: nil, presets: [])
|
40
|
+
@keys = keys || {}
|
41
|
+
@presets = presets || []
|
42
|
+
@env = env || ENV
|
43
|
+
augment_keys_with_presets!
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# @param [::LightStep::Span] span
|
48
|
+
#
|
49
|
+
def call(span:)
|
50
|
+
@keys.each do |span_key, env_key|
|
51
|
+
value = @env.fetch(env_key.to_s, nil)
|
52
|
+
span.set_tag(span_key.to_s.downcase.tr('-', '_').strip, value.nil? ? '' : value)
|
53
|
+
end
|
54
|
+
|
55
|
+
yield span
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
##
|
61
|
+
# Augment keys based on presets
|
62
|
+
#
|
63
|
+
def augment_keys_with_presets!
|
64
|
+
@presets.each do |preset|
|
65
|
+
case preset
|
66
|
+
when :nomad
|
67
|
+
@keys.merge!(PRESET_NOMAD)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2019-present, BigCommerce Pty. Ltd. All rights reserved
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
6
|
+
# documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
7
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
8
|
+
# persons to whom the Software is furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
11
|
+
# Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
14
|
+
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
15
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
16
|
+
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
17
|
+
#
|
18
|
+
module Bigcommerce
|
19
|
+
module Lightstep
|
20
|
+
module Interceptors
|
21
|
+
##
|
22
|
+
# Thread-safe registry for interceptors
|
23
|
+
#
|
24
|
+
class Registry
|
25
|
+
def initialize
|
26
|
+
@registry = []
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Add to the thread-safe registry
|
31
|
+
#
|
32
|
+
# @param [Class] klass The class to add
|
33
|
+
# @param [Hash] options A hash of options to pass into the class during initialization
|
34
|
+
#
|
35
|
+
def use(klass, options = {})
|
36
|
+
registry_mutex do
|
37
|
+
@registry << {
|
38
|
+
klass: klass,
|
39
|
+
options: options
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Intercept a trace with all interceptors
|
46
|
+
#
|
47
|
+
def intercept(span)
|
48
|
+
interceptors = all
|
49
|
+
interceptor = interceptors.pop
|
50
|
+
|
51
|
+
return yield unless interceptor
|
52
|
+
|
53
|
+
interceptor.call(span: span) do |yielded_span|
|
54
|
+
if interceptors.any?
|
55
|
+
intercept(yielded_span) { yield yielded_span }
|
56
|
+
else
|
57
|
+
yield yielded_span
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Clear the registry
|
64
|
+
#
|
65
|
+
def clear
|
66
|
+
registry_mutex do
|
67
|
+
@registry = []
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# @return [Integer] The number of items currently loaded
|
73
|
+
#
|
74
|
+
def count
|
75
|
+
registry_mutex do
|
76
|
+
@registry ||= []
|
77
|
+
@registry.count
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
##
|
82
|
+
# Return a list of the classes in the registry in their execution order
|
83
|
+
#
|
84
|
+
# @return [Array<Class>]
|
85
|
+
#
|
86
|
+
def list
|
87
|
+
registry_mutex do
|
88
|
+
@registry.map { |h| h[:klass] }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
##
|
93
|
+
# Load and return all items
|
94
|
+
#
|
95
|
+
# @return [Array<Object>]
|
96
|
+
#
|
97
|
+
def all
|
98
|
+
is = []
|
99
|
+
registry_mutex do
|
100
|
+
@registry.each do |o|
|
101
|
+
is << o[:klass].new(o[:options])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
is
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
##
|
110
|
+
# Handle mutations to the registry in a thread-safe manner
|
111
|
+
#
|
112
|
+
def registry_mutex(&block)
|
113
|
+
@registry_mutex ||= begin
|
114
|
+
require 'monitor'
|
115
|
+
Monitor.new
|
116
|
+
end
|
117
|
+
@registry_mutex.synchronize(&block)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
require_relative 'base'
|
125
|
+
require_relative 'env'
|
@@ -23,7 +23,9 @@ module Bigcommerce
|
|
23
23
|
class Tracer
|
24
24
|
private
|
25
25
|
|
26
|
-
def initialize
|
26
|
+
def initialize
|
27
|
+
@interceptors = Bigcommerce::Lightstep.interceptors || Bigcommerce::Lightstep::Interceptors::Registry.new
|
28
|
+
end
|
27
29
|
|
28
30
|
public
|
29
31
|
|
@@ -66,7 +68,9 @@ module Bigcommerce
|
|
66
68
|
# run the process
|
67
69
|
result = nil
|
68
70
|
begin
|
69
|
-
|
71
|
+
@interceptors.intercept(span) do |inner_span|
|
72
|
+
result = yield inner_span
|
73
|
+
end
|
70
74
|
rescue StandardError
|
71
75
|
span.set_tag('error', true)
|
72
76
|
raise
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bc-lightstep-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shaun McCormick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -114,6 +114,9 @@ files:
|
|
114
114
|
- lib/bigcommerce/lightstep.rb
|
115
115
|
- lib/bigcommerce/lightstep/configuration.rb
|
116
116
|
- lib/bigcommerce/lightstep/errors.rb
|
117
|
+
- lib/bigcommerce/lightstep/interceptors/base.rb
|
118
|
+
- lib/bigcommerce/lightstep/interceptors/env.rb
|
119
|
+
- lib/bigcommerce/lightstep/interceptors/registry.rb
|
117
120
|
- lib/bigcommerce/lightstep/middleware/faraday.rb
|
118
121
|
- lib/bigcommerce/lightstep/rails_controller_instrumentation.rb
|
119
122
|
- lib/bigcommerce/lightstep/redis/tracer.rb
|
@@ -141,7 +144,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
144
|
- !ruby/object:Gem::Version
|
142
145
|
version: '0'
|
143
146
|
requirements: []
|
144
|
-
|
147
|
+
rubyforge_project:
|
148
|
+
rubygems_version: 2.7.9
|
145
149
|
signing_key:
|
146
150
|
specification_version: 4
|
147
151
|
summary: Gem for lightstep distributed tracing
|