Skip to content

Commit c1c8ce1

Browse files
author
Yoshi Yamaguchi
authoredApr 21, 2023
feat: add logic to convert severity string to uppercase (#744)
1 parent 7baafa0 commit c1c8ce1

File tree

3 files changed

+97
-71
lines changed

3 files changed

+97
-71
lines changed
 

‎google/cloud/logging_v2/entries.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,10 @@ def to_api_repr(self):
229229
if self.insert_id is not None:
230230
info["insertId"] = self.insert_id
231231
if self.severity is not None:
232-
info["severity"] = self.severity
232+
if isinstance(self.severity, str):
233+
info["severity"] = self.severity.upper()
234+
else:
235+
info["severity"] = self.severity
233236
if self.http_request is not None:
234237
info["httpRequest"] = self.http_request
235238
if self.timestamp is not None:

‎google/cloud/logging_v2/logger.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def _do_log(self, client, _entry_class, payload=None, **kw):
141141
kw["resource"] = kw.pop("resource", self.default_resource)
142142

143143
severity = kw.get("severity", None)
144-
if isinstance(severity, str) and not severity.isupper():
144+
if isinstance(severity, str):
145145
# convert severity to upper case, as expected by enum definition
146146
kw["severity"] = severity.upper()
147147

‎tests/unit/test_logger.py

+92-69
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,13 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from copy import deepcopy
16-
from datetime import datetime
17-
from datetime import timedelta
18-
from datetime import timezone
1915
import sys
20-
2116
import unittest
22-
import pytest
17+
from copy import deepcopy
18+
from datetime import datetime, timedelta, timezone
2319

2420
import mock
21+
import pytest
2522

2623

2724
def _make_credentials():
@@ -131,6 +128,7 @@ def test_log_empty_defaults_w_default_labels(self):
131128

132129
def test_log_empty_w_explicit(self):
133130
import datetime
131+
134132
from google.cloud.logging import Resource
135133

136134
ALT_LOG_NAME = "projects/foo/logs/alt.log.name"
@@ -237,6 +235,7 @@ def test_log_text_w_unicode_and_default_labels(self):
237235

238236
def test_log_text_explicit(self):
239237
import datetime
238+
240239
from google.cloud.logging import Resource
241240

242241
ALT_LOG_NAME = "projects/foo/logs/alt.log.name"
@@ -370,6 +369,7 @@ def test_log_struct_w_default_labels(self):
370369

371370
def test_log_struct_w_explicit(self):
372371
import datetime
372+
373373
from google.cloud.logging import Resource
374374

375375
ALT_LOG_NAME = "projects/foo/logs/alt.log.name"
@@ -533,10 +533,11 @@ def test_log_lowercase_severity(self):
533533
)
534534

535535
def test_log_proto_defaults(self):
536+
import json
537+
536538
from google.cloud.logging_v2.handlers._monitored_resources import (
537539
detect_resource,
538540
)
539-
import json
540541
from google.protobuf.json_format import MessageToJson
541542
from google.protobuf.struct_pb2 import Struct, Value
542543

@@ -559,10 +560,11 @@ def test_log_proto_defaults(self):
559560
)
560561

561562
def test_log_proto_w_default_labels(self):
563+
import json
564+
562565
from google.cloud.logging_v2.handlers._monitored_resources import (
563566
detect_resource,
564567
)
565-
import json
566568
from google.protobuf.json_format import MessageToJson
567569
from google.protobuf.struct_pb2 import Struct, Value
568570

@@ -587,12 +589,12 @@ def test_log_proto_w_default_labels(self):
587589
)
588590

589591
def test_log_proto_w_explicit(self):
590-
import json
591592
import datetime
592-
from google.protobuf.json_format import MessageToJson
593-
from google.protobuf.struct_pb2 import Struct
594-
from google.protobuf.struct_pb2 import Value
593+
import json
594+
595595
from google.cloud.logging import Resource
596+
from google.protobuf.json_format import MessageToJson
597+
from google.protobuf.struct_pb2 import Struct, Value
596598

