Skip to content

Commit 78ffede

Browse files
Merge pull request #106 from planswell/capture_message
Add capture_message
2 parents ef0913f + 548fa80 commit 78ffede

File tree

4 files changed

+83
-20
lines changed

4 files changed

+83
-20
lines changed

lib/sentry.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,17 @@ defmodule Sentry do
123123
end
124124
end
125125

126+
@doc """
127+
Reports a message to Sentry.
128+
"""
129+
@spec capture_message(String.t, Keyword.t) :: {:ok, String.t} | :error
130+
def capture_message(message, opts \\ []) do
131+
opts
132+
|> Keyword.put(:message, message)
133+
|> Event.create_event()
134+
|> send_event()
135+
end
136+
126137
@doc """
127138
Sends a `Sentry.Event`
128139
"""

lib/sentry/event.ex

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ defmodule Sentry.Event do
2626
breadcrumbs: []
2727

2828
@doc """
29-
Transforms an Exception to a Sentry event.
29+
Creates an Event struct out of context collected and options
3030
## Options
31+
* `:exception` - expection
32+
* `:message` - message
3133
* `:stacktrace` - a list of Exception.stacktrace()
3234
* `:extra` - map of extra context
3335
* `:user` - map of user context
@@ -36,37 +38,33 @@ defmodule Sentry.Event do
3638
* `:breadcrumbs` - list of breadcrumbs
3739
* `:level` - error level
3840
"""
39-
@spec transform_exception(Exception.t, Keyword.t) :: %Event{}
40-
def transform_exception(exception, opts) do
41+
def create_event(opts) do
4142
%{user: user_context,
42-
tags: tags_context,
43-
extra: extra_context,
44-
breadcrumbs: breadcrumbs_context,
45-
request: request_context} = Sentry.Context.get_all()
43+
tags: tags_context,
44+
extra: extra_context,
45+
breadcrumbs: breadcrumbs_context,
46+
request: request_context} = Sentry.Context.get_all()
47+
48+
exception = Keyword.get(opts, :exception)
49+
50+
message = Keyword.get(opts, :message)
4651

4752
stacktrace = Keyword.get(opts, :stacktrace, [])
4853

4954
extra = extra_context
5055
|> Map.merge(Keyword.get(opts, :extra, %{}))
5156
user = user_context
52-
|> Map.merge(Keyword.get(opts, :user, %{}))
57+
|> Map.merge(Keyword.get(opts, :user, %{}))
5358
tags = Application.get_env(:sentry, :tags, %{})
54-
|> Map.merge(tags_context)
55-
|> Map.merge(Keyword.get(opts, :tags, %{}))
59+
|> Map.merge(tags_context)
60+
|> Map.merge(Keyword.get(opts, :tags, %{}))
5661
request = request_context
5762
|> Map.merge(Keyword.get(opts, :request, %{}))
5863
breadcrumbs = Keyword.get(opts, :breadcrumbs, [])
5964
|> Kernel.++(breadcrumbs_context)
6065

6166
level = Keyword.get(opts, :level, "error")
6267

63-
exception = Exception.normalize(:error, exception)
64-
65-
message = :error
66-
|> Exception.format_banner(exception)
67-
|> String.trim("*")
68-
|> String.trim
69-
7068
release = Application.get_env(:sentry, :release)
7169

7270
server_name = Application.get_env(:sentry, :server_name)
@@ -80,7 +78,7 @@ defmodule Sentry.Event do
8078
platform: "elixir",
8179
environment: env,
8280
server_name: server_name,
83-
exception: [%{type: exception.__struct__, value: Exception.message(exception)}],
81+
exception: exception,
8482
stacktrace: %{
8583
frames: stacktrace_to_frames(stacktrace)
8684
},
@@ -89,9 +87,37 @@ defmodule Sentry.Event do
8987
tags: tags,
9088
user: user,
9189
breadcrumbs: breadcrumbs,
90+
request: request
9291
}
9392
|> add_metadata()
94-
|> Map.put(:request, request)
93+
end
94+
95+
@doc """
96+
Transforms an Exception to a Sentry event.
97+
## Options
98+
* `:stacktrace` - a list of Exception.stacktrace()
99+
* `:extra` - map of extra context
100+
* `:user` - map of user context
101+
* `:tags` - map of tags context
102+
* `:request` - map of request context
103+
* `:breadcrumbs` - list of breadcrumbs
104+
* `:level` - error level
105+
"""
106+
@spec transform_exception(Exception.t, Keyword.t) :: %Event{}
107+
def transform_exception(exception, opts) do
108+
exception = Exception.normalize(:error, exception)
109+
110+
message = :error
111+
|> Exception.format_banner(exception)
112+
|> String.trim("*")
113+
|> String.trim
114+
115+
exception = [%{type: exception.__struct__, value: Exception.message(exception)}]
116+
117+
opts
118+
|> Keyword.put(:exception, exception)
119+
|> Keyword.put(:message, message)
120+
|> create_event()
95121
end
96122

97123
@spec add_metadata(%Event{}) :: %Event{}

test/event_test.exs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ defmodule Sentry.EventTest do
2121
value: "function Sentry.Event.not_a_function/0 is undefined or private"}
2222
]
2323
assert event.level == "error"
24-
assert event.message()== "(UndefinedFunctionError) function Sentry.Event.not_a_function/0 is undefined or private"
24+
assert event.message == "(UndefinedFunctionError) function Sentry.Event.not_a_function/0 is undefined or private"
2525
assert is_binary(event.server_name)
2626
assert event.stacktrace == %{frames: Enum.reverse([
2727
%{filename: nil, function: "Sentry.Event.not_a_function()", lineno: nil, module: Sentry.Event},
@@ -46,4 +46,29 @@ defmodule Sentry.EventTest do
4646
event = event_generated_by_exception(%{extra_data: "data"})
4747
assert event.extra == %{extra_data: "data"}
4848
end
49+
50+
test "create_event works for message" do
51+
assert Event.create_event(message: "Test message")
52+
|> Map.put(:event_id, nil)
53+
|> Map.put(:server_name, nil)
54+
|> Map.put(:timestamp, nil)
55+
==
56+
%Sentry.Event{
57+
breadcrumbs: [],
58+
culprit: nil,
59+
environment: :test,
60+
event_id: nil,
61+
exception: nil,
62+
extra: %{},
63+
level: "error",
64+
message: "Test message",
65+
platform: "elixir",
66+
release: nil,
67+
request: %{},
68+
server_name: nil,
69+
stacktrace: %{frames: []},
70+
tags: %{},
71+
timestamp: nil,
72+
user: %{}}
73+
end
4974
end

test/sentry_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ defmodule SentryTest do
2020

2121
assert {:ok, _} = Sentry.capture_exception(%RuntimeError{message: "error"}, [event_source: :plug])
2222
assert :excluded = Sentry.capture_exception(%ArithmeticError{message: "error"}, [event_source: :plug])
23+
assert {:ok, _} = Sentry.capture_message("RuntimeError: error", [event_source: :plug])
2324
end
2425
end

0 commit comments

Comments
 (0)