@@ -667,3 +667,93 @@ def test_valid_instrumentation_info(self):
667
667
inst_source_dict ,
668
668
"instrumentation payload not logged properly" ,
669
669
)
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