defmodule Mix.Tasks.Sentry.SendTestEvent do
use Mix.Task
alias Sentry.Config
@shortdoc "Send a test event to Sentry to check your Sentry configuration"
@moduledoc """
Sends a test event to Sentry to check if your Sentry configuration is correct.
This task reports a `RuntimeError` exception like this one:
%RuntimeError{message: "Testing sending Sentry event"}
## Options
* `--no-compile` - does not compile, even if files require compilation.
"""
@impl true
def run(args) when is_list(args) do
unless "--no-compile" in args do
Mix.Task.run("compile", args)
end
case Application.ensure_all_started(:sentry) do
{:ok, _apps} ->
:ok
{:error, reason} ->
Mix.raise("Failed to start the :sentry application:\n\n#{inspect(reason)}")
end
included_environments =
case Application.fetch_env(:sentry, :included_environments) do
{:ok, envs} when is_list(envs) or envs == :all ->
envs
:error ->
Mix.raise("""
The :included_environments application configuration option is not configured for the \
:sentry application.
""")
end
print_environment_info(Sentry.Transport.get_dsn(), included_environments)
env_name = to_string(Config.environment_name())
if included_environments == :all or env_name in included_environments do
send_event()
else
Mix.shell().info([
:yellow,
"#{inspect(env_name)} is not in #{inspect(included_environments)} so no test event will be sent"
])
end
end
defp print_environment_info({endpoint, public_key, secret_key}, included_environments) do
Mix.shell().info("Client configuration:")
Mix.shell().info("server: #{endpoint}")
Mix.shell().info("public_key: #{public_key}")
Mix.shell().info("secret_key: #{secret_key}")
Mix.shell().info("included_environments: #{inspect(included_environments)}")
Mix.shell().info("current environment_name: #{inspect(to_string(Config.environment_name()))}")
Mix.shell().info("hackney_opts: #{inspect(Config.hackney_opts())}\n")
end
defp send_event do
Mix.shell().info("Sending test event...")
exception = %RuntimeError{message: "Testing sending Sentry event"}
{:current_stacktrace, stacktrace} = Process.info(self(), :current_stacktrace)
case Sentry.capture_exception(exception, result: :sync, stacktrace: stacktrace) do
{:ok, id} ->
Mix.shell().info([:green, :bright, "Test event sent", :reset, "\nEvent ID: #{id}"])
{:error, reason} ->
Mix.raise("Error sending event:\n\n#{inspect(reason)}")
:excluded ->
Mix.shell().info("No test event was sent because the event was excluded by a filter")
:unsampled ->
Mix.shell().info("""
No test event was sent because the event was excluded according to the :sample_rate \
configuration option.
""")
end
end
end