Skip to content

Commit

Permalink
Support formats in logger
Browse files Browse the repository at this point in the history
Accept a third argument when creating a logger that sets the format
that messages in logs will be parsed as. Bumps agent to 8d042e2
  • Loading branch information
thijsc committed Feb 21, 2023
1 parent c73fb17 commit 962d069
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 43 deletions.
8 changes: 8 additions & 0 deletions .changesets/bump-agent-to-8d042e2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
bump: "patch"
type: "change"
---

Bump agent to 8d042e2.

- Support multiple log formats.
54 changes: 27 additions & 27 deletions ext/agent.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,139 +4,139 @@
# Modifications to this file will be overwritten with the next agent release.

APPSIGNAL_AGENT_CONFIG = {
"version" => "0d593d5",
"version" => "8d042e2",
"mirrors" => [
"https://appsignal-agent-releases.global.ssl.fastly.net",
"https://d135dj0rjqvssy.cloudfront.net"
],
"triples" => {
"x86_64-darwin" => {
"static" => {
"checksum" => "8e63a3b1ee61165914e6dbb8654c1ad7f096079c77d0559c1733dff15103f4ab",
"checksum" => "e0142859f35e31b52dcc57418636c05bcb21940ad499bbe255f90a1cf7359bf7",
"filename" => "appsignal-x86_64-darwin-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "21d5e46302d0b35f5514ea5b68c4b90f0748c6e74c75abe670c7d65aad1ccd06",
"checksum" => "43b01ab821eddb9fda03cedf59ab4bd8ebfca4c0cf011daa0233802fff69fc0b",
"filename" => "appsignal-x86_64-darwin-all-dynamic.tar.gz"
}
},
"universal-darwin" => {
"static" => {
"checksum" => "8e63a3b1ee61165914e6dbb8654c1ad7f096079c77d0559c1733dff15103f4ab",
"checksum" => "e0142859f35e31b52dcc57418636c05bcb21940ad499bbe255f90a1cf7359bf7",
"filename" => "appsignal-x86_64-darwin-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "21d5e46302d0b35f5514ea5b68c4b90f0748c6e74c75abe670c7d65aad1ccd06",
"checksum" => "43b01ab821eddb9fda03cedf59ab4bd8ebfca4c0cf011daa0233802fff69fc0b",
"filename" => "appsignal-x86_64-darwin-all-dynamic.tar.gz"
}
},
"aarch64-darwin" => {
"static" => {
"checksum" => "cdf323d1b411f45084c13dc4a2c0f980599273d64ab91a28cd07bbc48b3293f6",
"checksum" => "5a1ab02452497b29222d580f3e9d3649eb547b8c90338858462d4f221dd18ff9",
"filename" => "appsignal-aarch64-darwin-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "2ccc7217f71316a2bc6a47e25db4926e55e854a0ac3d5e99150a7c7c9c46392e",
"checksum" => "ea6ee98125ae521f3a79c47d942cf9b689a43e48fd172eab62d3dc80a7fea033",
"filename" => "appsignal-aarch64-darwin-all-dynamic.tar.gz"
}
},
"arm64-darwin" => {
"static" => {
"checksum" => "cdf323d1b411f45084c13dc4a2c0f980599273d64ab91a28cd07bbc48b3293f6",
"checksum" => "5a1ab02452497b29222d580f3e9d3649eb547b8c90338858462d4f221dd18ff9",
"filename" => "appsignal-aarch64-darwin-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "2ccc7217f71316a2bc6a47e25db4926e55e854a0ac3d5e99150a7c7c9c46392e",
"checksum" => "ea6ee98125ae521f3a79c47d942cf9b689a43e48fd172eab62d3dc80a7fea033",
"filename" => "appsignal-aarch64-darwin-all-dynamic.tar.gz"
}
},
"arm-darwin" => {
"static" => {
"checksum" => "cdf323d1b411f45084c13dc4a2c0f980599273d64ab91a28cd07bbc48b3293f6",
"checksum" => "5a1ab02452497b29222d580f3e9d3649eb547b8c90338858462d4f221dd18ff9",
"filename" => "appsignal-aarch64-darwin-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "2ccc7217f71316a2bc6a47e25db4926e55e854a0ac3d5e99150a7c7c9c46392e",
"checksum" => "ea6ee98125ae521f3a79c47d942cf9b689a43e48fd172eab62d3dc80a7fea033",
"filename" => "appsignal-aarch64-darwin-all-dynamic.tar.gz"
}
},
"aarch64-linux" => {
"static" => {
"checksum" => "a6baf7c586722c71c9d5ec885c8ca17da6b9fc9c5d7ab154a7b667f28d082a0f",
"checksum" => "0e85a0a13b9457c4ee1f316e92e8d95de9125bbaff90ceb826bcefaaffa413d9",
"filename" => "appsignal-aarch64-linux-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "1f2912a078b8e2f5524ecf3353d8216d24a36817956d0e8218702df8bb6a6d21",
"checksum" => "77103ab5c9907334998c48464fd742ab21fcbead58195cb6afcfc4797514f34c",
"filename" => "appsignal-aarch64-linux-all-dynamic.tar.gz"
}
},
"i686-linux" => {
"static" => {
"checksum" => "c102053fe1f68af84d0b362bd892256981bc4a2dec7e12fec27ea57ba0efbda2",
"checksum" => "0e8a0490ca960bb8e57183156ed4999afbd70cf13c640fe96f9b0e25556075f1",
"filename" => "appsignal-i686-linux-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "88a8c13182c26b9e2396474606202ecce78f22c95f6e378c058a92b216f8c575",
"checksum" => "f19947288f3638f15eeaf8f6ee9aecae6f1f777e4e68820c88bf4fb6941856b9",
"filename" => "appsignal-i686-linux-all-dynamic.tar.gz"
}
},
"x86-linux" => {
"static" => {
"checksum" => "c102053fe1f68af84d0b362bd892256981bc4a2dec7e12fec27ea57ba0efbda2",
"checksum" => "0e8a0490ca960bb8e57183156ed4999afbd70cf13c640fe96f9b0e25556075f1",
"filename" => "appsignal-i686-linux-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "88a8c13182c26b9e2396474606202ecce78f22c95f6e378c058a92b216f8c575",
"checksum" => "f19947288f3638f15eeaf8f6ee9aecae6f1f777e4e68820c88bf4fb6941856b9",
"filename" => "appsignal-i686-linux-all-dynamic.tar.gz"
}
},
"x86_64-linux" => {
"static" => {
"checksum" => "8f3987d22f0fcbd466377e624aa645c5b9b0f4bbc88855ddb7076b09b9a8d42a",
"checksum" => "4eec193edeae76e0793789846112ac9127870c90a8ae6e47aa2a8490163733aa",
"filename" => "appsignal-x86_64-linux-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "a441047dde49b583789bc3d4c8c086337e42d96ea73e5676abd6f3f4db709cf4",
"checksum" => "dcbc99ba30038f03f91232e5a25d76f27fae1a85a1b692e4935c62720e60b4ae",
"filename" => "appsignal-x86_64-linux-all-dynamic.tar.gz"
}
},
"x86_64-linux-musl" => {
"static" => {
"checksum" => "e353e165f828cb788c85199adb1b39f15c26406da948117a34b4944f6eabfabc",
"checksum" => "d91d1ed6e775cc00319fca0a4144dff064d31fb6a8a28dbb5027add44e4dab02",
"filename" => "appsignal-x86_64-linux-musl-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "fed6aa61e0661351a4bae4b2f17b7e4e2f660fd020cd759d10d1ce3d2ddaeb86",
"checksum" => "87a704506c488a9f6fd582b2191085af9dc3c1ffb10eaa8586691474fc42f595",
"filename" => "appsignal-x86_64-linux-musl-all-dynamic.tar.gz"
}
},
"aarch64-linux-musl" => {
"static" => {
"checksum" => "b08c5d65fbff05ac6838aa0ed4614b669701f009826652f7d67ab423fede0e44",
"checksum" => "0ff6702bd976871f610f39ff6c2dd73c4535b12c15c81c0d0afab7650e75922d",
"filename" => "appsignal-aarch64-linux-musl-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "848671a482243083fd7af6f44f35e6169aeb2b415ccd2f86eb1386d73303171b",
"checksum" => "516656660666791a5158765fdc8181f12c2c08763f257740c6e04d97cdcdb6c2",
"filename" => "appsignal-aarch64-linux-musl-all-dynamic.tar.gz"
}
},
"x86_64-freebsd" => {
"static" => {
"checksum" => "f516b4c84274b9c56cbcb11c252685a4ef97b68b9fec6c189dde96fd37bbf515",
"checksum" => "d973edc7f13cdad2993c415f17a680a4de3288ce57fc5ae0c69ef3a1ccbb2856",
"filename" => "appsignal-x86_64-freebsd-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "17a698650bb8d8d1b031e0ba216217d932c9fe33936c7bdce1e677b257b742f7",
"checksum" => "6720b701bb41257c4fcdb189c7196241c5e43a0a0f20f1614a1a8978e117f5c9",
"filename" => "appsignal-x86_64-freebsd-all-dynamic.tar.gz"
}
},
"amd64-freebsd" => {
"static" => {
"checksum" => "f516b4c84274b9c56cbcb11c252685a4ef97b68b9fec6c189dde96fd37bbf515",
"checksum" => "d973edc7f13cdad2993c415f17a680a4de3288ce57fc5ae0c69ef3a1ccbb2856",
"filename" => "appsignal-x86_64-freebsd-all-static.tar.gz"
},
"dynamic" => {
"checksum" => "17a698650bb8d8d1b031e0ba216217d932c9fe33936c7bdce1e677b257b742f7",
"checksum" => "6720b701bb41257c4fcdb189c7196241c5e43a0a0f20f1614a1a8978e117f5c9",
"filename" => "appsignal-x86_64-freebsd-all-dynamic.tar.gz"
}
}
Expand Down
6 changes: 4 additions & 2 deletions ext/appsignal_extension.c
Original file line number Diff line number Diff line change
Expand Up @@ -720,11 +720,12 @@ static VALUE close_span(VALUE self) {
return Qnil;
}

static VALUE a_log(VALUE self, VALUE group, VALUE severity, VALUE message, VALUE attributes) {
static VALUE a_log(VALUE self, VALUE group, VALUE severity, VALUE format, VALUE message, VALUE attributes) {
appsignal_data_t* attributes_data;

Check_Type(group, T_STRING);
Check_Type(severity, T_FIXNUM);
Check_Type(format, T_FIXNUM);
Check_Type(message, T_STRING);
Check_Type(attributes, RUBY_T_DATA);

Expand All @@ -733,6 +734,7 @@ static VALUE a_log(VALUE self, VALUE group, VALUE severity, VALUE message, VALUE
appsignal_log(
make_appsignal_string(group),
FIX2INT(severity),
FIX2INT(format),
make_appsignal_string(message),
attributes_data
);
Expand Down Expand Up @@ -859,7 +861,7 @@ void Init_appsignal_extension(void) {
// Diagnostics
rb_define_singleton_method(Extension, "diagnose", diagnose, 0);
// Logging
rb_define_singleton_method(Extension, "log", a_log, 4);
rb_define_singleton_method(Extension, "log", a_log, 5);

// Server state
rb_define_singleton_method(Extension, "get_server_state", get_server_state, 1);
Expand Down
13 changes: 12 additions & 1 deletion lib/appsignal/logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,20 @@
module Appsignal
# Logger that flushes logs to the AppSignal logging service
class Logger < ::Logger # rubocop:disable Metrics/ClassLength
PLAINTEXT = 0
LOGFMT = 1
JSON = 2

# Create a new logger instance
#
# @param group Name of the group for this logger.
# @param level Log level to filter with
# @return [void]
def initialize(group, level = INFO)
def initialize(group, level: INFO, format: PLAINTEXT)
raise TypeError, "group must be a string" unless group.is_a? String
@group = group
@level = level
@format = format
end

# We support the various methods in the Ruby
Expand Down Expand Up @@ -51,6 +56,7 @@ def add(severity, message = nil, group = nil) # rubocop:disable Metrics/Cyclomat
Appsignal::Extension.log(
group,
severity_number,
@format,
message,
Appsignal::Utils::Data.generate({})
)
Expand All @@ -69,6 +75,7 @@ def debug(message = nil, attributes = {})
Appsignal::Extension.log(
@group,
2,
@format,
message,
Appsignal::Utils::Data.generate(attributes)
)
Expand All @@ -86,6 +93,7 @@ def info(message = nil, attributes = {})
Appsignal::Extension.log(
@group,
3,
@format,
message,
Appsignal::Utils::Data.generate(attributes)
)
Expand All @@ -103,6 +111,7 @@ def warn(message = nil, attributes = {})
Appsignal::Extension.log(
@group,
5,
@format,
message,
Appsignal::Utils::Data.generate(attributes)
)
Expand All @@ -120,6 +129,7 @@ def error(message = nil, attributes = {})
Appsignal::Extension.log(
@group,
6,
@format,
message,
Appsignal::Utils::Data.generate(attributes)
)
Expand All @@ -137,6 +147,7 @@ def fatal(message = nil, attributes = {})
Appsignal::Extension.log(
@group,
7,
@format,
message,
Appsignal::Utils::Data.generate(attributes)
)
Expand Down
35 changes: 22 additions & 13 deletions spec/lib/appsignal/logger_spec.rb
Original file line number Diff line number Diff line change
@@ -1,31 +1,30 @@
describe Appsignal::Logger do
let(:level) { ::Logger::DEBUG }
let(:logger) { Appsignal::Logger.new("group", level) }
let(:logger) { Appsignal::Logger.new("group", :level => ::Logger::DEBUG) }

it "should not create a logger with a nil group" do
expect do
Appsignal::Logger.new(nil, level)
Appsignal::Logger.new(nil)
end.to raise_error(TypeError)
end

describe "#add" do
it "should log with a level and message" do
expect(Appsignal::Extension).to receive(:log)
.with("group", 3, "Log message", instance_of(Appsignal::Extension::Data))
.with("group", 3, 0, "Log message", instance_of(Appsignal::Extension::Data))
logger.add(::Logger::INFO, "Log message")
end

it "should log with a block" do
expect(Appsignal::Extension).to receive(:log)
.with("group", 3, "Log message", instance_of(Appsignal::Extension::Data))
.with("group", 3, 0, "Log message", instance_of(Appsignal::Extension::Data))
logger.add(::Logger::INFO) do
"Log message"
end
end

it "should log with a level, message and group" do
expect(Appsignal::Extension).to receive(:log)
.with("other_group", 3, "Log message", instance_of(Appsignal::Extension::Data))
.with("other_group", 3, 0, "Log message", instance_of(Appsignal::Extension::Data))
logger.add(::Logger::INFO, "Log message", "other_group")
end

Expand All @@ -34,15 +33,25 @@
logger.add(::Logger::INFO, nil)
end

context "with debug log level" do
let(:level) { ::Logger::INFO }
context "with info log level" do
let(:logger) { Appsignal::Logger.new("group", :level => ::Logger::INFO) }

it "should skip logging if the level is too low" do
expect(Appsignal::Extension).not_to receive(:log)
logger.add(::Logger::DEBUG, "Log message")
end
end

context "with a format set" do
let(:logger) { Appsignal::Logger.new("group", :format => Appsignal::Logger::LOGFMT) }

it "should log and pass the format flag" do
expect(Appsignal::Extension).to receive(:log)
.with("group", 3, 1, "Log message", instance_of(Appsignal::Extension::Data))
logger.add(::Logger::INFO, "Log message")
end
end

context "with a formatter set" do
before do
logger.formatter = proc do |_level, _timestamp, _appname, message|
Expand All @@ -52,7 +61,7 @@

it "should log with a level, message and group" do
expect(Appsignal::Extension).to receive(:log)
.with("other_group", 3, "formatted: 'Log message'", instance_of(Appsignal::Extension::Data))
.with("other_group", 3, 0, "formatted: 'Log message'", instance_of(Appsignal::Extension::Data))
logger.add(::Logger::INFO, "Log message", "other_group")
end
end
Expand All @@ -71,7 +80,7 @@
.with({})
.and_call_original
expect(Appsignal::Extension).to receive(:log)
.with("group", method[1], "Log message", instance_of(Appsignal::Extension::Data))
.with("group", method[1], 0, "Log message", instance_of(Appsignal::Extension::Data))

logger.send(method[0], "Log message")
end
Expand All @@ -81,7 +90,7 @@
.with({})
.and_call_original
expect(Appsignal::Extension).to receive(:log)
.with("group", method[1], "Log message", instance_of(Appsignal::Extension::Data))
.with("group", method[1], 0, "Log message", instance_of(Appsignal::Extension::Data))

logger.send(method[0]) do
"Log message"
Expand All @@ -95,7 +104,7 @@

if method[2]
context "with a lower log level" do
let(:level) { method[2] }
let(:logger) { Appsignal::Logger.new("group", :level => method[2]) }

it "should skip logging if the level is too low" do
expect(Appsignal::Extension).not_to receive(:log)
Expand All @@ -113,7 +122,7 @@

it "should log with a level, message and group" do
expect(Appsignal::Extension).to receive(:log)
.with("group", method[1], "formatted: 'Log message'", instance_of(Appsignal::Extension::Data))
.with("group", method[1], 0, "formatted: 'Log message'", instance_of(Appsignal::Extension::Data))
logger.send(method[0], "Log message")
end
end
Expand Down

0 comments on commit 962d069

Please sign in to comment.