Class: Instana::Span
- Inherits:
-
Object
- Object
- Instana::Span
- Defined in:
- lib/instana/tracing/span.rb
Constant Summary collapse
- REGISTERED_SPANS =
[ :actioncontroller, :actionview, :activerecord, :excon, :memcache, :'net-http', :rack, :render, :'rpc-client', :'rpc-server', :'sidekiq-client', :'sidekiq-worker', :redis, :'resque-client', :'resque-worker' ].freeze
- ENTRY_SPANS =
[ :rack, :'resque-worker', :'rpc-server', :'sidekiq-worker' ].freeze
- EXIT_SPANS =
[ :activerecord, :excon, :'net-http', :'resque-client', :'rpc-client', :'sidekiq-client', :redis ].freeze
- HTTP_SPANS =
[ :rack, :excon, :'net-http' ].freeze
Instance Attribute Summary collapse
-
#baggage ⇒ Object
Returns the value of attribute baggage.
-
#parent ⇒ Object
Returns the value of attribute parent.
Instance Method Summary collapse
-
#[](key) ⇒ Object
Hash accessor to the internal @data hash.
-
#[]=(key, value) ⇒ Object
Hash setter to the internal @data hash.
-
#add_error(e) ⇒ Object
Log an error into the span.
-
#add_stack(limit: nil, stack: Kernel.caller) ⇒ Object
Adds a backtrace to this span.
-
#close(end_time = ::Instana::Util.now_in_ms) ⇒ Span
Closes out the span.
-
#configure_custom(name) ⇒ Object
Configure this span to be a custom span per the SDK generic span type.
-
#context ⇒ Instana::SpanContext
Retrieve the context of this span.
-
#custom? ⇒ Boolean
Indicates whether this span is a custom or registered Span.
-
#duration ⇒ Integer
Get the duration value for this Span.
-
#finish(end_time = ::Instana::Util.now_in_ms) ⇒ Object
Finish the Span Spec: OpenTracing API.
-
#get_baggage_item(key) ⇒ Object
Get a baggage item Spec: OpenTracing API.
-
#id ⇒ Integer
Retrieve the ID for this span.
-
#initialize(name, trace_id, parent_id: nil, start_time: ::Instana::Util.now_in_ms) ⇒ Span
constructor
A new instance of Span.
- #inspect ⇒ Object
-
#is_root? ⇒ Boolean
Indicates whether this span in the root span in the Trace.
-
#key?(k) ⇒ Boolean
Hash key query to the internal @data hash.
-
#log(event = nil, timestamp = Time.now, **fields) ⇒ Object
Add a log entry to this span Spec: OpenTracing API.
-
#name ⇒ String
Get the name (operation) of this Span.
-
#name=(n) ⇒ Object
Set the name (operation) for this Span.
-
#operation_name=(name) ⇒ Object
Set the name of the operation Spec: OpenTracing API.
-
#parent_id ⇒ Integer
Retrieve the parent ID of this span.
-
#parent_id=(id) ⇒ Integer
Set the parent ID of this span.
-
#raw ⇒ Object
Get the raw @data hash that summarizes this span.
-
#set_baggage_item(key, value) ⇒ Object
Set a baggage item on the span Spec: OpenTracing API.
-
#set_tag(key, value) ⇒ Object
Set a tag value on this span Spec: OpenTracing API.
-
#set_tags(tags) ⇒ Span
Helper method to add multiple tags to this span.
-
#tags(key = nil) ⇒ Object
Retrieve the hash of tags for this span.
-
#trace_id ⇒ Integer
Retrieve the Trace ID for this span.
Constructor Details
#initialize(name, trace_id, parent_id: nil, start_time: ::Instana::Util.now_in_ms) ⇒ Span
Returns a new instance of Span.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/instana/tracing/span.rb', line 15 def initialize(name, trace_id, parent_id: nil, start_time: ::Instana::Util.now_in_ms) @data = {} @data[:t] = trace_id # Trace ID @data[:s] = ::Instana::Util.generate_id # Span ID @data[:p] = parent_id if parent_id # Parent ID @data[:ta] = :ruby # Agent @data[:data] = {} # Entity Source @data[:f] = { :e => ::Instana.agent.report_pid, :h => ::Instana.agent.agent_uuid } # Start time if start_time.is_a?(Time) @data[:ts] = ::Instana::Util.time_to_ms(start_time) else @data[:ts] = start_time end @baggage = {} if ::Instana.config[:collect_backtraces] # For entry spans, add a backtrace fingerprint add_stack(limit: 2) if ENTRY_SPANS.include?(name) # Attach a backtrace to all exit spans add_stack if EXIT_SPANS.include?(name) end # Check for custom tracing if REGISTERED_SPANS.include?(name.to_sym) @data[:n] = name.to_sym else configure_custom(name) end end |
Instance Attribute Details
#baggage ⇒ Object
Returns the value of attribute baggage.
13 14 15 |
# File 'lib/instana/tracing/span.rb', line 13 def baggage @baggage end |
#parent ⇒ Object
Returns the value of attribute parent.
12 13 14 |
# File 'lib/instana/tracing/span.rb', line 12 def parent @parent end |
Instance Method Details
#[](key) ⇒ Object
Hash accessor to the internal @data hash
226 227 228 |
# File 'lib/instana/tracing/span.rb', line 226 def [](key) @data[key.to_sym] end |
#[]=(key, value) ⇒ Object
Hash setter to the internal @data hash
232 233 234 |
# File 'lib/instana/tracing/span.rb', line 232 def []=(key, value) @data[key.to_sym] = value end |
#add_error(e) ⇒ Object
Log an error into the span
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/instana/tracing/span.rb', line 83 def add_error(e) @data[:error] = true if @data.key?(:ec) @data[:ec] = @data[:ec] + 1 else @data[:ec] = 1 end # If a valid exception has been passed in, log the information about it # In case of just logging an error for things such as HTTP client 5xx # responses, an exception/backtrace may not exist. if e if e.backtrace.is_a?(Array) add_stack(stack: e.backtrace) end if HTTP_SPANS.include?(@data[:n]) (:http => { :error => "#{e.class}: #{e.message}" }) else log(:error, Time.now, { :message => e., :parameters => e.class.to_s }) end e.instance_variable_set(:@instana_logged, true) end self end |
#add_stack(limit: nil, stack: Kernel.caller) ⇒ Object
Adds a backtrace to this span
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/instana/tracing/span.rb', line 55 def add_stack(limit: nil, stack: Kernel.caller) frame_count = 0 @data[:stack] = [] stack.each do |i| # If the stack has the full instana gem version in it's path # then don't include that frame. Also don't exclude the Rack module. if !i.match(/instana\/instrumentation\/rack.rb/).nil? || (i.match(::Instana::VERSION_FULL).nil? && i.match('lib/instana/').nil?) break if limit && frame_count >= limit x = i.split(':') @data[:stack] << { :c => x[0], :n => x[1], :m => x[2] } frame_count = frame_count + 1 if limit end end end |
#close(end_time = ::Instana::Util.now_in_ms) ⇒ Span
Closes out the span. This difference between this and the finish method tells us how the tracing is being performed (with OpenTracing or Instana default)
135 136 137 138 139 140 141 142 143 |
# File 'lib/instana/tracing/span.rb', line 135 def close(end_time = ::Instana::Util.now_in_ms) if end_time.is_a?(Time) end_time = ::Instana::Util.time_to_ms(end_time) end @data[:d] = end_time - @data[:ts] self end |
#configure_custom(name) ⇒ Object
Configure this span to be a custom span per the SDK generic span type.
Default to an intermediate kind span. Can be overridden by setting a span.kind tag.
120 121 122 123 124 125 126 |
# File 'lib/instana/tracing/span.rb', line 120 def configure_custom(name) @data[:n] = :sdk @data[:k] = :intermediate @data[:data] = { :sdk => { :name => name.to_sym, :type => :intermediate } } @data[:data][:sdk][:custom] = { :tags => {}, :logs => {} } self end |
#context ⇒ Instana::SpanContext
Retrieve the context of this span.
153 154 155 |
# File 'lib/instana/tracing/span.rb', line 153 def context @context ||= ::Instana::SpanContext.new(@data[:t], @data[:s], @baggage) end |
#custom? ⇒ Boolean
Indicates whether this span is a custom or registered Span
249 250 251 |
# File 'lib/instana/tracing/span.rb', line 249 def custom? @data[:n] == :sdk end |
#duration ⇒ Integer
Get the duration value for this Span
211 212 213 |
# File 'lib/instana/tracing/span.rb', line 211 def duration @data[:d] end |
#finish(end_time = ::Instana::Util.now_in_ms) ⇒ Object
Finish the Instana::Span Spec: OpenTracing API
381 382 383 384 385 386 387 388 389 390 391 392 393 394 |
# File 'lib/instana/tracing/span.rb', line 381 def finish(end_time = ::Instana::Util.now_in_ms) if ::Instana.tracer.current_span.id != id ::Instana.logger.debug "Closing a span that isn't active. This will result in a broken trace: #{self.inspect}" end if is_root? # This is the root span for the trace. Call log_end to close # out and queue the trace ::Instana.tracer.log_end(name, {}, end_time) else ::Instana.tracer.current_trace.end_span({}, end_time) end self end |
#get_baggage_item(key) ⇒ Object
Get a baggage item Spec: OpenTracing API
342 343 344 |
# File 'lib/instana/tracing/span.rb', line 342 def get_baggage_item(key) @baggage[key] end |
#id ⇒ Integer
Retrieve the ID for this span
160 161 162 |
# File 'lib/instana/tracing/span.rb', line 160 def id @data[:s] end |
#inspect ⇒ Object
253 254 255 |
# File 'lib/instana/tracing/span.rb', line 253 def inspect @data.inspect end |
#is_root? ⇒ Boolean
Indicates whether this span in the root span in the Trace
220 221 222 |
# File 'lib/instana/tracing/span.rb', line 220 def is_root? @data[:s] == @data[:t] end |
#key?(k) ⇒ Boolean
Hash key query to the internal @data hash
238 239 240 |
# File 'lib/instana/tracing/span.rb', line 238 def key?(k) @data.key?(k.to_sym) end |
#log(event = nil, timestamp = Time.now, **fields) ⇒ Object
Add a log entry to this span Spec: OpenTracing API
364 365 366 367 368 369 370 371 372 373 374 |
# File 'lib/instana/tracing/span.rb', line 364 def log(event = nil, = Time.now, **fields) ts = ::Instana::Util.time_to_ms().to_s if custom? @data[:data][:sdk][:custom][:logs][ts] = fields @data[:data][:sdk][:custom][:logs][ts][:event] = event else (:log => fields) end rescue StandardError => e Instana.logger.debug "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" end |
#name ⇒ String
Get the name (operation) of this Span
188 189 190 191 192 193 194 |
# File 'lib/instana/tracing/span.rb', line 188 def name if custom? @data[:data][:sdk][:name] else @data[:n] end end |
#name=(n) ⇒ Object
Set the name (operation) for this Span
200 201 202 203 204 205 206 |
# File 'lib/instana/tracing/span.rb', line 200 def name=(n) if custom? @data[:data][:sdk][:name] = n else @data[:n] = n end end |
#operation_name=(name) ⇒ Object
Set the name of the operation Spec: OpenTracing API
266 267 268 |
# File 'lib/instana/tracing/span.rb', line 266 def operation_name=(name) @data[:n] = name end |
#parent_id ⇒ Integer
Retrieve the parent ID of this span
174 175 176 |
# File 'lib/instana/tracing/span.rb', line 174 def parent_id @data[:p] end |
#parent_id=(id) ⇒ Integer
Set the parent ID of this span
181 182 183 |
# File 'lib/instana/tracing/span.rb', line 181 def parent_id=(id) @data[:p] = id end |
#raw ⇒ Object
Get the raw @data hash that summarizes this span
244 245 246 |
# File 'lib/instana/tracing/span.rb', line 244 def raw @data end |
#set_baggage_item(key, value) ⇒ Object
Set a baggage item on the span Spec: OpenTracing API
323 324 325 326 327 328 329 330 331 332 333 334 |
# File 'lib/instana/tracing/span.rb', line 323 def set_baggage_item(key, value) @baggage ||= {} @baggage[key] = value # Init/Update the SpanContext item if @context @context.baggage = @baggage else @context ||= ::Instana::SpanContext.new(@data[:t], @data[:s], @baggage) end self end |
#set_tag(key, value) ⇒ Object
Set a tag value on this span Spec: OpenTracing API
a String, Numeric, or Boolean it will be encoded with to_s
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 |
# File 'lib/instana/tracing/span.rb', line 277 def set_tag(key, value) if custom? @data[:data][:sdk][:custom] ||= {} @data[:data][:sdk][:custom][:tags] ||= {} @data[:data][:sdk][:custom][:tags][key] = value if key.to_sym == :'span.kind' case value.to_sym when :server, :consumer @data[:data][:sdk][:type] = @data[:k] = :entry when :client, :producer @data[:data][:sdk][:type] = @data[:k] = :exit else @data[:data][:sdk][:type] = @data[:k] = :intermediate end end else if !@data[:data].key?(key) @data[:data][key] = value elsif value.is_a?(Hash) && self[:data][key].is_a?(Hash) @data[:data][key].merge!(value) else @data[:data][key] = value end end self end |
#set_tags(tags) ⇒ Span
Helper method to add multiple tags to this span
310 311 312 313 314 315 316 |
# File 'lib/instana/tracing/span.rb', line 310 def () return unless .is_a?(Hash) .each do |k,v| set_tag(k, v) end self end |
#tags(key = nil) ⇒ Object
Retrieve the hash of tags for this span
348 349 350 351 352 353 354 355 |
# File 'lib/instana/tracing/span.rb', line 348 def (key = nil) if custom? = @data[:data][:sdk][:custom][:tags] else = @data[:data][key] end key ? [key] : end |
#trace_id ⇒ Integer
Retrieve the Trace ID for this span
167 168 169 |
# File 'lib/instana/tracing/span.rb', line 167 def trace_id @data[:t] end |