finagle-thrift 1.2.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,7 +21,7 @@ module FinagleThrift
21
21
  header.parent_span_id = Trace.id.parent_id.to_i
22
22
  header.span_id = Trace.id.span_id.to_i
23
23
  header.sampled = Trace.id.sampled?
24
- header.debug = false
24
+ header.flags = Trace.id.flags.to_i
25
25
 
26
26
  header.client_id = client_id if client_id
27
27
 
@@ -43,11 +43,13 @@ module FinagleThrift
43
43
  TIMESTAMP = 1
44
44
  VALUE = 2
45
45
  HOST = 3
46
+ DURATION = 4
46
47
 
47
48
  FIELDS = {
48
49
  TIMESTAMP => {:type => ::Thrift::Types::I64, :name => 'timestamp'},
49
50
  VALUE => {:type => ::Thrift::Types::STRING, :name => 'value'},
50
- HOST => {:type => ::Thrift::Types::STRUCT, :name => 'host', :class => FinagleThrift::Endpoint, :optional => true}
51
+ HOST => {:type => ::Thrift::Types::STRUCT, :name => 'host', :class => FinagleThrift::Endpoint, :optional => true},
52
+ DURATION => {:type => ::Thrift::Types::I32, :name => 'duration', :optional => true}
51
53
  }
52
54
 
53
55
  def struct_fields; FIELDS; end
@@ -91,6 +93,7 @@ module FinagleThrift
91
93
  PARENT_ID = 5
92
94
  ANNOTATIONS = 6
93
95
  BINARY_ANNOTATIONS = 8
96
+ DEBUG = 9
94
97
 
95
98
  FIELDS = {
96
99
  TRACE_ID => {:type => ::Thrift::Types::I64, :name => 'trace_id'},
@@ -98,7 +101,8 @@ module FinagleThrift
98
101
  ID => {:type => ::Thrift::Types::I64, :name => 'id'},
99
102
  PARENT_ID => {:type => ::Thrift::Types::I64, :name => 'parent_id', :optional => true},
100
103
  ANNOTATIONS => {:type => ::Thrift::Types::LIST, :name => 'annotations', :element => {:type => ::Thrift::Types::STRUCT, :class => FinagleThrift::Annotation}},
101
- BINARY_ANNOTATIONS => {:type => ::Thrift::Types::LIST, :name => 'binary_annotations', :element => {:type => ::Thrift::Types::STRUCT, :class => FinagleThrift::BinaryAnnotation}}
104
+ BINARY_ANNOTATIONS => {:type => ::Thrift::Types::LIST, :name => 'binary_annotations', :element => {:type => ::Thrift::Types::STRUCT, :class => FinagleThrift::BinaryAnnotation}},
105
+ DEBUG => {:type => ::Thrift::Types::BOOL, :name => 'debug'}
102
106
  }
103
107
 
104
108
  def struct_fields; FIELDS; end
@@ -134,17 +138,17 @@ module FinagleThrift
134
138
  TRACE_ID = 1
135
139
  SPAN_ID = 2
136
140
  PARENT_SPAN_ID = 3
137
- DEBUG = 4
138
141
  SAMPLED = 5
139
142
  CLIENT_ID = 6
143
+ FLAGS = 7
140
144
 
141
145
  FIELDS = {
142
146
  TRACE_ID => {:type => ::Thrift::Types::I64, :name => 'trace_id'},
143
147
  SPAN_ID => {:type => ::Thrift::Types::I64, :name => 'span_id'},
144
148
  PARENT_SPAN_ID => {:type => ::Thrift::Types::I64, :name => 'parent_span_id', :optional => true},
145
- DEBUG => {:type => ::Thrift::Types::BOOL, :name => 'debug'},
146
149
  SAMPLED => {:type => ::Thrift::Types::BOOL, :name => 'sampled', :optional => true},
147
- CLIENT_ID => {:type => ::Thrift::Types::STRUCT, :name => 'client_id', :class => FinagleThrift::ClientId, :optional => true}
150
+ CLIENT_ID => {:type => ::Thrift::Types::STRUCT, :name => 'client_id', :class => FinagleThrift::ClientId, :optional => true},
151
+ FLAGS => {:type => ::Thrift::Types::I64, :name => 'flags', :optional => true}
148
152
  }
149
153
 
150
154
  def struct_fields; FIELDS; end
@@ -6,7 +6,7 @@ module Trace
6
6
  def id
7
7
  if stack.empty?
8
8
  span_id = generate_id
9
- trace_id = TraceId.new(span_id, nil, span_id, should_sample?)
9
+ trace_id = TraceId.new(span_id, nil, span_id, should_sample?, Flags::EMPTY)
10
10
  stack.push(trace_id)
11
11
  end
12
12
  stack.last
