Packages
new_relic_agent
1.27.1
1.40.3
1.40.2
1.40.1
1.40.0
1.39.0
1.38.0
1.37.0
1.36.0
1.35.0
1.34.0
1.33.0
1.32.0
1.31.1
1.31.0
1.30.0
1.29.0
1.28.0
1.27.8
1.27.7
1.27.6
1.27.5
1.27.4
1.27.3
1.27.2
1.27.1
1.27.0
1.26.0
1.25.3
1.25.2
1.25.1
1.25.0
1.24.5
1.24.4
1.24.3
1.24.2
1.24.1
1.24.0
1.24.0-rc.10
1.24.0-rc.9
1.24.0-rc.8
1.24.0-rc.7
1.23.6
1.23.5
1.23.4
1.23.3
1.23.2
1.23.1
1.23.0
1.23.0-rc.6
1.23.0-rc.5
1.23.0-rc.4
1.23.0-rc.3
1.23.0-rc.2
1.23.0-rc.1
1.22.6
1.22.5
1.22.4
1.22.3
1.22.2
1.22.1
1.22.0
1.21.2
1.21.1
1.21.0
1.21.0-rc.3
1.21.0-rc.1
1.20.0
1.20.0-rc.1
1.19.7
1.19.6
1.19.5
1.19.4
1.19.3
1.19.2
1.19.1
1.19.0
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.18.0-rc.5
1.18.0-rc.4
1.18.0-rc.2
1.18.0-rc.1
1.17.1
1.17.0
1.17.0-rc.4
1.17.0-rc.3
1.17.0-rc.2
1.17.0-rc.1
1.17.0-rc.0
1.16.7
1.16.6
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.16.0-rc.2
1.16.0-rc.1
1.16.0-rc.0
1.15.0
1.15.0-rc.3
1.15.0-rc.2
1.15.0-rc.1
1.14.0
1.13.1
1.13.0
1.12.0
1.11.0
1.10.2
1.10.1
1.10.0
1.9.12
1.9.11
1.9.10
1.9.9
1.9.8
1.9.7
1.9.6
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.0
1.7.0
1.6.2
1.6.1
1.6.0
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.0
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
New Relic's Open-Source Elixir Agent
Current section
Files
Jump to
Current section
Files
lib/new_relic/distributed_trace/w3c_trace_context.ex
defmodule NewRelic.DistributedTrace.W3CTraceContext do
@moduledoc false
alias NewRelic.Harvest.Collector.AgentRun
alias NewRelic.DistributedTrace.Context
alias __MODULE__.{TraceParent, TraceState}
@w3c_traceparent "traceparent"
@w3c_tracestate "tracestate"
def extract(headers) do
with traceparent_header <- Map.get(headers, @w3c_traceparent),
tracestate_header <- Map.get(headers, @w3c_tracestate),
%TraceParent{} = traceparent <- TraceParent.decode(traceparent_header),
%TraceState{} = tracestate <- TraceState.decode(tracestate_header) do
case TraceState.restrict_access(tracestate) do
{newrelic, others} ->
NewRelic.report_metric(:supportability, [:trace_context, :accept, :success])
%Context{
source:
{:w3c,
%{
tracestate: :new_relic,
sampled: traceparent.flags.sampled,
others: others,
span_id: newrelic.span_id,
tracing_vendors: Enum.map(others, & &1.key)
}},
type: newrelic.parent_type,
account_id: newrelic.account_id,
app_id: newrelic.app_id,
parent_id: newrelic.transaction_id,
span_guid: traceparent.parent_id,
trace_id: traceparent.trace_id,
trust_key: newrelic.trusted_account_key,
priority: newrelic.priority,
sampled: newrelic.sampled,
timestamp: newrelic.timestamp
}
others ->
NewRelic.report_metric(:supportability, [:trace_context, :accept, :success])
NewRelic.report_metric(:supportability, [:trace_context, :tracestate, :non_new_relic])
%Context{
source:
{:w3c,
%{
tracestate: :non_new_relic,
sampled: traceparent.flags.sampled,
others: others,
tracing_vendors: Enum.map(others, & &1.key)
}},
parent_id: traceparent.parent_id,
span_guid: traceparent.parent_id,
trace_id: traceparent.trace_id,
trust_key: AgentRun.trusted_account_key()
}
end
else
_ ->
NewRelic.report_metric(:supportability, [:trace_context, :accept, :exception])
:bad_trace_context
end
end
def generate(%{source: source} = context) do
{others, traceparent_sampled} =
case source do
{:w3c, %{others: others, sampled: sampled}} -> {others, sampled}
_ -> {[], context.sampled}
end
traceparent =
TraceParent.encode(%TraceParent{
trace_id: context.trace_id,
parent_id: context.span_guid,
flags: %{sampled: traceparent_sampled}
})
tracestate =
TraceState.encode(%TraceState{
members: [
%{
key: :new_relic,
value: %TraceState.NewRelicState{
trusted_account_key: context.trust_key,
parent_type: context.type,
account_id: context.account_id,
app_id: context.app_id,
span_id: context.span_guid,
transaction_id: context.parent_id,
sampled: context.sampled,
priority: context.priority,
timestamp: context.timestamp
}
}
| others
]
})
{traceparent, tracestate}
end
end