aury-boot 0.0.35__tar.gz → 0.0.37__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.
- {aury_boot-0.0.35 → aury_boot-0.0.37}/PKG-INFO +1 -1
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/_version.py +2 -2
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/config/settings.py +22 -12
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/init.py +2 -2
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/server/app.py +8 -5
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/AGENTS.md.tpl +1 -1
- aury_boot-0.0.37/aury/boot/commands/templates/project/aury_docs/14-mq.md.tpl +152 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/messaging.tpl +15 -7
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/rules.py +2 -2
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/tracing/processor.py +17 -1
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/mq/backends/__init__.py +2 -0
- aury_boot-0.0.37/aury/boot/infrastructure/mq/backends/redis_stream.py +428 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/mq/base.py +1 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/mq/manager.py +3 -0
- aury_boot-0.0.35/aury/boot/commands/templates/project/aury_docs/14-mq.md.tpl +0 -102
- {aury_boot-0.0.35 → aury_boot-0.0.37}/.gitignore +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/README.md +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/adapter/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/adapter/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/adapter/config.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/adapter/decorators.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/adapter/exceptions.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/adapter/http.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/app/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/app/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/app/components.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/app/middlewares.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/app/startup.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/config/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/config/multi_instance.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/constants/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/constants/components.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/constants/scheduler.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/constants/service.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/errors/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/errors/chain.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/errors/codes.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/errors/exceptions.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/errors/handlers.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/errors/response.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/interfaces/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/interfaces/egress.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/interfaces/ingress.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/middleware/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/middleware/logging.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/migrations/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/migrations/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/migrations/setup.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/rpc/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/rpc/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/rpc/client.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/rpc/discovery.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/scheduler/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/scheduler/runner.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/application/server/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/add.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/app.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/config.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/docker.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/docs.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/generate.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/migrate/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/migrate/app.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/migrate/commands.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/pkg.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/scheduler.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/server/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/generate/api.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/generate/model.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/generate/repository.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/generate/schema.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/generate/service.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/README.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/admin_console_init.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/alert_rules.example.yaml.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/00-overview.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/01-model.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/02-repository.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/03-service.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/04-schema.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/05-api.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/06-exception.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/07-cache.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/08-scheduler.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/09-tasks.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/10-storage.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/11-logging.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/12-admin.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/13-channel.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/15-events.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/16-adapter.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/17-alerting.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/aury_docs/99-cli.md.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/config.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/conftest.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/_header.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/admin.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/cache.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/database.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/log.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/monitoring.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/rpc.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/scheduler.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/service.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/storage.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/env_templates/third_party.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/gitignore.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/main.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/modules/api.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/modules/exceptions.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/modules/schedules.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/templates/project/modules/tasks.py.tpl +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/commands/worker.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/exceptions/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/i18n/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/i18n/translator.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/logging/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/logging/context.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/logging/decorators.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/logging/format.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/common/logging/setup.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/contrib/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/contrib/admin_console/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/contrib/admin_console/auth.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/contrib/admin_console/discovery.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/contrib/admin_console/install.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/contrib/admin_console/utils.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/exceptions/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/models/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/models/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/models/mixins.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/models/models.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/pagination/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/repository/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/repository/impl.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/repository/interceptors.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/repository/interface.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/repository/query_builder.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/service/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/service/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/domain/transaction/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/cache/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/cache/backends.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/cache/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/cache/exceptions.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/cache/factory.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/cache/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/channel/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/channel/backends/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/channel/backends/broadcaster.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/channel/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/channel/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/clients/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/clients/rabbitmq/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/clients/rabbitmq/config.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/clients/rabbitmq/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/clients/redis/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/clients/redis/config.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/clients/redis/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/database/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/database/config.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/database/exceptions.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/database/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/database/query_tools/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/database/strategies/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/di/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/di/container.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/events/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/events/backends/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/events/backends/broadcaster.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/events/backends/rabbitmq.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/events/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/events/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/events/middleware.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/aggregator.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/events.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/notifiers/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/notifiers/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/notifiers/feishu.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/alerting/notifiers/webhook.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/health/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/tracing/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/tracing/context.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/tracing/logging.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/tracing/provider.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/tracing/tracing.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/mq/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/mq/backends/rabbitmq.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/mq/backends/redis.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/scheduler/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/scheduler/exceptions.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/scheduler/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/storage/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/storage/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/storage/exceptions.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/storage/factory.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/tasks/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/tasks/config.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/tasks/constants.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/tasks/exceptions.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/tasks/manager.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/testing/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/testing/base.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/testing/client.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/testing/factory.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/toolkit/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/toolkit/http/__init__.py +0 -0
- {aury_boot-0.0.35 → aury_boot-0.0.37}/pyproject.toml +0 -0
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.0.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 0,
|
|
31
|
+
__version__ = version = '0.0.37'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 0, 37)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -147,13 +147,13 @@ class MQInstanceConfig(MultiInstanceSettings):
|
|
|
147
147
|
|
|
148
148
|
环境变量格式: MQ__{INSTANCE}__{FIELD}
|
|
149
149
|
示例:
|
|
150
|
-
MQ__DEFAULT__BACKEND=
|
|
150
|
+
MQ__DEFAULT__BACKEND=redis_stream
|
|
151
151
|
MQ__DEFAULT__URL=redis://localhost:6379/4
|
|
152
152
|
"""
|
|
153
153
|
|
|
154
154
|
backend: str = Field(
|
|
155
|
-
default="
|
|
156
|
-
description="消息队列后端 (redis/rabbitmq)"
|
|
155
|
+
default="redis_stream",
|
|
156
|
+
description="消息队列后端 (redis/redis_stream/rabbitmq)"
|
|
157
157
|
)
|
|
158
158
|
url: str | None = Field(
|
|
159
159
|
default=None,
|
|
@@ -530,24 +530,25 @@ class MessageQueueSettings(BaseModel):
|
|
|
530
530
|
"""消息队列配置。
|
|
531
531
|
|
|
532
532
|
环境变量格式: MQ__{FIELD}
|
|
533
|
-
示例:
|
|
533
|
+
示例: MQ__BACKEND, MQ__URL, MQ__BROKER_URL
|
|
534
534
|
|
|
535
535
|
与 Task(任务队列)的区别:
|
|
536
536
|
- Task: 基于 Dramatiq,用于异步任务处理(API + Worker 模式)
|
|
537
537
|
- MQ: 通用消息队列,用于服务间通信、事件驱动架构
|
|
538
538
|
|
|
539
539
|
支持的后端:
|
|
540
|
-
-
|
|
541
|
-
-
|
|
540
|
+
- redis: redis://localhost:6379/0
|
|
541
|
+
- redis_stream: redis://localhost:6379/0
|
|
542
|
+
- rabbitmq: amqp://guest:guest@localhost:5672//
|
|
542
543
|
"""
|
|
543
544
|
|
|
544
|
-
|
|
545
|
-
default=
|
|
546
|
-
description="
|
|
545
|
+
backend: str = Field(
|
|
546
|
+
default="",
|
|
547
|
+
description="消息队列后端 (redis/redis_stream/rabbitmq),空字符串表示不启用"
|
|
547
548
|
)
|
|
548
|
-
|
|
549
|
+
url: str | None = Field(
|
|
549
550
|
default=None,
|
|
550
|
-
description="
|
|
551
|
+
description="连接 URL"
|
|
551
552
|
)
|
|
552
553
|
default_queue: str = Field(
|
|
553
554
|
default="default",
|
|
@@ -714,7 +715,7 @@ class AlertSettings(BaseModel):
|
|
|
714
715
|
|
|
715
716
|
# 抑制配置
|
|
716
717
|
suppress_seconds: int = Field(
|
|
717
|
-
default=
|
|
718
|
+
default=300,
|
|
718
719
|
description="告警抑制时间(秒),相同告警在此时间内不重复发送"
|
|
719
720
|
)
|
|
720
721
|
|
|
@@ -1001,6 +1002,7 @@ class BaseConfig(BaseSettings):
|
|
|
1001
1002
|
# ========== 异步与事件 ==========
|
|
1002
1003
|
task: TaskSettings = Field(default_factory=TaskSettings)
|
|
1003
1004
|
event: EventSettings = Field(default_factory=EventSettings)
|
|
1005
|
+
mq: MessageQueueSettings = Field(default_factory=MessageQueueSettings)
|
|
1004
1006
|
|
|
1005
1007
|
# ========== 微服务通信 ==========
|
|
1006
1008
|
# RPC 客户端配置(调用其他服务)
|
|
@@ -1108,10 +1110,18 @@ class BaseConfig(BaseSettings):
|
|
|
1108
1110
|
"""获取所有消息队列实例配置。
|
|
1109
1111
|
|
|
1110
1112
|
从环境变量解析 MQ__{INSTANCE}__{FIELD} 格式的配置。
|
|
1113
|
+
如果没有配置多实例,返回从单实例配置转换的 default 实例。
|
|
1111
1114
|
"""
|
|
1112
1115
|
if self._mqs is None:
|
|
1113
1116
|
loader = MultiInstanceConfigLoader("MQ", MQInstanceConfig)
|
|
1114
1117
|
self._mqs = loader.load()
|
|
1118
|
+
if not self._mqs and self.mq.backend:
|
|
1119
|
+
self._mqs = {
|
|
1120
|
+
"default": MQInstanceConfig(
|
|
1121
|
+
backend=self.mq.backend,
|
|
1122
|
+
url=self.mq.url,
|
|
1123
|
+
)
|
|
1124
|
+
}
|
|
1115
1125
|
return self._mqs
|
|
1116
1126
|
|
|
1117
1127
|
def get_events(self) -> dict[str, EventInstanceConfig]:
|
|
@@ -707,8 +707,8 @@ def init(
|
|
|
707
707
|
console.print(f" [cyan]uv add \"{deps[0]}\"[/cyan]")
|
|
708
708
|
console.print()
|
|
709
709
|
else:
|
|
710
|
-
#
|
|
711
|
-
with_admin_console =
|
|
710
|
+
# 非交互模式:默认禁用 Admin Console
|
|
711
|
+
with_admin_console = False
|
|
712
712
|
if package_name == ".":
|
|
713
713
|
package_name_snake = None
|
|
714
714
|
elif package_name:
|
|
@@ -9,6 +9,7 @@ import sys
|
|
|
9
9
|
from typing import TYPE_CHECKING
|
|
10
10
|
|
|
11
11
|
import typer
|
|
12
|
+
import uvicorn
|
|
12
13
|
|
|
13
14
|
if TYPE_CHECKING:
|
|
14
15
|
from aury.boot.application.app.base import FoundationApp
|
|
@@ -416,7 +417,6 @@ def dev(
|
|
|
416
417
|
os_module.environ["AURIMYTH_RELOAD"] = "1"
|
|
417
418
|
|
|
418
419
|
# 热重载模式下,直接使用 uvicorn,传递 app 字符串路径
|
|
419
|
-
import uvicorn
|
|
420
420
|
uvicorn.run(
|
|
421
421
|
app=app_module_path,
|
|
422
422
|
host=server_host,
|
|
@@ -500,19 +500,22 @@ def prod(
|
|
|
500
500
|
typer.echo(" 热重载: ❌")
|
|
501
501
|
typer.echo(" 调试模式: ❌")
|
|
502
502
|
|
|
503
|
+
# 获取 app 模块路径(多进程模式需要字符串格式)
|
|
504
|
+
app_module_path = app_path or _detect_app_module()
|
|
505
|
+
typer.echo(f" 应用模块: {app_module_path}")
|
|
506
|
+
|
|
503
507
|
try:
|
|
504
|
-
|
|
505
|
-
|
|
508
|
+
# 多进程模式必须使用字符串路径,否则子进程无法重新加载应用
|
|
509
|
+
uvicorn.run(
|
|
510
|
+
app=app_module_path,
|
|
506
511
|
host=server_host,
|
|
507
512
|
port=server_port,
|
|
508
513
|
workers=server_workers,
|
|
509
514
|
reload=False,
|
|
510
515
|
loop="auto",
|
|
511
516
|
http="auto",
|
|
512
|
-
debug=False,
|
|
513
517
|
access_log=True,
|
|
514
518
|
)
|
|
515
|
-
server.run()
|
|
516
519
|
except KeyboardInterrupt:
|
|
517
520
|
typer.echo("\n👋 服务器已停止")
|
|
518
521
|
except Exception as e:
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# 消息队列(MQ)
|
|
2
|
+
|
|
3
|
+
支持 `redis`、`redis_stream` 和 `rabbitmq` 后端的消息队列,用于异步任务解耦。
|
|
4
|
+
|
|
5
|
+
## 14.1 基本用法
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
from aury.boot.infrastructure.mq import MQManager
|
|
9
|
+
|
|
10
|
+
# 获取实例
|
|
11
|
+
mq = MQManager.get_instance()
|
|
12
|
+
|
|
13
|
+
# Redis List 后端(简单队列)
|
|
14
|
+
await mq.initialize(backend="redis", url="redis://localhost:6379/0")
|
|
15
|
+
|
|
16
|
+
# Redis Stream 后端(推荐,支持消费者组)
|
|
17
|
+
await mq.initialize(backend="redis_stream", url="redis://localhost:6379/0")
|
|
18
|
+
|
|
19
|
+
# RabbitMQ 后端
|
|
20
|
+
await mq.initialize(backend="rabbitmq", url="amqp://guest:guest@localhost:5672/")
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 14.2 后端对比
|
|
24
|
+
|
|
25
|
+
**Redis List (redis)**:
|
|
26
|
+
- 简单的 FIFO 队列(LPUSH/BRPOP)
|
|
27
|
+
- 适合单消费者场景
|
|
28
|
+
- 消息不持久化(除非开启 AOF)
|
|
29
|
+
|
|
30
|
+
**Redis Stream (redis_stream)** ⭐ 推荐:
|
|
31
|
+
- 支持消费者组,多实例可并行消费
|
|
32
|
+
- 消息持久化(配合 AOF)
|
|
33
|
+
- 支持消息确认(ACK)和重试
|
|
34
|
+
- 支持消息回放和历史查询
|
|
35
|
+
|
|
36
|
+
**RabbitMQ (rabbitmq)**:
|
|
37
|
+
- 功能最完整的消息队列
|
|
38
|
+
- 支持多种交换机类型
|
|
39
|
+
- 适合复杂的消息路由场景
|
|
40
|
+
|
|
41
|
+
## 14.3 生产者
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
from aury.boot.infrastructure.mq import MQMessage
|
|
45
|
+
|
|
46
|
+
# 发送消息
|
|
47
|
+
await mq.send(
|
|
48
|
+
queue="orders",
|
|
49
|
+
message={{"order_id": "123", "action": "created"}}
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# 使用 MQMessage 对象(可设置 headers)
|
|
53
|
+
msg = MQMessage(
|
|
54
|
+
body={{"order_id": "123"}},
|
|
55
|
+
headers={{"priority": "high"}}
|
|
56
|
+
)
|
|
57
|
+
await mq.send("orders", msg)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 14.4 消费者
|
|
61
|
+
|
|
62
|
+
**文件**: `{package_name}/workers/order_worker.py`
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
from aury.boot.infrastructure.mq import MQManager, MQMessage
|
|
66
|
+
from aury.boot.common.logging import logger
|
|
67
|
+
|
|
68
|
+
mq = MQManager.get_instance()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
async def process_order(message: MQMessage):
|
|
72
|
+
\"\"\"处理订单消息。\"\"\"
|
|
73
|
+
logger.info(f"处理订单: {{message.body}}")
|
|
74
|
+
# 业务逻辑...
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
async def start_consumer():
|
|
78
|
+
\"\"\"启动消费者。\"\"\"
|
|
79
|
+
# consume 会自动处理 ACK/NACK
|
|
80
|
+
await mq.consume("orders", process_order)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 14.5 Redis Stream 特性
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
from aury.boot.infrastructure.mq.backends.redis_stream import RedisStreamMQ
|
|
87
|
+
|
|
88
|
+
# 初始化时指定消费者组
|
|
89
|
+
mq = MQManager.get_instance()
|
|
90
|
+
await mq.initialize(
|
|
91
|
+
backend="redis_stream",
|
|
92
|
+
url="redis://localhost:6379/0"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# 获取底层 RedisStreamMQ 实例使用高级特性
|
|
96
|
+
stream_mq: RedisStreamMQ = mq.backend
|
|
97
|
+
|
|
98
|
+
# 读取所有历史消息(用于重放)
|
|
99
|
+
messages = await stream_mq.read_all("orders", count=100)
|
|
100
|
+
|
|
101
|
+
# 阻塞读取新消息(用于 SSE/实时推送)
|
|
102
|
+
messages = await stream_mq.read_blocking(
|
|
103
|
+
"orders",
|
|
104
|
+
last_id="$", # 从最新消息开始
|
|
105
|
+
count=10,
|
|
106
|
+
block_ms=5000 # 阻塞 5 秒
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# 裁剪 Stream(保留最新 1000 条)
|
|
110
|
+
await stream_mq.trim("orders", maxlen=1000)
|
|
111
|
+
|
|
112
|
+
# 获取 Stream 信息
|
|
113
|
+
info = await stream_mq.stream_info("orders")
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 14.6 多实例配置
|
|
117
|
+
|
|
118
|
+
框架支持命名多实例,适合不同业务场景使用不同的 MQ:
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
# 代码中使用命名实例
|
|
122
|
+
orders_mq = MQManager.get_instance("orders")
|
|
123
|
+
notifications_mq = MQManager.get_instance("notifications")
|
|
124
|
+
|
|
125
|
+
# 分别初始化
|
|
126
|
+
await orders_mq.initialize(backend="redis_stream", url="redis://localhost:6379/1")
|
|
127
|
+
await notifications_mq.initialize(backend="redis", url="redis://localhost:6379/2")
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**环境变量配置**(自动初始化):
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
# 单实例配置
|
|
134
|
+
MQ__BACKEND=redis_stream
|
|
135
|
+
MQ__URL=redis://localhost:6379/0
|
|
136
|
+
|
|
137
|
+
# 多实例配置(格式:MQ__{{INSTANCE}}__{{FIELD}})
|
|
138
|
+
MQ__DEFAULT__BACKEND=redis_stream
|
|
139
|
+
MQ__DEFAULT__URL=redis://localhost:6379/4
|
|
140
|
+
MQ__ORDERS__BACKEND=rabbitmq
|
|
141
|
+
MQ__ORDERS__URL=amqp://guest:guest@localhost:5672/
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 14.7 与异步任务(Dramatiq)的区别
|
|
145
|
+
|
|
146
|
+
- **MQ**:轻量级消息传递,适合简单的生产者-消费者模式、实时通知、多实例消费
|
|
147
|
+
- **Dramatiq(TaskManager)**:功能更丰富,支持重试、延迟、优先级、Actor 模式
|
|
148
|
+
|
|
149
|
+
选择建议:
|
|
150
|
+
- 简单的异步解耦 → MQ (redis_stream)
|
|
151
|
+
- 需要重试/延迟/优先级 → Dramatiq
|
|
152
|
+
- 多服务实例并行消费 → MQ (redis_stream) 或 RabbitMQ
|
|
@@ -19,19 +19,27 @@
|
|
|
19
19
|
# =============================================================================
|
|
20
20
|
# 消息队列配置 (MQ__)
|
|
21
21
|
# =============================================================================
|
|
22
|
+
# 支持后端: redis | redis_stream (推荐) | rabbitmq
|
|
23
|
+
#
|
|
22
24
|
# 单实例配置:
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
|
|
25
|
+
# MQ__BACKEND=redis_stream
|
|
26
|
+
# MQ__URL=redis://localhost:6379/4
|
|
27
|
+
#
|
|
26
28
|
# 多实例配置 (格式: MQ__{{INSTANCE}}__{{FIELD}}):
|
|
27
|
-
# MQ__DEFAULT__BACKEND=
|
|
29
|
+
# MQ__DEFAULT__BACKEND=redis_stream
|
|
28
30
|
# MQ__DEFAULT__URL=redis://localhost:6379/4
|
|
29
|
-
# MQ__DEFAULT__MAX_CONNECTIONS=10
|
|
30
31
|
#
|
|
31
|
-
#
|
|
32
|
+
# Redis List 后端 (简单 FIFO 队列):
|
|
33
|
+
# MQ__SIMPLE__BACKEND=redis
|
|
34
|
+
# MQ__SIMPLE__URL=redis://localhost:6379/4
|
|
35
|
+
#
|
|
36
|
+
# Redis Stream 后端 (推荐,支持消费者组/多实例消费):
|
|
37
|
+
# MQ__TASKS__BACKEND=redis_stream
|
|
38
|
+
# MQ__TASKS__URL=redis://localhost:6379/4
|
|
39
|
+
#
|
|
40
|
+
# RabbitMQ 后端 (复杂消息路由):
|
|
32
41
|
# MQ__ORDERS__BACKEND=rabbitmq
|
|
33
42
|
# MQ__ORDERS__URL=amqp://guest:guest@localhost:5672/orders
|
|
34
|
-
# MQ__ORDERS__PREFETCH_COUNT=10
|
|
35
43
|
|
|
36
44
|
# =============================================================================
|
|
37
45
|
# 事件总线配置 (EVENT__)
|
|
@@ -107,14 +107,14 @@ class AlertRule:
|
|
|
107
107
|
# 检查路径
|
|
108
108
|
if self._path_regex:
|
|
109
109
|
endpoint = event.metadata.get("endpoint", "")
|
|
110
|
-
if not self._path_regex.
|
|
110
|
+
if not self._path_regex.fullmatch(endpoint):
|
|
111
111
|
return False
|
|
112
112
|
|
|
113
113
|
# 检查排除路径
|
|
114
114
|
if self._exclude_regexes:
|
|
115
115
|
endpoint = event.metadata.get("endpoint", "")
|
|
116
116
|
for exclude_regex in self._exclude_regexes:
|
|
117
|
-
if exclude_regex.
|
|
117
|
+
if exclude_regex.fullmatch(endpoint):
|
|
118
118
|
return False # 匹配到排除规则,不触发告警
|
|
119
119
|
|
|
120
120
|
# 检查阈值(对于 slow_* 类型)
|
{aury_boot-0.0.35 → aury_boot-0.0.37}/aury/boot/infrastructure/monitoring/tracing/processor.py
RENAMED
|
@@ -181,7 +181,23 @@ class AlertingSpanProcessor:
|
|
|
181
181
|
or name
|
|
182
182
|
)
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
# 检查所有可能的路径来源
|
|
185
|
+
paths_to_check = [path]
|
|
186
|
+
|
|
187
|
+
# 也检查 span name 中的路径(可能包含 HTTP 方法和后缀)
|
|
188
|
+
# 例如 "GET /api/v1/spaces/{space_id}/subscribe http receive"
|
|
189
|
+
if name and name != path:
|
|
190
|
+
# 尝试提取 span name 中的路径部分
|
|
191
|
+
parts = name.split()
|
|
192
|
+
for part in parts:
|
|
193
|
+
if part.startswith("/"):
|
|
194
|
+
paths_to_check.append(part)
|
|
195
|
+
|
|
196
|
+
for p in paths_to_check:
|
|
197
|
+
if any(regex.fullmatch(p) for regex in self._exclude_regexes):
|
|
198
|
+
return True
|
|
199
|
+
|
|
200
|
+
return False
|
|
185
201
|
|
|
186
202
|
def _emit_slow_alert(
|
|
187
203
|
self,
|