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. * `--type` - `exception` or `message`. Defaults to `exception`. *Available since v10.1.0.*. * `--no-stacktrace` - does not include a stacktrace in the reported event. *Available since v10.1.0.*. """ @switches [ compile: :boolean, stacktrace: :boolean, type: :string ] @impl true def run(args) when is_list(args) do {opts, args} = OptionParser.parse!(args, strict: @switches) if Keyword.get(opts, :compile, true) 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 print_environment_info() if Config.dsn() do send_event(opts) else Mix.shell().info([ :yellow, "Event not sent because the :dsn option is not set (or set to nil)" ]) end end defp print_environment_info do Mix.shell().info("Client configuration:") if Config.dsn() do {endpoint, public_key, secret_key} = Config.dsn() Mix.shell().info("server: #{endpoint}") Mix.shell().info("public_key: #{public_key}") Mix.shell().info("secret_key: #{secret_key}") end 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(opts) do stacktrace_opts = if Keyword.get(opts, :stacktrace, true) do {:current_stacktrace, stacktrace} = Process.info(self(), :current_stacktrace) [stacktrace: stacktrace] else [] end Mix.shell().info("Sending test event...") result = case Keyword.get(opts, :type, "exception") do "exception" -> exception = %RuntimeError{message: "Testing sending Sentry event"} Sentry.capture_exception(exception, [result: :sync] ++ stacktrace_opts) "message" -> Sentry.capture_message( "Testing sending Sentry event", [result: :sync] ++ stacktrace_opts ) end case result 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