Skip to content

Commit a5c2f8e

Browse files
feat: record source locations (#254)
1 parent a78f577 commit a5c2f8e

File tree

3 files changed

+31
-11
lines changed

3 files changed

+31
-11
lines changed

google/cloud/logging_v2/handlers/handlers.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def __init__(
126126
self.project_id = client.project
127127
self.resource = resource
128128
self.labels = labels
129+
# add extra keys to log record
130+
self.addFilter(CloudLoggingFilter(self.project_id))
129131

130132
def emit(self, record):
131133
"""Actually log the specified logging record.
@@ -138,25 +140,31 @@ def emit(self, record):
138140
record (logging.LogRecord): The record to be logged.
139141
"""
140142
message = super(CloudLoggingHandler, self).format(record)
141-
trace_id = getattr(record, "trace", None)
142-
span_id = getattr(record, "span_id", None)
143-
http_request = getattr(record, "http_request", None)
144-
resource = getattr(record, "resource", self.resource)
145143
user_labels = getattr(record, "labels", {})
146144
# merge labels
147145
total_labels = self.labels if self.labels is not None else {}
148146
total_labels.update(user_labels)
149147
if len(total_labels) == 0:
150148
total_labels = None
149+
# create source location object
150+
if record.lineno and record.funcName and record.pathname:
151+
source_location = {
152+
"file": record.pathname,
153+
"line": str(record.lineno),
154+
"function": record.funcName,
155+
}
156+
else:
157+
source_location = None
151158
# send off request
152159
self.transport.send(
153160
record,
154161
message,
155-
resource=resource,
162+
resource=getattr(record, "resource", self.resource),
156163
labels=(total_labels if total_labels else None),
157-
trace=trace_id,
158-
span_id=span_id,
159-
http_request=http_request,
164+
trace=(record.trace if record.trace else None),
165+
span_id=getattr(record, "span_id", None),
166+
http_request=(record.http_request if record.http_request else None),
167+
source_location=source_location,
160168
)
161169

162170

tests/unit/handlers/test_handlers.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,11 @@ def test_emit(self):
257257
logname = "loggername"
258258
message = "hello world"
259259
record = logging.LogRecord(logname, logging, None, None, message, None, None)
260+
handler.filter(record)
260261
handler.emit(record)
261-
262262
self.assertEqual(
263263
handler.transport.send_called_with,
264-
(record, message, _GLOBAL_RESOURCE, None, None, None, None),
264+
(record, message, _GLOBAL_RESOURCE, None, None, None, None, None),
265265
)
266266

267267
def test_emit_manual_field_override(self):
@@ -286,6 +286,15 @@ def test_emit_manual_field_override(self):
286286
setattr(record, "resource", expected_resource)
287287
expected_labels = {"test-label": "manual"}
288288
setattr(record, "labels", expected_labels)
289+
expected_source = {
290+
"file": "test-file",
291+
"line": str(1),
292+
"function": "test-func",
293+
}
294+
setattr(record, "lineno", int(expected_source["line"]))
295+
setattr(record, "funcName", expected_source["function"])
296+
setattr(record, "pathname", expected_source["file"])
297+
handler.filter(record)
289298
handler.emit(record)
290299

291300
self.assertEqual(
@@ -298,6 +307,7 @@ def test_emit_manual_field_override(self):
298307
expected_trace,
299308
expected_span,
300309
expected_http,
310+
expected_source,
301311
),
302312
)
303313

@@ -413,6 +423,7 @@ def send(
413423
trace=None,
414424
span_id=None,
415425
http_request=None,
426+
source_location=None,
416427
):
417428
self.send_called_with = (
418429
record,
@@ -422,4 +433,5 @@ def send(
422433
trace,
423434
span_id,
424435
http_request,
436+
source_location,
425437
)

0 commit comments

Comments
 (0)