Skip to content

Commit 6a51913

Browse files
authored
Logs: set ObservedTimestamp field (#3565)
* Logs: set ObservedTimestamp field * Update CHANGELOG.md ---------
1 parent e7d1422 commit 6a51913

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
- Logs: set `observed_timestamp` field
11+
([#3565](https://github.com/open-telemetry/opentelemetry-python/pull/3565))
1012
- Add missing Resource SchemaURL in OTLP exporters
1113
([#3652](https://github.com/open-telemetry/opentelemetry-python/pull/3652))
1214
- Fix loglevel warning text

opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ def _get_attributes(record: logging.LogRecord) -> Attributes:
477477

478478
def _translate(self, record: logging.LogRecord) -> LogRecord:
479479
timestamp = int(record.created * 1e9)
480+
observered_timestamp = time_ns()
480481
span_context = get_current_span().get_span_context()
481482
attributes = self._get_attributes(record)
482483
# This comment is taken from GanyedeNil's PR #3343, I have redacted it
@@ -530,6 +531,7 @@ def _translate(self, record: logging.LogRecord) -> LogRecord:
530531

531532
return LogRecord(
532533
timestamp=timestamp,
534+
observed_timestamp=observered_timestamp,
533535
trace_id=span_context.trace_id,
534536
span_id=span_context.span_id,
535537
trace_flags=span_context.trace_flags,

opentelemetry-sdk/tests/logs/test_handler.py

+14
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,20 @@ def test_log_record_no_span_context(self):
9898
log_record.trace_flags, INVALID_SPAN_CONTEXT.trace_flags
9999
)
100100

101+
def test_log_record_observed_timestamp(self):
102+
emitter_provider_mock = Mock(spec=LoggerProvider)
103+
emitter_mock = APIGetLogger(
104+
__name__, logger_provider=emitter_provider_mock
105+
)
106+
logger = get_logger(logger_provider=emitter_provider_mock)
107+
# Assert emit gets called for warning message
108+
with self.assertLogs(level=logging.WARNING):
109+
logger.warning("Warning message")
110+
args, _ = emitter_mock.emit.call_args_list[0]
111+
log_record = args[0]
112+
113+
self.assertIsNotNone(log_record.observed_timestamp)
114+
101115
def test_log_record_user_attributes(self):
102116
"""Attributes can be injected into logs by adding them to the LogRecord"""
103117
emitter_provider_mock = Mock(spec=LoggerProvider)

0 commit comments

Comments
 (0)