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.

Files changed (289) hide show
  1. {svc_infra-0.1.603 → svc_infra-0.1.604}/PKG-INFO +2 -1
  2. {svc_infra-0.1.603 → svc_infra-0.1.604}/README.md +1 -0
  3. {svc_infra-0.1.603 → svc_infra-0.1.604}/pyproject.toml +2 -1
  4. svc_infra-0.1.604/src/svc_infra/obs/add.py +115 -0
  5. svc_infra-0.1.604/src/svc_infra/obs/grafana/dashboards/http-overview.json +45 -0
  6. svc_infra-0.1.603/src/svc_infra/obs/add.py +0 -68
  7. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/__init__.py +0 -0
  8. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/README.md +0 -0
  9. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/__init__.py +0 -0
  10. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/alembic.py +0 -0
  11. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/models.py +0 -0
  12. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/__init__.py +0 -0
  13. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/aiydan.py +0 -0
  14. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/base.py +0 -0
  15. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/registry.py +0 -0
  16. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/provider/stripe.py +0 -0
  17. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/schemas.py +0 -0
  18. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/service.py +0 -0
  19. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/apf_payments/settings.py +0 -0
  20. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/__init__.py +0 -0
  21. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/__init__.py +0 -0
  22. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
  23. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/apf_payments/router.py +0 -0
  24. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/apf_payments/setup.py +0 -0
  25. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/__init__.py +0 -0
  26. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/_cookies.py +0 -0
  27. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/add.py +0 -0
  28. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/gaurd.py +0 -0
  29. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/__init__.py +0 -0
  30. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/models.py +0 -0
  31. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +0 -0
  32. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/router.py +0 -0
  33. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/security.py +0 -0
  34. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/utils.py +0 -0
  35. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/mfa/verify.py +0 -0
  36. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
  37. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/providers.py +0 -0
  38. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/__init__.py +0 -0
  39. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
  40. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +0 -0
  41. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +0 -0
  42. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/routers/session_router.py +0 -0
  43. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/security.py +0 -0
  44. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/sender.py +0 -0
  45. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/settings.py +0 -0
  46. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/auth/state.py +0 -0
  47. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/cache/__init__.py +0 -0
  48. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/cache/add.py +0 -0
  49. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
  50. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/http.py +0 -0
  51. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
  52. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py +0 -0
  53. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +0 -0
  54. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +0 -0
  55. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
  56. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
  57. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
  58. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/add.py +0 -0
  59. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/crud_router.py +0 -0
  60. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/health.py +0 -0
  61. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/session.py +0 -0
  62. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/db/sql/users.py +0 -0
  63. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +0 -0
  64. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/docs/__init__.py +0 -0
  65. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/docs/add.py +0 -0
  66. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/docs/landing.py +0 -0
  67. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/docs/scoped.py +0 -0
  68. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
  69. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/dualize.py +0 -0
  70. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/protected.py +0 -0
  71. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/public.py +0 -0
  72. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/router.py +0 -0
  73. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
  74. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/dx.py +0 -0
  75. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/ease.py +0 -0
  76. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/http/__init__.py +0 -0
  77. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
  78. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/http/conditional.py +0 -0
  79. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
  80. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/__init__.py +0 -0
  81. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
  82. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/__init__.py +0 -0
  83. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +0 -0
  84. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +0 -0
  85. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +0 -0
  86. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/idempotency.py +0 -0
  87. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +0 -0
  88. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +0 -0
  89. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/ratelimit.py +0 -0
  90. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +0 -0
  91. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/request_id.py +0 -0
  92. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +0 -0
  93. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/__init__.py +0 -0
  94. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/apply.py +0 -0
  95. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/conventions.py +0 -0
  96. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
  97. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/mutators.py +0 -0
  98. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/pipeline.py +0 -0
  99. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/responses.py +0 -0
  100. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/openapi/security.py +0 -0
  101. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/ops/add.py +0 -0
  102. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/pagination.py +0 -0
  103. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/__init__.py +0 -0
  104. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
  105. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
  106. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
  107. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/paths/user.py +0 -0
  108. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/routers/__init__.py +0 -0
  109. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
  110. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/setup.py +0 -0
  111. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/tenancy/add.py +0 -0
  112. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/api/fastapi/tenancy/context.py +0 -0
  113. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/README.md +0 -0
  114. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/__init__.py +0 -0
  115. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/env.py +0 -0
  116. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/logging/__init__.py +0 -0
  117. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/logging/add.py +0 -0
  118. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/logging/filter.py +0 -0
  119. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/logging/formats.py +0 -0
  120. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/app/root.py +0 -0
  121. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/README.md +0 -0
  122. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/__init__.py +0 -0
  123. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/backend.py +0 -0
  124. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/decorators.py +0 -0
  125. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/demo.py +0 -0
  126. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/keys.py +0 -0
  127. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/recache.py +0 -0
  128. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/resources.py +0 -0
  129. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/tags.py +0 -0
  130. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/ttl.py +0 -0
  131. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cache/utils.py +0 -0
  132. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/__init__.py +0 -0
  133. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/__main__.py +0 -0
  134. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/__init__.py +0 -0
  135. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/__init__.py +0 -0
  136. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/__init__.py +0 -0
  137. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
  138. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/__init__.py +0 -0
  139. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +0 -0
  140. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +0 -0
  141. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/sql/__init__.py +0 -0
  142. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +0 -0
  143. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +0 -0
  144. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +0 -0
  145. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/help.py +0 -0
  146. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
  147. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +0 -0
  148. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/obs/__init__.py +0 -0
  149. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/cmds/obs/obs_cmds.py +0 -0
  150. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/foundation/__init__.py +0 -0
  151. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/foundation/runner.py +0 -0
  152. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/cli/foundation/typer_bootstrap.py +0 -0
  153. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/add.py +0 -0
  154. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/backup.py +0 -0
  155. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/erasure.py +0 -0
  156. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/fixtures.py +0 -0
  157. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/data/retention.py +0 -0
  158. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/__init__.py +0 -0
  159. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/crud_schema.py +0 -0
  160. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/inbox.py +0 -0
  161. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/__init__.py +0 -0
  162. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/base.py +0 -0
  163. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/constants.py +0 -0
  164. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/core.py +0 -0
  165. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/indexes.py +0 -0
  166. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/management.py +0 -0
  167. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/README.md +0 -0
  168. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/__init__.py +0 -0
  169. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/client.py +0 -0
  170. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/settings.py +0 -0
  171. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/templates/__init__.py +0 -0
  172. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
  173. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
  174. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
  175. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/repository.py +0 -0
  176. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/resource.py +0 -0
  177. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/scaffold.py +0 -0
  178. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/service.py +0 -0
  179. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/service_with_hooks.py +0 -0
  180. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/types.py +0 -0
  181. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/nosql/utils.py +0 -0
  182. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/outbox.py +0 -0
  183. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/README.md +0 -0
  184. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/__init__.py +0 -0
  185. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/apikey.py +0 -0
  186. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/authref.py +0 -0
  187. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/base.py +0 -0
  188. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/constants.py +0 -0
  189. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/core.py +0 -0
  190. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/management.py +0 -0
  191. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/repository.py +0 -0
  192. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/resource.py +0 -0
  193. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/scaffold.py +0 -0
  194. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/service.py +0 -0
  195. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/service_with_hooks.py +0 -0
  196. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/__init__.py +0 -0
  197. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/__init__.py +0 -0
  198. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
  199. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
  200. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
  201. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
  202. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/__init__.py +0 -0
  203. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
  204. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
  205. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
  206. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
  207. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/tenant.py +0 -0
  208. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/types.py +0 -0
  209. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/uniq.py +0 -0
  210. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/uniq_hooks.py +0 -0
  211. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/utils.py +0 -0
  212. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/sql/versioning.py +0 -0
  213. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/db/utils.py +0 -0
  214. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/dx/add.py +0 -0
  215. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/builtins/outbox_processor.py +0 -0
  216. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/builtins/webhook_delivery.py +0 -0
  217. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/easy.py +0 -0
  218. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/loader.py +0 -0
  219. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/queue.py +0 -0
  220. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/redis_queue.py +0 -0
  221. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/scheduler.py +0 -0
  222. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/jobs/worker.py +0 -0
  223. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/mcp/__init__.py +0 -0
  224. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/mcp/svc_infra_mcp.py +0 -0
  225. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/README.md +0 -0
  226. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/__init__.py +0 -0
  227. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/cloud_dash.py +0 -0
  228. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/__init__.py +0 -0
  229. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/asgi.py +0 -0
  230. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/base.py +0 -0
  231. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/http.py +0 -0
  232. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics/sqlalchemy.py +0 -0
  233. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/metrics.py +0 -0
  234. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/__init__.py +0 -0
  235. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/compose_cloud/__init__.py +0 -0
  236. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/compose_cloud/templates/__init__.py +0 -0
  237. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
  238. {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
  239. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/__init__.py +0 -0
  240. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
  241. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
  242. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
  243. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
  244. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
  245. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/dashboards/__init__.py +0 -0
  246. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/__init__.py +0 -0
  247. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
  248. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
  249. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/provisioning/__init__.py +0 -0
  250. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
  251. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
  252. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/settings.py +0 -0
  253. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
  254. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
  255. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/__init__.py +0 -0
  256. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/compose/__init__.py +0 -0
  257. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
  258. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
  259. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
  260. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
  261. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
  262. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
  263. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
  264. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
  265. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
  266. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
  267. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
  268. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
  269. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/py.typed +0 -0
  270. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/add.py +0 -0
  271. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/audit.py +0 -0
  272. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/audit_service.py +0 -0
  273. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/headers.py +0 -0
  274. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/hibp.py +0 -0
  275. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/jwt_rotation.py +0 -0
  276. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/lockout.py +0 -0
  277. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/models.py +0 -0
  278. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/org_invites.py +0 -0
  279. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/passwords.py +0 -0
  280. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/permissions.py +0 -0
  281. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/session.py +0 -0
  282. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/security/signed_cookies.py +0 -0
  283. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/utils.py +0 -0
  284. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/__init__.py +0 -0
  285. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/add.py +0 -0
  286. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/fastapi.py +0 -0
  287. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/router.py +0 -0
  288. {svc_infra-0.1.603 → svc_infra-0.1.604}/src/svc_infra/webhooks/service.py +0 -0
  289. {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.603
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.603"
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