Packages
sentry
12.0.0
13.3.0
13.2.0
13.1.0
13.0.1
13.0.0
12.0.3
12.0.2
12.0.1
12.0.0
11.0.4
11.0.3
11.0.2
11.0.1
11.0.0
10.10.0
10.9.0
10.8.1
10.8.0
10.7.1
10.7.0
10.6.2
10.6.1
10.6.0
10.5.0
10.4.0
10.3.0
10.2.1
10.2.0
10.2.0-rc.2
10.2.0-rc.1
10.1.0
10.0.3
10.0.2
10.0.1
10.0.0
9.1.0
9.0.0
8.1.0
8.0.6
8.0.5
8.0.4
8.0.3
8.0.2
8.0.1
8.0.0
8.0.0-rc.2
8.0.0-rc.1
8.0.0-rc.0
retired
7.2.5
7.2.4
7.2.3
7.2.2
7.2.1
7.2.0
7.1.0
7.0.6
7.0.5
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.4.2
6.4.1
6.4.0
6.3.0
6.2.1
6.2.0
6.1.0
6.0.5
6.0.4
6.0.3
6.0.2
6.0.1
6.0.0
5.0.1
5.0.0
4.0.3
4.0.2
4.0.1
4.0.0
3.0.0
2.2.0
2.1.0
2.0.2
2.0.1
2.0.0
1.1.2
1.1.1
1.1.0
1.0.0
0.3.2
0.3.1
0.3.0
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
The Official Elixir client for Sentry
Current section
Files
Jump to
Current section
Files
lib/sentry/transaction.ex
defmodule Sentry.Transaction do
@moduledoc """
The struct for the **transaction** interface.
See <https://develop.sentry.dev/sdk/data-model/event-payloads/transaction/>.
"""
@moduledoc since: "11.0.0"
alias Sentry.{Config, UUID, Interfaces, Interfaces.Span, Interfaces.SDK}
@sdk %Interfaces.SDK{
name: "sentry-elixir",
version: Mix.Project.config()[:version]
}
@typedoc """
A map of measurements.
See
[here](https://github.com/getsentry/sentry/blob/a8c960a933d2ded5225841573d8fc426a482ca9c/static/app/utils/discover/fields.tsx#L654-L676)
for the list of supported keys (which could change in the future).
"""
@typedoc since: "11.0.0"
@type measurements() :: %{
optional(key :: atom()) => %{
required(:value) => number(),
optional(:unit) => String.t()
}
}
@typedoc """
Transaction information.
Should only be set by integrations and not developers directly.
"""
@typedoc since: "11.0.0"
@type transaction_info() :: %{
required(:source) => String.t()
}
@typedoc since: "11.0.0"
@type t() ::
%__MODULE__{
# Required
event_id: UUID.t(),
start_timestamp: String.t() | number(),
timestamp: String.t() | number(),
platform: String.t(),
# See https://develop.sentry.dev/sdk/data-model/event-payloads/contexts/#trace-context
contexts: %{
required(:trace) => %{
required(:trace_id) => String.t(),
required(:span_id) => String.t(),
optional(:parent_span_id) => String.t(),
optional(:op) => String.t(),
optional(:description) => String.t(),
optional(:status) => String.t()
}
},
# Optional
environment: String.t(),
transaction: String.t(),
transaction_info: transaction_info(),
measurements: measurements(),
tags: map(),
data: map(),
# Interfaces
spans: [Span.t()],
sdk: SDK.t()
}
@enforce_keys [:event_id, :span_id, :start_timestamp, :timestamp]
defstruct @enforce_keys ++
[
:spans,
:transaction,
:transaction_info,
:contexts,
:measurements,
:sdk,
:platform,
:environment,
:tags,
:data
]
@doc false
def new(attrs) do
struct!(
__MODULE__,
attrs
|> Map.put(:event_id, UUID.uuid4_hex())
|> Map.put(:environment, Config.environment_name())
|> Map.put(:sdk, @sdk)
|> Map.put(:platform, "elixir")
)
end
@doc false
def to_payload(%__MODULE__{} = transaction) do
transaction
|> Map.from_struct()
|> Map.put(:type, "transaction")
|> update_in([Access.key(:spans, []), Access.all()], &Map.from_struct/1)
end
end