Skip to content

Commit ef038bf

Browse files
yuvipandacrwilcox
authored andcommitted
Allow turning on JSON Detection in StackDriver (#6293)
* Allow turning on JSON Detection in StackDriver To enable JSON detection in StackDriver, `jsonPayload` should have no fields other than `message`. This patch lets clients opt-in to this behavior, by creating a custom Transport. Fixes googleapis/google-cloud-python#5799
1 parent b945006 commit ef038bf

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

google/cloud/logging/handlers/transports/background_thread.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,18 @@ class _Worker(object):
9292
than the grace_period. This means this is effectively the longest
9393
amount of time the background thread will hold onto log entries
9494
before sending them to the server.
95+
96+
:type includer_logger_name: bool
97+
:param include_logger_name: (optional) Include python_logger field in
98+
jsonPayload. Turn this off to enable json detection in log messages.
9599
"""
96100

97101
def __init__(self, cloud_logger, grace_period=_DEFAULT_GRACE_PERIOD,
98102
max_batch_size=_DEFAULT_MAX_BATCH_SIZE,
99-
max_latency=_DEFAULT_MAX_LATENCY):
103+
max_latency=_DEFAULT_MAX_LATENCY,
104+
include_logger_name=True):
100105
self._cloud_logger = cloud_logger
106+
self._include_logger_name = include_logger_name
101107
self._grace_period = grace_period
102108
self._max_batch_size = max_batch_size
103109
self._max_latency = max_latency
@@ -253,17 +259,21 @@ def enqueue(self, record, message, resource=None, labels=None,
253259
:param span_id: (optional) span_id within the trace for the log entry.
254260
Specify the trace parameter if span_id is set.
255261
"""
256-
self._queue.put_nowait({
262+
263+
log_record = {
257264
'info': {
258265
'message': message,
259-
'python_logger': record.name,
260266
},
261267
'severity': record.levelname,
262268
'resource': resource,
263269
'labels': labels,
264270
'trace': trace,
265271
'span_id': span_id,
266-
})
272+
}
273+
274+
if self._include_logger_name:
275+
log_record['info']['python_logger'] = record.name
276+
self._queue.put_nowait(log_record)
267277

268278
def flush(self):
269279
"""Submit any pending log records."""
@@ -293,17 +303,24 @@ class BackgroundThreadTransport(Transport):
293303
than the grace_period. This means this is effectively the longest
294304
amount of time the background thread will hold onto log entries
295305
before sending them to the server.
306+
307+
:type includer_logger_name: bool
308+
:param include_logger_name: (optional) Include python_logger field in
309+
jsonPayload. Turn this off to enable jso
310+
detection in log messages.
296311
"""
297312

298313
def __init__(self, client, name, grace_period=_DEFAULT_GRACE_PERIOD,
299314
batch_size=_DEFAULT_MAX_BATCH_SIZE,
300-
max_latency=_DEFAULT_MAX_LATENCY):
315+
max_latency=_DEFAULT_MAX_LATENCY,
316+
include_logger_name=True):
301317
self.client = client
302318
logger = self.client.logger(name)
303319
self.worker = _Worker(logger,
304320
grace_period=grace_period,
305321
max_batch_size=batch_size,
306-
max_latency=max_latency)
322+
max_latency=max_latency,
323+
include_logger_name=include_logger_name)
307324
self.worker.start()
308325

309326
def send(self, record, message, resource=None, labels=None,

tests/unit/handlers/transports/test_background_thread.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ def test_constructor(self):
175175
self.assertEqual(worker._grace_period, grace_period)
176176
self.assertEqual(worker._max_batch_size, max_batch_size)
177177
self.assertEqual(worker._max_latency, max_latency)
178+
self.assertTrue(worker._include_logger_name)
178179
self.assertFalse(worker.is_alive)
179180
self.assertIsNone(worker._thread)
180181

@@ -282,6 +283,23 @@ def test__thread_main(self):
282283
self.assertEqual(worker._cloud_logger._batch.commit_count, 2)
283284
self.assertEqual(worker._queue.qsize(), 0)
284285

286+
def test__thread_main_no_python_logger(self):
287+
from google.cloud.logging.handlers.transports import background_thread
288+
289+
worker = self._make_one(_Logger(self.NAME), include_logger_name=False)
290+
self.assertFalse(worker._include_logger_name)
291+
292+
# Enqueue one record and the termination signal.
293+
self._enqueue_record(worker, '1')
294+
worker._queue.put_nowait(background_thread._WORKER_TERMINATOR)
295+
296+
worker._thread_main()
297+
298+
self.assertEqual(len(worker._cloud_logger._batch.all_entries), 1)
299+
self.assertFalse(
300+
'python_logger' in worker._cloud_logger._batch.all_entries[0]
301+
)
302+
285303
def test__thread_main_error(self):
286304
from google.cloud.logging.handlers.transports import background_thread
287305

@@ -421,9 +439,12 @@ def join(self, timeout=None):
421439
class _Batch(object):
422440

423441
def __init__(self):
442+
# Entries waiting to be committed
424443
self.entries = []
425444
self.commit_called = False
426445
self.commit_count = None
446+
# All entries ever committed via this _Batch
447+
self.all_entries = []
427448

428449
def log_struct(
429450
self, info, severity=logging.INFO, resource=None, labels=None,
@@ -436,6 +457,7 @@ def log_struct(
436457
self.log_struct_called_with = (info, severity, resource, labels,
437458
trace, span_id)
438459
self.entries.append(info)
460+
self.all_entries.append(info)
439461

440462
def commit(self):
441463
self.commit_called = True

0 commit comments

Comments
 (0)