|
39 | 39 | ) |
40 | 40 | from opentelemetry.attributes import _VALID_ANY_VALUE_TYPES, BoundedAttributes |
41 | 41 | from opentelemetry.context import get_current |
| 42 | +from opentelemetry.context.context import Context |
42 | 43 | from opentelemetry.sdk.environment_variables import ( |
43 | 44 | OTEL_ATTRIBUTE_COUNT_LIMIT, |
44 | 45 | OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT, |
|
53 | 54 | format_span_id, |
54 | 55 | format_trace_id, |
55 | 56 | ) |
56 | | -from opentelemetry.util.types import _ExtendedAttributes |
| 57 | +from opentelemetry.util.types import AnyValue, _ExtendedAttributes |
57 | 58 |
|
58 | 59 | _DEFAULT_OTEL_ATTRIBUTE_COUNT_LIMIT = 128 |
59 | 60 | _ENV_VALUE_UNSET = "" |
@@ -249,46 +250,6 @@ def __eq__(self, other: object) -> bool: |
249 | 250 | return NotImplemented |
250 | 251 | return self.__dict__ == other.__dict__ |
251 | 252 |
|
252 | | - def to_json(self, indent: int | None = 4) -> str: |
253 | | - return json.dumps( |
254 | | - { |
255 | | - "body": self.log_record.body, |
256 | | - "severity_number": self.log_record.severity_number.value |
257 | | - if self.log_record.severity_number is not None |
258 | | - else None, |
259 | | - "severity_text": self.log_record.severity_text, |
260 | | - "attributes": ( |
261 | | - dict(self.log_record.attributes) |
262 | | - if bool(self.log_record.attributes) |
263 | | - else None |
264 | | - ), |
265 | | - "dropped_attributes": self.dropped_attributes, |
266 | | - "timestamp": ns_to_iso_str(self.log_record.timestamp) |
267 | | - if self.log_record.timestamp is not None |
268 | | - else None, |
269 | | - "observed_timestamp": ns_to_iso_str( |
270 | | - self.log_record.observed_timestamp |
271 | | - ), |
272 | | - "trace_id": ( |
273 | | - f"0x{format_trace_id(self.log_record.trace_id)}" |
274 | | - if self.log_record.trace_id is not None |
275 | | - else "" |
276 | | - ), |
277 | | - "span_id": ( |
278 | | - f"0x{format_span_id(self.log_record.span_id)}" |
279 | | - if self.log_record.span_id is not None |
280 | | - else "" |
281 | | - ), |
282 | | - "trace_flags": self.log_record.trace_flags, |
283 | | - "resource": json.loads(self.resource.to_json()), |
284 | | - "event_name": self.log_record.event_name |
285 | | - if self.log_record.event_name |
286 | | - else "", |
287 | | - }, |
288 | | - indent=indent, |
289 | | - cls=BytesEncoder, |
290 | | - ) |
291 | | - |
292 | 253 | @property |
293 | 254 | def dropped_attributes(self) -> int: |
294 | 255 | if isinstance(self.log_record.attributes, BoundedAttributes): |
@@ -513,8 +474,8 @@ class LoggingHandler(logging.Handler): |
513 | 474 |
|
514 | 475 | def __init__( |
515 | 476 | self, |
516 | | - level=logging.NOTSET, |
517 | | - logger_provider=None, |
| 477 | + level: int = logging.NOTSET, |
| 478 | + logger_provider: APILoggerProvider | None = None, |
518 | 479 | ) -> None: |
519 | 480 | super().__init__(level=level) |
520 | 481 | self._logger_provider = logger_provider or get_logger_provider() |
@@ -606,11 +567,11 @@ def flush(self) -> None: |
606 | 567 | Flushes the logging output. Skip flushing if logging_provider has no force_flush method. |
607 | 568 | """ |
608 | 569 | if hasattr(self._logger_provider, "force_flush") and callable( |
609 | | - self._logger_provider.force_flush |
| 570 | + self._logger_provider.force_flush # type: ignore[reportAttributeAccessIssue] |
610 | 571 | ): |
611 | 572 | # This is done in a separate thread to avoid a potential deadlock, for |
612 | 573 | # details see https://github.com/open-telemetry/opentelemetry-python/pull/4636. |
613 | | - thread = threading.Thread(target=self._logger_provider.force_flush) |
| 574 | + thread = threading.Thread(target=self._logger_provider.force_flush) # type: ignore[reportAttributeAccessIssue] |
614 | 575 | thread.start() |
615 | 576 |
|
616 | 577 |
|
@@ -639,20 +600,51 @@ def resource(self): |
639 | 600 | return self._resource |
640 | 601 |
|
641 | 602 | # pylint: disable=arguments-differ |
642 | | - def emit(self, record: LogRecord): |
| 603 | + def emit( |
| 604 | + self, |
| 605 | + record: LogRecord | None = None, |
| 606 | + *, |
| 607 | + timestamp: int | None = None, |
| 608 | + observed_timestamp: int | None = None, |
| 609 | + context: Context | None = None, |
| 610 | + severity_number: SeverityNumber | None = None, |
| 611 | + severity_text: str | None = None, |
| 612 | + body: AnyValue | None = None, |
| 613 | + attributes: _ExtendedAttributes | None = None, |
| 614 | + event_name: str | None = None, |
| 615 | + ) -> None: |
643 | 616 | """Emits the :class:`ReadWriteLogRecord` by setting instrumentation scope |
644 | 617 | and forwarding to the processor. |
645 | 618 | """ |
646 | | - writable_record: ReadWriteLogRecord |
647 | | - if not isinstance(record, ReadWriteLogRecord): |
648 | | - # pylint:disable=protected-access |
| 619 | + # If a record is provided, use it directly |
| 620 | + if record is not None: |
| 621 | + if not isinstance(record, ReadWriteLogRecord): |
| 622 | + # pylint:disable=protected-access |
| 623 | + writable_record = ReadWriteLogRecord._from_api_log_record( |
| 624 | + record=record, |
| 625 | + resource=self._resource, |
| 626 | + instrumentation_scope=self._instrumentation_scope, |
| 627 | + ) |
| 628 | + else: |
| 629 | + writable_record = record |
| 630 | + else: |
| 631 | + # Create a record from individual parameters |
| 632 | + log_record = LogRecord( |
| 633 | + timestamp=timestamp, |
| 634 | + observed_timestamp=observed_timestamp, |
| 635 | + context=context, |
| 636 | + severity_number=severity_number, |
| 637 | + severity_text=severity_text, |
| 638 | + body=body, |
| 639 | + attributes=attributes, |
| 640 | + event_name=event_name, |
| 641 | + ) |
649 | 642 | writable_record = ReadWriteLogRecord._from_api_log_record( |
650 | | - record=record, |
| 643 | + record=log_record, |
651 | 644 | resource=self._resource, |
652 | 645 | instrumentation_scope=self._instrumentation_scope, |
653 | 646 | ) |
654 | | - else: |
655 | | - writable_record = record |
| 647 | + |
656 | 648 | self._multi_log_record_processor.on_emit(writable_record) |
657 | 649 |
|
658 | 650 |
|
@@ -724,7 +716,7 @@ def get_logger( |
724 | 716 | version: str | None = None, |
725 | 717 | schema_url: str | None = None, |
726 | 718 | attributes: _ExtendedAttributes | None = None, |
727 | | - ) -> Logger: |
| 719 | + ) -> APILogger: |
728 | 720 | if self._disabled: |
729 | 721 | return NoOpLogger( |
730 | 722 | name, |
|
0 commit comments