Class: NewRelic::Agent::OpenTelemetry::Trace::Span
- Inherits:
-
OpenTelemetry::Trace::Span
- Object
- OpenTelemetry::Trace::Span
- NewRelic::Agent::OpenTelemetry::Trace::Span
- Defined in:
- lib/new_relic/agent/opentelemetry/trace/span.rb
Instance Attribute Summary collapse
-
#finishable ⇒ Object
Returns the value of attribute finishable.
-
#kind ⇒ Object
Returns the value of attribute kind.
-
#status ⇒ Object
Returns the value of attribute status.
-
#translator ⇒ Object
writeonly
Sets the attribute translator.
Instance Method Summary collapse
- #add_attributes(attributes) ⇒ Object
- #add_event(name, attributes: nil, timestamp: nil) ⇒ Object
- #add_instrumentation_scope(name, version) ⇒ Object
- #add_link(link) ⇒ Object
- #apply_translated_attributes(translated) ⇒ Object
- #finish(end_timestamp: nil) ⇒ Object
- #name=(name) ⇒ Object private
-
#record_exception(exception, attributes: nil) ⇒ Object
TODO: do we need to add a condition for NewRelic::Agent::Tracer.capture_segment_error(segment) if finishable is a segment?.
- #recording? ⇒ Boolean private
- #set_attribute(key, value) ⇒ Object
- #transaction ⇒ Object
Instance Attribute Details
#finishable ⇒ Object
Returns the value of attribute finishable.
10 11 12 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 10 def finishable @finishable end |
#kind ⇒ Object
Returns the value of attribute kind.
11 12 13 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 11 def kind @kind end |
#status ⇒ Object
Returns the value of attribute status.
13 14 15 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 13 def status @status end |
#translator=(value) ⇒ Object (writeonly)
Sets the attribute translator
12 13 14 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 12 def translator=(value) @translator = value end |
Instance Method Details
#add_attributes(attributes) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 23 def add_attributes(attributes) return if attributes.nil? || attributes.empty? if @translator translated = @translator.translate(attributes: attributes, kind: @kind) apply_translated_attributes(translated) else # fallback to adding all attributes to the span as custom NewRelic::Agent.add_custom_span_attributes(attributes) end end |
#add_event(name, attributes: nil, timestamp: nil) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 44 def add_event(name, attributes: nil, timestamp: nil) # This method adds SpanEvent events to a Span event. # A SpanEvent is used to denote a meaningful, singular point in a # Span's duration. return self unless recording? # add_span_event_event lives in OpenTelemetry::AbstractSegmentPatch # and in OpenTelemetry::TransactionPatch finishable&.add_span_event_event(name, attributes: attributes, timestamp: ) self end |
#add_instrumentation_scope(name, version) ⇒ Object
112 113 114 115 116 117 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 112 def add_instrumentation_scope(name, version) return unless transaction transaction.add_agent_attribute('otel.scope.name', name, AttributeFilter::DST_SPAN_EVENTS) transaction.add_agent_attribute('otel.scope.version', version, AttributeFilter::DST_SPAN_EVENTS) end |
#add_link(link) ⇒ Object
35 36 37 38 39 40 41 42 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 35 def add_link(link) return self unless recording? # add_span_link lives in OpenTelemetry::AbstractSegmentPatch # and in OpenTelemetry::TransactionPatch finishable&.add_span_link(link) self end |
#apply_translated_attributes(translated) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 56 def apply_translated_attributes(translated) translated[:instance_variable].each do |key, value| sym_key = "@#{key}".to_sym finishable.instance_variable_set(sym_key, value) end translated[:intrinsic].each do |key, value| finishable.attributes.add_intrinsic_attribute(key, value) end translated[:agent].each do |key, attr_data| finishable.attributes.add_agent_attribute(key, attr_data[:value], attr_data[:destinations]) end NewRelic::Agent.add_custom_span_attributes(translated[:custom]) unless translated[:custom].empty? end |
#finish(end_timestamp: nil) ⇒ Object
15 16 17 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 15 def finish(end_timestamp: nil) finishable&.finish end |
#name=(name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 87 def name=(name) if recording? # overridden_name has slightly higher precedence than # set_transaction_name, but still has a small chance of being # overruled by other transaction naming operations if a # @frozen_name has already been set. See Transaction#best_name. if finishable.is_a?(NewRelic::Agent::Transaction) finishable.overridden_name = name # New Relic doesn't allow customers to rename segments # so this method is just to deal with the OTel APIs that may # try to rename a span after it's created. elsif finishable.is_a?(NewRelic::Agent::Transaction::Segment) finishable.instance_variable_set(:@name, name) end else NewRelic::Agent.logger.warn('Calling name= on a finished OpenTelemetry Span') end end |
#record_exception(exception, attributes: nil) ⇒ Object
TODO: do we need to add a condition for NewRelic::Agent::Tracer.capture_segment_error(segment) if finishable is a segment?
74 75 76 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 74 def record_exception(exception, attributes: nil) NewRelic::Agent.notice_error(exception, attributes: attributes) end |
#recording? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
79 80 81 82 83 84 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 79 def recording? # in OTel, the recording? method checks for the end time on a span # The closest method we have to this is finished? which exists on # both transactions and segments. !finishable&.finished? end |
#set_attribute(key, value) ⇒ Object
19 20 21 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 19 def set_attribute(key, value) add_attributes(key => value) end |
#transaction ⇒ Object
106 107 108 109 110 |
# File 'lib/new_relic/agent/opentelemetry/trace/span.rb', line 106 def transaction return nil unless finishable @transaction ||= finishable.is_a?(Transaction) ? finishable : finishable.transaction end |