View Source Sentry.Context (sentry v8.1.0)
Provides functionality to store user, tags, extra, and breadcrumbs context when an event is reported. The contexts will be fetched and merged into the event when it is sent.
When calling Sentry.Context, Logger metadata is used to store this state. This imposes some limitations. The metadata will only exist within the current process, and the context will die with the process.
For example, if you add context inside your controller and an error happens in a Task, that context will not be included.
A common use-case is to set context within Plug or Phoenix applications, as each request is its own process, and so any stored context will be included should an error be reported within that request process. Example:
# post_controller.ex
def index(conn, _params) do
Sentry.Context.set_user_context(%{id: conn.assigns.user_id})
posts = Blog.list_posts()
render(conn, "index.html", posts: posts)
end
It should be noted that the set_*_context/1
functions merge with the
existing context rather than entirely overwriting it.
Link to this section Summary
Functions
Adds a new breadcrumb to the :breadcrumb
context, specific to the current
process.
Clears all existing context for the current process.
Returns the keys used to store context in the current Process's process dictionary.
Retrieves all currently set context on the current process.
Merges new fields into the :extra
context, specific to the current process.
Merges new fields into the :request
context, specific to the current
process.
Merges new fields into the :tags
context, specific to the current process.
Merges new fields into the :user
context, specific to the current process.
Link to this section Functions
Adds a new breadcrumb to the :breadcrumb
context, specific to the current
process.
Breadcrumbs are used to record a series of events that led to a specific instance of an error. Breadcrumbs can contain arbitrary key data to assist in understanding what happened before an error occurred.
example
Example
iex> Sentry.Context.add_breadcrumb(message: "first_event")
:ok
iex> Sentry.Context.add_breadcrumb(%{message: "second_event", type: "auth"})
%{breadcrumbs: [%{:message => "first_event", "timestamp" => 1562007480}]}
iex> Sentry.Context.add_breadcrumb(%{message: "response"})
%{
breadcrumbs: [
%{:message => "second_event", :type => "auth", "timestamp" => 1562007505},
%{:message => "first_event", "timestamp" => 1562007480}
]
}
iex> Sentry.Context.get_all()
%{
breadcrumbs: [
%{:message => "first_event", "timestamp" => 1562007480},
%{:message => "second_event", :type => "auth", "timestamp" => 1562007505},
%{:message => "response", "timestamp" => 1562007517}
],
extra: %{},
request: %{},
tags: %{},
user: %{}
}
Clears all existing context for the current process.
example
Example
iex> Sentry.Context.set_tags_context(%{id: 123})
:ok
iex> Sentry.Context.clear_all()
:ok
iex> Sentry.Context.get_all()
%{breadcrumbs: [], extra: %{}, request: %{}, tags: %{}, user: %{}}
@spec context_keys() :: [atom()]
Returns the keys used to store context in the current Process's process dictionary.
example
Example
iex> Sentry.Context.context_keys()
[:breadcrumbs, :tags, :user, :extra]
Retrieves all currently set context on the current process.
example
Example
iex> Sentry.Context.set_user_context(%{id: 123})
iex> Sentry.Context.set_tags_context(%{message_id: 456})
iex> Sentry.Context.get_all()
%{
user: %{id: 123},
tags: %{message_id: 456},
extra: %{},
request: %{},
breadcrumbs: []
}
@spec set_extra_context(map()) :: :ok
Merges new fields into the :extra
context, specific to the current process.
This is used to set fields which should display when looking at a specific instance of an error.
example
Example
iex> Sentry.Context.set_extra_context(%{id: 123})
:ok
iex> Sentry.Context.set_extra_context(%{detail: "bad_error"})
:ok
iex> Sentry.Context.set_extra_context(%{message: "Oh no"})
:ok
iex> Sentry.Context.get_all()
%{
user: %{},
tags: %{},
extra: %{detail: "bad_error", id: 123, message: "Oh no"},
request: %{},
breadcrumbs: []
}
@spec set_request_context(map()) :: :ok
Merges new fields into the :request
context, specific to the current
process.
This is used to set metadata that identifies the request associated with a specific instance of an error.
example
Example
iex(1)> Sentry.Context.set_request_context(%{id: 123})
:ok
iex(2)> Sentry.Context.set_request_context(%{url: "www.example.com"})
:ok
iex(3)> Sentry.Context.get_all()
%{
breadcrumbs: [],
extra: %{},
request: %{id: 123, url: "www.example.com"},
tags: %{},
user: %{}
}
@spec set_tags_context(map()) :: :ok
Merges new fields into the :tags
context, specific to the current process.
This is used to set fields which should display when looking at a specific instance of an error. These fields can also be used to search and filter on.
example
Example
iex> Sentry.Context.set_tags_context(%{id: 123})
:ok
iex> Sentry.Context.set_tags_context(%{other_id: 456})
:ok
iex> Sentry.Context.get_all()
%{
breadcrumbs: [],
extra: %{},
request: %{},
tags: %{id: 123, other_id: 456},
user: %{}
}
@spec set_user_context(map()) :: :ok
Merges new fields into the :user
context, specific to the current process.
This is used to set certain fields which identify the actor who experienced a specific instance of an error.
example
Example
iex> Sentry.Context.set_user_context(%{id: 123})
:ok
iex> Sentry.Context.set_user_context(%{username: "george"})
:ok
iex> Sentry.Context.get_all()
%{
user: %{id: 123, username: "george"},
tags: %{},
extra: %{},
request: %{},
breadcrumbs: []
}