lightstep 0.12.0 → 0.13.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/.circleci/config.yml +31 -0
- data/.gitignore +0 -2
- data/.rubocop.yml +48 -0
- data/Gemfile.lock +52 -0
- data/Makefile +2 -2
- data/example.rb +2 -2
- data/examples/rack/inject_extract.rb +1 -1
- data/lib/lightstep.rb +2 -0
- data/lib/lightstep/reporter.rb +14 -9
- data/lib/lightstep/scope.rb +23 -0
- data/lib/lightstep/scope_manager.rb +54 -0
- data/lib/lightstep/span.rb +18 -14
- data/lib/lightstep/tracer.rb +80 -3
- data/lib/lightstep/transport/base.rb +0 -3
- data/lib/lightstep/transport/http_json.rb +73 -17
- data/lib/lightstep/version.rb +1 -1
- data/lightstep.gemspec +2 -2
- metadata +11 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 412b678787b505c5c97155f3d702adf01e8ebd60254fb793a07e8ae4da2cd7fa
|
4
|
+
data.tar.gz: bdd33820334d2306ce78b7e84928e4be5193211d0c359bba02b4032ed3c6fc42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d1395123221d74ce722e748dc21951f8462103dd505edc42f3f04c32f3f9eed524358a684085cb8ba55acd35dc3909102447cb0133700f8b91016687bf0ba00
|
7
|
+
data.tar.gz: 597593ee87d988b10f9c79fc80ddfa5e4b3f05290e5033873aeb1e7655d6562dacb5f81410a3d0db62d2a418958e9165557e17f062f188db4602c2e3c09a0b44
|
@@ -0,0 +1,31 @@
|
|
1
|
+
version: 2
|
2
|
+
|
3
|
+
jobs:
|
4
|
+
test:
|
5
|
+
docker:
|
6
|
+
- image: circleci/ruby:2
|
7
|
+
steps:
|
8
|
+
- checkout
|
9
|
+
- restore_cache:
|
10
|
+
keys:
|
11
|
+
- gem-cache-v2-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
|
12
|
+
- gem-cache-v2-{{ .Branch }}-
|
13
|
+
- gem-cache-v2-
|
14
|
+
- run:
|
15
|
+
name: "set up environment"
|
16
|
+
command: |
|
17
|
+
echo 'export BUNDLE_PATH="$HOME/project/.bundler_cache"' >> $BASH_ENV
|
18
|
+
source $BASH_ENV
|
19
|
+
- run: bundle
|
20
|
+
- save_cache:
|
21
|
+
paths:
|
22
|
+
- ~/project/.bundler_cache
|
23
|
+
key: gem-cache-v2-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
|
24
|
+
- run: make test
|
25
|
+
|
26
|
+
workflows:
|
27
|
+
version: 2
|
28
|
+
test:
|
29
|
+
jobs:
|
30
|
+
- test
|
31
|
+
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- spec/**/*
|
4
|
+
- .bundle/**/*
|
5
|
+
- bin/**/*
|
6
|
+
- vendor/**/*
|
7
|
+
- tmp/**/*
|
8
|
+
- log/**/*
|
9
|
+
- Rakefile
|
10
|
+
- lightstep.gemspec
|
11
|
+
|
12
|
+
Lint/AmbiguousOperator:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
Metrics/ParameterLists:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Metrics/AbcSize:
|
19
|
+
Max: 147
|
20
|
+
|
21
|
+
Metrics/BlockNesting:
|
22
|
+
Max: 4
|
23
|
+
|
24
|
+
# Configuration parameters: CountComments.
|
25
|
+
Metrics/ClassLength:
|
26
|
+
Max: 406
|
27
|
+
|
28
|
+
Metrics/CyclomaticComplexity:
|
29
|
+
Max: 24
|
30
|
+
|
31
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
|
32
|
+
# URISchemes: http, https
|
33
|
+
Metrics/LineLength:
|
34
|
+
Enabled: false
|
35
|
+
|
36
|
+
# Configuration parameters: CountComments.
|
37
|
+
Metrics/MethodLength:
|
38
|
+
Max: 88
|
39
|
+
|
40
|
+
# Configuration parameters: CountComments.
|
41
|
+
Metrics/ModuleLength:
|
42
|
+
Max: 1000
|
43
|
+
|
44
|
+
Performance/RedundantBlockCall:
|
45
|
+
Enabled: false
|
46
|
+
|
47
|
+
Style/PercentLiteralDelimiters:
|
48
|
+
Enabled: false
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
lightstep (0.13.0)
|
5
|
+
concurrent-ruby (~> 1.0)
|
6
|
+
opentracing (~> 0.4.1)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
bump (0.6.1)
|
12
|
+
concurrent-ruby (1.0.5)
|
13
|
+
diff-lcs (1.3)
|
14
|
+
docile (1.3.1)
|
15
|
+
json (2.1.0)
|
16
|
+
opentracing (0.4.1)
|
17
|
+
rack (2.0.5)
|
18
|
+
rake (11.3.0)
|
19
|
+
rspec (3.7.0)
|
20
|
+
rspec-core (~> 3.7.0)
|
21
|
+
rspec-expectations (~> 3.7.0)
|
22
|
+
rspec-mocks (~> 3.7.0)
|
23
|
+
rspec-core (3.7.1)
|
24
|
+
rspec-support (~> 3.7.0)
|
25
|
+
rspec-expectations (3.7.0)
|
26
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
27
|
+
rspec-support (~> 3.7.0)
|
28
|
+
rspec-mocks (3.7.0)
|
29
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
30
|
+
rspec-support (~> 3.7.0)
|
31
|
+
rspec-support (3.7.1)
|
32
|
+
simplecov (0.16.1)
|
33
|
+
docile (~> 1.1)
|
34
|
+
json (>= 1.8, < 3)
|
35
|
+
simplecov-html (~> 0.10.0)
|
36
|
+
simplecov-html (0.10.2)
|
37
|
+
timecop (0.8.1)
|
38
|
+
|
39
|
+
PLATFORMS
|
40
|
+
ruby
|
41
|
+
|
42
|
+
DEPENDENCIES
|
43
|
+
bump (~> 0.5)
|
44
|
+
lightstep!
|
45
|
+
rack (~> 2.0)
|
46
|
+
rake (~> 11.3)
|
47
|
+
rspec (~> 3.0)
|
48
|
+
simplecov (~> 0.16)
|
49
|
+
timecop (~> 0.8.0)
|
50
|
+
|
51
|
+
BUNDLED WITH
|
52
|
+
1.16.6
|
data/Makefile
CHANGED
@@ -14,8 +14,8 @@ benchmark:
|
|
14
14
|
ruby benchmark/threading/thread_test.rb
|
15
15
|
|
16
16
|
bump-version:
|
17
|
-
# ruby -e 'require "bump"; Bump::Bump.run("
|
18
|
-
|
17
|
+
# ruby -e 'require "bump"; Bump::Bump.run("patch")'
|
18
|
+
make build # rebuild after version increment
|
19
19
|
git tag `ruby scripts/version.rb`
|
20
20
|
# git push
|
21
21
|
git push --tags
|
data/example.rb
CHANGED
@@ -11,7 +11,7 @@ LightStep.configure(component_name: 'lightstep/ruby/example', access_token: acce
|
|
11
11
|
puts 'Starting operation...'
|
12
12
|
span = LightStep.start_span('my_span')
|
13
13
|
thread1 = Thread.new do
|
14
|
-
|
14
|
+
(1..10).each do |i|
|
15
15
|
sleep(0.15)
|
16
16
|
puts "Logging event #{i}..."
|
17
17
|
span.log(event: 'hello world', count: i)
|
@@ -19,7 +19,7 @@ thread1 = Thread.new do
|
|
19
19
|
end
|
20
20
|
thread2 = Thread.new do
|
21
21
|
current = 1
|
22
|
-
|
22
|
+
(1..16).each do |i|
|
23
23
|
child = LightStep.start_span('my_child', child_of: span.span_context)
|
24
24
|
sleep(0.1)
|
25
25
|
current *= 2
|
data/lib/lightstep.rb
CHANGED
data/lib/lightstep/reporter.rb
CHANGED
@@ -57,7 +57,10 @@ module LightStep
|
|
57
57
|
|
58
58
|
span_records = @span_records.slice!(0, @span_records.length)
|
59
59
|
dropped_spans = 0
|
60
|
-
@dropped_spans.update
|
60
|
+
@dropped_spans.update do |old|
|
61
|
+
dropped_spans = old
|
62
|
+
0
|
63
|
+
end
|
61
64
|
|
62
65
|
report_request = {
|
63
66
|
runtime: @runtime,
|
@@ -65,9 +68,10 @@ module LightStep
|
|
65
68
|
youngest_micros: now,
|
66
69
|
span_records: span_records,
|
67
70
|
internal_metrics: {
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
+
counts: [{
|
72
|
+
name: 'spans.dropped',
|
73
|
+
int64_value: dropped_spans
|
74
|
+
}]
|
71
75
|
}
|
72
76
|
}
|
73
77
|
|
@@ -75,9 +79,10 @@ module LightStep
|
|
75
79
|
|
76
80
|
begin
|
77
81
|
@transport.report(report_request)
|
78
|
-
rescue
|
79
|
-
|
80
|
-
|
82
|
+
rescue StandardError => e
|
83
|
+
LightStep.logger.error "LightStep error reporting to collector: #{e.message}"
|
84
|
+
# an error occurs, add the previous dropped_spans and count of spans
|
85
|
+
# that would have been recorded
|
81
86
|
@dropped_spans.increment(dropped_spans + span_records.length)
|
82
87
|
end
|
83
88
|
end
|
@@ -103,8 +108,8 @@ module LightStep
|
|
103
108
|
sleep(@period)
|
104
109
|
flush
|
105
110
|
end
|
106
|
-
rescue =>
|
107
|
-
|
111
|
+
rescue StandardError => e
|
112
|
+
LightStep.logger.error "LightStep failed to report spans: #{e.message}"
|
108
113
|
end
|
109
114
|
end
|
110
115
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module LightStep
|
2
|
+
# Scope represents an OpenTracing Scope
|
3
|
+
#
|
4
|
+
# See http://www.opentracing.io for more information.
|
5
|
+
class Scope
|
6
|
+
attr_reader :span
|
7
|
+
|
8
|
+
def initialize(manager:, span:, finish_on_close: true)
|
9
|
+
@manager = manager
|
10
|
+
@span = span
|
11
|
+
@finish_on_close = finish_on_close
|
12
|
+
end
|
13
|
+
|
14
|
+
# Mark the end of the active period for the current thread and Scope,
|
15
|
+
# updating the ScopeManager#active in the process.
|
16
|
+
def close
|
17
|
+
raise(LightStep::Error, 'already closed') if @closed
|
18
|
+
@closed = true
|
19
|
+
@span.finish if @finish_on_close
|
20
|
+
@manager.deactivate
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module LightStep
|
2
|
+
# ScopeManager represents an OpenTracing ScopeManager
|
3
|
+
#
|
4
|
+
# See http://www.opentracing.io for more information.
|
5
|
+
#
|
6
|
+
# The ScopeManager interface abstracts both the activation of Span instances
|
7
|
+
# via ScopeManager#activate and access to an active Span/Scope via
|
8
|
+
# ScopeManager#active
|
9
|
+
#
|
10
|
+
class ScopeManager
|
11
|
+
# Make a span instance active.
|
12
|
+
#
|
13
|
+
# @param span [Span] the Span that should become active
|
14
|
+
# @param finish_on_close [Boolean] whether the Span should automatically be
|
15
|
+
# finished when Scope#close is called
|
16
|
+
# @return [Scope] instance to control the end of the active period for the
|
17
|
+
# Span. It is a programming error to neglect to call Scope#close on the
|
18
|
+
# returned instance.
|
19
|
+
def activate(span:, finish_on_close: true)
|
20
|
+
return active if active && active.span == span
|
21
|
+
LightStep::Scope.new(manager: self, span: span, finish_on_close: finish_on_close).tap do |scope|
|
22
|
+
add_scope(scope)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [Scope] the currently active Scope which can be used to access the
|
27
|
+
# currently active Span.
|
28
|
+
#
|
29
|
+
# If there is a non-null Scope, its wrapped Span becomes an implicit parent
|
30
|
+
# (as Reference#CHILD_OF) of any newly-created Span at Tracer#start_active_span
|
31
|
+
# or Tracer#start_span time.
|
32
|
+
def active
|
33
|
+
scopes.last
|
34
|
+
end
|
35
|
+
|
36
|
+
def deactivate
|
37
|
+
scopes.pop
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def scopes
|
43
|
+
Thread.current[object_id.to_s] || []
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_scope(scope)
|
47
|
+
if Thread.current[object_id.to_s].nil?
|
48
|
+
Thread.current[object_id.to_s] = [scope]
|
49
|
+
else
|
50
|
+
Thread.current[object_id.to_s] << scope
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/lightstep/span.rb
CHANGED
@@ -11,7 +11,10 @@ module LightStep
|
|
11
11
|
|
12
12
|
# Internal use only
|
13
13
|
# @private
|
14
|
-
attr_reader :start_micros, :end_micros, :tags, :operation_name, :
|
14
|
+
attr_reader :start_micros, :end_micros, :tags, :operation_name, :context
|
15
|
+
|
16
|
+
# To keep backwards compatibility
|
17
|
+
alias_method :span_context, :context
|
15
18
|
|
16
19
|
# Creates a new {Span}
|
17
20
|
#
|
@@ -37,6 +40,7 @@ module LightStep
|
|
37
40
|
tags: nil,
|
38
41
|
max_log_records:
|
39
42
|
)
|
43
|
+
|
40
44
|
@tags = Concurrent::Hash.new
|
41
45
|
@tags.update(tags) unless tags.nil?
|
42
46
|
@log_records = Concurrent::Array.new
|
@@ -49,14 +53,14 @@ module LightStep
|
|
49
53
|
|
50
54
|
ref = child_of ? child_of : references
|
51
55
|
ref = ref[0] if (Array === ref)
|
52
|
-
ref = ref.
|
56
|
+
ref = ref.context if (Span === ref)
|
53
57
|
|
54
58
|
if SpanContext === ref
|
55
|
-
@
|
59
|
+
@context = SpanContext.new(id: LightStep.guid, trace_id: ref.trace_id)
|
56
60
|
set_baggage(ref.baggage)
|
57
61
|
set_tag(:parent_span_guid, ref.id)
|
58
62
|
else
|
59
|
-
@
|
63
|
+
@context = SpanContext.new(id: LightStep.guid, trace_id: LightStep.guid)
|
60
64
|
end
|
61
65
|
end
|
62
66
|
|
@@ -76,10 +80,10 @@ module LightStep
|
|
76
80
|
# @param key [String] the key of the baggage item
|
77
81
|
# @param value [String] the value of the baggage item
|
78
82
|
def set_baggage_item(key, value)
|
79
|
-
@
|
80
|
-
id:
|
81
|
-
trace_id:
|
82
|
-
baggage:
|
83
|
+
@context = SpanContext.new(
|
84
|
+
id: context.id,
|
85
|
+
trace_id: context.trace_id,
|
86
|
+
baggage: context.baggage.merge({key => value})
|
83
87
|
)
|
84
88
|
self
|
85
89
|
end
|
@@ -87,9 +91,9 @@ module LightStep
|
|
87
91
|
# Set all baggage at once. This will reset the baggage to the given param.
|
88
92
|
# @param baggage [Hash] new baggage for the span
|
89
93
|
def set_baggage(baggage = {})
|
90
|
-
@
|
91
|
-
id:
|
92
|
-
trace_id:
|
94
|
+
@context = SpanContext.new(
|
95
|
+
id: context.id,
|
96
|
+
trace_id: context.trace_id,
|
93
97
|
baggage: baggage
|
94
98
|
)
|
95
99
|
end
|
@@ -98,7 +102,7 @@ module LightStep
|
|
98
102
|
# @param key [String] the key of the baggage item
|
99
103
|
# @return Value of the baggage item
|
100
104
|
def get_baggage_item(key)
|
101
|
-
|
105
|
+
context.baggage[key]
|
102
106
|
end
|
103
107
|
|
104
108
|
# Add a log entry to this span
|
@@ -140,8 +144,8 @@ module LightStep
|
|
140
144
|
def to_h
|
141
145
|
{
|
142
146
|
runtime_guid: tracer.guid,
|
143
|
-
span_guid:
|
144
|
-
trace_guid:
|
147
|
+
span_guid: context.id,
|
148
|
+
trace_guid: context.trace_id,
|
145
149
|
span_name: operation_name,
|
146
150
|
attributes: tags.map {|key, value|
|
147
151
|
{Key: key.to_s, Value: value}
|
data/lib/lightstep/tracer.rb
CHANGED
@@ -53,6 +53,78 @@ module LightStep
|
|
53
53
|
|
54
54
|
# TODO(bhs): Support FollowsFrom and multiple references
|
55
55
|
|
56
|
+
# Creates a scope manager or returns the already-created one.
|
57
|
+
#
|
58
|
+
# @return [ScopeManager] the current ScopeManager, which may be a no-op but
|
59
|
+
# may not be nil.
|
60
|
+
def scope_manager
|
61
|
+
@scope_manager ||= LightStep::ScopeManager.new
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns a newly started and activated Scope.
|
65
|
+
#
|
66
|
+
# If ScopeManager#active is not nil, no explicit references are provided,
|
67
|
+
# and `ignore_active_scope` is false, then an inferred References#CHILD_OF
|
68
|
+
# reference is created to the ScopeManager#active's SpanContext when
|
69
|
+
# start_active_span is invoked.
|
70
|
+
#
|
71
|
+
# @param operation_name [String] The operation name for the Span
|
72
|
+
# @param child_of [SpanContext, Span] SpanContext that acts as a parent to
|
73
|
+
# the newly-started Span. If a Span instance is provided, its
|
74
|
+
# context is automatically substituted. See [Reference] for more
|
75
|
+
# information.
|
76
|
+
#
|
77
|
+
# If specified, the `references` parameter must be omitted.
|
78
|
+
# @param references [Array<Reference>] An array of reference
|
79
|
+
# objects that identify one or more parent SpanContexts.
|
80
|
+
# @param start_time [Time] When the Span started, if not now
|
81
|
+
# @param tags [Hash] Tags to assign to the Span at start time
|
82
|
+
# @param ignore_active_scope [Boolean] whether to create an implicit
|
83
|
+
# References#CHILD_OF reference to the ScopeManager#active.
|
84
|
+
# @param finish_on_close [Boolean] whether span should automatically be
|
85
|
+
# finished when Scope#close is called
|
86
|
+
# @yield [Scope] If an optional block is passed to start_active it will
|
87
|
+
# yield the newly-started Scope. If `finish_on_close` is true then the
|
88
|
+
# Span will be finished automatically after the block is executed.
|
89
|
+
# @return [Scope] The newly-started and activated Scope
|
90
|
+
def start_active_span(operation_name,
|
91
|
+
child_of: nil,
|
92
|
+
references: nil,
|
93
|
+
start_time: Time.now,
|
94
|
+
tags: nil,
|
95
|
+
ignore_active_scope: false,
|
96
|
+
finish_on_close: true)
|
97
|
+
if child_of.nil? && references.nil? && !ignore_active_scope
|
98
|
+
child_of = active_span
|
99
|
+
end
|
100
|
+
|
101
|
+
span = start_span(
|
102
|
+
operation_name,
|
103
|
+
child_of: child_of,
|
104
|
+
references: references,
|
105
|
+
start_time: start_time,
|
106
|
+
tags: tags,
|
107
|
+
ignore_active_scope: ignore_active_scope
|
108
|
+
)
|
109
|
+
|
110
|
+
scope_manager.activate(span: span, finish_on_close: finish_on_close).tap do |scope|
|
111
|
+
if block_given?
|
112
|
+
yield scope
|
113
|
+
scope.close
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns the span from the active scope, if any.
|
119
|
+
#
|
120
|
+
# @return [Span, nil] the active span. This is a shorthand for
|
121
|
+
# `scope_manager.active.span`, and nil will be returned if
|
122
|
+
# Scope#active is nil.
|
123
|
+
def active_span
|
124
|
+
scope = scope_manager.active
|
125
|
+
scope.span if scope
|
126
|
+
end
|
127
|
+
|
56
128
|
# Starts a new span.
|
57
129
|
#
|
58
130
|
# @param operation_name [String] The operation name for the Span
|
@@ -64,8 +136,13 @@ module LightStep
|
|
64
136
|
# are provided, their .span_context is automatically substituted.
|
65
137
|
# @param start_time [Time] When the Span started, if not now
|
66
138
|
# @param tags [Hash] Tags to assign to the Span at start time
|
139
|
+
# @param ignore_active_scope [Boolean] whether to create an implicit
|
140
|
+
# References#CHILD_OF reference to the ScopeManager#active.
|
67
141
|
# @return [Span]
|
68
|
-
def start_span(operation_name, child_of: nil, references:
|
142
|
+
def start_span(operation_name, child_of: nil, references: nil, start_time: nil, tags: nil, ignore_active_scope: false)
|
143
|
+
if child_of.nil? && references.nil? && !ignore_active_scope
|
144
|
+
child_of = active_span
|
145
|
+
end
|
69
146
|
|
70
147
|
Span.new(
|
71
148
|
tracer: self,
|
@@ -150,7 +227,7 @@ module LightStep
|
|
150
227
|
protected
|
151
228
|
|
152
229
|
def configure(component_name:, access_token: nil, transport: nil, tags: {})
|
153
|
-
raise ConfigurationError, "component_name must be a string" unless String
|
230
|
+
raise ConfigurationError, "component_name must be a string" unless component_name.is_a?(String)
|
154
231
|
raise ConfigurationError, "component_name cannot be blank" if component_name.empty?
|
155
232
|
|
156
233
|
if transport.nil? and !access_token.nil?
|
@@ -234,7 +311,7 @@ module LightStep
|
|
234
311
|
def extract_from_rack(env)
|
235
312
|
extract_from_text_map(env.reduce({}){|memo, tuple|
|
236
313
|
raw_header, value = tuple
|
237
|
-
header = raw_header.gsub(/^HTTP_/, '').
|
314
|
+
header = raw_header.gsub(/^HTTP_/, '').tr('_', '-').downcase
|
238
315
|
|
239
316
|
memo[header] = value if header.start_with?(CARRIER_TRACER_STATE_PREFIX, CARRIER_BAGGAGE_PREFIX)
|
240
317
|
memo
|
@@ -11,46 +11,102 @@ module LightStep
|
|
11
11
|
# within the fork (and in the parent post-fork). See
|
12
12
|
# `examples/fork_children/main.rb` for an example.
|
13
13
|
class HTTPJSON < Base
|
14
|
-
LIGHTSTEP_HOST =
|
14
|
+
LIGHTSTEP_HOST = 'collector.lightstep.com'.freeze
|
15
15
|
LIGHTSTEP_PORT = 443
|
16
16
|
|
17
|
-
ENCRYPTION_TLS = 'tls'
|
18
|
-
ENCRYPTION_NONE = 'none'
|
17
|
+
ENCRYPTION_TLS = 'tls'.freeze
|
18
|
+
ENCRYPTION_NONE = 'none'.freeze
|
19
19
|
|
20
|
+
REPORTS_API_ENDPOINT = '/api/v0/reports'.freeze
|
21
|
+
HEADER_ACCESS_TOKEN = 'LightStep-Access-Token'.freeze
|
22
|
+
|
23
|
+
##
|
20
24
|
# Initialize the transport
|
21
|
-
#
|
25
|
+
#
|
26
|
+
# @param host [String] host of the domain to the endpoint to push data
|
22
27
|
# @param port [Numeric] port on which to connect
|
23
28
|
# @param verbose [Numeric] verbosity level. Right now 0-3 are supported
|
24
29
|
# @param encryption [ENCRYPTION_TLS, ENCRYPTION_NONE] kind of encryption to use
|
25
30
|
# @param access_token [String] access token for LightStep server
|
26
|
-
# @
|
27
|
-
|
31
|
+
# @param ssl_verify_peer [Boolean]
|
32
|
+
# @param open_timeout [Integer]
|
33
|
+
# @param read_timeout [Integer]
|
34
|
+
# @param continue_timeout [Integer]
|
35
|
+
# @param keep_alive_timeout [Integer]
|
36
|
+
# @param logger [Logger]
|
37
|
+
#
|
38
|
+
def initialize(
|
39
|
+
host: LIGHTSTEP_HOST,
|
40
|
+
port: LIGHTSTEP_PORT,
|
41
|
+
verbose: 0,
|
42
|
+
encryption: ENCRYPTION_TLS,
|
43
|
+
access_token:,
|
44
|
+
ssl_verify_peer: true,
|
45
|
+
open_timeout: 20,
|
46
|
+
read_timeout: 20,
|
47
|
+
continue_timeout: nil,
|
48
|
+
keep_alive_timeout: 2,
|
49
|
+
logger: nil
|
50
|
+
)
|
28
51
|
@host = host
|
29
52
|
@port = port
|
30
53
|
@verbose = verbose
|
31
54
|
@encryption = encryption
|
55
|
+
@ssl_verify_peer = ssl_verify_peer
|
56
|
+
@open_timeout = open_timeout.to_i
|
57
|
+
@read_timeout = read_timeout.to_i
|
58
|
+
@continue_timeout = continue_timeout
|
59
|
+
@keep_alive_timeout = keep_alive_timeout.to_i
|
32
60
|
|
33
|
-
raise Tracer::ConfigurationError,
|
34
|
-
raise Tracer::ConfigurationError,
|
61
|
+
raise Tracer::ConfigurationError, 'access_token must be a string' unless access_token.is_a?(String)
|
62
|
+
raise Tracer::ConfigurationError, 'access_token cannot be blank' if access_token.empty?
|
35
63
|
@access_token = access_token
|
64
|
+
@logger = logger || LightStep.logger
|
36
65
|
end
|
37
66
|
|
67
|
+
##
|
38
68
|
# Queue a report for sending
|
69
|
+
#
|
39
70
|
def report(report)
|
40
|
-
|
71
|
+
@logger.info report if @verbose >= 3
|
72
|
+
|
73
|
+
req = build_request(report)
|
74
|
+
res = connection.request(req)
|
75
|
+
|
76
|
+
@logger.info res.to_s if @verbose >= 3
|
77
|
+
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
41
82
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
83
|
+
##
|
84
|
+
# @param [Hash] report
|
85
|
+
# @return [Net::HTTP::Post]
|
86
|
+
#
|
87
|
+
def build_request(report)
|
88
|
+
req = Net::HTTP::Post.new(REPORTS_API_ENDPOINT)
|
89
|
+
req[HEADER_ACCESS_TOKEN] = @access_token
|
46
90
|
req['Content-Type'] = 'application/json'
|
47
91
|
req['Connection'] = 'keep-alive'
|
48
92
|
req.body = report.to_json
|
49
|
-
|
50
|
-
|
51
|
-
puts res.to_s if @verbose >= 3
|
93
|
+
req
|
94
|
+
end
|
52
95
|
|
53
|
-
|
96
|
+
##
|
97
|
+
# @return [Net::HTTP]
|
98
|
+
#
|
99
|
+
def connection
|
100
|
+
unless @connection
|
101
|
+
@connection = ::Net::HTTP.new(@host, @port)
|
102
|
+
@connection.use_ssl = @encryption == ENCRYPTION_TLS
|
103
|
+
@connection.verify_mode = ::OpenSSL::SSL::VERIFY_NONE unless @ssl_verify_peer
|
104
|
+
@connection.open_timeout = @open_timeout
|
105
|
+
@connection.read_timeout = @read_timeout
|
106
|
+
@connection.continue_timeout = @continue_timeout
|
107
|
+
@connection.keep_alive_timeout = @keep_alive_timeout
|
108
|
+
end
|
109
|
+
@connection
|
54
110
|
end
|
55
111
|
end
|
56
112
|
end
|
data/lib/lightstep/version.rb
CHANGED
data/lightstep.gemspec
CHANGED
@@ -17,11 +17,11 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.require_paths = ['lib']
|
18
18
|
|
19
19
|
spec.add_dependency 'concurrent-ruby', '~> 1.0'
|
20
|
-
spec.add_dependency 'opentracing', '~> 0.
|
20
|
+
spec.add_dependency 'opentracing', '~> 0.4.1'
|
21
21
|
spec.add_development_dependency 'rake', '~> 11.3'
|
22
22
|
spec.add_development_dependency 'rack', '~> 2.0'
|
23
23
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
24
24
|
spec.add_development_dependency 'bump', '~> 0.5'
|
25
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
25
|
+
spec.add_development_dependency 'simplecov', '~> 0.16'
|
26
26
|
spec.add_development_dependency 'timecop', '~> 0.8.0'
|
27
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lightstep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bcronin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.4.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.4.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.
|
103
|
+
version: '0.16'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
110
|
+
version: '0.16'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: timecop
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,9 +129,12 @@ executables: []
|
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
|
+
- ".circleci/config.yml"
|
132
133
|
- ".gitignore"
|
133
134
|
- ".rspec"
|
135
|
+
- ".rubocop.yml"
|
134
136
|
- Gemfile
|
137
|
+
- Gemfile.lock
|
135
138
|
- LICENSE.txt
|
136
139
|
- Makefile
|
137
140
|
- README.md
|
@@ -149,6 +152,8 @@ files:
|
|
149
152
|
- lib/lightstep.rb
|
150
153
|
- lib/lightstep/global_tracer.rb
|
151
154
|
- lib/lightstep/reporter.rb
|
155
|
+
- lib/lightstep/scope.rb
|
156
|
+
- lib/lightstep/scope_manager.rb
|
152
157
|
- lib/lightstep/span.rb
|
153
158
|
- lib/lightstep/span_context.rb
|
154
159
|
- lib/lightstep/tracer.rb
|