Packages
new_relic_agent
1.18.4
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/span/event.ex
defmodule NewRelic.Span.Event do
# Struct for a Span Event
#
# * trace_id: Distributed Trace ID
# - trace_id from Transaction
# * guid: Segment Identifier
# * parent_id: Segment's Parent's GUID
# - id of incoming DT payload OR `guid` of parent segment
# * transaction_id: Transaction's guid
# * timestamp: Segment start in unix timestamp milliseconds
# * duration: Segment elapsed in seconds
# * category: http | datastore | generic
# * entry_point: Only included if span is First segment
defstruct type: "Span",
trace_id: nil,
guid: nil,
parent_id: nil,
transaction_id: nil,
sampled: nil,
priority: nil,
timestamp: nil,
duration: nil,
name: nil,
category: nil,
entry_point: false,
category_attributes: %{}
@moduledoc false
def format_events(spans) do
Enum.map(spans, &format_event/1)
end
def format_event(%__MODULE__{} = span) do
intrinsics =
%{
type: span.type,
traceId: span.trace_id,
guid: span.guid,
parentId: span.parent_id,
transactionId: span.transaction_id,
sampled: span.sampled,
priority: span.priority,
timestamp: span.timestamp,
duration: span.duration,
name: span.name,
category: span.category
}
|> merge_category_attributes(span.category_attributes)
intrinsics =
case span.entry_point do
true -> Map.merge(intrinsics, %{"nr.entryPoint": true})
false -> intrinsics
end
[
intrinsics,
_user = %{},
_agent = %{}
]
end
def merge_category_attributes(%{category: "http"} = span, category_attributes) do
{category, custom} = Map.split(category_attributes, [:url, :method, :component])
span
|> Map.merge(%{
"http.url": category[:url] || "url",
"http.method": category[:method] || "method",
component: category[:component] || "component",
"span.kind": "client"
})
|> Map.merge(custom)
end
def merge_category_attributes(%{category: "datastore"} = span, category_attributes) do
{category, custom} =
Map.split(category_attributes, [:statement, :instance, :address, :hostname, :component])
span
|> Map.merge(%{
"db.statement": category[:statement] || "statement",
"db.instance": category[:instance] || "instance",
"peer.address": category[:address] || "address",
"peer.hostname": category[:hostname] || "hostname",
component: category[:component] || "component",
"span.kind": "client"
})
|> Map.merge(custom)
end
def merge_category_attributes(span, category_attributes),
do:
Map.merge(
span,
category_attributes,
# Don't overwrite existing span keys with custom values
fn _k, v1, _v2 -> v1 end
)
end