From 05e4647d7ff5b2ded837f57e3db54e944095a951 Mon Sep 17 00:00:00 2001 From: William Roe Date: Tue, 6 Aug 2024 12:31:40 +0100 Subject: [PATCH 1/5] Test the case of passing a context provider to the logger initializer There were no tests of that code path, only using the context_provider method. --- test/logger_test.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/logger_test.rb b/test/logger_test.rb index 109ce8c..c8b28ad 100644 --- a/test/logger_test.rb +++ b/test/logger_test.rb @@ -189,9 +189,13 @@ end it "should be able to add contextual information to events with the context_provider" do - purchase_logger = @logger.context_provider do - { 'context' => { 'id' => 'my-context-id' } } - end + provider = -> { { 'context' => { 'id' => 'my-context-id' } } } + purchase_logger = Twiglet::Logger.new( + 'petshop', + now: @now, + output: @buffer, + context_provider: provider + ) # do stuff purchase_logger.info( From 24e10c8838182bbbfce7651c999d20bec60c3c20 Mon Sep 17 00:00:00 2001 From: William Roe Date: Tue, 6 Aug 2024 12:33:25 +0100 Subject: [PATCH 2/5] Refactor to an array of context providers Maintaining the existing API to the initializers and the context_provider method. This is just simpler - without the need to wrap lambdas within other lambdas. It should also be easier to understand and read as a result. --- lib/twiglet/formatter.rb | 7 +++++-- lib/twiglet/logger.rb | 13 +++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/twiglet/formatter.rb b/lib/twiglet/formatter.rb index cc644f2..6b35463 100644 --- a/lib/twiglet/formatter.rb +++ b/lib/twiglet/formatter.rb @@ -11,12 +11,13 @@ def initialize( validator:, default_properties: {}, context_provider: nil, + context_providers: [], now: -> { Time.now.utc } ) @service_name = service_name @now = now @default_properties = default_properties - @context_provider = context_provider + @context_providers = context_provider ? [context_provider] : context_providers @validator = validator super() @@ -45,7 +46,9 @@ def log(level:, message:) } } - context = @context_provider&.call || {} + context = @context_providers.reduce({}) do |c, context_provider| + c.deep_merge(context_provider.call) + end JSON.generate( base_message diff --git a/lib/twiglet/logger.rb b/lib/twiglet/logger.rb index 91e978a..a6cc4a8 100644 --- a/lib/twiglet/logger.rb +++ b/lib/twiglet/logger.rb @@ -33,7 +33,7 @@ def initialize( formatter = Twiglet::Formatter.new( service_name, default_properties: args.fetch(:default_properties, {}), - context_provider: args[:context_provider], + context_providers: Array(args[:context_provider] || args[:context_providers]), now: now, validator: @validator ) @@ -82,15 +82,12 @@ def with(default_properties) end def context_provider(&blk) - new_context_provider = blk - if @args[:context_provider] - new_context_provider = lambda do - @args[:context_provider].call.merge(blk.call) - end - end + new_context_providers = Array(@args[:context_providers]) + new_context_providers << blk + self.class.new( @service_name, - **@args.merge(context_provider: new_context_provider) + **@args.merge(context_providers: new_context_providers) ) end From e50ea915d30949b1a6eea5196989ae71dc4c8367 Mon Sep 17 00:00:00 2001 From: William Roe Date: Tue, 6 Aug 2024 12:39:42 +0100 Subject: [PATCH 3/5] Add test for multiple context providers passed to formatter initializer --- test/formatter_test.rb | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/formatter_test.rb b/test/formatter_test.rb index 3e62654..a8dbc40 100644 --- a/test/formatter_test.rb +++ b/test/formatter_test.rb @@ -58,4 +58,32 @@ } assert_equal JSON.parse(msg), expected_log end + + it 'merges the outputs of all context providers into the messages log' do + provider_1 = -> { { 'request' => { 'id' => '1234567890' } } } + provider_2 = -> { { 'request' => { 'type' => 'test' } } } + formatter = Twiglet::Formatter.new( + 'petshop', now: @now, validator: Twiglet::Validator.new({}.to_json), + context_providers: [provider_1, provider_2] + ) + msg = formatter.call('warn', nil, nil, 'shop is running low on dog food') + expected_log = { + "ecs" => { + "version" => '1.5.0' + }, + "@timestamp" => '2020-05-11T15:01:01.000Z', + "service" => { + "name" => 'petshop' + }, + "log" => { + "level" => 'warn' + }, + "message" => 'shop is running low on dog food', + "request" => { + 'id' => '1234567890', + 'type' => 'test' + } + } + assert_equal expected_log, JSON.parse(msg) + end end From e4c3f9cd501ae4c457c52c9d25205cf5e4eeded3 Mon Sep 17 00:00:00 2001 From: William Roe Date: Tue, 6 Aug 2024 12:43:06 +0100 Subject: [PATCH 4/5] Add test for passing multiple context providers to logger initializer --- test/logger_test.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/logger_test.rb b/test/logger_test.rb index c8b28ad..a72e6fc 100644 --- a/test/logger_test.rb +++ b/test/logger_test.rb @@ -211,6 +211,31 @@ assert_equal 'my-context-id', log[:context][:id] end + it "should be able to add contextual information to events with multiple context providers" do + provider_1 = -> { { 'context' => { 'id' => 'my-context-id' } } } + provider_2 = -> { { 'context' => { 'type' => 'test' } } } + purchase_logger = Twiglet::Logger.new( + 'petshop', + now: @now, + output: @buffer, + context_providers: [provider_1, provider_2] + ) + + # do stuff + purchase_logger.info( + { + message: 'customer bought a dog', + pet: { name: 'Barker', species: 'dog', breed: 'Bitsa' } + } + ) + + log = read_json @buffer + + assert_equal 'customer bought a dog', log[:message] + assert_equal 'my-context-id', log[:context][:id] + assert_equal 'test', log[:context][:type] + end + it "chaining .with and .context_provider is possible" do # Let's add some context to this customer journey purchase_logger = @logger.with( From af667bc131a032fb8ecc41c970f7d999e0f4edec Mon Sep 17 00:00:00 2001 From: "dobby-app[bot]" <78910979+dobby-app[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:33:49 +0000 Subject: [PATCH 5/5] bump minor version --- lib/twiglet/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/twiglet/version.rb b/lib/twiglet/version.rb index e2a7cfa..f99ba4b 100644 --- a/lib/twiglet/version.rb +++ b/lib/twiglet/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Twiglet - VERSION = '3.10.0' + VERSION = '3.11.0' end