@@ -667,3 +667,93 @@ def test_valid_instrumentation_info(self):
667667 inst_source_dict ,
668668 "instrumentation payload not logged properly" ,
669669 )
670+
671+ def test_append_labels_adapter (self ):
672+ import logging
673+
674+ import mock
675+
676+ from google .cloud .logging_v2 .handlers .structured_log import \
677+ AppendLabelLoggingAdapter
678+
679+ logger = logging .getLogger ("google.cloud.logging_v2.handlers.structured_log" )
680+ handler = self ._make_one ()
681+ with mock .patch .object (handler , "emit_instrumentation_info" ):
682+ with mock .patch .object (logger , "_log" ) as mock_log :
683+ logger .addHandler (handler )
684+ logger .setLevel (logging .INFO )
685+ adapted_logger = AppendLabelLoggingAdapter (
686+ logger , append_labels = {"service_id" : 1 , "another_value" : "foo" }
687+ )
688+ adapted_logger .info ("test message" )
689+ mock_log .assert_called_once ()
690+ self .assertEqual (
691+ mock_log .call_args_list [0 ].kwargs ,
692+ {"extra" : {"labels" : {"service_id" : 1 , "another_value" : "foo" }}},
693+ )
694+
695+ def test_append_labels_adapter_override_defaults (self ):
696+ import logging
697+
698+ import mock
699+
700+ from google .cloud .logging_v2 .handlers .structured_log import \
701+ AppendLabelLoggingAdapter
702+
703+ logger = logging .getLogger ("google.cloud.logging_v2.handlers.structured_log" )
704+ handler = self ._make_one ()
705+ with mock .patch .object (handler , "emit_instrumentation_info" ):
706+ with mock .patch .object (logger , "_log" ) as mock_log :
707+ logger .addHandler (handler )
708+ logger .setLevel (logging .INFO )
709+ adapted_logger = AppendLabelLoggingAdapter (
710+ logger , append_labels = {"service_id" : 1 , "another_value" : "foo" }
711+ )
712+ adapted_logger .info (
713+ "test message" , extra = {"labels" : {"another_value" : "baz" }}
714+ )
715+ mock_log .assert_called_once ()
716+ # the default value was overridden
717+ self .assertEqual (
718+ mock_log .call_args_list [0 ].kwargs ,
719+ {"extra" : {"labels" : {"service_id" : 1 , "another_value" : "baz" }}},
720+ )
721+
722+ def test_append_labels_adapter_stacked (self ):
723+ import logging
724+
725+ import mock
726+
727+ from google .cloud .logging_v2 .handlers .structured_log import \
728+ AppendLabelLoggingAdapter
729+
730+ logger = logging .getLogger ("google.cloud.logging_v2.handlers.structured_log" )
731+ handler = self ._make_one ()
732+ with mock .patch .object (handler , "emit_instrumentation_info" ):
733+ with mock .patch .object (logger , "_log" ) as mock_log :
734+ logger .addHandler (handler )
735+ logger .setLevel (logging .INFO )
736+ adapted_logger = AppendLabelLoggingAdapter (
737+ logger , append_labels = {"service_id" : 1 , "another_value" : "foo" }
738+ )
739+ twice_adapted_logger = AppendLabelLoggingAdapter (
740+ adapted_logger ,
741+ # one fields is new, another was adapted already
742+ append_labels = {"new_field" : "new_value" , "another_value" : "baz" },
743+ )
744+ twice_adapted_logger .info (
745+ "test message" , extra = {"labels" : {"another_value" : "baz" }}
746+ )
747+ mock_log .assert_called_once ()
748+ self .assertEqual (
749+ mock_log .call_args_list [0 ].kwargs ,
750+ {
751+ "extra" : {
752+ "labels" : {
753+ "another_value" : "baz" , # value is changed by the second adapter
754+ "new_field" : "new_value" , # introduced by the second adapter
755+ "service_id" : 1 , # left as is from the first adapter configuration
756+ }
757+ }
758+ },
759+ )
0 commit comments