log-foundry 0.10.2.dev60__tar.gz → 0.10.2.dev62__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/PKG-INFO +1 -1
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/pyproject.toml +1 -1
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/_fork.py +40 -0
- log_foundry-0.10.2.dev62/src/log_foundry/_lifecycle.py +699 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/config.py +8 -1
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/decorator.py +2 -2
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/filtering.py +6 -2
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/logstash.py +7 -1
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/multi.py +7 -3
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/sentry.py +5 -3
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/transform.py +6 -2
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/worker.py +2 -2
- log_foundry-0.10.2.dev60/src/log_foundry/_lifecycle.py +0 -176
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/LICENSE +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/README.md +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/__init__.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/_diag.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/api.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/console.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/context.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/ids.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/model.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/py.typed +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/results.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sanitize.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/__init__.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_batch.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_chunk.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_retry.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_socket.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/_time.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/base.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/callback.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/clickhouse.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/datadog.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/elasticsearch.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/eventhubs.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/file.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/firehose.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/honeycomb.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/http.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/kafka.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/kinesis.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/logging_sink.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/loki.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/memory.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/mongodb.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/nats.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/newrelic.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/null.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/postgres.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/pubsub.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/rabbitmq.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/redis.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/sns.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/splunk.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/sqlite.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/sqs.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/stdout.py +0 -0
- {log_foundry-0.10.2.dev60 → log_foundry-0.10.2.dev62}/src/log_foundry/sinks/syslog.py +0 -0
|
@@ -366,6 +366,43 @@ def _offers_discard(holder: object) -> bool:
|
|
|
366
366
|
return False
|
|
367
367
|
|
|
368
368
|
|
|
369
|
+
_SKIP_ATTRIBUTE = "_FORK_SKIP"
|
|
370
|
+
"""A module's opt-out: attribute names the walk must not read or descend into.
|
|
371
|
+
|
|
372
|
+
**Bookkeeping that pins objects is not live state to repair**, and the difference is invisible
|
|
373
|
+
to a walk that only sees a container. ``_lifecycle._owned`` is the case: SPEC-042 FR-001 requires
|
|
374
|
+
it to hold a **strong** reference to every sink this process ever acquired, so without an opt-out
|
|
375
|
+
the walk reaches sinks the process abandoned several ``configure()`` calls ago — replacing their
|
|
376
|
+
locks, which is merely wasteful, and calling their fork hooks, which is not. Measured: a forked
|
|
377
|
+
child announced a buffer-discard failure for a sink that had been superseded, and a ``FileSink``
|
|
378
|
+
in that state would have its file reopened on every fork for the life of the process.
|
|
379
|
+
|
|
380
|
+
Declared by the module that owns the state rather than listed here, which keeps this module's
|
|
381
|
+
rule that it imports nothing but ``_diag`` (SPEC-039 FR-006). Nothing is lost by skipping: a sink
|
|
382
|
+
that is still *live* is reached through the config and the worker, which are not opted out.
|
|
383
|
+
"""
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def _skipped_names(holder: object) -> frozenset[str]:
|
|
387
|
+
"""Returns the attribute names a holder has opted out of the walk.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
holder: The module, class or instance the walk is about to read.
|
|
391
|
+
|
|
392
|
+
Returns:
|
|
393
|
+
The opted-out names, empty for anything that declares none.
|
|
394
|
+
|
|
395
|
+
Raises:
|
|
396
|
+
None. A malformed or unreadable declaration opts nothing out, so the walk does more work
|
|
397
|
+
rather than less — the safe direction for a repair whose absence is a hang.
|
|
398
|
+
"""
|
|
399
|
+
try:
|
|
400
|
+
declared = getattr(holder, _SKIP_ATTRIBUTE, None)
|
|
401
|
+
return frozenset(declared) if declared else frozenset()
|
|
402
|
+
except Exception:
|
|
403
|
+
return frozenset()
|
|
404
|
+
|
|
405
|
+
|
|
369
406
|
def _reinit_primitives() -> list[Any]:
|
|
370
407
|
"""Replaces every lock and event this package owns, wherever the walk reaches one.
|
|
371
408
|
|
|
@@ -417,7 +454,10 @@ def _reinit_primitives() -> list[Any]:
|
|
|
417
454
|
continue
|
|
418
455
|
if _offers_discard(holder):
|
|
419
456
|
buffered.append(holder)
|
|
457
|
+
skip = _skipped_names(holder)
|
|
420
458
|
for name, value in _namespace_items(holder):
|
|
459
|
+
if name in skip:
|
|
460
|
+
continue
|
|
421
461
|
fresh = _fresh_primitive(value, memo, keepalive)
|
|
422
462
|
if fresh is not None:
|
|
423
463
|
_assign(holder, name, fresh)
|