module NewRelic::Agent::Transaction::TraceContext
Constants
- ACCEPT_EXCEPTION_METRIC
- ACCEPT_PREFIX
- ACCEPT_SUCCESS_METRIC
- CREATE_EXCEPTION_METRIC
- CREATE_PREFIX
- CREATE_SUCCESS_METRIC
- IGNORE_ACCEPT_AFTER_CREATE_METRIC
- IGNORE_MULTIPLE_ACCEPT_METRIC
- INVALID_TRACESTATE_PAYLOAD_METRIC
- NO_NR_ENTRY_TRACESTATE_METRIC
- SUPPORTABILITY_PREFIX
- TRACESTATE_PREFIX
Attributes
Public Instance Methods
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 128 def accept_trace_context(header_data) return if ignore_trace_context? @trace_context_header_data = header_data transaction.trace_id = header_data.trace_id transaction.parent_span_id = header_data.parent_id return false unless payload = assign_trace_state_payload transaction.distributed_tracer.parent_transaction_id = payload.transaction_id determine_sampling_decision(payload, header_data) NewRelic::Agent.increment_metric(ACCEPT_SUCCESS_METRIC) true rescue => e NewRelic::Agent.increment_metric(ACCEPT_EXCEPTION_METRIC) NewRelic::Agent.logger.warn('Failed to accept trace context payload', e) false end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 115 def assign_trace_state_payload payload = @trace_context_header_data.trace_state_payload unless payload NewRelic::Agent.increment_metric(NO_NR_ENTRY_TRACESTATE_METRIC) return false end unless payload.valid? NewRelic::Agent.increment_metric(INVALID_TRACESTATE_PAYLOAD_METRIC) return false end @trace_state_payload = payload end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 80 def create_trace_state entry_key = AccountHelpers.trace_state_entry_key.dup payload = create_trace_state_payload if payload entry = NewRelic::Agent::DistributedTracing::TraceContext.create_trace_state_entry( \ entry_key, payload.to_s ) else entry = NewRelic::EMPTY_STR end trace_context_header_data ? trace_context_header_data.trace_state(entry) : entry end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 96 def create_trace_state_payload unless Agent.config[:'distributed_tracing.enabled'] NewRelic::Agent.logger.warn('Not configured to create W3C trace context payload') return end span_guid = Agent.config[:'span_events.enabled'] ? transaction.current_segment.guid : nil transaction_guid = Agent.config[:'transaction_events.enabled'] ? transaction.guid : nil TraceContextPayload.create( \ parent_account_id: Agent.config[:account_id], parent_app_id: Agent.config[:primary_application_id], transaction_id: transaction_guid, sampled: transaction.sampled?, priority: float!(transaction.priority, NewRelic::PRIORITY_PRECISION), id: span_guid ) end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 149 def determine_sampling_decision(payload, header_data) if header_data.trace_parent['trace_flags'] == '01' set_priority_and_sampled(NewRelic::Agent.config[:'distributed_tracing.sampler.remote_parent_sampled'], payload) elsif header_data.trace_parent['trace_flags'] == '00' set_priority_and_sampled(NewRelic::Agent.config[:'distributed_tracing.sampler.remote_parent_not_sampled'], payload) else use_nr_tracestate_sampled(payload) end rescue use_nr_tracestate_sampled(payload) end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 180 def ignore_trace_context? if trace_context_header_data NewRelic::Agent.increment_metric(IGNORE_MULTIPLE_ACCEPT_METRIC) return true elsif trace_context_inserted? NewRelic::Agent.increment_metric(IGNORE_ACCEPT_AFTER_CREATE_METRIC) return true end false end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 58 def insert_trace_context_header(header, format = NewRelic::FORMAT_NON_RACK) return unless Agent.config[:'distributed_tracing.enabled'] NewRelic::Agent::DistributedTracing::TraceContext.insert( \ format: format, carrier: header, trace_id: transaction.trace_id.rjust(32, '0').downcase, parent_id: transaction.current_segment.guid, trace_flags: transaction.sampled? ? 0x1 : 0x0, trace_state: create_trace_state ) @trace_context_inserted = true NewRelic::Agent.increment_metric(CREATE_SUCCESS_METRIC) true rescue Exception => e NewRelic::Agent.increment_metric(CREATE_EXCEPTION_METRIC) NewRelic::Agent.logger.warn('Failed to create trace context payload', e) false end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 168 def set_priority_and_sampled(config, payload) if config == 'always_on' transaction.sampled = true transaction.priority = 2.0 elsif config == 'always_off' transaction.sampled = false transaction.priority = 0 else # default use_nr_tracestate_sampled(payload) end end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 191 def trace_context_inserted? @trace_context_inserted ||= false end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 42 def trace_parent_header_present?(request) request[NewRelic::HTTP_TRACEPARENT_KEY] end
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 161 def use_nr_tracestate_sampled(payload) unless payload.sampled.nil? transaction.sampled = payload.sampled transaction.priority = payload.priority if payload.priority end end
Private Instance Methods
Source
# File lib/new_relic/agent/transaction/trace_context.rb, line 46 def accept_trace_context_incoming_request(request) header_data = NewRelic::Agent::DistributedTracing::TraceContext.parse( format: NewRelic::FORMAT_RACK, carrier: request, trace_state_entry_key: AccountHelpers.trace_state_entry_key ) return if header_data.nil? accept_trace_context(header_data) end