597599
message = Struct(fields={"foo": Value(bool_value=True)})
598600
ALT_LOG_NAME = "projects/foo/logs/alt.log.name"
@@ -720,11 +722,12 @@ def test_log_inference_struct(self):
720722

721723
def test_log_inference_proto(self):
722724
import json
723-
from google.protobuf.json_format import MessageToJson
724-
from google.protobuf.struct_pb2 import Struct, Value
725+
725726
from google.cloud.logging_v2.handlers._monitored_resources import (
726727
detect_resource,
727728
)
729+
from google.protobuf.json_format import MessageToJson
730+
from google.protobuf.struct_pb2 import Struct, Value
728731

729732
message = Struct(fields={"foo": Value(bool_value=True)})
730733
ENTRIES = [
@@ -809,8 +812,7 @@ def test_list_entries_defaults(self):
809812
self.assertLess(yesterday - timestamp, timedelta(minutes=1))
810813

811814
def test_list_entries_explicit(self):
812-
from google.cloud.logging import DESCENDING
813-
from google.cloud.logging import Client
815+
from google.cloud.logging import DESCENDING, Client
814816

815817
PROJECT1 = "PROJECT1"
816818
PROJECT2 = "PROJECT2"
@@ -870,8 +872,7 @@ def test_list_entries_explicit(self):
870872
self.assertLess(yesterday - timestamp, timedelta(minutes=1))
871873

872874
def test_list_entries_explicit_timestamp(self):
873-
from google.cloud.logging import DESCENDING
874-
from google.cloud.logging import Client
875+
from google.cloud.logging import DESCENDING, Client
875876

876877
PROJECT1 = "PROJECT1"
877878
PROJECT2 = "PROJECT2"
@@ -916,11 +917,13 @@ def test_list_entries_explicit_timestamp(self):
916917
)
917918

918919
def test_list_entries_limit(self):
919-
from google.cloud.logging import DESCENDING
920-
from google.cloud.logging import ProtobufEntry
921-
from google.cloud.logging import StructEntry
922-
from google.cloud.logging import Logger
923-
from google.cloud.logging import Client
920+
from google.cloud.logging import (
921+
DESCENDING,
922+
Client,
923+
Logger,
924+
ProtobufEntry,
925+
StructEntry,
926+
)
924927

925928
PROJECT1 = "PROJECT1"
926929
PROJECT2 = "PROJECT2"
@@ -1010,8 +1013,7 @@ def test_list_entries_limit(self):
10101013
)
10111014

10121015
def test_list_entries_folder(self):
1013-
from google.cloud.logging import TextEntry
1014-
from google.cloud.logging import Client
1016+
from google.cloud.logging import Client, TextEntry
10151017

