Skip to content

Commit ad04b15

Browse files
authored
Release v3.8.1 (#928)
1 parent df76082 commit ad04b15

File tree

13 files changed

+35
-25
lines changed

13 files changed

+35
-25
lines changed

CHANGELOG.md

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

3+
## [v3.8.1] (2025-03-13)
4+
5+
* Upgrade to OpenTelemetry 1.31.0 by @alexmojaki in [#927](https://github.com/pydantic/logfire/pull/927)
6+
* Record exception with traceback for non-fatal function tool errors in OpenAI agents SDK by @alexmojaki in [#924](https://github.com/pydantic/logfire/pull/924)
7+
38
## [v3.8.0] (2025-03-11)
49

510
* OpenAI Agents Framework instrumentation by @alexmojaki in [#917](https://github.com/pydantic/logfire/pull/917)
@@ -622,3 +627,4 @@ First release from new repo!
622627
[v3.7.0]: https://github.com/pydantic/logfire/compare/v3.6.4...v3.7.0
623628
[v3.7.1]: https://github.com/pydantic/logfire/compare/v3.7.0...v3.7.1
624629
[v3.8.0]: https://github.com/pydantic/logfire/compare/v3.7.1...v3.8.0
630+
[v3.8.1]: https://github.com/pydantic/logfire/compare/v3.8.0...v3.8.1

logfire-api/logfire_api/_internal/ast_utils.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class BaseTransformer(ast.NodeTransformer):
2323
logfire_method_name: str
2424
filename: str
2525
module_name: str
26-
qualname_stack = ...
26+
qualname_stack: list[str] = ...
2727
def __post_init__(self) -> None: ...
2828
def visit_ClassDef(self, node: ast.ClassDef): ...
2929
def visit_FunctionDef(self, node: ast.FunctionDef | ast.AsyncFunctionDef): ...

logfire-api/logfire_api/_internal/config.pyi

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ from .stack_info import warn_at_user_stacklevel as warn_at_user_stacklevel
2020
from .tracer import OPEN_SPANS as OPEN_SPANS, PendingSpanProcessor as PendingSpanProcessor, ProxyTracerProvider as ProxyTracerProvider
2121
from .utils import SeededRandomIdGenerator as SeededRandomIdGenerator, UnexpectedResponse as UnexpectedResponse, ensure_data_dir_exists as ensure_data_dir_exists, handle_internal_errors as handle_internal_errors, platform_is_emscripten as platform_is_emscripten, read_toml_file as read_toml_file, suppress_instrumentation as suppress_instrumentation
2222
from _typeshed import Incomplete
23-
from dataclasses import dataclass
23+
from dataclasses import dataclass, field
2424
from logfire.exceptions import LogfireConfigError as LogfireConfigError
2525
from logfire.sampling import SamplingOptions as SamplingOptions
2626
from logfire.sampling._tail_sampling import TailSamplingProcessor as TailSamplingProcessor
@@ -54,7 +54,7 @@ class ConsoleOptions:
5454
class AdvancedOptions:
5555
"""Options primarily used for testing by Logfire developers."""
5656
base_url: str = ...
57-
id_generator: IdGenerator = ...
57+
id_generator: IdGenerator = dataclasses.field(default_factory=Incomplete)
5858
ns_timestamp_generator: Callable[[], int] = ...
5959
log_record_processors: Sequence[LogRecordProcessor] = ...
6060

@@ -65,8 +65,8 @@ class PydanticPlugin:
6565
This class is deprecated for external use. Use `logfire.instrument_pydantic()` instead.
6666
"""
6767
record: PydanticPluginRecordValues = ...
68-
include: set[str] = ...
69-
exclude: set[str] = ...
68+
include: set[str] = field(default_factory=set)
69+
exclude: set[str] = field(default_factory=set)
7070

7171
@dataclass
7272
class MetricsOptions:

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ from ..stack_info import STACK_INFO_KEYS as STACK_INFO_KEYS
33
from ..utils import logger as logger, platform_is_emscripten as platform_is_emscripten, truncate_string as truncate_string
44
from .wrapper import WrapperLogExporter as WrapperLogExporter, WrapperSpanExporter as WrapperSpanExporter
55
from _typeshed import Incomplete
6+
from collections import deque
67
from functools import cached_property
78
from opentelemetry.sdk._logs import LogData as LogData
89
from opentelemetry.sdk.trace import ReadableSpan
910
from opentelemetry.sdk.trace.export import SpanExportResult
11+
from pathlib import Path
1012
from requests import Session
13+
from threading import Thread
1114
from typing import Any, Mapping, Sequence
1215

1316
class OTLPExporterHttpSession(Session):
@@ -29,8 +32,8 @@ class DiskRetryer:
2932
MAX_TASKS: int
3033
LOG_INTERVAL: int
3134
lock: Incomplete
32-
thread: Incomplete
33-
tasks: Incomplete
35+
thread: Thread | None
36+
tasks: deque[tuple[Path, dict[str, Any]]]
3437
session: Incomplete
3538
dir: Incomplete
3639
last_log_time: Incomplete

logfire-api/logfire_api/_internal/logs.pyi

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import dataclasses
12
from dataclasses import dataclass
23
from opentelemetry._logs import LogRecord, Logger, LoggerProvider
34
from opentelemetry.util.types import Attributes
@@ -9,9 +10,9 @@ from weakref import WeakSet
910
class ProxyLoggerProvider(LoggerProvider):
1011
"""A logger provider that wraps another internal logger provider allowing it to be re-assigned."""
1112
provider: LoggerProvider
12-
loggers: WeakSet[ProxyLogger] = ...
13-
lock: Lock = ...
14-
suppressed_scopes: set[str] = ...
13+
loggers: WeakSet[ProxyLogger] = dataclasses.field(default_factory=WeakSet)
14+
lock: Lock = dataclasses.field(default_factory=Lock)
15+
suppressed_scopes: set[str] = dataclasses.field(default_factory=set)
1516
def get_logger(self, name: str, version: str | None = None, schema_url: str | None = None, attributes: Attributes | None = None) -> Logger: ...
1617
def suppress_scopes(self, *scopes: str) -> None: ...
1718
def set_provider(self, logger_provider: LoggerProvider) -> None: ...

logfire-api/logfire_api/_internal/metrics.pyi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ Gauge: Incomplete
1212
@dataclasses.dataclass
1313
class ProxyMeterProvider(MeterProvider):
1414
provider: MeterProvider
15-
meters: WeakSet[_ProxyMeter] = ...
16-
lock: Lock = ...
17-
suppressed_scopes: set[str] = ...
15+
meters: WeakSet[_ProxyMeter] = dataclasses.field(default_factory=WeakSet)
16+
lock: Lock = dataclasses.field(default_factory=Lock)
17+
suppressed_scopes: set[str] = dataclasses.field(default_factory=set)
1818
def get_meter(self, name: str, version: str | None = None, schema_url: str | None = None, attributes: Attributes | None = None) -> Meter: ...
1919
def suppress_scopes(self, *scopes: str) -> None: ...
2020
def set_meter_provider(self, meter_provider: MeterProvider) -> None: ...

logfire-api/logfire_api/_internal/scrubbing.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class SpanScrubber:
6060
This class is separate from Scrubber so that it can be instantiated more regularly
6161
and hold and mutate state about the span being scrubbed, specifically the scrubbed notes.
6262
"""
63-
scrubbed: Incomplete
63+
scrubbed: list[ScrubbedNote]
6464
did_scrub: bool
6565
def __init__(self, parent: Scrubber) -> None: ...
6666
def scrub_span(self, span: ReadableSpanDict): ...

logfire-api/logfire_api/_internal/tracer.pyi

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ from .config import LogfireConfig as LogfireConfig
33
from .constants import ATTRIBUTES_MESSAGE_KEY as ATTRIBUTES_MESSAGE_KEY, ATTRIBUTES_PENDING_SPAN_REAL_PARENT_KEY as ATTRIBUTES_PENDING_SPAN_REAL_PARENT_KEY, ATTRIBUTES_SAMPLE_RATE_KEY as ATTRIBUTES_SAMPLE_RATE_KEY, ATTRIBUTES_SPAN_TYPE_KEY as ATTRIBUTES_SPAN_TYPE_KEY, ATTRIBUTES_VALIDATION_ERROR_KEY as ATTRIBUTES_VALIDATION_ERROR_KEY, log_level_attributes as log_level_attributes
44
from .utils import handle_internal_errors as handle_internal_errors
55
from _typeshed import Incomplete
6-
from dataclasses import dataclass
6+
from dataclasses import dataclass, field
77
from opentelemetry import context as context_api
88
from opentelemetry.context import Context
99
from opentelemetry.sdk.resources import Resource
@@ -23,9 +23,9 @@ class ProxyTracerProvider(TracerProvider):
2323
"""A tracer provider that wraps another internal tracer provider allowing it to be re-assigned."""
2424
provider: TracerProvider
2525
config: LogfireConfig
26-
tracers: WeakKeyDictionary[_ProxyTracer, Callable[[], Tracer]] = ...
27-
lock: Lock = ...
28-
suppressed_scopes: set[str] = ...
26+
tracers: WeakKeyDictionary[_ProxyTracer, Callable[[], Tracer]] = field(default_factory=WeakKeyDictionary)
27+
lock: Lock = field(default_factory=Lock)
28+
suppressed_scopes: set[str] = field(default_factory=set)
2929
def set_provider(self, provider: SDKTracerProvider) -> None: ...
3030
def suppress_scopes(self, *scopes: str) -> None: ...
3131
def get_tracer(self, instrumenting_module_name: str, *args: Any, is_span_tracer: bool = True, **kwargs: Any) -> _ProxyTracer: ...

logfire-api/logfire_api/experimental/query_client.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class _BaseLogfireQueryClient(Generic[T]):
3939
base_url: Incomplete
4040
read_token: Incomplete
4141
timeout: Incomplete
42-
client: Incomplete
42+
client: T
4343
def __init__(self, base_url: str, read_token: str, timeout: Timeout, client: type[T], **client_kwargs: Any) -> None: ...
4444
def build_query_params(self, sql: str, min_timestamp: datetime | None = None, max_timestamp: datetime | None = None, limit: int | None = None, row_oriented: bool = False) -> dict[str, str]: ...
4545
def handle_response_errors(self, response: Response) -> None: ...

logfire-api/logfire_api/sampling/_tail_sampling.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def check_trace_id_ratio(trace_id: int, rate: float) -> bool: ...
8181
class TailSamplingProcessor(WrapperSpanProcessor):
8282
"""Passes spans to the wrapped processor if any span in a trace meets the sampling criteria."""
8383
get_tail_sample_rate: Incomplete
84-
traces: Incomplete
84+
traces: dict[int, TraceBuffer]
8585
lock: Incomplete
8686
def __init__(self, processor: SpanProcessor, get_tail_sample_rate: Callable[[TailSamplingSpanInfo], float]) -> None: ...
8787
def on_start(self, span: Span, parent_context: context.Context | None = None) -> None: ...

0 commit comments

Comments
 (0)