@@ -33,7 +33,7 @@ module Trace
33
33
  saved_stack = stack.dup
34
34
  yield
35
35
  ensure
36
- @stack = saved
36
+ @stack = saved_stack
37
37
  end
38
38
  end
39
39
  end
@@ -58,23 +58,45 @@ module Trace
58
58
  end
59
59
 
60
60
  class TraceId
61
- attr_reader :trace_id, :parent_id, :span_id, :sampled
62
- alias :sampled? :sampled
63
- def initialize(trace_id, parent_id, span_id, sampled)
61
+ attr_reader :trace_id, :parent_id, :span_id, :sampled, :flags
62
+
63
+ def initialize(trace_id, parent_id, span_id, sampled, flags)
64
64
  @trace_id = SpanId.from_value(trace_id)
65
65
  @parent_id = parent_id.nil? ? nil : SpanId.from_value(parent_id)
66
66
  @span_id = SpanId.from_value(span_id)
67
67
  @sampled = !!sampled
68
+ @flags = flags
68
69
  end
69
70
 
70
71
  def next_id
71
- TraceId.new(@trace_id, @span_id, Trace.generate_id, @sampled)
72
+ TraceId.new(@trace_id, @span_id, Trace.generate_id, @sampled, @flags)
73
+ end
74
+
75
+ # the debug flag is used to ensure the trace passes ALL samplers
76
+ def debug?
77
+ @flags & Flags::DEBUG == Flags::DEBUG
78
+ end
79
+
80
+ def sampled?
81
+ debug? || @sampled
72
82
  end
73
83
 
74
84
  def to_s
75
- "TraceId(trace_id = #{@trace_id.to_s}, parent_id = #{@parent_id.to_s}, span_id = #{@span_id.to_s}, sampled = #{@sampled.to_s})"
85
+ "TraceId(trace_id = #{@trace_id.to_s}, parent_id = #{@parent_id.to_s}, span_id = #{@span_id.to_s}, sampled = #{@sampled.to_s}, flags = #{@flags.to_s})"
76
86
  end
77
87
  end
88
+
89
+ # there are a total of 64 flags that can be passed down with the various tracing headers
90
+ # at the time of writing only one is used (debug).
91
+ #
92
+ # Note that using the 64th bit in Ruby requires some sign conversion since Thrift i64s are signed
93
+ # but Ruby won't do the right thing if you try to set 1 << 64
94
+ class Flags
95
+ # no flags set
96
+ EMPTY = 0
97
+ # the debug flag is used to ensure we pass all the sampling layers and that the trace is stored
98
+ DEBUG = 1
99
+ end
78
100
 
79
101
  class SpanId
80
102
  HEX_REGEX = /^[a-f0-9]{16}$/i
@@ -121,12 +121,13 @@ module Trace
121
121
  end
122
122
 
123
123
  class Span
124
- attr_accessor :name, :annotations, :binary_annotations
124
+ attr_accessor :name, :annotations, :binary_annotations, :debug
125
125
  def initialize(name, span_id)
126
126
  @name = name
127
127
  @span_id = span_id
128
128
  @annotations = []
129
129
  @binary_annotations = []
130
+ @debug = span_id.debug?
130
131
  end
131
132
 
132
133
  def to_thrift
@@ -136,7 +137,8 @@ module Trace
136
137
  :id => @span_id.span_id.to_i,
137
138
  :parent_id => @span_id.parent_id.nil? ? nil : @span_id.parent_id.to_i,
138
139
  :annotations => @annotations.map { |a| a.to_thrift },
139
- :binary_annotations => @binary_annotations.map { |a| a.to_thrift }
140
+ :binary_annotations => @binary_annotations.map { |a| a.to_thrift },
141
+ :debug => @debug
140
142
  )
141
143
  end
142
144
  end
@@ -147,7 +149,8 @@ module Trace
147
149
  SERVER_SEND = "ss"
148
150
  SERVER_RECV = "sr"
149
151
 
150
- attr_reader :value, :host, :timestamp
152
+ # write access for tests
153
+ attr_accessor :value, :host, :timestamp
151
154
  def initialize(value, host)
152
155
  @timestamp = (Time.now.to_f * 1000 * 1000).to_i # micros
153
156
  @value = value
@@ -1,3 +1,3 @@
1
1
  module FinagleThrift
2
- VERSION = "1.2.0"
3
- end
2
+ VERSION = "1.3.1"
3
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: finagle-thrift
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 2
9
- - 0
10
- version: 1.2.0
8
+ - 3
9
+ - 1
10
+ version: 1.3.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Arya Asemanfar
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-05-25 00:00:00 Z
18
+ date: 2013-06-13 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
21
  description: A Ruby client library for integrating into finagle's thrift tracing protocol