c2cwsgiutils 6.2.0.dev154__tar.gz → 6.2.0.dev161__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 c2cwsgiutils might be problematic. Click here for more details.

Files changed (67) hide show
  1. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/PKG-INFO +4 -3
  2. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/db.py +7 -4
  3. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/stats_pyramid/_db_spy.py +8 -5
  4. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/pyproject.toml +1 -1
  5. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/LICENSE +0 -0
  6. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/README.md +0 -0
  7. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/__init__.py +0 -0
  8. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/acceptance/__init__.py +0 -0
  9. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/acceptance/connection.py +0 -0
  10. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/acceptance/image.py +0 -0
  11. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/acceptance/package-lock.json +0 -0
  12. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/acceptance/package.json +0 -0
  13. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/acceptance/print.py +0 -0
  14. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/acceptance/screenshot.js +0 -0
  15. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/acceptance/utils.py +0 -0
  16. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/auth.py +0 -0
  17. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/broadcast/__init__.py +0 -0
  18. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/broadcast/interface.py +0 -0
  19. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/broadcast/local.py +0 -0
  20. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/broadcast/redis.py +0 -0
  21. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/broadcast/utils.py +0 -0
  22. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/client_info.py +0 -0
  23. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/config_utils.py +0 -0
  24. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/coverage_setup.py +0 -0
  25. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/db_maintenance_view.py +0 -0
  26. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/debug/__init__.py +0 -0
  27. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/debug/_listeners.py +0 -0
  28. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/debug/_views.py +0 -0
  29. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/debug/utils.py +0 -0
  30. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/errors.py +0 -0
  31. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/health_check.py +0 -0
  32. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/index.py +0 -0
  33. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/loader.py +0 -0
  34. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/logging_view.py +0 -0
  35. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/models_graph.py +0 -0
  36. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/pretty_json.py +0 -0
  37. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/profiler.py +0 -0
  38. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/prometheus.py +0 -0
  39. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/py.typed +0 -0
  40. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/pyramid.py +0 -0
  41. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/pyramid_logging.py +0 -0
  42. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/redis_stats.py +0 -0
  43. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/redis_utils.py +0 -0
  44. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/request_tracking/__init__.py +0 -0
  45. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/request_tracking/_sql.py +0 -0
  46. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/scripts/__init__.py +0 -0
  47. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/scripts/genversion.py +0 -0
  48. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/scripts/stats_db.py +0 -0
  49. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/scripts/test_print.py +0 -0
  50. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sentry.py +0 -0
  51. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/services.py +0 -0
  52. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/setup_process.py +0 -0
  53. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sql_profiler/__init__.py +0 -0
  54. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sql_profiler/_impl.py +0 -0
  55. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sqlalchemylogger/README.md +0 -0
  56. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sqlalchemylogger/__init__.py +0 -0
  57. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sqlalchemylogger/_filters.py +0 -0
  58. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sqlalchemylogger/_models.py +0 -0
  59. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sqlalchemylogger/examples/__init__.py +0 -0
  60. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sqlalchemylogger/examples/example.py +0 -0
  61. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/sqlalchemylogger/handlers.py +0 -0
  62. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/static/favicon-16x16.png +0 -0
  63. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/static/favicon-32x32.png +0 -0
  64. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/stats_pyramid/__init__.py +0 -0
  65. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/stats_pyramid/_pyramid_spy.py +0 -0
  66. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/templates/index.html.mako +0 -0
  67. {c2cwsgiutils-6.2.0.dev154 → c2cwsgiutils-6.2.0.dev161}/c2cwsgiutils/version.py +0 -0
@@ -1,8 +1,9 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: c2cwsgiutils
3
- Version: 6.2.0.dev154
3
+ Version: 6.2.0.dev161
4
4
  Summary: Common utilities for Camptocamp WSGI applications
5
- License: BSD-2-Clause
5
+ License-Expression: BSD-2-Clause
6
+ License-File: LICENSE
6
7
  Keywords: geo,gis,sqlalchemy,orm,wsgi
7
8
  Author: Camptocamp
8
9
  Author-email: info@camptocamp.com
