class Aws::Xray::Context
Constants
- VAR_NAME
Attributes
Public Class Methods
@return [Aws::Xray::Context]
# File lib/aws/xray/context.rb, line 11 def current Thread.current.thread_variable_get(VAR_NAME) || raise(NotSetError) end
# File lib/aws/xray/context.rb, line 52 def initialize(name, trace, base_segment_id = nil) raise 'name is required' unless name @name = name @trace = trace @base_segment_id = base_segment_id @disabled_ids = [] @subsegment_name = nil end
@return [Boolean]
# File lib/aws/xray/context.rb, line 24 def started? !!Thread.current.thread_variable_get(VAR_NAME) end
@param [Aws::Xray::Context] context
# File lib/aws/xray/context.rb, line 16 def with_given_context(context) Thread.current.thread_variable_set(VAR_NAME, context) yield ensure remove_current end
@param [String] name logical name of this tracing context. @param [Aws::Xray::Trace] trace newly generated trace or created with
HTTP request header.
@yield [Aws::Xray::Context] newly created context.
# File lib/aws/xray/context.rb, line 32 def with_new_context(name, trace) build_current(name, trace) yield ensure remove_current end
Private Class Methods
# File lib/aws/xray/context.rb, line 41 def build_current(name, trace) Thread.current.thread_variable_set(VAR_NAME, Context.new(name, trace)) end
# File lib/aws/xray/context.rb, line 45 def remove_current Thread.current.thread_variable_set(VAR_NAME, nil) end
Public Instance Methods
Curretly context object is thread safe, so copying is not necessary, but in case we need this, offer copy interface for multi threaded environment.
Trace
should be imutable and thread-safe.
See README for example.
# File lib/aws/xray/context.rb, line 68 def copy self.class.new(@name.dup, @trace.copy, @base_segment_id ? @base_segment_id.dup : nil) end
Use `Aws::Xray.disable_trace` instead of this. @param [Symbol] id must be unique between tracing methods.
# File lib/aws/xray/context.rb, line 114 def disable_trace(id) @disabled_ids << id begin yield ensure @disabled_ids.delete(id) end end
Use `Aws::Xray.disabled?` instead of this. @param [Symbol] id @return [Boolean]
# File lib/aws/xray/context.rb, line 127 def disabled?(id) @disabled_ids.include?(id) end
@param [String] name
# File lib/aws/xray/context.rb, line 132 def overwrite(name:) return yield if @subsegment_name @subsegment_name = name.to_s begin yield ensure @subsegment_name = nil end end
Use `Aws::Xray.trace` instead of this. @yield [Aws::Xray::Segment] @return [Object] A value which given block returns.
# File lib/aws/xray/context.rb, line 75 def start_segment base_segment = Segment.build(@name, @trace) @base_segment_id = base_segment.id begin yield base_segment rescue Exception => e base_segment.set_error(fault: true, e: e) raise e ensure base_segment.finish unless base_segment.finished? Client.send_segment(base_segment) if @trace.sampled? end end
Use `Aws::Xray.start_subsegment` instead of this. @param [Boolean] remote @param [String] name Arbitrary name of the sub segment. e.g. “funccall_f”. @yield [Aws::Xray::Subsegment] @return [Object] A value which given block returns.
# File lib/aws/xray/context.rb, line 96 def start_subsegment(remote:, name:) raise SegmentDidNotStartError unless @base_segment_id sub = Subsegment.build(@trace, @base_segment_id, remote: remote, name: overwrite_name(name)) begin yield sub rescue Exception => e sub.set_error(fault: true, e: e) raise e ensure sub.finish unless sub.finished? Client.send_segment(sub) if @trace.sampled? end end
Private Instance Methods
# File lib/aws/xray/context.rb, line 146 def overwrite_name(name) return name unless @subsegment_name name = @subsegment_name @subsegment_name = nil name end