Skip to content

Commit a6a443e

Browse files
brunoaistseaver
authored andcommitted
Add trace and span_id to logging async API (#5908)
1 parent 5b25f59 commit a6a443e

File tree

5 files changed

+86
-13
lines changed

5 files changed

+86
-13
lines changed

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ def _main_thread_terminated(self):
229229
'Failed to send %d pending logs.' % (self._queue.qsize(),),
230230
file=sys.stderr)
231231

232-
def enqueue(self, record, message, resource=None, labels=None):
232+
def enqueue(self, record, message, resource=None, labels=None,
233+
trace=None, span_id=None):
233234
"""Queues a log entry to be written by the background thread.
234235
235236
:type record: :class:`logging.LogRecord`
@@ -244,6 +245,13 @@ def enqueue(self, record, message, resource=None, labels=None):
244245
245246
:type labels: dict
246247
:param labels: (Optional) Mapping of labels for the entry.
248+
249+
:type trace: str
250+
:param trace: (optional) traceid to apply to the logging entry.
251+
252+
:type span_id: str
253+
:param span_id: (optional) span_id within the trace for the log entry.
254+
Specify the trace parameter if span_id is set.
247255
"""
248256
self._queue.put_nowait({
249257
'info': {
@@ -253,6 +261,8 @@ def enqueue(self, record, message, resource=None, labels=None):
253261
'severity': record.levelname,
254262
'resource': resource,
255263
'labels': labels,
264+
'trace': trace,
265+
'span_id': span_id,
256266
})
257267

258268
def flush(self):
@@ -296,7 +306,8 @@ def __init__(self, client, name, grace_period=_DEFAULT_GRACE_PERIOD,
296306
max_latency=max_latency)
297307
self.worker.start()
298308

299-
def send(self, record, message, resource=None, labels=None):
309+
def send(self, record, message, resource=None, labels=None,
310+
trace=None, span_id=None):
300311
"""Overrides Transport.send().
301312
302313
:type record: :class:`logging.LogRecord`
@@ -311,8 +322,16 @@ def send(self, record, message, resource=None, labels=None):
311322
312323
:type labels: dict
313324
:param labels: (Optional) Mapping of labels for the entry.
325+
326+
:type trace: str
327+
:param trace: (optional) traceid to apply to the logging entry.
328+
329+
:type span_id: str
330+
:param span_id: (optional) span_id within the trace for the log entry.
331+
Specify the trace parameter if span_id is set.
314332
"""
315-
self.worker.enqueue(record, message, resource=resource, labels=labels)
333+
self.worker.enqueue(record, message, resource=resource, labels=labels,
334+
trace=trace, span_id=span_id)
316335

317336
def flush(self):
318337
"""Submit any pending log records."""

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class Transport(object):
2222
client and name object, and must override :meth:`send`.
2323
"""
2424

25-
def send(self, record, message, resource=None, labels=None):
25+
def send(self, record, message, resource=None, labels=None,
26+
trace=None, span_id=None):
2627
"""Transport send to be implemented by subclasses.
2728
2829
:type record: :class:`logging.LogRecord`

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class SyncTransport(Transport):
2929
def __init__(self, client, name):
3030
self.logger = client.logger(name)
3131

32-
def send(self, record, message, resource=None, labels=None):
32+
def send(self, record, message, resource=None, labels=None,
33+
trace=None, span_id=None):
3334
"""Overrides transport.send().
3435
3536
:type record: :class:`logging.LogRecord`
@@ -49,4 +50,6 @@ def send(self, record, message, resource=None, labels=None):
4950
self.logger.log_struct(info,
5051
severity=record.levelname,
5152
resource=resource,
52-
labels=labels)
53+
labels=labels,
54+
trace=trace,
55+
span_id=span_id)

tests/unit/handlers/transports/test_background_thread.py

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,55 @@ def test_send(self):
6161
python_logger_name, logging.INFO,
6262
None, None, message, None, None)
6363

64-
transport.send(record, message, _GLOBAL_RESOURCE, None)
64+
transport.send(record, message, _GLOBAL_RESOURCE)
6565

6666
transport.worker.enqueue.assert_called_once_with(
67-
record, message, _GLOBAL_RESOURCE, None)
67+
record, message, _GLOBAL_RESOURCE, None,
68+
trace=None, span_id=None)
69+
70+
def test_trace_send(self):
71+
from google.cloud.logging.logger import _GLOBAL_RESOURCE
72+
73+
client = _Client(self.PROJECT)
74+
name = 'python_logger'
75+
76+
transport, _ = self._make_one(client, name)
77+
78+
python_logger_name = 'mylogger'
79+
message = 'hello world'
80+
trace = 'the-project/trace/longlogTraceid'
81+
82+
record = logging.LogRecord(
83+
python_logger_name, logging.INFO,
84+
None, None, message, None, None)
85+
86+
transport.send(record, message, _GLOBAL_RESOURCE, trace=trace)
87+
88+
transport.worker.enqueue.assert_called_once_with(
89+
record, message, _GLOBAL_RESOURCE, None,
90+
trace=trace, span_id=None)
91+
92+
def test_span_send(self):
93+
from google.cloud.logging.logger import _GLOBAL_RESOURCE
94+
95+
client = _Client(self.PROJECT)
96+
name = 'python_logger'
97+
98+
transport, _ = self._make_one(client, name)
99+
100+
python_logger_name = 'mylogger'
101+
message = 'hello world'
102+
span_id = 'the-project/trace/longlogTraceid/span/123456789012abbacdac'
103+
104+
record = logging.LogRecord(
105+
python_logger_name, logging.INFO,
106+
None, None, message, None, None)
107+
108+
transport.send(record, message, _GLOBAL_RESOURCE, span_id=span_id)
109+
110+
transport.worker.enqueue.assert_called_once_with(
111+
record, message, _GLOBAL_RESOURCE, None,
112+
trace=None, span_id=span_id)
68113

69114
def test_flush(self):
70115
client = _Client(self.PROJECT)
@@ -381,13 +426,15 @@ def __init__(self):
381426
self.commit_count = None
382427

383428
def log_struct(
384-
self, info, severity=logging.INFO, resource=None, labels=None):
429+
self, info, severity=logging.INFO, resource=None, labels=None,
430+
trace=None, span_id=None):
385431
from google.cloud.logging.logger import _GLOBAL_RESOURCE
386432

387433
assert resource is None
388434
resource = _GLOBAL_RESOURCE
389435

390-
self.log_struct_called_with = (info, severity, resource, labels)
436+
self.log_struct_called_with = (info, severity, resource, labels,
437+
trace, span_id)
391438
self.entries.append(info)
392439

393440
def commit(self):

tests/unit/handlers/transports/test_sync.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ def test_send(self):
5252
'message': message,
5353
'python_logger': python_logger_name,
5454
}
55-
EXPECTED_SENT = (EXPECTED_STRUCT, 'INFO', _GLOBAL_RESOURCE, None)
55+
EXPECTED_SENT = (EXPECTED_STRUCT, 'INFO', _GLOBAL_RESOURCE, None,
56+
None, None)
5657
self.assertEqual(
5758
transport.logger.log_struct_called_with, EXPECTED_SENT)
5859

@@ -64,8 +65,10 @@ def __init__(self, name):
6465
self.name = name
6566

6667
def log_struct(self, message, severity=None,
67-
resource=_GLOBAL_RESOURCE, labels=None):
68-
self.log_struct_called_with = (message, severity, resource, labels)
68+
resource=_GLOBAL_RESOURCE, labels=None,
69+
trace=None, span_id=None):
70+
self.log_struct_called_with = (message, severity, resource, labels,
71+
trace, span_id)
6972

7073

7174
class _Client(object):

0 commit comments

Comments
 (0)