svc-infra 0.1.603__tar.gz → 0.1.604__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.
Potentially problematic release.
This version of svc-infra might be problematic. Click here for more details.
- {svc_infra-0.1.603 → svc_infra-0.1.604}/PKG-INFO +2 -1
- {svc_infra-0.1.603 → svc_infra-0.1.604}/README.md +1 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/pyproject.toml +2 -1
- svc_infra-0.1.604/src/svc_infra/obs/add.py +115 -0
- svc_infra-0.1.604/src/svc_infra/obs/grafana/dashboards/http-overview.json +45 -0
- svc_infra-0.1.603/src/svc_infra/obs/add.py +0 -68
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/alembic.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/models.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/aiydan.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/base.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/registry.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/stripe.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/schemas.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/service.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/settings.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/apf_payments/router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/apf_payments/setup.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/_cookies.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/gaurd.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/models.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/security.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/utils.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/verify.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/providers.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/session_router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/security.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/sender.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/settings.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/state.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/cache/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/cache/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/http.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/crud_router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/health.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/session.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/users.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/docs/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/docs/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/docs/landing.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/docs/scoped.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/dualize.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/protected.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/public.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dx.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/ease.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/http/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/http/conditional.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/idempotency.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/ratelimit.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/request_id.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/apply.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/conventions.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/mutators.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/pipeline.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/responses.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/security.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/ops/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/pagination.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/user.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/routers/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/setup.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/tenancy/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/tenancy/context.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/env.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/logging/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/logging/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/logging/filter.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/logging/formats.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/root.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/backend.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/decorators.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/demo.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/keys.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/recache.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/resources.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/tags.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/ttl.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/utils.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/__main__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/sql/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/help.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/obs/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/obs/obs_cmds.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/foundation/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/foundation/runner.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/foundation/typer_bootstrap.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/backup.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/erasure.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/fixtures.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/retention.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/crud_schema.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/inbox.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/base.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/constants.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/core.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/indexes.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/management.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/client.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/settings.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/templates/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/repository.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/resource.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/scaffold.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/service.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/service_with_hooks.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/types.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/utils.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/outbox.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/apikey.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/authref.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/base.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/constants.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/core.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/management.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/repository.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/resource.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/scaffold.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/service.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/service_with_hooks.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/tenant.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/types.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/uniq.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/uniq_hooks.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/utils.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/versioning.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/utils.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/dx/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/builtins/outbox_processor.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/builtins/webhook_delivery.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/easy.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/loader.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/queue.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/redis_queue.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/scheduler.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/worker.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/mcp/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/mcp/svc_infra_mcp.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/cloud_dash.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/asgi.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/base.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/http.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/sqlalchemy.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/compose_cloud/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/compose_cloud/templates/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/provisioning/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/settings.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/compose/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/py.typed +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/audit.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/audit_service.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/headers.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/hibp.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/jwt_rotation.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/lockout.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/models.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/org_invites.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/passwords.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/permissions.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/session.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/signed_cookies.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/utils.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/__init__.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/add.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/fastapi.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/router.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/service.py +0 -0
- {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/signing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: svc-infra
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.604
|
|
4
4
|
Summary: Infrastructure for building and deploying prod-ready services
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: fastapi,sqlalchemy,alembic,auth,infra,async,pydantic
|
|
@@ -91,6 +91,7 @@ svc-infra packages the shared building blocks we use to ship production FastAPI
|
|
|
91
91
|
| Jobs | JobQueue, scheduler, CLI worker | [Jobs quickstart](docs/jobs.md) |
|
|
92
92
|
| Cache | cashews decorators, namespace management, TTL helpers | [Cache guide](docs/cache.md) |
|
|
93
93
|
| Observability | Prometheus middleware, Grafana automation, OTEL hooks | [Observability guide](docs/observability.md) |
|
|
94
|
+
| Ops | Probes, breaker, SLOs & dashboards | [SLOs & Ops](docs/ops.md) |
|
|
94
95
|
| Webhooks | Subscription store, signing, retry worker | [Webhooks framework](docs/webhooks.md) |
|
|
95
96
|
| Security | Password policy, lockout, signed cookies, headers | [Security hardening](docs/security.md) |
|
|
96
97
|
| Data Lifecycle | Fixtures, retention, erasure, backups | [Data lifecycle](docs/data-lifecycle.md) |
|
|
@@ -15,6 +15,7 @@ svc-infra packages the shared building blocks we use to ship production FastAPI
|
|
|
15
15
|
| Jobs | JobQueue, scheduler, CLI worker | [Jobs quickstart](docs/jobs.md) |
|
|
16
16
|
| Cache | cashews decorators, namespace management, TTL helpers | [Cache guide](docs/cache.md) |
|
|
17
17
|
| Observability | Prometheus middleware, Grafana automation, OTEL hooks | [Observability guide](docs/observability.md) |
|
|
18
|
+
| Ops | Probes, breaker, SLOs & dashboards | [SLOs & Ops](docs/ops.md) |
|
|
18
19
|
| Webhooks | Subscription store, signing, retry worker | [Webhooks framework](docs/webhooks.md) |
|
|
19
20
|
| Security | Password policy, lockout, signed cookies, headers | [Security hardening](docs/security.md) |
|
|
20
21
|
| Data Lifecycle | Fixtures, retention, erasure, backups | [Data lifecycle](docs/data-lifecycle.md) |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "svc-infra"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.604"
|
|
4
4
|
description = "Infrastructure for building and deploying prod-ready services"
|
|
5
5
|
authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -128,6 +128,7 @@ markers = [
|
|
|
128
128
|
"webhooks: Webhooks framework tests",
|
|
129
129
|
"tenancy: Tenancy isolation and enforcement tests",
|
|
130
130
|
"data_lifecycle: Data lifecycle (fixtures, retention, erasure, backups)",
|
|
131
|
+
"ops: SLOs & Ops tests (probes, breaker, instrumentation)",
|
|
131
132
|
]
|
|
132
133
|
filterwarnings = [
|
|
133
134
|
"ignore:The `route` decorator is deprecated:DeprecationWarning:starlette.*",
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Callable, Iterable, Optional, Protocol
|
|
4
|
+
|
|
5
|
+
from svc_infra.obs.settings import ObservabilitySettings
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _want_metrics(cfg: ObservabilitySettings) -> bool:
|
|
9
|
+
return bool(cfg.METRICS_ENABLED)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RouteClassifier(Protocol):
|
|
13
|
+
def __call__(
|
|
14
|
+
self, route_path: str, method: str
|
|
15
|
+
) -> str: # e.g., returns "public|internal|admin"
|
|
16
|
+
...
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def add_observability(
|
|
20
|
+
app: Any | None = None,
|
|
21
|
+
*,
|
|
22
|
+
db_engines: Optional[Iterable[Any]] = None,
|
|
23
|
+
metrics_path: str | None = None,
|
|
24
|
+
skip_metric_paths: Optional[Iterable[str]] = None,
|
|
25
|
+
route_classifier: RouteClassifier | None = None,
|
|
26
|
+
) -> Callable[[], None]:
|
|
27
|
+
"""
|
|
28
|
+
Enable Prometheus metrics for the ASGI app and optional SQLAlchemy pool metrics.
|
|
29
|
+
Returns a no-op shutdown callable for API compatibility.
|
|
30
|
+
"""
|
|
31
|
+
cfg = ObservabilitySettings()
|
|
32
|
+
|
|
33
|
+
# --- Metrics (Prometheus) — import lazily so CLIs/tests don’t require prometheus_client
|
|
34
|
+
if app is not None and _want_metrics(cfg):
|
|
35
|
+
try:
|
|
36
|
+
from svc_infra.obs.metrics.asgi import ( # lazy
|
|
37
|
+
PrometheusMiddleware,
|
|
38
|
+
add_prometheus,
|
|
39
|
+
metrics_endpoint,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
path = metrics_path or cfg.METRICS_PATH
|
|
43
|
+
skip_paths = tuple(skip_metric_paths or (path, "/health", "/healthz"))
|
|
44
|
+
# If a route_classifier is provided, use a custom route_resolver to append class label
|
|
45
|
+
if route_classifier is None:
|
|
46
|
+
add_prometheus(
|
|
47
|
+
app,
|
|
48
|
+
path=path,
|
|
49
|
+
skip_paths=skip_paths,
|
|
50
|
+
)
|
|
51
|
+
else:
|
|
52
|
+
# Install middleware manually to pass route_resolver
|
|
53
|
+
def _resolver(req):
|
|
54
|
+
# Base template
|
|
55
|
+
from svc_infra.obs.metrics.asgi import _route_template # type: ignore
|
|
56
|
+
|
|
57
|
+
base = _route_template(req)
|
|
58
|
+
method = getattr(req, "method", "GET")
|
|
59
|
+
cls = route_classifier(base, method)
|
|
60
|
+
# Encode as base|class for downstream label splitting in dashboards
|
|
61
|
+
return f"{base}|{cls}"
|
|
62
|
+
|
|
63
|
+
app.add_middleware(
|
|
64
|
+
PrometheusMiddleware,
|
|
65
|
+
skip_paths=skip_paths,
|
|
66
|
+
route_resolver=_resolver,
|
|
67
|
+
)
|
|
68
|
+
# Mount /metrics endpoint without re-adding middleware
|
|
69
|
+
try:
|
|
70
|
+
from svc_infra.api.fastapi.dual.public import public_router
|
|
71
|
+
from svc_infra.app.env import CURRENT_ENVIRONMENT, DEV_ENV, LOCAL_ENV
|
|
72
|
+
|
|
73
|
+
router = public_router()
|
|
74
|
+
router.add_api_route(
|
|
75
|
+
path,
|
|
76
|
+
endpoint=metrics_endpoint(),
|
|
77
|
+
include_in_schema=CURRENT_ENVIRONMENT in (LOCAL_ENV, DEV_ENV),
|
|
78
|
+
tags=["observability"],
|
|
79
|
+
)
|
|
80
|
+
app.include_router(router)
|
|
81
|
+
except Exception:
|
|
82
|
+
app.add_route(path, metrics_endpoint())
|
|
83
|
+
except Exception:
|
|
84
|
+
pass
|
|
85
|
+
|
|
86
|
+
# --- DB pool metrics (best effort) — also lazy
|
|
87
|
+
if db_engines:
|
|
88
|
+
try:
|
|
89
|
+
from svc_infra.obs.metrics.sqlalchemy import bind_sqlalchemy_pool_metrics # lazy
|
|
90
|
+
|
|
91
|
+
for eng in db_engines:
|
|
92
|
+
try:
|
|
93
|
+
bind_sqlalchemy_pool_metrics(eng)
|
|
94
|
+
except Exception:
|
|
95
|
+
pass
|
|
96
|
+
except Exception:
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
# --- HTTP client metrics (best effort) — import lazily
|
|
100
|
+
try:
|
|
101
|
+
from svc_infra.obs.metrics.http import instrument_httpx, instrument_requests # lazy
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
instrument_requests()
|
|
105
|
+
except Exception:
|
|
106
|
+
pass
|
|
107
|
+
try:
|
|
108
|
+
instrument_httpx()
|
|
109
|
+
except Exception:
|
|
110
|
+
pass
|
|
111
|
+
except Exception:
|
|
112
|
+
pass
|
|
113
|
+
|
|
114
|
+
# Tracing removed; return no-op for backward compatibility
|
|
115
|
+
return lambda: None
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Service HTTP Overview",
|
|
3
|
+
"tags": ["svc-infra", "http"],
|
|
4
|
+
"timezone": "browser",
|
|
5
|
+
"panels": [
|
|
6
|
+
{
|
|
7
|
+
"type": "timeseries",
|
|
8
|
+
"title": "Success Rate (5m)",
|
|
9
|
+
"targets": [
|
|
10
|
+
{
|
|
11
|
+
"expr": "sum(rate(http_server_requests_total{code!~\"5..\"}[5m])) / sum(rate(http_server_requests_total[5m]))",
|
|
12
|
+
"legendFormat": "success_rate"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"type": "timeseries",
|
|
18
|
+
"title": "Latency p99",
|
|
19
|
+
"targets": [
|
|
20
|
+
{
|
|
21
|
+
"expr": "histogram_quantile(0.99, sum(rate(http_server_request_duration_seconds_bucket[5m])) by (le))",
|
|
22
|
+
"legendFormat": "p99"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"type": "table",
|
|
28
|
+
"title": "Top Routes by Error (5m)",
|
|
29
|
+
"targets": [
|
|
30
|
+
{
|
|
31
|
+
"expr": "topk(10, sum(rate(http_server_requests_total{code=~\"5..\"}[5m])) by (route))",
|
|
32
|
+
"legendFormat": "{{route}}"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"templating": {
|
|
38
|
+
"list": []
|
|
39
|
+
},
|
|
40
|
+
"time": {
|
|
41
|
+
"from": "now-6h",
|
|
42
|
+
"to": "now"
|
|
43
|
+
},
|
|
44
|
+
"refresh": "30s"
|
|
45
|
+
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Any, Callable, Iterable, Optional
|
|
4
|
-
|
|
5
|
-
from svc_infra.obs.settings import ObservabilitySettings
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def _want_metrics(cfg: ObservabilitySettings) -> bool:
|
|
9
|
-
return bool(cfg.METRICS_ENABLED)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def add_observability(
|
|
13
|
-
app: Any | None = None,
|
|
14
|
-
*,
|
|
15
|
-
db_engines: Optional[Iterable[Any]] = None,
|
|
16
|
-
metrics_path: str | None = None,
|
|
17
|
-
skip_metric_paths: Optional[Iterable[str]] = None,
|
|
18
|
-
) -> Callable[[], None]:
|
|
19
|
-
"""
|
|
20
|
-
Enable Prometheus metrics for the ASGI app and optional SQLAlchemy pool metrics.
|
|
21
|
-
Returns a no-op shutdown callable for API compatibility.
|
|
22
|
-
"""
|
|
23
|
-
cfg = ObservabilitySettings()
|
|
24
|
-
|
|
25
|
-
# --- Metrics (Prometheus) — import lazily so CLIs/tests don’t require prometheus_client
|
|
26
|
-
if app is not None and _want_metrics(cfg):
|
|
27
|
-
try:
|
|
28
|
-
from svc_infra.obs.metrics.asgi import add_prometheus # lazy
|
|
29
|
-
|
|
30
|
-
path = metrics_path or cfg.METRICS_PATH
|
|
31
|
-
add_prometheus(
|
|
32
|
-
app,
|
|
33
|
-
path=path,
|
|
34
|
-
skip_paths=tuple(skip_metric_paths or (path, "/health", "/healthz")),
|
|
35
|
-
)
|
|
36
|
-
except Exception:
|
|
37
|
-
pass
|
|
38
|
-
|
|
39
|
-
# --- DB pool metrics (best effort) — also lazy
|
|
40
|
-
if db_engines:
|
|
41
|
-
try:
|
|
42
|
-
from svc_infra.obs.metrics.sqlalchemy import bind_sqlalchemy_pool_metrics # lazy
|
|
43
|
-
|
|
44
|
-
for eng in db_engines:
|
|
45
|
-
try:
|
|
46
|
-
bind_sqlalchemy_pool_metrics(eng)
|
|
47
|
-
except Exception:
|
|
48
|
-
pass
|
|
49
|
-
except Exception:
|
|
50
|
-
pass
|
|
51
|
-
|
|
52
|
-
# --- HTTP client metrics (best effort) — import lazily
|
|
53
|
-
try:
|
|
54
|
-
from svc_infra.obs.metrics.http import instrument_httpx, instrument_requests # lazy
|
|
55
|
-
|
|
56
|
-
try:
|
|
57
|
-
instrument_requests()
|
|
58
|
-
except Exception:
|
|
59
|
-
pass
|
|
60
|
-
try:
|
|
61
|
-
instrument_httpx()
|
|
62
|
-
except Exception:
|
|
63
|
-
pass
|
|
64
|
-
except Exception:
|
|
65
|
-
pass
|
|
66
|
-
|
|
67
|
-
# Tracing removed; return no-op for backward compatibility
|
|
68
|
-
return lambda: None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py
RENAMED
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py
RENAMED
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/session_router.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/__init__.py
RENAMED
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/catchall.py
RENAMED
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py
RENAMED
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/handlers.py
RENAMED
|
File without changes
|
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/idempotency_store.py
RENAMED
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py
RENAMED
|
File without changes
|
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py
RENAMED
|
File without changes
|
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/request_size_limit.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py
RENAMED
|
File without changes
|