10161018
client = Client(
10171019
project=self.PROJECT, credentials=_make_credentials(), _use_grpc=False
@@ -1042,11 +1044,11 @@ def test_list_entries_folder(self):
10421044
self.assertEqual(entry.log_name, LOG_NAME)
10431045

10441046
def test_first_log_emits_instrumentation(self):
1047+
import google.cloud.logging_v2
1048+
from google.cloud.logging_v2._instrumentation import _create_diagnostic_entry
10451049
from google.cloud.logging_v2.handlers._monitored_resources import (
10461050
detect_resource,
10471051
)
1048-
from google.cloud.logging_v2._instrumentation import _create_diagnostic_entry
1049-
import google.cloud.logging_v2
10501052

10511053
google.cloud.logging_v2._instrumentation_emitted = False
10521054
DEFAULT_LABELS = {"foo": "spam"}
@@ -1116,8 +1118,8 @@ def test_log_empty_defaults(self):
11161118

11171119
def test_log_empty_explicit(self):
11181120
import datetime
1119-
from google.cloud.logging import Resource
1120-
from google.cloud.logging import LogEntry
1121+
1122+
from google.cloud.logging import LogEntry, Resource
11211123

11221124
LABELS = {"foo": "bar", "baz": "qux"}
11231125
IID = "IID"
@@ -1161,8 +1163,8 @@ def test_log_empty_explicit(self):
11611163
self.assertEqual(batch.entries, [ENTRY])
11621164

11631165
def test_log_text_defaults(self):
1164-
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
11651166
from google.cloud.logging import TextEntry
1167+
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
11661168

11671169
TEXT = "This is the entry text"
11681170
ENTRY = TextEntry(payload=TEXT, resource=_GLOBAL_RESOURCE)
@@ -1174,8 +1176,8 @@ def test_log_text_defaults(self):
11741176

11751177
def test_log_text_explicit(self):
11761178
import datetime
1177-
from google.cloud.logging import Resource
1178-
from google.cloud.logging import TextEntry
1179+
1180+
from google.cloud.logging import Resource, TextEntry
11791181

11801182
TEXT = "This is the entry text"
11811183
LABELS = {"foo": "bar", "baz": "qux"}
@@ -1222,8 +1224,8 @@ def test_log_text_explicit(self):
12221224
self.assertEqual(batch.entries, [ENTRY])
12231225

12241226
def test_log_struct_defaults(self):
1225-
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
12261227
from google.cloud.logging import StructEntry
1228+
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
12271229

12281230
STRUCT = {"message": "Message text", "weather": "partly cloudy"}
12291231
ENTRY = StructEntry(payload=STRUCT, resource=_GLOBAL_RESOURCE)
@@ -1235,8 +1237,8 @@ def test_log_struct_defaults(self):
12351237

12361238
def test_log_struct_explicit(self):
12371239
import datetime
1238-
from google.cloud.logging import Resource
1239-
from google.cloud.logging import StructEntry
1240+
1241+
from google.cloud.logging import Resource, StructEntry
12401242

12411243
STRUCT = {"message": "Message text", "weather": "partly cloudy"}
12421244
LABELS = {"foo": "bar", "baz": "qux"}
@@ -1283,10 +1285,9 @@ def test_log_struct_explicit(self):
12831285
self.assertEqual(batch.entries, [ENTRY])
12841286

12851287
def test_log_proto_defaults(self):
1286-
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
12871288
from google.cloud.logging import ProtobufEntry
1288-
from google.protobuf.struct_pb2 import Struct
1289-
from google.protobuf.struct_pb2 import Value
1289+
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
1290+
from google.protobuf.struct_pb2 import Struct, Value
12901291

12911292
message = Struct(fields={"foo": Value(bool_value=True)})
12921293
ENTRY = ProtobufEntry(payload=message, resource=_GLOBAL_RESOURCE)
@@ -1298,10 +1299,9 @@ def test_log_proto_defaults(self):
12981299

12991300
def test_log_proto_explicit(self):
13001301
import datetime
1301-
from google.cloud.logging import Resource
1302-
from google.cloud.logging import ProtobufEntry
1303-
from google.protobuf.struct_pb2 import Struct
1304-
from google.protobuf.struct_pb2 import Value
1302+
1303+
from google.cloud.logging import ProtobufEntry, Resource
1304+
from google.protobuf.struct_pb2 import Struct, Value
13051305

13061306
message = Struct(fields={"foo": Value(bool_value=True)})
13071307
LABELS = {"foo": "bar", "baz": "qux"}
@@ -1365,8 +1365,8 @@ def test_log_inference_text(self):
13651365
When calling batch.log with text input, it should
13661366
call batch.log_text
13671367
"""
1368-
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
13691368
from google.cloud.logging import TextEntry
1369+
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
13701370

13711371
TEXT = "This is the entry text"
13721372
ENTRY = TextEntry(payload=TEXT, resource=_GLOBAL_RESOURCE)
@@ -1381,8 +1381,8 @@ def test_log_inference_struct(self):
13811381
When calling batch.struct with text input, it should
13821382
call batch.log_struct
13831383
"""
1384-
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
13851384
from google.cloud.logging import StructEntry
1385+
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
13861386

13871387
STRUCT = {"message": "Message text", "weather": "partly cloudy"}
13881388
ENTRY = StructEntry(payload=STRUCT, resource=_GLOBAL_RESOURCE)
@@ -1397,10 +1397,9 @@ def test_log_inference_proto(self):
13971397
When calling batch.log with proto input, it should
13981398
call batch.log_proto
13991399
"""
1400-
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
14011400
from google.cloud.logging import ProtobufEntry
1402-
from google.protobuf.struct_pb2 import Struct
1403-
from google.protobuf.struct_pb2 import Value
1401+
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
1402+
from google.protobuf.struct_pb2 import Struct, Value
14041403

14051404
message = Struct(fields={"foo": Value(bool_value=True)})
14061405
ENTRY = ProtobufEntry(payload=message, resource=_GLOBAL_RESOURCE)
@@ -1416,8 +1415,8 @@ def test_log_inference_struct_explicit(self):
14161415
call batch.log_struct, along with input arguments
14171416
"""
14181417
import datetime
1419-
from google.cloud.logging import Resource
1420-
from google.cloud.logging import StructEntry
1418+
1419+
from google.cloud.logging import Resource, StructEntry
14211420

14221421
STRUCT = {"message": "Message text", "weather": "partly cloudy"}
14231422
LABELS = {"foo": "bar", "baz": "qux"}
@@ -1464,15 +1463,15 @@ def test_log_inference_struct_explicit(self):
14641463
self.assertEqual(batch.entries, [ENTRY])
14651464

14661465
def test_commit_w_unknown_entry_type(self):
1467-
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
14681466
from google.cloud.logging import LogEntry
1467+
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
14691468

14701469
logger = _Logger()
14711470
client = _Client(project=self.PROJECT, connection=_make_credentials())
14721471
api = client.logging_api = _DummyLoggingAPI()
14731472
batch = self._make_one(logger, client)
14741473
batch.entries.append(LogEntry(severity="blah"))
1475-
ENTRY = {"severity": "blah", "resource": _GLOBAL_RESOURCE._to_dict()}
1474+
ENTRY = {"severity": "BLAH", "resource": _GLOBAL_RESOURCE._to_dict()}
14761475

14771476
batch.commit()
14781477

@@ -1482,9 +1481,35 @@ def test_commit_w_unknown_entry_type(self):
14821481
([ENTRY], logger.full_name, None, None, True),
14831482
)
14841483

