opencensus-jaeger 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.circleci/config.yml +77 -0
- data/.gitignore +15 -0
- data/.gitmodules +3 -0
- data/.rspec +3 -0
- data/.rubocop.yml +36 -0
- data/.travis.yml +7 -0
- data/CHANGELOG.md +6 -0
- data/CODEOWNERS +13 -0
- data/CODE_OF_CONDUCT.md +43 -0
- data/Gemfile +3 -0
- data/LICENSE +201 -0
- data/README.md +72 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/examples/.byebug_history +97 -0
- data/examples/Gemfile +9 -0
- data/examples/Gemfile.lock +46 -0
- data/examples/config.ru +15 -0
- data/examples/example.rb +25 -0
- data/lib/opencensus-jaeger.rb +4 -0
- data/lib/opencensus/jaeger.rb +12 -0
- data/lib/opencensus/jaeger/version.rb +5 -0
- data/lib/opencensus/logging.rb +24 -0
- data/lib/opencensus/trace/exporters/jaeger_driver.rb +125 -0
- data/lib/opencensus/trace/exporters/jaeger_driver/intermediate_transport.rb +25 -0
- data/lib/opencensus/trace/exporters/jaeger_driver/udp_sender.rb +28 -0
- data/lib/opencensus/trace/exporters/jaeger_driver/udp_transport.rb +43 -0
- data/lib/opencensus/trace/exporters/jaeger_exporter.rb +108 -0
- data/opencensus-jaeger.gemspec +45 -0
- data/scripts/publish.rb +7 -0
- data/scripts/rename_collectors.rb +88 -0
- data/thrift/agent.thrift +27 -0
- data/thrift/gen-rb/jaeger/thrift/agent.rb +117 -0
- data/thrift/gen-rb/jaeger/thrift/agent_constants.rb +13 -0
- data/thrift/gen-rb/jaeger/thrift/agent_types.rb +14 -0
- data/thrift/gen-rb/jaeger/thrift/collector.rb +82 -0
- data/thrift/gen-rb/jaeger/thrift/jaeger_constants.rb +13 -0
- data/thrift/gen-rb/jaeger/thrift/jaeger_types.rb +213 -0
- data/thrift/gen-rb/zipkin/zipkin_collector.rb +80 -0
- data/thrift/gen-rb/zipkin/zipkincore_constants.rb +43 -0
- data/thrift/gen-rb/zipkin/zipkincore_types.rb +223 -0
- data/thrift/jaeger.thrift +86 -0
- data/thrift/zipkincore.thrift +345 -0
- metadata +161 -0
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "opencensus/jaeger"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
c
|
2
|
+
continue
|
3
|
+
next
|
4
|
+
step
|
5
|
+
next
|
6
|
+
a.running?
|
7
|
+
a=OpenCensus.config.trace.exporter.instance_variable_get('@executor')
|
8
|
+
a.running?
|
9
|
+
next
|
10
|
+
a.running?
|
11
|
+
a=OpenCensus.config.trace.exporter.instance_variable_get('@executor')
|
12
|
+
a = _
|
13
|
+
OpenCensus.config.trace.exporter.instance_variable_get('@executor')
|
14
|
+
OpenCensus.config.trace.exporter.instance_variable_get('executor')
|
15
|
+
OpenCensus.config.trace.exporter.instance_variable_get(:executor)
|
16
|
+
OpenCensus.config.trace.exporter.running?
|
17
|
+
OpenCensus.config.trace.exporter
|
18
|
+
OpenCensus.config.trace.methods
|
19
|
+
OpenCensus.config.trace
|
20
|
+
OpenCensus.config.trcae
|
21
|
+
OpenCensus.config.methods
|
22
|
+
OpenCensus.config
|
23
|
+
next
|
24
|
+
value
|
25
|
+
field.value
|
26
|
+
next
|
27
|
+
field
|
28
|
+
field.exporter
|
29
|
+
field
|
30
|
+
key
|
31
|
+
next
|
32
|
+
key
|
33
|
+
@fields
|
34
|
+
field
|
35
|
+
n
|
36
|
+
'n
|
37
|
+
n
|
38
|
+
next
|
39
|
+
field
|
40
|
+
key
|
41
|
+
next
|
42
|
+
key
|
43
|
+
field.exporter.methods
|
44
|
+
field.exporter
|
45
|
+
field.methods
|
46
|
+
field
|
47
|
+
field.is_a? Config
|
48
|
+
field.value
|
49
|
+
@fields
|
50
|
+
field
|
51
|
+
fiel
|
52
|
+
next
|
53
|
+
backtrace
|
54
|
+
step
|
55
|
+
puts "#{c}"
|
56
|
+
step
|
57
|
+
next
|
58
|
+
step
|
59
|
+
c
|
60
|
+
step
|
61
|
+
next
|
62
|
+
step
|
63
|
+
continue
|
64
|
+
require 'jaeger/client'
|
65
|
+
continue
|
66
|
+
Jaeger.constants
|
67
|
+
Jaeger::Thrift
|
68
|
+
$LOAD_PATH
|
69
|
+
require_relative 'jaeger/client/../../thrift/gen-rb'
|
70
|
+
require 'jaeger/client/../../thrift/gen-rb'
|
71
|
+
require 'jaeger/client'
|
72
|
+
require 'jaeger/client/../../thrift/gen-rb'
|
73
|
+
require_relative 'jaeger/client/../../thrift/gen-rb'
|
74
|
+
require 'jaeger/client/../../thrift/gen-rb'
|
75
|
+
require 'jaeger/client'
|
76
|
+
require_relative 'jaeger/client/../../thrift/gen-rb'
|
77
|
+
__FILE__
|
78
|
+
File.dirname(__FILE__)
|
79
|
+
require 'jaeger'
|
80
|
+
$LOAD_PATH.push(File.dirname(__FILE__)+ '/../../thrift/gen-rb')
|
81
|
+
'
|
82
|
+
require 'jaeger/thrift/gen-rb/'
|
83
|
+
require 'jaeger/thrift/agent'
|
84
|
+
$LOAD_PATH.push(File.dirname(__FILE__)+ '/../../thrift/gen-rb')
|
85
|
+
require 'opentracing'
|
86
|
+
require 'jaeger/thrift/agent'
|
87
|
+
Jaeger::Thrift
|
88
|
+
Jaeger::Span.constants
|
89
|
+
Jaeger::Span.constant
|
90
|
+
Jaeger::Span.class
|
91
|
+
Jaeger::Span
|
92
|
+
Jaeger.constants
|
93
|
+
Jaeger.class
|
94
|
+
Jaeger.type
|
95
|
+
Jaeger.tyoe
|
96
|
+
Jaeger.methods
|
97
|
+
Jaeger
|
data/examples/Gemfile
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
opencensus-jaeger (0.2.0)
|
5
|
+
opencensus (~> 0.4.0)
|
6
|
+
thrift (~> 0.11.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
daemons (1.3.1)
|
12
|
+
eventmachine (1.2.7)
|
13
|
+
faraday (0.15.4)
|
14
|
+
multipart-post (>= 1.2, < 3)
|
15
|
+
multipart-post (2.0.0)
|
16
|
+
mustermann (1.0.3)
|
17
|
+
opencensus (0.4.0)
|
18
|
+
rack (2.0.6)
|
19
|
+
rack-protection (2.0.5)
|
20
|
+
rack
|
21
|
+
sinatra (2.0.5)
|
22
|
+
mustermann (~> 1.0)
|
23
|
+
rack (~> 2.0)
|
24
|
+
rack-protection (= 2.0.5)
|
25
|
+
tilt (~> 2.0)
|
26
|
+
thin (1.7.2)
|
27
|
+
daemons (~> 1.0, >= 1.0.9)
|
28
|
+
eventmachine (~> 1.0, >= 1.0.4)
|
29
|
+
rack (>= 1, < 3)
|
30
|
+
thrift (0.11.0.0)
|
31
|
+
tilt (2.0.9)
|
32
|
+
|
33
|
+
PLATFORMS
|
34
|
+
ruby
|
35
|
+
x86_64-darwin-17
|
36
|
+
x86_64-darwin-18
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
faraday
|
40
|
+
opencensus
|
41
|
+
opencensus-jaeger!
|
42
|
+
sinatra
|
43
|
+
thin
|
44
|
+
|
45
|
+
BUNDLED WITH
|
46
|
+
1.17.3
|
data/examples/config.ru
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'opencensus/jaeger'
|
2
|
+
require 'opencensus/trace/integrations/rack_middleware'
|
3
|
+
require 'opencensus/trace/integrations/faraday_middleware'
|
4
|
+
require_relative './example.rb'
|
5
|
+
|
6
|
+
OpenCensus.configure do |c|
|
7
|
+
c.trace.exporter = OpenCensus::Trace::Exporters::JaegerExporter.new \
|
8
|
+
service_name: 'test_service',
|
9
|
+
host: 'localhost',
|
10
|
+
port: 6831,
|
11
|
+
tags: { 'example_tag': 'hello_world' }
|
12
|
+
end
|
13
|
+
|
14
|
+
use OpenCensus::Trace::Integrations::RackMiddleware
|
15
|
+
run Example
|
data/examples/example.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
|
3
|
+
class Example < Sinatra::Base
|
4
|
+
get '/' do
|
5
|
+
'Hello world'
|
6
|
+
end
|
7
|
+
|
8
|
+
get "/lengthy" do
|
9
|
+
# Configure this Faraday connection with a middleware to trace outgoing
|
10
|
+
# requests.
|
11
|
+
conn = Faraday.new(url: "http://www.google.com") do |c|
|
12
|
+
c.use OpenCensus::Trace::Integrations::FaradayMiddleware
|
13
|
+
c.adapter Faraday.default_adapter
|
14
|
+
end
|
15
|
+
conn.get "/"
|
16
|
+
|
17
|
+
# You may instrument your code to create custom spans for long-running
|
18
|
+
# operations.
|
19
|
+
OpenCensus::Trace.in_span "long task" do
|
20
|
+
sleep rand
|
21
|
+
end
|
22
|
+
|
23
|
+
"Done!"
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'opencensus'
|
2
|
+
|
3
|
+
module OpenCensus
|
4
|
+
end
|
5
|
+
|
6
|
+
thrift_folder = File.expand_path(__dir__ + '../../../thrift/gen-rb')
|
7
|
+
$LOAD_PATH.unshift(thrift_folder) unless $LOAD_PATH.include?(thrift_folder)
|
8
|
+
|
9
|
+
require 'jaeger/thrift/agent'
|
10
|
+
require 'opencensus/jaeger/version'
|
11
|
+
require 'opencensus/logging'
|
12
|
+
require 'opencensus/trace/exporters/jaeger_exporter'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Logging
|
4
|
+
def default_logger
|
5
|
+
Logging.logger
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.logger
|
9
|
+
@logger ||= Logger.new(STDOUT)
|
10
|
+
@logger.level = ENV['LOG_LEVEL'].to_i || Logger::INFO
|
11
|
+
at_exit do
|
12
|
+
@logger.close
|
13
|
+
end
|
14
|
+
@logger
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.included(base)
|
18
|
+
class << base
|
19
|
+
def logger
|
20
|
+
Logging.logger
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'thrift'
|
3
|
+
require 'opencensus/trace/exporters/jaeger_driver/intermediate_transport'
|
4
|
+
require 'opencensus/trace/exporters/jaeger_driver/udp_sender'
|
5
|
+
|
6
|
+
module OpenCensus
|
7
|
+
module Trace
|
8
|
+
module Exporters
|
9
|
+
module JaegerDriver
|
10
|
+
extend self
|
11
|
+
|
12
|
+
MAX_64BIT_SIGNED_INT = (1 << 63) - 1
|
13
|
+
MAX_64BIT_UNSIGNED_INT = (1 << 64) - 1
|
14
|
+
TRACE_ID_UPPER_BOUND = MAX_64BIT_UNSIGNED_INT + 1
|
15
|
+
|
16
|
+
FIELDS = ::Jaeger::Thrift::Tag::FIELDS
|
17
|
+
KEY = FIELDS[::Jaeger::Thrift::Tag::KEY].fetch(:name)
|
18
|
+
VTYPE = FIELDS[::Jaeger::Thrift::Tag::VTYPE].fetch(:name)
|
19
|
+
VLONG = FIELDS[::Jaeger::Thrift::Tag::VLONG].fetch(:name)
|
20
|
+
VDOUBLE = FIELDS[::Jaeger::Thrift::Tag::VDOUBLE].fetch(:name)
|
21
|
+
VBOOL = FIELDS[::Jaeger::Thrift::Tag::VBOOL].fetch(:name)
|
22
|
+
VSTR = FIELDS[::Jaeger::Thrift::Tag::VSTR].fetch(:name)
|
23
|
+
|
24
|
+
def encode_span(span)
|
25
|
+
tags = build_thrift_tags(span.attributes)
|
26
|
+
trace_id_high = base16_hex_to_int64(
|
27
|
+
span.trace_id.slice(0, 16)
|
28
|
+
)
|
29
|
+
trace_id_low = base16_hex_to_int64(
|
30
|
+
span.trace_id.slice(16)
|
31
|
+
)
|
32
|
+
span_id = base16_hex_to_int64(
|
33
|
+
span.span_id
|
34
|
+
)
|
35
|
+
parent_span_id = base16_hex_to_int64(
|
36
|
+
span.parent_span_id
|
37
|
+
)
|
38
|
+
operation_name = span.name.value
|
39
|
+
references = []
|
40
|
+
flags = 0x01
|
41
|
+
start_time = span.start_time.to_f * 1_000_000
|
42
|
+
end_time = span.end_time.to_f * 1_000_000
|
43
|
+
duration = end_time - start_time
|
44
|
+
|
45
|
+
::Jaeger::Thrift::Span.new(
|
46
|
+
'traceIdLow': trace_id_low,
|
47
|
+
'traceIdHigh': trace_id_high,
|
48
|
+
'spanId': span_id,
|
49
|
+
'parentSpanId': parent_span_id,
|
50
|
+
'operationName': operation_name,
|
51
|
+
'references': references,
|
52
|
+
'flags': flags,
|
53
|
+
'startTime': start_time,
|
54
|
+
'duration': duration,
|
55
|
+
'tags': tags
|
56
|
+
)
|
57
|
+
rescue StandardError => e
|
58
|
+
puts "convert error #{e}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def ip_v4
|
62
|
+
ip_v4 = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }
|
63
|
+
ip_v4.nil? ? nil : ip_v4.ip_address
|
64
|
+
end
|
65
|
+
|
66
|
+
def base16_hex_id_to_uint64(id)
|
67
|
+
return nil unless id
|
68
|
+
value = id.to_i(16)
|
69
|
+
value > MAX_64BIT_UNSIGNED_INT || value < 0 ? 0 : value
|
70
|
+
end
|
71
|
+
|
72
|
+
# Thrift defines ID fields as i64, which is signed, therefore we convert
|
73
|
+
# large IDs (> 2^63) to negative longs
|
74
|
+
def uint64_id_to_int64(id)
|
75
|
+
id > MAX_64BIT_SIGNED_INT ? id - MAX_64BIT_UNSIGNED_INT - 1 : id
|
76
|
+
end
|
77
|
+
|
78
|
+
def base16_hex_to_int64(id)
|
79
|
+
uint64_id = base16_hex_id_to_uint64(id)
|
80
|
+
uint64_id_to_int64(uint64_id)
|
81
|
+
end
|
82
|
+
|
83
|
+
def build_thrift_tags(attributes)
|
84
|
+
attributes.collect do |key, value|
|
85
|
+
begin
|
86
|
+
if value.is_a?(OpenCensus::Trace::TruncatableString)
|
87
|
+
::Jaeger::Thrift::Tag.new(
|
88
|
+
KEY => key.to_s,
|
89
|
+
VTYPE => ::Jaeger::Thrift::TagType::STRING,
|
90
|
+
VSTR => value.value
|
91
|
+
)
|
92
|
+
elsif value.is_a?(Integer)
|
93
|
+
::Jaeger::Thrift::Tag.new(
|
94
|
+
KEY => key.to_s,
|
95
|
+
VTYPE => ::Jaeger::Thrift::TagType::LONG,
|
96
|
+
VLONG => value
|
97
|
+
)
|
98
|
+
elsif value.is_a?(Float)
|
99
|
+
::Jaeger::Thrift::Tag.new(
|
100
|
+
KEY => key.to_s,
|
101
|
+
VTYPE => ::Jaeger::Thrift::TagType::DOUBLE,
|
102
|
+
VDOUBLE => value
|
103
|
+
)
|
104
|
+
elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
105
|
+
::Jaeger::Thrift::Tag.new(
|
106
|
+
KEY => key.to_s,
|
107
|
+
VTYPE => ::Jaeger::Thrift::TagType::BOOL,
|
108
|
+
VBOOL => value
|
109
|
+
)
|
110
|
+
else
|
111
|
+
::Jaeger::Thrift::Tag.new(
|
112
|
+
KEY => key.to_s,
|
113
|
+
VTYPE => ::Jaeger::Thrift::TagType::STRING,
|
114
|
+
VSTR => value.to_s
|
115
|
+
)
|
116
|
+
end
|
117
|
+
rescue StandardError => error
|
118
|
+
logger.error "Cannot build thrift tags for #{key}:#{value}, error: #{error}"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module OpenCensus
|
2
|
+
module Trace
|
3
|
+
module Exporters
|
4
|
+
module JaegerDriver
|
5
|
+
class IntermediateTransport
|
6
|
+
attr_accessor :size
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@size = 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def write(buf)
|
13
|
+
@size += buf.size
|
14
|
+
end
|
15
|
+
|
16
|
+
def flush
|
17
|
+
@size = 0
|
18
|
+
end
|
19
|
+
|
20
|
+
def close; end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'opencensus/trace/exporters/jaeger_driver/udp_transport'
|
2
|
+
|
3
|
+
module OpenCensus
|
4
|
+
module Trace
|
5
|
+
module Exporters
|
6
|
+
module JaegerDriver
|
7
|
+
class UDPSender
|
8
|
+
include ::Logging
|
9
|
+
|
10
|
+
def initialize(host, port, logger, protocol_class)
|
11
|
+
@logger = logger || default_logger
|
12
|
+
@host = host
|
13
|
+
@port = port
|
14
|
+
@transport = UDPTransport.new(host, port, logger)
|
15
|
+
@protocol = protocol_class.new(@transport)
|
16
|
+
@client = ::Jaeger::Thrift::Agent::Client.new(@protocol)
|
17
|
+
end
|
18
|
+
|
19
|
+
def send_spans(spans)
|
20
|
+
@client.emitBatch(spans)
|
21
|
+
rescue StandardError => error
|
22
|
+
@logger.error "Failure while sending a batch of spans: #{error}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|