Class: ReactOnRailsPro::OpenTelemetry::ClientSpan

Inherits:
Object
  • Object
show all
Defined in:
lib/react_on_rails_pro/open_telemetry.rb,
sig/react_on_rails_pro/open_telemetry.rbs

Instance Method Summary collapse

Constructor Details

#initialize(span, context) ⇒ ClientSpan

Returns a new instance of ClientSpan.

Parameters:

  • span (Object)
  • context (Object)


31
32
33
34
35
36
37
38
39
40
41
# File 'lib/react_on_rails_pro/open_telemetry.rb', line 31

def initialize(span, context)
  @span = span
  @context = context
  @request_body = nil
  @request_size = 0
  @response_size = 0
  @request_sealed = true
  @response_finished = false
  @finished = false
  @finish_mutex = Mutex.new
end

Instance Method Details

#inject(headers) ⇒ Object

Parameters:

  • headers (Array[[String, String]])

Returns:

  • (Object)


48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/react_on_rails_pro/open_telemetry.rb', line 48

def inject(headers)
  carrier = {}
  ::OpenTelemetry::Context.with_current(@context) do
    ::OpenTelemetry.propagation.inject(carrier)
  end
  carrier.each do |name, value|
    next unless TRACE_HEADER_NAMES.include?(name.to_s.downcase)

    set_header(headers, name.to_s, value)
  end
rescue StandardError
  nil
end

#record_response(status) ⇒ Object

Parameters:

  • status (Integer)

Returns:

  • (Object)


62
63
64
65
66
67
# File 'lib/react_on_rails_pro/open_telemetry.rb', line 62

def record_response(status)
  @span.set_attribute(STATUS_ATTRIBUTE, status)
  mark_error if status >= 400 && status != ReactOnRailsPro::STATUS_SEND_BUNDLE
rescue StandardError
  nil
end

#record_response_chunk(chunk) ⇒ Object

Parameters:

  • chunk (String)

Returns:

  • (Object)


69
70
71
72
73
# File 'lib/react_on_rails_pro/open_telemetry.rb', line 69

def record_response_chunk(chunk)
  @response_size += chunk.bytesize
rescue StandardError
  nil
end

#request_body=(body) ⇒ Object

Parameters:

  • body (Object)

Returns:

  • (Object)


43
44
45
46
# File 'lib/react_on_rails_pro/open_telemetry.rb', line 43

def request_body=(body)
  @request_body = body
  @request_size = ReactOnRailsPro::OpenTelemetry.body_size(body)
end

#seal_request_sizeObject

Returns:

  • (Object)


79
80
81
82
83
84
# File 'lib/react_on_rails_pro/open_telemetry.rb', line 79

def seal_request_size
  final_request_size = ReactOnRailsPro::OpenTelemetry.body_size(@request_body)
  @request_size = [@request_size, final_request_size].max
  @request_sealed = true
  finish_if_ready
end

#wait_for_request_closefalse

Returns:

  • (false)


75
76
77
# File 'lib/react_on_rails_pro/open_telemetry.rb', line 75

def wait_for_request_close
  @request_sealed = false
end

#within_context { ... } ⇒ Object

Yields:

Yield Returns:

  • (Object)

Returns:

  • (Object)


86
87
88
89
90
91
92
93
94
95
# File 'lib/react_on_rails_pro/open_telemetry.rb', line 86

def within_context(&)
  ::OpenTelemetry::Context.with_current(@context, &)
rescue StandardError
  @request_sealed = true
  mark_error
  raise
ensure
  @response_finished = true
  finish_if_ready
end