1485-
def test_commit_w_resource_specified(self):
1484+
def test_commit_w_lowercase_severity_type(self):
1485+
from google.cloud.logging import LogEntry
14861486
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
1487+
1488+
logger = _Logger()
1489+
client = _Client(project=self.PROJECT, connection=_make_credentials())
1490+
api = client.logging_api = _DummyLoggingAPI()
1491+
batch = self._make_one(logger, client)
1492+
batch.entries.append(LogEntry(severity="info"))
1493+
batch.entries.append(LogEntry(severity="warn"))
1494+
batch.entries.append(LogEntry(severity="error"))
1495+
batch.entries.append(LogEntry(severity="fatal"))
1496+
ENTRIES = [
1497+
{"severity": "INFO", "resource": _GLOBAL_RESOURCE._to_dict()},
1498+
{"severity": "WARN", "resource": _GLOBAL_RESOURCE._to_dict()},
1499+
{"severity": "ERROR", "resource": _GLOBAL_RESOURCE._to_dict()},
1500+
{"severity": "FATAL", "resource": _GLOBAL_RESOURCE._to_dict()},
1501+
]
1502+
1503+
batch.commit()
1504+
self.assertEqual(list(batch.entries), [])
1505+
self.assertEqual(
1506+
api._write_entries_called_with,
1507+
(ENTRIES, logger.full_name, None, None, True),
1508+
)
1509+
1510+
def test_commit_w_resource_specified(self):
14871511
from google.cloud.logging import Resource
1512+
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
14881513

