Skip to content

Commit ec88df4

Browse files
committed
Simplify event handling & remove GenStage
1 parent e404ff4 commit ec88df4

10 files changed

Lines changed: 35 additions & 177 deletions

File tree

lib/telegram_logger_backend.ex

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,23 @@ defmodule LoggerTelegramBackend do
66
@behaviour :gen_event
77

88
defstruct [:name, :level, :metadata, :metadata_filter, :sender, :sender_args]
9+
alias __MODULE__, as: State
910

10-
alias LoggerTelegramBackend.Sender.Telegram
11-
alias LoggerTelegramBackend.Manager
11+
alias LoggerTelegramBackend.{Formatter, Telegram}
1212

1313
@default_name :telegram
1414
@default_sender {Telegram, [:token, :chat_id]}
1515
@default_metadata [:line, :function, :module, :application, :file]
1616

1717
@impl :gen_event
18-
def init(__MODULE__), do: init({__MODULE__, @default_name})
18+
def init(__MODULE__) do
19+
init({__MODULE__, @default_name})
20+
end
1921

2022
def init({__MODULE__, name}) when is_atom(name) do
2123
state =
2224
Application.get_env(:logger, name)
23-
|> initialize(%__MODULE__{})
25+
|> initialize(%State{})
2426

2527
{:ok, state}
2628
end
@@ -35,12 +37,9 @@ defmodule LoggerTelegramBackend do
3537
{:ok, state}
3638
end
3739

38-
def handle_event(
39-
{level, _gl, {Logger, msg, ts, md}},
40-
%{level: log_lvl, metadata_filter: filter} = state
41-
) do
42-
if meet_level?(level, log_lvl) and metadata_matches?(md, filter) do
43-
:ok = log_event(level, msg, ts, md, state)
40+
def handle_event({level, _gl, {Logger, message, timestamp, metadata}}, state) do
41+
if meet_level?(level, state.level) and metadata_matches?(metadata, state.metadata_filter) do
42+
:ok = log_event(level, message, timestamp, metadata, state)
4443
end
4544

4645
{:ok, state}
@@ -55,7 +54,7 @@ defmodule LoggerTelegramBackend do
5554
{:ok, state}
5655
end
5756

58-
## Helpers
57+
## Private
5958

6059
defp meet_level?(_lvl, nil), do: true
6160
defp meet_level?(lvl, min), do: Logger.compare_levels(lvl, min) != :lt
@@ -83,10 +82,10 @@ defmodule LoggerTelegramBackend do
8382
metadata = Keyword.get(config, :metadata, @default_metadata)
8483
metadata_filter = Keyword.get(config, :metadata_filter)
8584

