Skip to content

Commit 9874779

Browse files
qianl15alexmojaki
andauthored
Support kwargs in ProxyLogger emit() (#1561)
Co-authored-by: Alex Hall <[email protected]>
1 parent bfa1b59 commit 9874779

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

logfire/_internal/logs.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import functools
55
from dataclasses import dataclass
66
from threading import Lock
7-
from typing import TYPE_CHECKING, Any
7+
from typing import TYPE_CHECKING, Any, overload
88
from weakref import WeakSet
99

1010
from opentelemetry import trace
@@ -93,7 +93,17 @@ class ProxyLogger(Logger):
9393
schema_url: str | None = None
9494
attributes: _ExtendedAttributes | None = None
9595

96-
def emit(self, record: LogRecord) -> None: # type: ignore
96+
@overload
97+
def emit(self, record: LogRecord) -> None: ...
98+
99+
@overload
100+
def emit(self, **kwargs: Any) -> None: ...
101+
102+
def emit(self, record: LogRecord | None = None, **kwargs: Any) -> None: # type: ignore
103+
# If record is not provided, create one from kwargs
104+
if record is None:
105+
record = LogRecord(**kwargs)
106+
97107
if record.severity_number is not None:
98108
if record.severity_number.value < self.min_level:
99109
return

tests/test_otel_logs.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,46 @@ def export(self, batch: Sequence[ReadableLogRecord]):
156156
assert not connection_error_exporter.shutdown_called
157157
exporter.shutdown()
158158
assert connection_error_exporter.shutdown_called
159+
160+
161+
def test_log_events_with_kwargs(logs_exporter: TestLogExporter) -> None:
162+
logger = get_logger('scope')
163+
with logfire.span('span'):
164+
logger.emit(
165+
event_name='my_event',
166+
timestamp=2,
167+
severity_number=SeverityNumber.INFO,
168+
body='body',
169+
attributes={'key': 'value'},
170+
)
171+
172+
assert logs_exporter.exported_logs_as_dicts(include_resources=True, include_instrumentation_scope=True) == snapshot(
173+
[
174+
{
175+
'body': 'body',
176+
'severity_number': 9,
177+
'severity_text': None,
178+
'attributes': IsPartialDict({'key': 'value'}),
179+
'timestamp': 2000000000,
180+
'observed_timestamp': 3000000000,
181+
'trace_id': 1,
182+
'span_id': 1,
183+
'trace_flags': 1,
184+
'resource': {
185+
'attributes': {
186+
'service.instance.id': '00000000000000000000000000000000',
187+
'telemetry.sdk.language': 'python',
188+
'telemetry.sdk.name': 'opentelemetry',
189+
'telemetry.sdk.version': '0.0.0',
190+
'service.name': 'unknown_service',
191+
'process.pid': 1234,
192+
'process.runtime.name': 'cpython',
193+
'process.runtime.version': IsStr(),
194+
'process.runtime.description': IsStr(),
195+
'service.version': IsStr(),
196+
},
197+
},
198+
'instrumentation_scope': 'scope',
199+
}
200+
]
201+
)

0 commit comments

Comments
 (0)