14891514
logger = _Logger()
14901515
client = _Client(project=self.PROJECT, connection=_make_credentials())
@@ -1508,13 +1533,13 @@ def test_commit_w_resource_specified(self):
15081533
)
15091534

15101535
def test_commit_w_bound_client(self):
1511-
import json
15121536
import datetime
1513-
from google.protobuf.json_format import MessageToJson
1514-
from google.protobuf.struct_pb2 import Struct
1515-
from google.protobuf.struct_pb2 import Value
1537+
import json
1538+
15161539
from google.cloud._helpers import _datetime_to_rfc3339
15171540
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
1541+
from google.protobuf.json_format import MessageToJson
1542+
from google.protobuf.struct_pb2 import Struct, Value
15181543

15191544
TEXT = "This is the entry text"
15201545
STRUCT = {"message": TEXT, "weather": "partly cloudy"}
@@ -1599,11 +1624,11 @@ def test_commit_w_bound_client(self):
15991624

16001625
def test_commit_w_alternate_client(self):
16011626
import json
1602-
from google.protobuf.json_format import MessageToJson
1603-
from google.protobuf.struct_pb2 import Struct
1604-
from google.protobuf.struct_pb2 import Value
1627+
16051628
from google.cloud.logging import Logger
16061629
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
1630+
from google.protobuf.json_format import MessageToJson
1631+
from google.protobuf.struct_pb2 import Struct, Value
16071632

16081633
TEXT = "This is the entry text"
16091634
STRUCT = {"message": TEXT, "weather": "partly cloudy"}
@@ -1651,11 +1676,11 @@ def test_commit_w_alternate_client(self):
16511676

16521677
def test_context_mgr_success(self):
16531678
import json
1654-
from google.protobuf.json_format import MessageToJson
1655-
from google.protobuf.struct_pb2 import Struct
1656-
from google.protobuf.struct_pb2 import Value
1679+
16571680
from google.cloud.logging import Logger
16581681
from google.cloud.logging_v2.entries import _GLOBAL_RESOURCE
1682+
from google.protobuf.json_format import MessageToJson
1683+
from google.protobuf.struct_pb2 import Struct, Value
16591684

16601685
TEXT = "This is the entry text"
16611686
STRUCT = {"message": TEXT, "weather": "partly cloudy"}
@@ -1702,11 +1727,9 @@ def test_context_mgr_success(self):
17021727

17031728
def test_context_mgr_failure(self):
17041729
import datetime
1705-
from google.protobuf.struct_pb2 import Struct
1706-
from google.protobuf.struct_pb2 import Value
1707-
from google.cloud.logging import TextEntry
1708-
from google.cloud.logging import StructEntry
1709-
from google.cloud.logging import ProtobufEntry
1730+
1731+
from google.cloud.logging import ProtobufEntry, StructEntry, TextEntry
1732+
from google.protobuf.struct_pb2 import Struct, Value
17101733

17111734
TEXT = "This is the entry text"
17121735
STRUCT = {"message": TEXT, "weather": "partly cloudy"}
@@ -1752,8 +1775,8 @@ def test_append_context_to_error(self):
17521775
exception should be unchanged
17531776
"""
17541777
from google.api_core.exceptions import InvalidArgument
1755-
from google.rpc.error_details_pb2 import DebugInfo
17561778
from google.cloud.logging import TextEntry
1779+
from google.rpc.error_details_pb2 import DebugInfo
17571780

17581781
logger = _Logger()
17591782
client = _Client(project=self.PROJECT)
@@ -1803,8 +1826,8 @@ def test_batch_error_gets_context(self):
18031826
_append_context_to_error is thrown
18041827
"""
18051828
from google.api_core.exceptions import InvalidArgument
1806-
from google.rpc.error_details_pb2 import DebugInfo
18071829
from google.cloud.logging import TextEntry
1830+
from google.rpc.error_details_pb2 import DebugInfo
18081831

18091832
logger = _Logger()
18101833
client = _Client(project=self.PROJECT)

0 commit comments

Comments
 (0)
Please sign in to comment.