@@ -51,7 +51,7 @@ def setup_session(
51
51
  With an accompanying tween that switches between the master and the slave DB
52
52
  connection. Uses prefixed entries in the application's settings.
53
53
 
54
- The slave DB will be used for anything that is GET and OPTIONS queries. The master DB will be used for
54
+ The slave DB will be used for anything that is GET, HEAD and OPTIONS queries. The master DB will be used for
55
55
  all the other queries. You can tweak this behavior with the force_master and force_slave parameters.
56
56
  Those parameters are lists of regex that are going to be matched against "{VERB} {PATH}". Warning, the
57
57
  path includes the route_prefix.
@@ -111,7 +111,7 @@ def create_session(
111
111
  With an accompanying tween that switches between the master and the slave DB
112
112
  connection.
113
113
 
114
- The slave DB will be used for anything that is GET and OPTIONS queries. The master DB will be used for
114
+ The slave DB will be used for anything that is GET, HEAD and OPTIONS queries. The master DB will be used for
115
115
  all the other queries. You can tweak this behavior with the force_master and force_slave parameters.
116
116
  Those parameters are lists of regex that are going to be matched against "{VERB} {PATH}". Warning, the
117
117
  path includes the route_prefix.
@@ -187,7 +187,10 @@ def _add_tween(
187
187
  has_force_master = any(r.match(method_path) for r in master_paths)
188
188
  if FORCE_READONLY or (
189
189
  not has_force_master
190
- and (request.method in ("GET", "OPTIONS") or any(r.match(method_path) for r in slave_paths))
190
+ and (
191
+ request.method in ("GET", "HEAD", "OPTIONS")
192
+ or any(r.match(method_path) for r in slave_paths)
193
+ )
191
194
  ):
192
195
  _LOG.debug(
193
196
  "Using %s database for: %s",
@@ -260,7 +263,7 @@ class SessionFactory(_sessionmaker):
260
263
  if FORCE_READONLY or (
261
264
  not has_force_master
262
265
  and (
263
- request.method in ("GET", "OPTIONS")
266
+ request.method in ("GET", "OPTIONS", "HEAD")
264
267
  or any(r.match(method_path) for r in self.slave_paths)
265
268
  )
266
269
  ):
@@ -16,7 +16,7 @@ _LOG = logging.getLogger(__name__)
16
16
  _PROMETHEUS_DB_SUMMARY = prometheus_client.Summary(
17
17
  prometheus.build_metric_name("database"),
18
18
  "Database requests",
19
- ["what"],
19
+ ["what", "engine"],
20
20
  unit="seconds",
21
21
  )
22
22
 
@@ -67,12 +67,14 @@ def _simplify_sql(sql: str) -> str:
67
67
  return re.sub(r"%\(\w+\)\w", "?", sql)
68
68
 
69
69
 
70
- def _create_sqlalchemy_timer_cb(what: str) -> Callable[..., Any]:
70
+ def _create_sqlalchemy_timer_cb(what: str, engine_name: str | None = None) -> Callable[..., Any]:
71
71
  start = time.perf_counter()
72
72
 
73
73
  def after(*_args: Any, **_kwargs: Any) -> None:
74
- _PROMETHEUS_DB_SUMMARY.labels({"query": what}).observe(time.perf_counter() - start)
75
- _LOG.debug("Execute statement '%s' in %d.", what, time.perf_counter() - start)
74
+ elapsed_time = time.perf_counter() - start
75
+ _PROMETHEUS_DB_SUMMARY.labels(what=what, engine=engine_name).observe(elapsed_time)
76
+ engine_suffix = f", on {engine_name}" if engine_name else ""
77
+ _LOG.debug("Execute statement '%s' in %.3f%ss.", what, elapsed_time, engine_suffix)
76
78
 
77
79
  return after
78
80
 
@@ -85,10 +87,11 @@ def _before_cursor_execute(
85
87
  _context: Any,
86
88
  _executemany: Any,
87
89
  ) -> None:
90
+ engine_name = getattr(conn.engine, "c2c_name", None)
88
91
  sqlalchemy.event.listen(
89
92
  conn,
90
93
  "after_cursor_execute",
91
- _create_sqlalchemy_timer_cb(_simplify_sql(statement)),
94
+ _create_sqlalchemy_timer_cb(_simplify_sql(statement), engine_name),
92
95
  once=True,
93
96
  )
94
97
 
@@ -227,7 +227,7 @@ include = [
227
227
  ]
228
228
  requires-python = ">=3.10"
229
229
  dependencies = ["requests", "pyyaml", "ujson", "cee_syslog_handler", "prometheus-client"]
230
- version = "6.2.0.dev154"
230
+ version = "6.2.0.dev161"
231
231
 
232
232
  [project.urls]
233
233
  repository = "https://github.com/camptocamp/c2cwsgiutils"