86-
%{
85+
%State{
8786
state
8887
| sender: sender,
89-
sender_args: Enum.map(sender_args, &Keyword.get(config, &1)),
88+
sender_args: Keyword.take(config, sender_args),
9089
metadata: configure_metadata(metadata),
9190
level: level,
9291
metadata_filter: metadata_filter
@@ -96,15 +95,11 @@ defmodule LoggerTelegramBackend do
9695
defp configure_metadata(:all), do: :all
9796
defp configure_metadata(metadata), do: Enum.reverse(metadata)
9897

99-
defp log_event(lvl, msg, ts, md, %{sender: sender, sender_args: sender_args, metadata: keys}) do
100-
event = %{
101-
level: lvl,
102-
message: msg,
103-
metadata: take_metadata(md, keys),
104-
timestamp: ts
105-
}
98+
defp log_event(lvl, msg, _ts, md, %State{sender: sender, sender_args: args, metadata: keys}) do
99+
metadata = take_metadata(md, keys)
106100

107-
Manager.add_event({sender, sender_args, event})
101+
Formatter.format_event(msg, lvl, metadata)
102+
|> sender.send_message(args)
108103
end
109104

110105
defp take_metadata(metadata, :all), do: metadata

lib/telegram_logger_backend/application.ex

Lines changed: 0 additions & 23 deletions
This file was deleted.

lib/telegram_logger_backend/formatter.ex

Lines changed: 10 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,35 @@
11
defmodule LoggerTelegramBackend.Formatter do
22
@moduledoc false
33

4-
use GenStage
5-
6-
alias LoggerTelegramBackend.Manager
7-
8-
def start_link([min_demand, max_demand]) do
9-
GenStage.start_link(__MODULE__, {min_demand, max_demand}, name: __MODULE__)
10-
end
11-
12-
# Callbacks
13-
14-
def init({min_demand, max_demand}) do
15-
{
16-
:producer_consumer,
17-
%{},
18-
subscribe_to: [{Manager, min_demand: min_demand, max_demand: max_demand}]
19-
}
20-
end
21-
22-
def handle_events(events, _from, state) do
23-
formatted_events =
24-
events
25-
|> Enum.reverse()
26-
|> Enum.map(&format_event/1)
27-
28-
{:noreply, formatted_events, state}
29-
end
30-
31-
# Private
32-
33-
defp format_event({sender, args, %{level: lvl, message: msg, metadata: md}}) do
34-
text = """
35-
<b>[#{lvl}]</b> #{format_message(msg)}
36-
<pre>#{format_metadata(md)}</pre>
4+
def format_event(message, level, metadata) do
5+
"""
6+
<b>[#{level}]</b> #{format_message(message)}
7+
<pre>#{format_metadata(metadata)}</pre>
378
"""
38-
39-
{sender, args, text}
409
end
4110

42-
defp format_message(msg) do
43-
msg
11+
defp format_message(message) do
12+
message
4413
|> to_string
4514
|> String.trim()
4615
|> escape_special_chars()
4716
|> highlight_title()
4817
end
4918

50-
defp escape_special_chars(msg) do
19+
defp escape_special_chars(message) do
5120
special_chars = [
5221
{"&", "&amp;"},
5322
{"<", "&lt;"},
5423
{">", "&gt;"}
5524
]
5625

57-
Enum.reduce(special_chars, msg, fn {c, r}, acc ->
26+
Enum.reduce(special_chars, message, fn {c, r}, acc ->
5827
String.replace(acc, c, r)
5928
end)
6029
end
6130

62-
defp highlight_title(msg) do
63-
msg
31+
defp highlight_title(message) do
32+
message
6433
|> String.split("\n")
6534
|> do_highlight_title()
6635
|> Enum.join("\n")

lib/telegram_logger_backend/manager.ex

Lines changed: 0 additions & 46 deletions
This file was deleted.

lib/telegram_logger_backend/sender.ex

Lines changed: 0 additions & 32 deletions
This file was deleted.

lib/telegram_logger_backend/sender/telegram.ex renamed to lib/telegram_logger_backend/telegram.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
defmodule LoggerTelegramBackend.Sender.Telegram do
1+
defmodule LoggerTelegramBackend.Telegram do
22
@moduledoc false
33

44
alias HTTPoison.{Response, Error}
55

6-
def send_message(text, token, chat_id) when is_binary(text) do
7-
post("https://api.telegram.org/bot#{token}/sendMessage",
6+
def send_message(text, opts) when is_binary(text) and is_list(opts) do
7+
post("https://api.telegram.org/bot#{Keyword.fetch!(opts, :token)}/sendMessage",
88
text: text,
9-
chat_id: chat_id,
9+
chat_id: Keyword.fetch!(opts, :chat_id),
1010
parse_mode: "HTML"
1111
)
1212
end

mix.exs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@ defmodule LoggerTelegramBackend.Mixfile do
44
def project do
55
[
66
app: :logger_telegram_backend,
7-
version: "1.1.0-beta",
7+
version: "1.1.0-beta.1",
88
elixir: "~> 1.5",
99
start_permanent: Mix.env() == :prod,
1010
deps: deps(),
1111
package: package(),
12-
13-
# Docs
1412
name: "LoggerTelegramBackend",
1513
description: "A Logger backend for Telegram",
1614
source_url: "https://github.com/adriankumpf/logger-telegram-backend",
@@ -21,16 +19,14 @@ defmodule LoggerTelegramBackend.Mixfile do
2119

2220
def application do
2321
[
24-
extra_applications: [:logger],
25-
mod: {LoggerTelegramBackend.Application, []}
22+
extra_applications: [:logger]
2623
]
2724
end
2825

2926
defp deps do
3027
[
3128
{:ex_doc, "~> 0.18", only: :dev, runtime: false},
3229
{:exvcr, "~> 0.10", only: :test},
33-
{:gen_stage, "~> 0.13"},
3430
{:httpoison, "~> 1.0"}
3531
]
3632
end

mix.lock

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
"exactor": {:hex, :exactor, "2.2.4", "5efb4ddeb2c48d9a1d7c9b465a6fffdd82300eb9618ece5d34c3334d5d7245b1", [:mix], [], "hexpm"},
66
"exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm"},
77
"exvcr": {:hex, :exvcr, "0.10.3", "1ae3b97560430acfa88ebc737c85b2b7a9dbacd8a2b26789a19718b51ae3522c", [:mix], [{:exactor, "~> 2.2", [hex: :exactor, repo: "hexpm", optional: false]}, {:exjsx, "~> 4.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: true]}, {:httpotion, "~> 3.1", [hex: :httpotion, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:meck, "~> 0.8", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm"},
8-
"gen_stage": {:hex, :gen_stage, "0.14.1", "9d46723fda072d4f4bb31a102560013f7960f5d80ea44dcb96fd6304ed61e7a4", [:mix], [], "hexpm"},
98
"hackney": {:hex, :hackney, "1.14.3", "b5f6f5dcc4f1fba340762738759209e21914516df6be440d85772542d4a5e412", [:rebar3], [{:certifi, "2.4.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
10-
"httpoison": {:hex, :httpoison, "1.3.1", "7ac607311f5f706b44e8b3fab736d0737f2f62a31910ccd9afe7227b43edb7f0", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
9+
"httpoison": {:hex, :httpoison, "1.4.0", "e0b3c2ad6fa573134e42194d13e925acfa8f89d138bc621ffb7b1989e6d22e73", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
1110
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
1211
"jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm"},
1312
"makeup": {:hex, :makeup, "0.5.5", "9e08dfc45280c5684d771ad58159f718a7b5788596099bdfb0284597d368a882", [:mix], [{:nimble_parsec, "~> 0.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},

test/logger_telegram_backend/sender_telegram_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ defmodule SenderTelegramTest do
1616

1717
test "send_message" do
1818
use_cassette "send_message" do
19-
assert Telegram.send_message("tach", "$token", "$chatId") == :ok
19+
assert :ok = Telegram.send_message("tach", token: "$token", chat_id: "$chatId")
2020
end
2121
end
2222
end

test/logger_telegram_backend_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ defmodule LoggerTelegramBackendTest do
8989
end
9090

9191
defmodule TestSender do
92-
def send_message(text) do
92+
def send_message(text, _opts) do
9393
send(:logger_telegram_backend_test, {:text, text})
9494
:ok
9595
end

0 commit comments

Comments
 (0)