Skip to content

Commit

Permalink
Implement Logger module
Browse files Browse the repository at this point in the history
This module exposes functions to log messages by severity through the
extension Logging API
luismiramirez committed Nov 15, 2022
1 parent cb143d7 commit cd7359c
Showing 6 changed files with 160 additions and 15 deletions.
28 changes: 14 additions & 14 deletions agent.exs
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
# Modifications to this file will be overwritten with the next agent release.

defmodule Appsignal.Agent do
def version, do: "06391fb"
def version, do: "9b62288"

def mirrors do
[
@@ -16,55 +16,55 @@ defmodule Appsignal.Agent do
def triples do
%{
"x86_64-darwin" => %{
checksum: "9bf41c183d94c80e980f57ea2e29d08bae97e8097b5284a2b91a5484bf866f8c",
checksum: "5ff2ec4f16f5089e15188670b2c43866c76ab5db2ac07d72878a9816e63171ca",
filename: "appsignal-x86_64-darwin-all-static.tar.gz"
},
"universal-darwin" => %{
checksum: "9bf41c183d94c80e980f57ea2e29d08bae97e8097b5284a2b91a5484bf866f8c",
checksum: "5ff2ec4f16f5089e15188670b2c43866c76ab5db2ac07d72878a9816e63171ca",
filename: "appsignal-x86_64-darwin-all-static.tar.gz"
},
"aarch64-darwin" => %{
checksum: "74edd7b97995f3314c10e3d84fc832c1b842c236c331ed4f2f77146ad004d179",
checksum: "9dfdfd6697b3eeeb80a30356fdc1d03a79b8601f18cedd1b2c1442e512d2ed6a",
filename: "appsignal-aarch64-darwin-all-static.tar.gz"
},
"arm64-darwin" => %{
checksum: "74edd7b97995f3314c10e3d84fc832c1b842c236c331ed4f2f77146ad004d179",
checksum: "9dfdfd6697b3eeeb80a30356fdc1d03a79b8601f18cedd1b2c1442e512d2ed6a",
filename: "appsignal-aarch64-darwin-all-static.tar.gz"
},
"arm-darwin" => %{
checksum: "74edd7b97995f3314c10e3d84fc832c1b842c236c331ed4f2f77146ad004d179",
checksum: "9dfdfd6697b3eeeb80a30356fdc1d03a79b8601f18cedd1b2c1442e512d2ed6a",
filename: "appsignal-aarch64-darwin-all-static.tar.gz"
},
"aarch64-linux" => %{
checksum: "0f2430e637eb77ce2093f021777087e87cb1e7be7c86a53771172696791c4879",
checksum: "0e5d89aeda1e883c912ff069bb76029a1e3cad69f493865d877ffaffa2b45142",
filename: "appsignal-aarch64-linux-all-static.tar.gz"
},
"i686-linux" => %{
checksum: "449ba623aaa1853c2d211bf1e2d3a14e5ae09225a62457cbdbcc0983a5713a52",
checksum: "ff3cffb1204afd846ba0bb33c50b03f8ada8305527a5908ccfebed6fdcce0e61",
filename: "appsignal-i686-linux-all-static.tar.gz"
},
"x86-linux" => %{
checksum: "449ba623aaa1853c2d211bf1e2d3a14e5ae09225a62457cbdbcc0983a5713a52",
checksum: "ff3cffb1204afd846ba0bb33c50b03f8ada8305527a5908ccfebed6fdcce0e61",
filename: "appsignal-i686-linux-all-static.tar.gz"
},
"x86_64-linux" => %{
checksum: "394796c0ddeb4881c9f2e6ce82f840e66bcb69e027324f6c04f6671067445fbb",
checksum: "0b6fe4b343461a1a906fc73edb44bc5b12c75214d21fc81ed26d3eb88588003e",
filename: "appsignal-x86_64-linux-all-static.tar.gz"
},
"x86_64-linux-musl" => %{
checksum: "673271c8c5fd55053d8a719bcd307f787db4ca4633baf8cf961c442bf1805614",
checksum: "b3f52d7a7a1f4ae8095dd5b1207270dc1797766820d925aca0d09133983c9163",
filename: "appsignal-x86_64-linux-musl-all-static.tar.gz"
},
"aarch64-linux-musl" => %{
checksum: "e90ca19bf61596be022ba04897e8902b3401add58f351a40a3d3a7af241d0bbb",
checksum: "d306c50cc9f1bc8ea3339b4185b2a60a1c27f17d9067a529b1889d74c6c0a8d6",
filename: "appsignal-aarch64-linux-musl-all-static.tar.gz"
},
"x86_64-freebsd" => %{
checksum: "cb45da91c51123859e5ef5cea850460c28d6e77dfa08b90375178d9017162ba8",
checksum: "135d2ff898f30b15721eca36569d1a0a5deaaee7b4787937d0888ed49f25019b",
filename: "appsignal-x86_64-freebsd-all-static.tar.gz"
},
"amd64-freebsd" => %{
checksum: "cb45da91c51123859e5ef5cea850460c28d6e77dfa08b90375178d9017162ba8",
checksum: "135d2ff898f30b15721eca36569d1a0a5deaaee7b4787937d0888ed49f25019b",
filename: "appsignal-x86_64-freebsd-all-static.tar.gz"
},
}
33 changes: 32 additions & 1 deletion c_src/appsignal_extension.c
Original file line number Diff line number Diff line change
@@ -1264,6 +1264,36 @@ static ERL_NIF_TERM _span_to_json(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
return make_ok_tuple(env, make_elixir_string(env, json));
}

static ERL_NIF_TERM _log(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
ErlNifBinary group, message;
int severity;
data_ptr *data_ptr;

if (argc != 4) {
return enif_make_badarg(env);
}
if(!enif_inspect_iolist_as_binary(env, argv[0], &group)) {
return enif_make_badarg(env);
}
if(!enif_get_int(env, argv[1], &severity)) {
return enif_make_badarg(env);
}
if(!enif_inspect_iolist_as_binary(env, argv[2], &message)) {
return enif_make_badarg(env);
}
if(!enif_get_resource(env, argv[3], appsignal_data_type, (void**) &data_ptr)) {
return enif_make_badarg(env);
}

appsignal_log(
make_appsignal_string(group),
severity,
make_appsignal_string(message),
data_ptr->data
);

return enif_make_atom(env, "ok");
}

static int on_load(ErlNifEnv* env, void** UNUSED(priv), ERL_NIF_TERM UNUSED(info))
{
@@ -1378,7 +1408,8 @@ static ErlNifFunc nif_funcs[] =
{"_add_span_error", 4, _add_span_error, 0},
{"_close_span", 1, _close_span, 0},
{"_close_span_with_timestamp", 3, _close_span_with_timestamp, 0},
{"_span_to_json", 1, _span_to_json, 0}
{"_span_to_json", 1, _span_to_json, 0},
{"_log", 4, _log, 0}
};

ERL_NIF_INIT(Elixir.Appsignal.Nif, nif_funcs, on_load, on_reload, on_upgrade, NULL)
52 changes: 52 additions & 0 deletions lib/appsignal/logger.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
defmodule Appsignal.Logger do
require Appsignal.Utils

@nif Appsignal.Utils.compile_env(:appsignal, :appsignal_tracer_nif, Appsignal.Nif)
@severity %{
trace: 1,
debug: 2,
info: 3,
warn: 5,
error: 6
}

@type log_level :: :trace | :debug | :info | :warn | :error

@spec trace(String.t(), String.t(), %{}) :: :ok
def trace(group, message, metadata \\ %{}) do
log(:trace, group, message, metadata)
end

@spec debug(String.t(), String.t(), %{}) :: :ok
def debug(group, message, metadata \\ %{}) do
log(:debug, group, message, metadata)
end

@spec info(String.t(), String.t(), %{}) :: :ok
def info(group, message, metadata \\ %{}) do
log(:info, group, message, metadata)
end

@spec warn(String.t(), String.t(), %{}) :: :ok
def warn(group, message, metadata \\ %{}) do
log(:warn, group, message, metadata)
end

@spec error(String.t(), String.t(), %{}) :: :ok
def error(group, message, metadata \\ %{}) do
log(:error, group, message, metadata)
end

@spec log(log_level(), String.t(), String.t(), %{}) :: :ok
defp log(log_level, group, message, metadata) do
severity = @severity[log_level]
encoded_metadata = Appsignal.Utils.DataEncoder.encode(metadata)

@nif.log(
group,
severity,
message,
encoded_metadata
)
end
end
8 changes: 8 additions & 0 deletions lib/appsignal/nif.ex
Original file line number Diff line number Diff line change
@@ -248,6 +248,10 @@ defmodule Appsignal.Nif do
_span_to_json(resource)
end

def log(group, severity, message, attributes) do
_log(group, severity, message, attributes)
end

if Mix.env() == :test do
def data_to_json(reference) do
_data_to_json(reference)
@@ -484,6 +488,10 @@ defmodule Appsignal.Nif do
{:ok, "{}"}
end

def _log(_group, _severity, _message, _attributes) do
:ok
end

if Mix.env() in [:test, :test_no_nif] do
def _data_to_json(resource) do
resource
49 changes: 49 additions & 0 deletions test/appsignal/logger_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
defmodule Appsignal.LoggerTest do
use ExUnit.Case
alias Appsignal.{Logger, Test}

setup do
start_supervised(Test.Nif)
:ok
end

test "trace/3 sends the trace log call through the extension" do
metadata = %{some: "metadata"}

Logger.trace("app", "This is a trace", metadata)

assert [{"app", 1, "This is a trace", _encoded_metadata}] = Test.Nif.get!(:log)
end

test "debug/3 sends the debug log call through the extension" do
metadata = %{some: "metadata"}

Logger.debug("app", "This is a debug", metadata)

assert [{"app", 2, "This is a debug", _encoded_metadata}] = Test.Nif.get!(:log)
end

test "info/3 sends the info call through the extension" do
metadata = %{some: "metadata"}

Logger.info("app", "This is an info", metadata)

assert [{"app", 3, "This is an info", _encoded_metadata}] = Test.Nif.get!(:log)
end

test "warn/3 sends the warn log call through the extension" do
metadata = %{some: "metadata"}

Logger.warn("app", "This is a warn", metadata)

assert [{"app", 5, "This is a warn", _encoded_metadata}] = Test.Nif.get!(:log)
end

test "error/3 sends the error log call through the extension" do
metadata = %{some: "metadata"}

Logger.error("app", "This is an error", metadata)

assert [{"app", 6, "This is an error", _encoded_metadata}] = Test.Nif.get!(:log)
end
end
5 changes: 5 additions & 0 deletions test/support/appsignal/test_nif.ex
Original file line number Diff line number Diff line change
@@ -46,4 +46,9 @@ defmodule Appsignal.Test.Nif do
add(:close_span_with_timestamp, {reference, sec, nsec})
Nif.close_span_with_timestamp(reference, sec, nsec)
end

def log(group, severity, message, metadata) do
add(:log, {group, severity, message, metadata})
Nif.log(group, severity, message, metadata)
end
end

0 comments on commit cd7359c

Please sign in to comment.