Skip to content

Commit e56d3e8

Browse files
feat: set partial_success to default to true for batched logs (#649)
1 parent e27da52 commit e56d3e8

File tree

6 files changed

+91
-39
lines changed

6 files changed

+91
-39
lines changed

google/cloud/logging_v2/_gapic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def write_entries(
121121
logger_name=None,
122122
resource=None,
123123
labels=None,
124-
partial_success=False,
124+
partial_success=True,
125125
dry_run=False,
126126
):
127127
"""Log an entry resource via a POST request

google/cloud/logging_v2/_http.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def write_entries(
144144
logger_name=None,
145145
resource=None,
146146
labels=None,
147-
partial_success=False,
147+
partial_success=True,
148148
dry_run=False,
149149
):
150150
"""Log an entry resource via a POST request

google/cloud/logging_v2/logger.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ def _do_log(self, client, _entry_class, payload=None, **kw):
135135
kw["log_name"] = kw.pop("log_name", self.full_name)
136136
kw["labels"] = kw.pop("labels", self.labels)
137137
kw["resource"] = kw.pop("resource", self.default_resource)
138-
partial_success = False
139138

140139
severity = kw.get("severity", None)
141140
if isinstance(severity, str) and not severity.isupper():
@@ -159,11 +158,10 @@ def _do_log(self, client, _entry_class, payload=None, **kw):
159158
api_repr = entry.to_api_repr()
160159
entries = [api_repr]
161160
if google.cloud.logging_v2._instrumentation_emitted is False:
162-
partial_success = True
163161
entries = _add_instrumentation(entries, **kw)
164162
google.cloud.logging_v2._instrumentation_emitted = True
165-
166-
client.logging_api.write_entries(entries, partial_success=partial_success)
163+
# partial_success is true to avoid dropping instrumentation logs
164+
client.logging_api.write_entries(entries, partial_success=True)
167165

168166
def log_empty(self, *, client=None, **kw):
169167
"""Log an empty message
@@ -437,13 +435,17 @@ def log(self, message=None, **kw):
437435
entry_type = TextEntry
438436
self.entries.append(entry_type(payload=message, **kw))
439437

440-
def commit(self, *, client=None):
438+
def commit(self, *, client=None, partial_success=True):
441439
"""Send saved log entries as a single API call.
442440
443441
Args:
444442
client (Optional[~logging_v2.client.Client]):
445443
The client to use. If not passed, falls back to the
446444
``client`` stored on the current batch.
445+
partial_success (Optional[bool]):
446+
Whether a batch's valid entries should be written even
447+
if some other entry failed due to a permanent error such
448+
as INVALID_ARGUMENT or PERMISSION_DENIED.
447449
"""
448450
if client is None:
449451
client = self.client
@@ -458,5 +460,7 @@ def commit(self, *, client=None):
458460

459461
entries = [entry.to_api_repr() for entry in self.entries]
460462

461-
client.logging_api.write_entries(entries, **kwargs)
463+
client.logging_api.write_entries(
464+
entries, partial_success=partial_success, **kwargs
465+
)
462466
del self.entries[:]

tests/unit/test__gapic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ def test_write_entries_single(self):
167167
# Check the request
168168
call.assert_called_once()
169169
request = call.call_args.args[0]
170-
assert request.partial_success is False
170+
assert request.partial_success is True
171171
assert len(request.entries) == 1
172172
assert request.entries[0].log_name == entry["logName"]
173173
assert request.entries[0].resource.type == entry["resource"]["type"]

tests/unit/test__http.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ def test_write_entries_single(self):
306306
client = _Client(conn)
307307
api = self._make_one(client)
308308

309-
api.write_entries([ENTRY])
309+
api.write_entries([ENTRY], partial_success=False)
310310

311311
self.assertEqual(conn._called_with["method"], "POST")
312312
path = f"/{self.WRITE_ENTRIES_PATH}"
@@ -325,7 +325,7 @@ def test_write_entries_multiple(self):
325325
"resource": RESOURCE,
326326
"labels": LABELS,
327327
"entries": [ENTRY1, ENTRY2],
328-
"partialSuccess": False,
328+
"partialSuccess": True,
329329
"dry_run": False,
330330
}
331331
conn = _Connection({})

tests/unit/test_logger.py

Lines changed: 76 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,9 @@ def test_log_empty_defaults_w_default_labels(self):
123123

124124
logger.log_empty()
125125

126-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
126+
self.assertEqual(
127+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
128+
)
127129

128130
def test_log_empty_w_explicit(self):
129131
import datetime
@@ -177,7 +179,9 @@ def test_log_empty_w_explicit(self):
177179
trace_sampled=True,
178180
)
179181

180-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
182+
self.assertEqual(
183+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
184+
)
181185

182186
def test_log_text_defaults(self):
183187
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -199,7 +203,9 @@ def test_log_text_defaults(self):
199203

200204
logger.log_text(TEXT)
201205

202-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
206+
self.assertEqual(
207+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
208+
)
203209

204210
def test_log_text_w_unicode_and_default_labels(self):
205211
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -223,7 +229,9 @@ def test_log_text_w_unicode_and_default_labels(self):
223229

224230
logger.log_text(TEXT)
225231

226-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
232+
self.assertEqual(
233+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
234+
)
227235

228236
def test_log_text_explicit(self):
229237
import datetime
@@ -280,7 +288,9 @@ def test_log_text_explicit(self):
280288
trace_sampled=True,
281289
)
282290

283-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
291+
self.assertEqual(
292+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
293+
)
284294

285295
def test_log_struct_defaults(self):
286296
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -302,7 +312,9 @@ def test_log_struct_defaults(self):
302312

303313
logger.log_struct(STRUCT)
304314

305-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
315+
self.assertEqual(
316+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
317+
)
306318

307319
def test_log_nested_struct(self):
308320
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -324,7 +336,9 @@ def test_log_nested_struct(self):
324336

325337
logger.log(STRUCT)
326338

327-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
339+
self.assertEqual(
340+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
341+
)
328342

329343
def test_log_struct_w_default_labels(self):
330344
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -348,7 +362,9 @@ def test_log_struct_w_default_labels(self):
348362

349363
logger.log_struct(STRUCT)
350364

351-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
365+
self.assertEqual(
366+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
367+
)
352368

353369
def test_log_struct_w_explicit(self):
354370
import datetime
@@ -405,7 +421,9 @@ def test_log_struct_w_explicit(self):
405421
trace_sampled=True,
406422
)
407423

408-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
424+
self.assertEqual(
425+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
426+
)
409427

410428
def test_log_struct_inference(self):
411429
"""
@@ -439,7 +457,9 @@ def test_log_struct_inference(self):
439457

440458
logger.log_struct(STRUCT, resource=RESOURCE)
441459

442-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
460+
self.assertEqual(
461+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
462+
)
443463

444464
def test_log_w_dict_resource(self):
445465
"""
@@ -467,7 +487,9 @@ def test_log_w_dict_resource(self):
467487
}
468488
]
469489
logger.log(MESSAGE, resource=resource)
470-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
490+
self.assertEqual(
491+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
492+
)
471493

472494
def test_log_lowercase_severity(self):
473495
"""
@@ -505,7 +527,7 @@ def test_log_lowercase_severity(self):
505527
logger.log(MESSAGE, severity=lower_severity)
506528

507529
self.assertEqual(
508-
api._write_entries_called_with, (ENTRIES, None, None, None)
530+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
509531
)
510532

511533
def test_log_proto_defaults(self):
@@ -530,7 +552,9 @@ def test_log_proto_defaults(self):
530552

531553
logger.log_proto(message)
532554

533-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
555+
self.assertEqual(
556+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
557+
)
534558

535559
def test_log_proto_w_default_labels(self):
536560
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -556,7 +580,9 @@ def test_log_proto_w_default_labels(self):
556580

557581
logger.log_proto(message)
558582

559-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
583+
self.assertEqual(
584+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
585+
)
560586

561587
def test_log_proto_w_explicit(self):
562588
import json
@@ -617,7 +643,9 @@ def test_log_proto_w_explicit(self):
617643
trace_sampled=True,
618644
)
619645

