Current section

Files

Jump to
new_relic_agent lib new_relic transaction trace.ex
Raw

lib/new_relic/transaction/trace.ex

defmodule NewRelic.Transaction.Trace do
defstruct start_time: nil,
metric_name: nil,
request_url: nil,
attributes: %{},
segments: [],
duration: nil,
cat_guid: "",
reserved_for_future_use: nil,
force_persist_flag: false,
xray_session_id: nil,
synthetics_resource_id: ""
@moduledoc false
defmodule Segment do
defstruct relative_start_time: nil,
relative_end_time: nil,
metric_name: nil,
attributes: %{},
children: [],
class_name: nil,
method_name: nil,
parent_id: nil,
id: nil,
pid: nil
@moduledoc false
end
@unused_map %{}
def format_traces(traces) do
Enum.map(traces, &format_trace/1)
end
defp format_trace(%__MODULE__{} = trace) do
trace_segments = format_segments(trace)
trace_details = [trace.start_time, @unused_map, @unused_map, trace_segments, trace.attributes]
[
trace.start_time,
trace.duration,
trace.metric_name,
trace.request_url,
trace_details,
trace.cat_guid,
trace.reserved_for_future_use,
trace.force_persist_flag,
trace.xray_session_id,
trace.synthetics_resource_id
]
end
defp format_segments(%{
segments: [first_segment | _] = segments,
duration: duration,
metric_name: metric_name
}) do
attributes = first_segment.attributes |> NewRelic.Util.coerce_attributes()
[
0,
duration,
metric_name,
attributes,
Enum.map(segments, &format_child_segments/1)
]
end
defp format_child_segments(%Segment{} = segment) do
[
segment.relative_start_time,
segment.relative_end_time,
segment.metric_name,
segment.attributes |> NewRelic.Util.coerce_attributes(),
Enum.map(segment.children, &format_child_segments/1),
segment.class_name,
segment.method_name
]
end
end