Skip to content

Commit 15402c3

Browse files
authored
Release v4.16.0 (#1563)
1 parent 9874779 commit 15402c3

File tree

15 files changed

+44
-33
lines changed

15 files changed

+44
-33
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Release Notes
22

3+
## [v4.16.0] (2025-12-04)
4+
5+
* Support OpenTelemetry 1.39.0, drop support for earlier versions, stop using the OTel events API/SDK by @alexmojaki in [#1562](https://github.com/pydantic/logfire/pull/1562)
6+
* Add `new_trace` parameter to `logfire.instrument` by @njz-cvm in [#1499](https://github.com/pydantic/logfire/pull/1499)
7+
* Fix JSON serialization error with `instrument_google_genai` by @alexmojaki in [#1551](https://github.com/pydantic/logfire/pull/1551)
8+
* Support kwargs in `ProxyLogger` `emit()` by @qianl15 in [#1561](https://github.com/pydantic/logfire/pull/1561)
9+
310
## [v4.15.1] (2025-11-20)
411

512
* Make `logfire.instrument`ed functions cloudpicklable by @alexmojaki in [#1542](https://github.com/pydantic/logfire/pull/1542)
@@ -977,3 +984,4 @@ First release from new repo!
977984
[v4.14.2]: https://github.com/pydantic/logfire/compare/v4.14.1...v4.14.2
978985
[v4.15.0]: https://github.com/pydantic/logfire/compare/v4.14.2...v4.15.0
979986
[v4.15.1]: https://github.com/pydantic/logfire/compare/v4.15.0...v4.15.1
987+
[v4.16.0]: https://github.com/pydantic/logfire/compare/v4.15.1...v4.16.0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from logfire._internal.utils import platform_is_emscripten as platform_is_emscripten

logfire-api/logfire_api/_internal/config.pyi

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ from logfire.exceptions import LogfireConfigError as LogfireConfigError
3030
from logfire.sampling import SamplingOptions as SamplingOptions
3131
from logfire.sampling._tail_sampling import TailSamplingProcessor as TailSamplingProcessor
3232
from logfire.version import VERSION as VERSION
33-
from opentelemetry._events import EventLoggerProvider
3433
from opentelemetry.sdk._logs import LogRecordProcessor as LogRecordProcessor
3534
from opentelemetry.sdk.metrics.export import MetricReader as MetricReader
3635
from opentelemetry.sdk.trace import SpanProcessor
@@ -233,14 +232,6 @@ class LogfireConfig(_LogfireConfigData):
233232
Returns:
234233
The logger provider.
235234
"""
236-
def get_event_logger_provider(self) -> EventLoggerProvider | None:
237-
"""Get an event logger provider from this `LogfireConfig`.
238-
239-
This is used internally and should not be called by users of the SDK.
240-
241-
Returns:
242-
The event logger provider.
243-
"""
244235
def warn_if_not_initialized(self, message: str): ...
245236
def suppress_scopes(self, *scopes: str) -> None: ...
246237

logfire-api/logfire_api/_internal/exporters/console.pyi

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ from ..utils import truncate_string as truncate_string
44
from _typeshed import Incomplete
55
from collections.abc import Mapping, Sequence
66
from dataclasses import dataclass
7-
from opentelemetry.sdk._logs import LogData as LogData, LogRecord
8-
from opentelemetry.sdk._logs.export import LogExportResult, LogExporter
7+
from opentelemetry._logs import LogRecord
8+
from opentelemetry.sdk._logs import ReadableLogRecord as ReadableLogRecord
9+
from opentelemetry.sdk._logs.export import LogRecordExportResult, LogRecordExporter
910
from opentelemetry.sdk.trace import Event, ReadableSpan
1011
from opentelemetry.sdk.trace.export import SpanExportResult, SpanExporter
1112
from typing import TextIO
@@ -67,7 +68,7 @@ class ShowParentsConsoleSpanExporter(SimpleConsoleSpanExporter):
6768
"""Print any parent spans which aren't in the current stack of displayed spans, then print this span."""
6869

6970
@dataclass
70-
class ConsoleLogExporter(LogExporter):
71+
class ConsoleLogExporter(LogRecordExporter):
7172
span_exporter: SimpleConsoleSpanExporter
72-
def export(self, batch: Sequence[LogData]) -> LogExportResult: ...
73+
def export(self, batch: Sequence[ReadableLogRecord]) -> LogRecordExportResult: ...
7374
def shutdown(self) -> None: ...

logfire-api/logfire_api/_internal/exporters/logs.pyi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ from dataclasses import dataclass
22
from logfire._internal.exporters.wrapper import WrapperLogProcessor as WrapperLogProcessor
33
from logfire._internal.scrubbing import BaseScrubber as BaseScrubber
44
from logfire._internal.utils import is_instrumentation_suppressed as is_instrumentation_suppressed
5-
from opentelemetry.sdk._logs import LogData
5+
from opentelemetry.sdk._logs import ReadWriteLogRecord
66

77
class CheckSuppressInstrumentationLogProcessorWrapper(WrapperLogProcessor):
88
"""Checks if instrumentation is suppressed, then suppresses instrumentation itself.
99
1010
Placed at the root of the tree of processors.
1111
"""
12-
def on_emit(self, log_data: LogData): ...
12+
def on_emit(self, log_record: ReadWriteLogRecord): ...
1313

1414
@dataclass
1515
class MainLogProcessorWrapper(WrapperLogProcessor):
1616
scrubber: BaseScrubber
17-
def on_emit(self, log_data: LogData): ...
17+
def on_emit(self, log_record: ReadWriteLogRecord): ...

logfire-api/logfire_api/_internal/exporters/otlp.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ from collections import deque
66
from collections.abc import Mapping, Sequence
77
from functools import cached_property
88
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
9-
from opentelemetry.sdk._logs import LogData as LogData
9+
from opentelemetry.sdk._logs import ReadableLogRecord as ReadableLogRecord
1010
from opentelemetry.sdk.trace import ReadableSpan as ReadableSpan
1111
from opentelemetry.sdk.trace.export import SpanExportResult
1212
from pathlib import Path
@@ -60,4 +60,4 @@ class QuietSpanExporter(WrapperSpanExporter):
6060

6161
class QuietLogExporter(WrapperLogExporter):
6262
"""A LogExporter that catches request exceptions to prevent OTEL from logging a huge traceback."""
63-
def export(self, batch: Sequence[LogData]): ...
63+
def export(self, batch: Sequence[ReadableLogRecord]): ...

logfire-api/logfire_api/_internal/exporters/wrapper.pyi

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ from _typeshed import Incomplete
22
from collections.abc import Sequence
33
from dataclasses import dataclass
44
from opentelemetry import context
5-
from opentelemetry.sdk._logs import LogData, LogRecordProcessor
6-
from opentelemetry.sdk._logs.export import LogExportResult, LogExporter
5+
from opentelemetry.sdk._logs import LogRecordProcessor, ReadWriteLogRecord, ReadableLogRecord as ReadableLogRecord
6+
from opentelemetry.sdk._logs.export import LogRecordExportResult, LogRecordExporter
77
from opentelemetry.sdk.metrics.export import AggregationTemporality as AggregationTemporality, MetricExportResult, MetricExporter, MetricsData
88
from opentelemetry.sdk.metrics.view import Aggregation as Aggregation
99
from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor
@@ -36,16 +36,16 @@ class WrapperSpanProcessor(SpanProcessor):
3636
def force_flush(self, timeout_millis: int = 30000) -> bool: ...
3737

3838
@dataclass
39-
class WrapperLogExporter(LogExporter):
39+
class WrapperLogExporter(LogRecordExporter):
4040
"""A base class for LogExporters that wrap another exporter."""
41-
exporter: LogExporter
42-
def export(self, batch: Sequence[LogData]) -> LogExportResult: ...
41+
exporter: LogRecordExporter
42+
def export(self, batch: Sequence[ReadableLogRecord]) -> LogRecordExportResult: ...
4343
def shutdown(self): ...
4444

4545
@dataclass
4646
class WrapperLogProcessor(LogRecordProcessor):
4747
"""A base class for SpanProcessors that wrap another processor."""
4848
processor: LogRecordProcessor
49-
def on_emit(self, log_data: LogData) -> None: ...
49+
def on_emit(self, log_record: ReadWriteLogRecord) -> None: ...
5050
def shutdown(self): ...
5151
def force_flush(self, timeout_millis: int = 30000): ...

logfire-api/logfire_api/_internal/instrument.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ CONTEXTMANAGER_HELPER_CODE: Incomplete
1515
ASYNCCONTEXTMANAGER_HELPER_CODE: Incomplete
1616
GENERATOR_WARNING_MESSAGE: str
1717

18-
def instrument(logfire: Logfire, tags: Sequence[str], msg_template: LiteralString | None, span_name: str | None, extract_args: bool | Iterable[str], record_return: bool, allow_generator: bool) -> Callable[[Callable[P, R]], Callable[P, R]]: ...
19-
def get_open_span(logfire: Logfire, attributes: dict[str, otel_types.AttributeValue], span_name: str | None, extract_args: bool | Iterable[str], func: Callable[P, R]) -> Callable[P, AbstractContextManager[Any]]: ...
18+
def instrument(logfire: Logfire, tags: Sequence[str], msg_template: LiteralString | None, span_name: str | None, extract_args: bool | Iterable[str], record_return: bool, allow_generator: bool, new_trace: bool) -> Callable[[Callable[P, R]], Callable[P, R]]: ...
19+
def get_open_span(logfire: Logfire, attributes: dict[str, otel_types.AttributeValue], span_name: str | None, extract_args: bool | Iterable[str], func: Callable[P, R], new_trace: bool) -> Callable[P, AbstractContextManager[Any]]: ...
2020
def get_attributes(func: Any, msg_template: str | None, tags: Sequence[str] | None) -> dict[str, otel_types.AttributeValue]: ...

logfire-api/logfire_api/_internal/integrations/google_genai.pyi

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ original_flatten_compound_value: Incomplete
99

1010
def wrapped_flatten_compound_value(key: str, value: Any, *args: Any, **kwargs: Any): ...
1111

12+
original_to_dict: Any
13+
ANY_ADAPTER: Incomplete
14+
15+
def wrapped_to_dict(obj: object) -> object: ...
16+
1217
Part: TypeAlias
1318

1419
def default_json(x: Any) -> str: ...

logfire-api/logfire_api/_internal/logs.pyi

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ from logfire._internal.constants import LEVEL_NUMBERS as LEVEL_NUMBERS
44
from opentelemetry._logs import LogRecord, Logger, LoggerProvider
55
from opentelemetry.util.types import _ExtendedAttributes
66
from threading import Lock
7-
from typing import Any
7+
from typing import Any, overload
88
from weakref import WeakSet
99

1010
@dataclass
@@ -29,6 +29,9 @@ class ProxyLogger(Logger):
2929
version: str | None = ...
3030
schema_url: str | None = ...
3131
attributes: _ExtendedAttributes | None = ...
32+
@overload
3233
def emit(self, record: LogRecord) -> None: ...
34+
@overload
35+
def emit(self, **kwargs: Any) -> None: ...
3336
def set_logger(self, provider: LoggerProvider) -> None: ...
3437
def __getattr__(self, item: str): ...

0 commit comments

Comments
 (0)