620-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
646+
self.assertEqual(
647+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
648+
)
621649

622650
def test_log_inference_empty(self):
623651
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -638,7 +666,9 @@ def test_log_inference_empty(self):
638666

639667
logger.log()
640668

641-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
669+
self.assertEqual(
670+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
671+
)
642672

643673
def test_log_inference_text(self):
644674
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -659,7 +689,9 @@ def test_log_inference_text(self):
659689

660690
logger.log(TEXT)
661691

662-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
692+
self.assertEqual(
693+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
694+
)
663695

664696
def test_log_inference_struct(self):
665697
from google.cloud.logging_v2.handlers._monitored_resources import (
@@ -680,7 +712,9 @@ def test_log_inference_struct(self):
680712

681713
logger.log(STRUCT)
682714

683-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
715+
self.assertEqual(
716+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
717+
)
684718

685719
def test_log_inference_proto(self):
686720
import json
@@ -704,7 +738,9 @@ def test_log_inference_proto(self):
704738

705739
logger.log(message)
706740

707-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
741+
self.assertEqual(
742+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
743+
)
708744

709745
def test_delete_w_bound_client(self):
710746
client = _Client(project=self.PROJECT)
@@ -1033,12 +1069,16 @@ def test_first_log_emits_instrumentation(self):
10331069
api = client.logging_api = _DummyLoggingAPI()
10341070
logger = self._make_one(self.LOGGER_NAME, client=client, labels=DEFAULT_LABELS)
10351071
logger.log_empty()
1036-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
1072+
self.assertEqual(
1073+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
1074+
)
10371075

10381076
ENTRIES = ENTRIES[-1:]
10391077
api = client.logging_api = _DummyLoggingAPI()
10401078
logger.log_empty()
1041-
self.assertEqual(api._write_entries_called_with, (ENTRIES, None, None, None))
1079+
self.assertEqual(
1080+
api._write_entries_called_with, (ENTRIES, None, None, None, True)
1081+
)
10421082

10431083

10441084
class TestBatch(unittest.TestCase):
@@ -1436,7 +1476,8 @@ def test_commit_w_unknown_entry_type(self):
14361476

14371477
self.assertEqual(list(batch.entries), [])
14381478
self.assertEqual(
1439-
api._write_entries_called_with, ([ENTRY], logger.full_name, None, None)
1479+
api._write_entries_called_with,
1480+
([ENTRY], logger.full_name, None, None, True),
14401481
)
14411482

14421483
def test_commit_w_resource_specified(self):
@@ -1461,7 +1502,7 @@ def test_commit_w_resource_specified(self):
14611502
batch.commit()
14621503
self.assertEqual(
14631504
api._write_entries_called_with,
1464-
(ENTRIES, logger.full_name, RESOURCE._to_dict(), None),
1505+
(ENTRIES, logger.full_name, RESOURCE._to_dict(), None, True),
14651506
)
14661507

14671508
def test_commit_w_bound_client(self):
@@ -1550,7 +1591,8 @@ def test_commit_w_bound_client(self):
15501591

15511592
self.assertEqual(list(batch.entries), [])
15521593
self.assertEqual(
1553-
api._write_entries_called_with, (ENTRIES, logger.full_name, None, None)
1594+
api._write_entries_called_with,
1595+
(ENTRIES, logger.full_name, None, None, True),
15541596
)
15551597

15561598
def test_commit_w_alternate_client(self):
@@ -1597,12 +1639,12 @@ def test_commit_w_alternate_client(self):
15971639
batch.log_text(TEXT, labels=LABELS)
15981640
batch.log_struct(STRUCT, severity=SEVERITY)
15991641
batch.log_proto(message, http_request=REQUEST)
1600-
batch.commit(client=client2)
1642+
batch.commit(client=client2, partial_success=False)
16011643

16021644
self.assertEqual(list(batch.entries), [])
16031645
self.assertEqual(
16041646
api._write_entries_called_with,
1605-
(ENTRIES, logger.full_name, None, DEFAULT_LABELS),
1647+
(ENTRIES, logger.full_name, None, DEFAULT_LABELS, False),
16061648
)
16071649

16081650
def test_context_mgr_success(self):
@@ -1653,7 +1695,7 @@ def test_context_mgr_success(self):
16531695
self.assertEqual(list(batch.entries), [])
16541696
self.assertEqual(
16551697
api._write_entries_called_with,
1656-
(ENTRIES, logger.full_name, None, DEFAULT_LABELS),
1698+
(ENTRIES, logger.full_name, None, DEFAULT_LABELS, True),
16571699
)
16581700

16591701
def test_context_mgr_failure(self):
@@ -1719,7 +1761,13 @@ def write_entries(
17191761
labels=None,
17201762
partial_success=False,
17211763
):
1722-
self._write_entries_called_with = (entries, logger_name, resource, labels)
1764+
self._write_entries_called_with = (
1765+
entries,
1766+
logger_name,
1767+
resource,
1768+
labels,
1769+
partial_success,
1770+
)
17231771

17241772
def logger_delete(self, logger_name):
17251773
self._logger_delete_called_with = logger_name

0 commit comments

Comments
 (0)