Class: Excon::Middleware::TingYunCrossAppTracing

Inherits:
Object
  • Object
show all
Defined in:
lib/ting_yun/instrumentation/excon.rb

Constant Summary collapse

TRACE_DATA_IVAR =
:@tingyun_trace_data

Instance Method Summary collapse

Constructor Details

#initialize(stack) ⇒ TingYunCrossAppTracing

Returns a new instance of TingYunCrossAppTracing.



84
85
86
# File 'lib/ting_yun/instrumentation/excon.rb', line 84

def initialize(stack)
  @stack = stack
end

Instance Method Details

#error_call(datum) ⇒ Object



113
114
115
116
# File 'lib/ting_yun/instrumentation/excon.rb', line 113

def error_call(datum)
  finish_trace(datum)
  @stack.error_call(datum)
end

#finish_trace(datum) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
# File 'lib/ting_yun/instrumentation/excon.rb', line 118

def finish_trace(datum)
  trace_data = datum[:connection] && datum[:connection].instance_variable_get(TRACE_DATA_IVAR)
  if trace_data
    datum[:connection].instance_variable_set(TRACE_DATA_IVAR, nil)
    t0, segment, wrapped_request = trace_data
    if datum[:response]
      wrapped_response = ::TingYun::Http::ExconHTTPResponse.new(datum[:response])
    end
    TingYun::Agent::CrossAppTracing.finish_trace(TingYun::Agent::TransactionState.tl_get,t0, segment, wrapped_request, wrapped_response )
  end
end

#request_call(datum) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/ting_yun/instrumentation/excon.rb', line 88

def request_call(datum)
  begin
    # Only instrument this request if we haven't already done so, because
    # we can get request_call multiple times for requests marked as
    # :idempotent in the options, but there will be only a single
    # accompanying response_call/error_call.
    if datum[:connection] && !datum[:connection].instance_variable_get(TRACE_DATA_IVAR)
      wrapped_request = ::TingYun::Http::ExconHTTPRequest.new(datum)
      state = TingYun::Agent::TransactionState.tl_get
      t0 = Time.now.to_f
      node = TingYun::Agent::CrossAppTracing.start_trace(state, t0, wrapped_request)

      datum[:connection].instance_variable_set(TRACE_DATA_IVAR, [t0, node, wrapped_request])
    end
  rescue => e
    TingYun::Agent.logger.debug(e)
  end
  @stack.request_call(datum)
end

#response_call(datum) ⇒ Object



108
109
110
111
# File 'lib/ting_yun/instrumentation/excon.rb', line 108

def response_call(datum)
  finish_trace(datum)
  @stack.response_call(datum)
end