1
1
"""aws_lambda_logging tests."""
2
2
import io
3
3
import json
4
+ import random
5
+ import string
4
6
5
7
import pytest
6
8
@@ -12,9 +14,15 @@ def stdout():
12
14
return io .StringIO ()
13
15
14
16
17
+ @pytest .fixture
18
+ def service_name ():
19
+ chars = string .ascii_letters + string .digits
20
+ return "" .join (random .SystemRandom ().choice (chars ) for _ in range (15 ))
21
+
22
+
15
23
@pytest .mark .parametrize ("level" , ["DEBUG" , "WARNING" , "ERROR" , "INFO" , "CRITICAL" ])
16
- def test_setup_with_valid_log_levels (stdout , level ):
17
- logger = Logger (level = level , stream = stdout , request_id = "request id!" , another = "value" )
24
+ def test_setup_with_valid_log_levels (stdout , level , service_name ):
25
+ logger = Logger (service = service_name , level = level , stream = stdout , request_id = "request id!" , another = "value" )
18
26
msg = "This is a test"
19
27
log_command = {
20
28
"INFO" : logger .info ,
@@ -37,8 +45,8 @@ def test_setup_with_valid_log_levels(stdout, level):
37
45
assert "exception" not in log_dict
38
46
39
47
40
- def test_logging_exception_traceback (stdout ):
41
- logger = Logger (level = "DEBUG" , stream = stdout )
48
+ def test_logging_exception_traceback (stdout , service_name ):
49
+ logger = Logger (service = service_name , level = "DEBUG" , stream = stdout )
42
50
43
51
try :
44
52
raise ValueError ("Boom" )
@@ -52,9 +60,9 @@ def test_logging_exception_traceback(stdout):
52
60
assert "exception" in log_dict
53
61
54
62
55
- def test_setup_with_invalid_log_level (stdout ):
63
+ def test_setup_with_invalid_log_level (stdout , service_name ):
56
64
with pytest .raises (ValueError ) as e :
57
- Logger (level = "not a valid log level" )
65
+ Logger (service = service_name , level = "not a valid log level" )
58
66
assert "Unknown level" in e .value .args [0 ]
59
67
60
68
@@ -65,8 +73,8 @@ def check_log_dict(log_dict):
65
73
assert "message" in log_dict
66
74
67
75
68
- def test_with_dict_message (stdout ):
69
- logger = Logger (level = "DEBUG" , stream = stdout )
76
+ def test_with_dict_message (stdout , service_name ):
77
+ logger = Logger (service = service_name , level = "DEBUG" , stream = stdout )
70
78
71
79
msg = {"x" : "isx" }
72
80
logger .critical (msg )
@@ -76,8 +84,8 @@ def test_with_dict_message(stdout):
76
84
assert msg == log_dict ["message" ]
77
85
78
86
79
- def test_with_json_message (stdout ):
80
- logger = Logger (stream = stdout )
87
+ def test_with_json_message (stdout , service_name ):
88
+ logger = Logger (service = service_name , stream = stdout )
81
89
82
90
msg = {"x" : "isx" }
83
91
logger .info (json .dumps (msg ))
@@ -87,8 +95,8 @@ def test_with_json_message(stdout):
87
95
assert msg == log_dict ["message" ]
88
96
89
97
90
- def test_with_unserializable_value_in_message (stdout ):
91
- logger = Logger (level = "DEBUG" , stream = stdout )
98
+ def test_with_unserializable_value_in_message (stdout , service_name ):
99
+ logger = Logger (service = service_name , level = "DEBUG" , stream = stdout )
92
100
93
101
class Unserializable :
94
102
pass
@@ -101,12 +109,17 @@ class Unserializable:
101
109
assert log_dict ["message" ]["x" ].startswith ("<" )
102
110
103
111
104
- def test_with_unserializable_value_in_message_custom (stdout ):
112
+ def test_with_unserializable_value_in_message_custom (stdout , service_name ):
105
113
class Unserializable :
106
114
pass
107
115
108
116
# GIVEN a custom json_default
109
- logger = Logger (level = "DEBUG" , stream = stdout , json_default = lambda o : f"<non-serializable: { type (o ).__name__ } >" )
117
+ logger = Logger (
118
+ service = service_name ,
119
+ level = "DEBUG" ,
120
+ stream = stdout ,
121
+ json_default = lambda o : f"<non-serializable: { type (o ).__name__ } >" ,
122
+ )
110
123
111
124
# WHEN we log a message
112
125
logger .debug ({"x" : Unserializable ()})
@@ -118,9 +131,9 @@ class Unserializable:
118
131
assert "json_default" not in log_dict
119
132
120
133
121
- def test_log_dict_key_seq (stdout ):
134
+ def test_log_dict_key_seq (stdout , service_name ):
122
135
# GIVEN the default logger configuration
123
- logger = Logger (stream = stdout )
136
+ logger = Logger (service = service_name , stream = stdout )
124
137
125
138
# WHEN logging a message
126
139
logger .info ("Message" )
@@ -131,9 +144,9 @@ def test_log_dict_key_seq(stdout):
131
144
assert "," .join (list (log_dict .keys ())[:4 ]) == "level,location,message,timestamp"
132
145
133
146
134
- def test_log_dict_key_custom_seq (stdout ):
147
+ def test_log_dict_key_custom_seq (stdout , service_name ):
135
148
# GIVEN a logger configuration with log_record_order set to ["message"]
136
- logger = Logger (stream = stdout , log_record_order = ["message" ])
149
+ logger = Logger (service = service_name , stream = stdout , log_record_order = ["message" ])
137
150
138
151
# WHEN logging a message
139
152
logger .info ("Message" )
@@ -144,9 +157,9 @@ def test_log_dict_key_custom_seq(stdout):
144
157
assert list (log_dict .keys ())[0 ] == "message"
145
158
146
159
147
- def test_log_custom_formatting (stdout ):
160
+ def test_log_custom_formatting (stdout , service_name ):
148
161
# GIVEN a logger where we have a custom `location`, 'datefmt' format
149
- logger = Logger (stream = stdout , location = "[%(funcName)s] %(module)s" , datefmt = "fake-datefmt" )
162
+ logger = Logger (service = service_name , stream = stdout , location = "[%(funcName)s] %(module)s" , datefmt = "fake-datefmt" )
150
163
151
164
# WHEN logging a message
152
165
logger .info ("foo" )
@@ -158,7 +171,7 @@ def test_log_custom_formatting(stdout):
158
171
assert log_dict ["timestamp" ] == "fake-datefmt"
159
172
160
173
161
- def test_log_dict_key_strip_nones (stdout ):
174
+ def test_log_dict_key_strip_nones (stdout , service_name ):
162
175
# GIVEN a logger confirmation where we set `location` and `timestamp` to None
163
176
# Note: level, sampling_rate and service can not be suppressed
164
177
logger = Logger (stream = stdout , level = None , location = None , timestamp = None , sampling_rate = None , service = None )
@@ -170,14 +183,15 @@ def test_log_dict_key_strip_nones(stdout):
170
183
171
184
# THEN the keys should only include `level`, `message`, `service`, `sampling_rate`
172
185
assert sorted (log_dict .keys ()) == ["level" , "message" , "sampling_rate" , "service" ]
186
+ assert log_dict ["service" ] == "service_undefined"
173
187
174
188
175
- def test_log_dict_xray_is_present_when_tracing_is_enabled (stdout , monkeypatch ):
189
+ def test_log_dict_xray_is_present_when_tracing_is_enabled (stdout , monkeypatch , service_name ):
176
190
# GIVEN a logger is initialized within a Lambda function with X-Ray enabled
177
191
trace_id = "1-5759e988-bd862e3fe1be46a994272793"
178
192
trace_header = f"Root={ trace_id } ;Parent=53995c3f42cd8ad8;Sampled=1"
179
193
monkeypatch .setenv (name = "_X_AMZN_TRACE_ID" , value = trace_header )
180
- logger = Logger (stream = stdout )
194
+ logger = Logger (service = service_name , stream = stdout )
181
195
182
196
# WHEN logging a message
183
197
logger .info ("foo" )
@@ -190,9 +204,9 @@ def test_log_dict_xray_is_present_when_tracing_is_enabled(stdout, monkeypatch):
190
204
monkeypatch .delenv (name = "_X_AMZN_TRACE_ID" )
191
205
192
206
193
- def test_log_dict_xray_is_not_present_when_tracing_is_disabled (stdout , monkeypatch ):
207
+ def test_log_dict_xray_is_not_present_when_tracing_is_disabled (stdout , monkeypatch , service_name ):
194
208
# GIVEN a logger is initialized within a Lambda function with X-Ray disabled (default)
195
- logger = Logger (stream = stdout )
209
+ logger = Logger (service = service_name , stream = stdout )
196
210
197
211
# WHEN logging a message
198
212
logger .info ("foo" )
@@ -203,12 +217,12 @@ def test_log_dict_xray_is_not_present_when_tracing_is_disabled(stdout, monkeypat
203
217
assert "xray_trace_id" not in log_dict
204
218
205
219
206
- def test_log_dict_xray_is_updated_when_tracing_id_changes (stdout , monkeypatch ):
220
+ def test_log_dict_xray_is_updated_when_tracing_id_changes (stdout , monkeypatch , service_name ):
207
221
# GIVEN a logger is initialized within a Lambda function with X-Ray enabled
208
222
trace_id = "1-5759e988-bd862e3fe1be46a994272793"
209
223
trace_header = f"Root={ trace_id } ;Parent=53995c3f42cd8ad8;Sampled=1"
210
224
monkeypatch .setenv (name = "_X_AMZN_TRACE_ID" , value = trace_header )
211
- logger = Logger (stream = stdout )
225
+ logger = Logger (service = service_name , stream = stdout )
212
226
213
227
# WHEN logging a message
214
228
logger .info ("foo" )
0 commit comments