prefect-client 3.7.9.dev7__tar.gz → 3.8.1.dev1__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.
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/PKG-INFO +1 -1
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/AGENTS.md +1 -0
- prefect_client-3.8.1.dev1/src/prefect/_build_info.py +5 -0
- prefect_client-3.8.1.dev1/src/prefect/concurrency/context.py +53 -0
- prefect_client-3.8.1.dev1/src/prefect/concurrency/v1/context.py +56 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/clients.py +54 -11
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/subscribers.py +46 -22
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/exceptions.py +4 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/futures.py +11 -1
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/clients.py +39 -12
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/_types.py +1 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/database.py +6 -0
- prefect_client-3.7.9.dev7/src/prefect/_build_info.py +0 -5
- prefect_client-3.7.9.dev7/src/prefect/concurrency/context.py +0 -25
- prefect_client-3.7.9.dev7/src/prefect/concurrency/v1/context.py +0 -29
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/.gitignore +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/LICENSE +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/README.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/hatch_build.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/pyproject.toml +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/__main__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/agent.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/automations.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/base.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/context.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/engine.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/related.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/flows.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/main.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/plugins.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/py.typed +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/results.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/schedules.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/serializers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/states.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/tasks.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/transactions.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/types/names.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/variables.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.7.9.dev7 → prefect_client-3.8.1.dev1}/src/prefect/workers/utilities.py +0 -0
|
@@ -23,6 +23,7 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
|
|
|
23
23
|
- **Engine ordering matters.** The engines apply features (retries, caching, result persistence, transactions) in a specific order. Changing the order or forgetting a feature in one engine path is the most common source of breakage.
|
|
24
24
|
- **Set run metadata before state transitions.** Any run attribute that event subscribers observe at the moment of a state transition (e.g., custom `flow_run_name`) must be persisted to the server *before* `set_state()` is called for that transition. Metadata set after the call appears stale to subscribers of that state event.
|
|
25
25
|
- **Sync and async must stay in sync.** Both `flow_engine.py` and `task_engine.py` have sync and async paths. Any behavior change must be applied to both.
|
|
26
|
+
- **Event and log WebSocket subscribers are parallel implementations.** `events/clients.py::PrefectEventSubscriber` and `logging/clients.py::PrefectLogsSubscriber` duplicate the same reconnect/backoff/dedup logic, including the `reconnect_on_clean_close` option (used by `events/subscribers.py::FlowRunSubscriber` so a clean disconnect doesn't hide a terminal event). Mirror any reconnection-behavior change across both.
|
|
26
27
|
- **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences between whenever 0.7.x–0.9.x and ≥ 0.10.0. The `_WHENEVER_NEW_API` flag (True when whenever ≥ 0.10.0) guards version-specific code. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Violations will silently break on whichever whenever version the helpers weren't written for.
|
|
27
28
|
- **Flow and task engines advance state differently.** The flow engine makes blocking API calls to the server to propose and advance states. The task engine emits `prefect.task_run.*` events (delivered via WebSockets) but advances state locally through `set_state` calls with polling/backoff — do not assume the two engines work the same way.
|
|
28
29
|
- **Flow state transitions go through the server.** The flow engine proposes states to the server, which accepts or rejects them via orchestration rules. The task engine, by contrast, manages state transitions locally via `set_state` and emits `prefect.task_run.*` events — it does not propose states to the server.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from contextvars import ContextVar
|
|
3
|
+
from typing import Any, ClassVar
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from typing_extensions import Self
|
|
7
|
+
|
|
8
|
+
from prefect.client.orchestration import get_client
|
|
9
|
+
from prefect.context import ContextModel, Field
|
|
10
|
+
from prefect.logging.loggers import get_logger, get_run_logger
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _cleanup_logger() -> "logging.Logger | logging.LoggerAdapter[logging.Logger]":
|
|
14
|
+
try:
|
|
15
|
+
# Use a run logger if available so failures reach the run logs
|
|
16
|
+
return get_run_logger()
|
|
17
|
+
except Exception:
|
|
18
|
+
return get_logger("concurrency")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ConcurrencyContext(ContextModel):
|
|
22
|
+
__var__: ClassVar[ContextVar[Self]] = ContextVar("concurrency")
|
|
23
|
+
|
|
24
|
+
# Track the leases that have been acquired but were not able to be released
|
|
25
|
+
# due to cancellation or some other error. These leases are revoked when
|
|
26
|
+
# the context manager exits.
|
|
27
|
+
cleanup_lease_ids: list[UUID] = Field(default_factory=lambda: [])
|
|
28
|
+
|
|
29
|
+
def __exit__(self, *exc_info: Any) -> None:
|
|
30
|
+
# Releasing these leases is best-effort: a failure for one lease must not
|
|
31
|
+
# strand the others or skip the context teardown below.
|
|
32
|
+
if self.cleanup_lease_ids:
|
|
33
|
+
logger = _cleanup_logger()
|
|
34
|
+
try:
|
|
35
|
+
with get_client(sync_client=True) as client:
|
|
36
|
+
for lease_id in self.cleanup_lease_ids:
|
|
37
|
+
try:
|
|
38
|
+
client.release_concurrency_slots_with_lease(
|
|
39
|
+
lease_id=lease_id
|
|
40
|
+
)
|
|
41
|
+
except Exception:
|
|
42
|
+
logger.warning(
|
|
43
|
+
"Failed to release concurrency lease %s during cleanup",
|
|
44
|
+
lease_id,
|
|
45
|
+
exc_info=True,
|
|
46
|
+
)
|
|
47
|
+
except Exception:
|
|
48
|
+
logger.warning(
|
|
49
|
+
"Failed to release concurrency leases during cleanup",
|
|
50
|
+
exc_info=True,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return super().__exit__(*exc_info)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from contextvars import ContextVar
|
|
3
|
+
from typing import Any, ClassVar
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from typing_extensions import Self
|
|
7
|
+
|
|
8
|
+
from prefect.client.orchestration import get_client
|
|
9
|
+
from prefect.context import ContextModel, Field
|
|
10
|
+
from prefect.logging.loggers import get_logger, get_run_logger
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _cleanup_logger() -> "logging.Logger | logging.LoggerAdapter[logging.Logger]":
|
|
14
|
+
try:
|
|
15
|
+
# Use a run logger if available so failures reach the run logs
|
|
16
|
+
return get_run_logger()
|
|
17
|
+
except Exception:
|
|
18
|
+
return get_logger("concurrency")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ConcurrencyContext(ContextModel):
|
|
22
|
+
__var__: ClassVar[ContextVar[Self]] = ContextVar("concurrency_v1")
|
|
23
|
+
|
|
24
|
+
# Track the limits that have been acquired but were not able to be released
|
|
25
|
+
# due to cancellation or some other error. These limits are released when
|
|
26
|
+
# the context manager exits.
|
|
27
|
+
cleanup_slots: list[tuple[list[str], float, UUID]] = Field(default_factory=list)
|
|
28
|
+
|
|
29
|
+
def __exit__(self, *exc_info: Any) -> None:
|
|
30
|
+
# Releasing these slots is best-effort: a failure for one entry must not
|
|
31
|
+
# strand the others or skip the context teardown below.
|
|
32
|
+
if self.cleanup_slots:
|
|
33
|
+
logger = _cleanup_logger()
|
|
34
|
+
try:
|
|
35
|
+
with get_client(sync_client=True) as client:
|
|
36
|
+
for names, occupancy_seconds, task_run_id in self.cleanup_slots:
|
|
37
|
+
try:
|
|
38
|
+
client.decrement_v1_concurrency_slots(
|
|
39
|
+
names=names,
|
|
40
|
+
occupancy_seconds=occupancy_seconds,
|
|
41
|
+
task_run_id=task_run_id,
|
|
42
|
+
)
|
|
43
|
+
except Exception:
|
|
44
|
+
logger.warning(
|
|
45
|
+
"Failed to release concurrency slots %s for task run %s during cleanup",
|
|
46
|
+
names,
|
|
47
|
+
task_run_id,
|
|
48
|
+
exc_info=True,
|
|
49
|
+
)
|
|
50
|
+
except Exception:
|
|
51
|
+
logger.warning(
|
|
52
|
+
"Failed to release concurrency slots during cleanup",
|
|
53
|
+
exc_info=True,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return super().__exit__(*exc_info)
|
|
@@ -136,16 +136,21 @@ def get_events_client(
|
|
|
136
136
|
def get_events_subscriber(
|
|
137
137
|
filter: Optional["EventFilter"] = None,
|
|
138
138
|
reconnection_attempts: int = 10,
|
|
139
|
+
reconnect_on_clean_close: bool = False,
|
|
139
140
|
) -> "PrefectEventSubscriber":
|
|
140
141
|
api_url = PREFECT_API_URL.value()
|
|
141
142
|
|
|
142
143
|
if isinstance(api_url, str) and api_url.startswith(PREFECT_CLOUD_API_URL.value()):
|
|
143
144
|
return PrefectCloudEventSubscriber(
|
|
144
|
-
filter=filter,
|
|
145
|
+
filter=filter,
|
|
146
|
+
reconnection_attempts=reconnection_attempts,
|
|
147
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
145
148
|
)
|
|
146
149
|
elif api_url:
|
|
147
150
|
return PrefectEventSubscriber(
|
|
148
|
-
filter=filter,
|
|
151
|
+
filter=filter,
|
|
152
|
+
reconnection_attempts=reconnection_attempts,
|
|
153
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
149
154
|
)
|
|
150
155
|
elif PREFECT_SERVER_ALLOW_EPHEMERAL_MODE:
|
|
151
156
|
from prefect.server.api.server import SubprocessASGIServer
|
|
@@ -156,6 +161,7 @@ def get_events_subscriber(
|
|
|
156
161
|
api_url=server.api_url,
|
|
157
162
|
filter=filter,
|
|
158
163
|
reconnection_attempts=reconnection_attempts,
|
|
164
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
159
165
|
)
|
|
160
166
|
else:
|
|
161
167
|
raise ValueError(
|
|
@@ -677,6 +683,10 @@ class PrefectEventSubscriber:
|
|
|
677
683
|
"""
|
|
678
684
|
Subscribes to a Prefect event stream, yielding events as they occur.
|
|
679
685
|
|
|
686
|
+
Abnormal disconnects are retried. Clean disconnects end iteration unless
|
|
687
|
+
`reconnect_on_clean_close` is enabled. Event backfill and ID-based
|
|
688
|
+
deduplication cover the reconnect window.
|
|
689
|
+
|
|
680
690
|
Example:
|
|
681
691
|
|
|
682
692
|
from prefect.events.clients import PrefectEventSubscriber
|
|
@@ -693,6 +703,7 @@ class PrefectEventSubscriber:
|
|
|
693
703
|
_websocket: Optional[ClientConnection]
|
|
694
704
|
_filter: "EventFilter"
|
|
695
705
|
_seen_events: MutableMapping[UUID, bool]
|
|
706
|
+
_backfill_since: Optional[prefect.types._datetime.DateTime]
|
|
696
707
|
|
|
697
708
|
_api_key: Optional[str]
|
|
698
709
|
_auth_token: Optional[str]
|
|
@@ -702,6 +713,7 @@ class PrefectEventSubscriber:
|
|
|
702
713
|
api_url: Optional[str] = None,
|
|
703
714
|
filter: Optional["EventFilter"] = None,
|
|
704
715
|
reconnection_attempts: int = 10,
|
|
716
|
+
reconnect_on_clean_close: bool = False,
|
|
705
717
|
):
|
|
706
718
|
"""
|
|
707
719
|
Args:
|
|
@@ -709,6 +721,8 @@ class PrefectEventSubscriber:
|
|
|
709
721
|
api_key: The API of an actor with the manage_events scope
|
|
710
722
|
reconnection_attempts: When the client is disconnected, how many times
|
|
711
723
|
the client should attempt to reconnect
|
|
724
|
+
reconnect_on_clean_close: Whether to reconnect when the server closes
|
|
725
|
+
the connection normally instead of ending iteration
|
|
712
726
|
"""
|
|
713
727
|
self._api_key = None
|
|
714
728
|
auth_string = get_current_settings().api.auth_string
|
|
@@ -725,6 +739,7 @@ class PrefectEventSubscriber:
|
|
|
725
739
|
|
|
726
740
|
self._filter = filter or EventFilter() # type: ignore[call-arg]
|
|
727
741
|
self._seen_events = TTLCache(maxsize=SEEN_EVENTS_SIZE, ttl=SEEN_EVENTS_TTL)
|
|
742
|
+
self._backfill_since = None
|
|
728
743
|
|
|
729
744
|
socket_url = events_out_socket_from_api_url(api_url)
|
|
730
745
|
|
|
@@ -736,6 +751,7 @@ class PrefectEventSubscriber:
|
|
|
736
751
|
)
|
|
737
752
|
self._websocket = None
|
|
738
753
|
self._reconnection_attempts = reconnection_attempts
|
|
754
|
+
self._reconnect_on_clean_close = reconnect_on_clean_close
|
|
739
755
|
if self._reconnection_attempts < 0:
|
|
740
756
|
raise ValueError("reconnection_attempts must be a non-negative integer")
|
|
741
757
|
|
|
@@ -808,9 +824,13 @@ class PrefectEventSubscriber:
|
|
|
808
824
|
|
|
809
825
|
from prefect.events.filters import EventOccurredFilter
|
|
810
826
|
|
|
827
|
+
current_time = prefect.types._datetime.now("UTC")
|
|
828
|
+
if self._backfill_since is None:
|
|
829
|
+
self._backfill_since = current_time - timedelta(minutes=1)
|
|
830
|
+
|
|
811
831
|
self._filter.occurred = EventOccurredFilter(
|
|
812
|
-
since=
|
|
813
|
-
until=
|
|
832
|
+
since=self._backfill_since,
|
|
833
|
+
until=current_time + timedelta(days=365),
|
|
814
834
|
)
|
|
815
835
|
|
|
816
836
|
logger.debug(" filtering events since %s...", self._filter.occurred.since)
|
|
@@ -841,6 +861,7 @@ class PrefectEventSubscriber:
|
|
|
841
861
|
async def __anext__(self) -> Event:
|
|
842
862
|
assert self._reconnection_attempts >= 0
|
|
843
863
|
consecutive_failures = 0
|
|
864
|
+
consecutive_clean_closes = 0
|
|
844
865
|
while consecutive_failures <= self._reconnection_attempts:
|
|
845
866
|
try:
|
|
846
867
|
# If we're here and the websocket is None, then we've had a failure in a
|
|
@@ -865,25 +886,39 @@ class PrefectEventSubscriber:
|
|
|
865
886
|
if event.id in self._seen_events:
|
|
866
887
|
continue
|
|
867
888
|
self._seen_events[event.id] = True
|
|
889
|
+
replay_since = event.occurred - timedelta(minutes=1)
|
|
890
|
+
if (
|
|
891
|
+
self._backfill_since is None
|
|
892
|
+
or replay_since > self._backfill_since
|
|
893
|
+
):
|
|
894
|
+
self._backfill_since = replay_since
|
|
868
895
|
|
|
869
896
|
try:
|
|
870
897
|
return event
|
|
871
898
|
finally:
|
|
872
899
|
EVENTS_OBSERVED.labels(self.client_name).inc()
|
|
873
|
-
except
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
900
|
+
except RETRYABLE_EXCEPTIONS as exc:
|
|
901
|
+
if isinstance(exc, ConnectionClosedOK):
|
|
902
|
+
if not self._reconnect_on_clean_close:
|
|
903
|
+
logger.debug('Connection closed with "OK" status')
|
|
904
|
+
raise StopAsyncIteration
|
|
905
|
+
consecutive_clean_closes += 1
|
|
906
|
+
|
|
877
907
|
consecutive_failures += 1
|
|
908
|
+
attempts = (
|
|
909
|
+
consecutive_clean_closes
|
|
910
|
+
if isinstance(exc, ConnectionClosedOK)
|
|
911
|
+
else consecutive_failures
|
|
912
|
+
)
|
|
878
913
|
logger.debug(
|
|
879
914
|
"Retryable error with %s/%s attempts",
|
|
880
|
-
|
|
915
|
+
attempts,
|
|
881
916
|
self._reconnection_attempts,
|
|
882
917
|
)
|
|
883
|
-
if
|
|
918
|
+
if attempts > self._reconnection_attempts:
|
|
884
919
|
raise
|
|
885
920
|
|
|
886
|
-
if
|
|
921
|
+
if attempts > 2:
|
|
887
922
|
# let the first two attempts happen quickly in case this is just
|
|
888
923
|
# a standard load balancer timeout, but after that, just take a
|
|
889
924
|
# beat to let things come back around.
|
|
@@ -898,6 +933,7 @@ class PrefectCloudEventSubscriber(PrefectEventSubscriber):
|
|
|
898
933
|
api_key: Optional[str] = None,
|
|
899
934
|
filter: Optional["EventFilter"] = None,
|
|
900
935
|
reconnection_attempts: int = 10,
|
|
936
|
+
reconnect_on_clean_close: bool = False,
|
|
901
937
|
):
|
|
902
938
|
"""
|
|
903
939
|
Args:
|
|
@@ -905,6 +941,8 @@ class PrefectCloudEventSubscriber(PrefectEventSubscriber):
|
|
|
905
941
|
api_key: The API of an actor with the manage_events scope
|
|
906
942
|
reconnection_attempts: When the client is disconnected, how many times
|
|
907
943
|
the client should attempt to reconnect
|
|
944
|
+
reconnect_on_clean_close: Whether to reconnect when the server closes
|
|
945
|
+
the connection normally instead of ending iteration
|
|
908
946
|
"""
|
|
909
947
|
api_url, api_key = _get_api_url_and_key(api_url, api_key)
|
|
910
948
|
|
|
@@ -912,6 +950,7 @@ class PrefectCloudEventSubscriber(PrefectEventSubscriber):
|
|
|
912
950
|
api_url=api_url,
|
|
913
951
|
filter=filter,
|
|
914
952
|
reconnection_attempts=reconnection_attempts,
|
|
953
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
915
954
|
)
|
|
916
955
|
|
|
917
956
|
self._api_key = api_key
|
|
@@ -924,6 +963,7 @@ class PrefectCloudAccountEventSubscriber(PrefectCloudEventSubscriber):
|
|
|
924
963
|
api_key: Optional[str] = None,
|
|
925
964
|
filter: Optional["EventFilter"] = None,
|
|
926
965
|
reconnection_attempts: int = 10,
|
|
966
|
+
reconnect_on_clean_close: bool = False,
|
|
927
967
|
):
|
|
928
968
|
"""
|
|
929
969
|
Args:
|
|
@@ -931,6 +971,8 @@ class PrefectCloudAccountEventSubscriber(PrefectCloudEventSubscriber):
|
|
|
931
971
|
api_key: The API of an actor with the manage_events scope
|
|
932
972
|
reconnection_attempts: When the client is disconnected, how many times
|
|
933
973
|
the client should attempt to reconnect
|
|
974
|
+
reconnect_on_clean_close: Whether to reconnect when the server closes
|
|
975
|
+
the connection normally instead of ending iteration
|
|
934
976
|
"""
|
|
935
977
|
api_url, api_key = _get_api_url_and_key(api_url, api_key)
|
|
936
978
|
|
|
@@ -940,6 +982,7 @@ class PrefectCloudAccountEventSubscriber(PrefectCloudEventSubscriber):
|
|
|
940
982
|
api_url=account_api_url,
|
|
941
983
|
filter=filter,
|
|
942
984
|
reconnection_attempts=reconnection_attempts,
|
|
985
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
943
986
|
)
|
|
944
987
|
|
|
945
988
|
self._api_key = api_key
|
|
@@ -33,6 +33,9 @@ class FlowRunSubscriber:
|
|
|
33
33
|
is received, the event subscription stops but log subscription continues for a
|
|
34
34
|
configurable timeout to catch any straggler logs.
|
|
35
35
|
|
|
36
|
+
The underlying event and log subscribers own reconnection behavior. If either
|
|
37
|
+
exhausts its retries or fails for another reason, that error is propagated.
|
|
38
|
+
|
|
36
39
|
Example:
|
|
37
40
|
```python
|
|
38
41
|
from prefect.events.subscribers import FlowRunSubscriber
|
|
@@ -47,7 +50,7 @@ class FlowRunSubscriber:
|
|
|
47
50
|
"""
|
|
48
51
|
|
|
49
52
|
_flow_run_id: UUID
|
|
50
|
-
_queue: asyncio.Queue[Union[Log, Event, None]]
|
|
53
|
+
_queue: asyncio.Queue[Union[Log, Event, Exception, None]]
|
|
51
54
|
_tasks: list[asyncio.Task[None]]
|
|
52
55
|
_flow_completed: bool
|
|
53
56
|
_straggler_timeout: int
|
|
@@ -91,10 +94,14 @@ class FlowRunSubscriber:
|
|
|
91
94
|
async def __aenter__(self) -> Self:
|
|
92
95
|
"""Enter the async context manager"""
|
|
93
96
|
self._logs_subscriber = get_logs_subscriber(
|
|
94
|
-
filter=self._log_filter,
|
|
97
|
+
filter=self._log_filter,
|
|
98
|
+
reconnection_attempts=self._reconnection_attempts,
|
|
99
|
+
reconnect_on_clean_close=True,
|
|
95
100
|
)
|
|
96
101
|
self._events_subscriber = get_events_subscriber(
|
|
97
|
-
filter=self._event_filter,
|
|
102
|
+
filter=self._event_filter,
|
|
103
|
+
reconnection_attempts=self._reconnection_attempts,
|
|
104
|
+
reconnect_on_clean_close=True,
|
|
98
105
|
)
|
|
99
106
|
|
|
100
107
|
await self._logs_subscriber.__aenter__()
|
|
@@ -122,6 +129,22 @@ class FlowRunSubscriber:
|
|
|
122
129
|
await self._logs_subscriber.__aexit__(exc_type, exc_val, exc_tb)
|
|
123
130
|
await self._events_subscriber.__aexit__(exc_type, exc_val, exc_tb)
|
|
124
131
|
|
|
132
|
+
def _is_terminal_event(self, event: Event) -> bool:
|
|
133
|
+
"""Whether an event marks the flow run reaching a terminal state"""
|
|
134
|
+
if event.resource.id != f"prefect.flow-run.{self._flow_run_id}":
|
|
135
|
+
return False
|
|
136
|
+
|
|
137
|
+
state_type_str = event.resource.get("prefect.state-type")
|
|
138
|
+
if not state_type_str and "validated_state" in event.payload:
|
|
139
|
+
state_type_str = event.payload["validated_state"].get("type")
|
|
140
|
+
if not state_type_str:
|
|
141
|
+
return False
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
return StateType(state_type_str) in TERMINAL_STATES
|
|
145
|
+
except ValueError:
|
|
146
|
+
return False
|
|
147
|
+
|
|
125
148
|
def __aiter__(self) -> Self:
|
|
126
149
|
"""Return self as an async iterator"""
|
|
127
150
|
return self
|
|
@@ -142,6 +165,8 @@ class FlowRunSubscriber:
|
|
|
142
165
|
if item is None:
|
|
143
166
|
self._sentinels_received += 1
|
|
144
167
|
continue
|
|
168
|
+
if isinstance(item, Exception):
|
|
169
|
+
raise item
|
|
145
170
|
|
|
146
171
|
return item
|
|
147
172
|
|
|
@@ -154,8 +179,13 @@ class FlowRunSubscriber:
|
|
|
154
179
|
await self._queue.put(log)
|
|
155
180
|
except asyncio.CancelledError:
|
|
156
181
|
pass
|
|
157
|
-
except Exception:
|
|
158
|
-
|
|
182
|
+
except Exception as exc:
|
|
183
|
+
await self._queue.put(exc)
|
|
184
|
+
else:
|
|
185
|
+
if not self._flow_completed:
|
|
186
|
+
await self._queue.put(
|
|
187
|
+
ConnectionError("Flow run logs stream closed unexpectedly")
|
|
188
|
+
)
|
|
159
189
|
finally:
|
|
160
190
|
await self._queue.put(None)
|
|
161
191
|
|
|
@@ -164,23 +194,17 @@ class FlowRunSubscriber:
|
|
|
164
194
|
try:
|
|
165
195
|
async for event in self._events_subscriber:
|
|
166
196
|
await self._queue.put(event)
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
state_type_str = event.resource.get("prefect.state-type")
|
|
172
|
-
if not state_type_str and "validated_state" in event.payload:
|
|
173
|
-
state_type_str = event.payload["validated_state"].get("type")
|
|
174
|
-
|
|
175
|
-
if state_type_str:
|
|
176
|
-
try:
|
|
177
|
-
state_type = StateType(state_type_str)
|
|
178
|
-
if state_type in TERMINAL_STATES:
|
|
179
|
-
self._flow_completed = True
|
|
180
|
-
break
|
|
181
|
-
except ValueError:
|
|
182
|
-
pass
|
|
183
|
-
except Exception:
|
|
197
|
+
if self._is_terminal_event(event):
|
|
198
|
+
self._flow_completed = True
|
|
199
|
+
break
|
|
200
|
+
except asyncio.CancelledError:
|
|
184
201
|
pass
|
|
202
|
+
except Exception as exc:
|
|
203
|
+
await self._queue.put(exc)
|
|
204
|
+
else:
|
|
205
|
+
if not self._flow_completed:
|
|
206
|
+
await self._queue.put(
|
|
207
|
+
ConnectionError("Flow run events stream closed unexpectedly")
|
|
208
|
+
)
|
|
185
209
|
finally:
|
|
186
210
|
await self._queue.put(None)
|
|
@@ -425,6 +425,10 @@ class FlowRunWaitTimeout(PrefectException):
|
|
|
425
425
|
"""Raised when a flow run takes longer than a given timeout"""
|
|
426
426
|
|
|
427
427
|
|
|
428
|
+
class FlowRunWatchError(PrefectException):
|
|
429
|
+
"""Raised when watching a flow run stops before it reaches a terminal state"""
|
|
430
|
+
|
|
431
|
+
|
|
428
432
|
class PrefectImportError(ImportError):
|
|
429
433
|
"""
|
|
430
434
|
An error raised when a Prefect object cannot be imported due to a move or removal.
|
|
@@ -610,6 +610,7 @@ def as_completed(
|
|
|
610
610
|
unique_futures: set[PrefectFuture[R]] = set(futures)
|
|
611
611
|
total_futures = len(unique_futures)
|
|
612
612
|
pending = unique_futures
|
|
613
|
+
deadline: float | None = None
|
|
613
614
|
try:
|
|
614
615
|
with timeout_context(timeout):
|
|
615
616
|
done = {f for f in unique_futures if f._final_state} # type: ignore[privateUsage]
|
|
@@ -628,8 +629,17 @@ def as_completed(
|
|
|
628
629
|
for future in pending:
|
|
629
630
|
_register_prefect_done_callback(future, add_to_done)
|
|
630
631
|
|
|
632
|
+
deadline = time.monotonic() + timeout if timeout is not None else None
|
|
633
|
+
|
|
631
634
|
while pending:
|
|
632
|
-
|
|
635
|
+
if timeout is None:
|
|
636
|
+
finished_event.wait()
|
|
637
|
+
else:
|
|
638
|
+
assert deadline is not None
|
|
639
|
+
remaining = deadline - time.monotonic()
|
|
640
|
+
if not finished_event.wait(timeout=max(remaining, 0.0)):
|
|
641
|
+
raise TimeoutError
|
|
642
|
+
|
|
633
643
|
with finished_lock:
|
|
634
644
|
done = finished_futures
|
|
635
645
|
finished_futures = []
|
|
@@ -47,6 +47,13 @@ if TYPE_CHECKING:
|
|
|
47
47
|
|
|
48
48
|
logger: "logging.Logger" = get_logger(__name__)
|
|
49
49
|
|
|
50
|
+
# Exceptions that indicate transient network issues and should trigger retries.
|
|
51
|
+
_RETRYABLE_EXCEPTIONS: Tuple[Type[Exception], ...] = (
|
|
52
|
+
ConnectionClosed,
|
|
53
|
+
TimeoutError,
|
|
54
|
+
OSError,
|
|
55
|
+
)
|
|
56
|
+
|
|
50
57
|
LOGS_OBSERVED = Counter(
|
|
51
58
|
"prefect_logs_observed",
|
|
52
59
|
"The number of logs observed by Prefect log subscribers",
|
|
@@ -90,6 +97,7 @@ def _get_api_url_and_key(
|
|
|
90
97
|
def get_logs_subscriber(
|
|
91
98
|
filter: Optional["LogFilter"] = None,
|
|
92
99
|
reconnection_attempts: int = 10,
|
|
100
|
+
reconnect_on_clean_close: bool = False,
|
|
93
101
|
) -> "PrefectLogsSubscriber":
|
|
94
102
|
"""
|
|
95
103
|
Get a logs subscriber based on the current Prefect configuration.
|
|
@@ -101,13 +109,16 @@ def get_logs_subscriber(
|
|
|
101
109
|
|
|
102
110
|
if isinstance(api_url, str) and api_url.startswith(PREFECT_CLOUD_API_URL.value()):
|
|
103
111
|
return PrefectCloudLogsSubscriber(
|
|
104
|
-
filter=filter,
|
|
112
|
+
filter=filter,
|
|
113
|
+
reconnection_attempts=reconnection_attempts,
|
|
114
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
105
115
|
)
|
|
106
116
|
elif api_url:
|
|
107
117
|
return PrefectLogsSubscriber(
|
|
108
118
|
api_url=api_url,
|
|
109
119
|
filter=filter,
|
|
110
120
|
reconnection_attempts=reconnection_attempts,
|
|
121
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
111
122
|
)
|
|
112
123
|
elif PREFECT_SERVER_ALLOW_EPHEMERAL_MODE:
|
|
113
124
|
from prefect.server.api.server import SubprocessASGIServer
|
|
@@ -118,6 +129,7 @@ def get_logs_subscriber(
|
|
|
118
129
|
api_url=server.api_url,
|
|
119
130
|
filter=filter,
|
|
120
131
|
reconnection_attempts=reconnection_attempts,
|
|
132
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
121
133
|
)
|
|
122
134
|
else:
|
|
123
135
|
raise ValueError(
|
|
@@ -129,6 +141,10 @@ class PrefectLogsSubscriber:
|
|
|
129
141
|
"""
|
|
130
142
|
Subscribes to a Prefect logs stream, yielding logs as they occur.
|
|
131
143
|
|
|
144
|
+
Abnormal disconnects are retried. Clean disconnects end iteration unless
|
|
145
|
+
`reconnect_on_clean_close` is enabled. The logs stream is live-only, so logs
|
|
146
|
+
emitted while disconnected may be omitted.
|
|
147
|
+
|
|
132
148
|
Example:
|
|
133
149
|
|
|
134
150
|
from prefect.logging.clients import PrefectLogsSubscriber
|
|
@@ -155,6 +171,7 @@ class PrefectLogsSubscriber:
|
|
|
155
171
|
api_url: Optional[str] = None,
|
|
156
172
|
filter: Optional["LogFilter"] = None,
|
|
157
173
|
reconnection_attempts: int = 10,
|
|
174
|
+
reconnect_on_clean_close: bool = False,
|
|
158
175
|
):
|
|
159
176
|
"""
|
|
160
177
|
Args:
|
|
@@ -162,6 +179,8 @@ class PrefectLogsSubscriber:
|
|
|
162
179
|
filter: Log filter to apply
|
|
163
180
|
reconnection_attempts: When the client is disconnected, how many times
|
|
164
181
|
the client should attempt to reconnect
|
|
182
|
+
reconnect_on_clean_close: Whether to reconnect when the server closes
|
|
183
|
+
the connection normally instead of ending iteration
|
|
165
184
|
"""
|
|
166
185
|
self._api_key = None
|
|
167
186
|
self._auth_token = PREFECT_API_AUTH_STRING.value()
|
|
@@ -189,6 +208,7 @@ class PrefectLogsSubscriber:
|
|
|
189
208
|
self._connect = websocket_connect(socket_url, **connect_kwargs)
|
|
190
209
|
self._websocket = None
|
|
191
210
|
self._reconnection_attempts = reconnection_attempts
|
|
211
|
+
self._reconnect_on_clean_close = reconnect_on_clean_close
|
|
192
212
|
if self._reconnection_attempts < 0:
|
|
193
213
|
raise ValueError("reconnection_attempts must be a non-negative integer")
|
|
194
214
|
|
|
@@ -272,14 +292,15 @@ class PrefectLogsSubscriber:
|
|
|
272
292
|
|
|
273
293
|
async def __anext__(self) -> Log:
|
|
274
294
|
assert self._reconnection_attempts >= 0
|
|
275
|
-
|
|
295
|
+
attempts = 0
|
|
296
|
+
while attempts <= self._reconnection_attempts:
|
|
276
297
|
try:
|
|
277
298
|
# If we're here and the websocket is None, then we've had a failure in a
|
|
278
299
|
# previous reconnection attempt.
|
|
279
300
|
#
|
|
280
301
|
# Otherwise, after the first time through this loop, we're recovering
|
|
281
302
|
# from a ConnectionClosed, so reconnect now.
|
|
282
|
-
if not self._websocket or
|
|
303
|
+
if not self._websocket or attempts > 0:
|
|
283
304
|
try:
|
|
284
305
|
await self._reconnect()
|
|
285
306
|
finally:
|
|
@@ -301,20 +322,22 @@ class PrefectLogsSubscriber:
|
|
|
301
322
|
finally:
|
|
302
323
|
LOGS_OBSERVED.labels(self.client_name).inc()
|
|
303
324
|
|
|
304
|
-
except
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
325
|
+
except _RETRYABLE_EXCEPTIONS as exc:
|
|
326
|
+
if isinstance(exc, ConnectionClosedOK):
|
|
327
|
+
if not self._reconnect_on_clean_close:
|
|
328
|
+
logger.debug('Connection closed with "OK" status')
|
|
329
|
+
raise StopAsyncIteration
|
|
330
|
+
|
|
331
|
+
attempts += 1
|
|
308
332
|
logger.debug(
|
|
309
|
-
"
|
|
310
|
-
|
|
333
|
+
"Retryable error with %s/%s attempts",
|
|
334
|
+
attempts,
|
|
311
335
|
self._reconnection_attempts,
|
|
312
336
|
)
|
|
313
|
-
if
|
|
314
|
-
# this was our final chance, raise the most recent error
|
|
337
|
+
if attempts > self._reconnection_attempts:
|
|
315
338
|
raise
|
|
316
339
|
|
|
317
|
-
if
|
|
340
|
+
if attempts > 2:
|
|
318
341
|
# let the first two attempts happen quickly in case this is just
|
|
319
342
|
# a standard load balancer timeout, but after that, just take a
|
|
320
343
|
# beat to let things come back around.
|
|
@@ -331,6 +354,7 @@ class PrefectCloudLogsSubscriber(PrefectLogsSubscriber):
|
|
|
331
354
|
api_key: Optional[str] = None,
|
|
332
355
|
filter: Optional["LogFilter"] = None,
|
|
333
356
|
reconnection_attempts: int = 10,
|
|
357
|
+
reconnect_on_clean_close: bool = False,
|
|
334
358
|
):
|
|
335
359
|
"""
|
|
336
360
|
Args:
|
|
@@ -339,6 +363,8 @@ class PrefectCloudLogsSubscriber(PrefectLogsSubscriber):
|
|
|
339
363
|
filter: Log filter to apply
|
|
340
364
|
reconnection_attempts: When the client is disconnected, how many times
|
|
341
365
|
the client should attempt to reconnect
|
|
366
|
+
reconnect_on_clean_close: Whether to reconnect when the server closes
|
|
367
|
+
the connection normally instead of ending iteration
|
|
342
368
|
"""
|
|
343
369
|
api_url, api_key = _get_api_url_and_key(api_url, api_key)
|
|
344
370
|
|
|
@@ -346,6 +372,7 @@ class PrefectCloudLogsSubscriber(PrefectLogsSubscriber):
|
|
|
346
372
|
api_url=api_url,
|
|
347
373
|
filter=filter,
|
|
348
374
|
reconnection_attempts=reconnection_attempts,
|
|
375
|
+
reconnect_on_clean_close=reconnect_on_clean_close,
|
|
349
376
|
)
|
|
350
377
|
|
|
351
378
|
self._api_key = api_key
|
|
@@ -280,6 +280,12 @@ class ServerDatabaseSettings(PrefectBaseSettings):
|
|
|
280
280
|
),
|
|
281
281
|
)
|
|
282
282
|
|
|
283
|
+
migration_timeout: Optional[float] = Field(
|
|
284
|
+
default=None,
|
|
285
|
+
gt=0,
|
|
286
|
+
description="A statement timeout, in seconds, applied to database migrations. Schema changes such as concurrent index builds on large tables can take much longer than an ordinary API query, so migrations are not bound by `server.database.timeout`. Defaults to `None` (no timeout); set a positive value to bound migration statement duration.",
|
|
287
|
+
)
|
|
288
|
+
|
|
283
289
|
# handle deprecated fields
|
|
284
290
|
|
|
285
291
|
def __getattribute__(self, name: str) -> Any:
|