flagsmith-common 3.8.0__tar.gz → 3.8.2__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.
Files changed (112) hide show
  1. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/PKG-INFO +1 -1
  2. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/pyproject.toml +3 -3
  3. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/docgen/events.py +6 -2
  4. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/otel.py +17 -4
  5. flagsmith_common-3.8.2/src/common/core/templates/docgen-events.md +9 -0
  6. flagsmith_common-3.8.2/src/common/core/templates/docgen-metrics.md +10 -0
  7. flagsmith_common-3.8.0/src/common/core/templates/docgen-events.md +0 -20
  8. flagsmith_common-3.8.0/src/common/core/templates/docgen-metrics.md +0 -24
  9. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/LICENSE +0 -0
  10. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/README.md +0 -0
  11. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/__init__.py +0 -0
  12. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/__init__.py +0 -0
  13. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/app.py +0 -0
  14. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/cli/__init__.py +0 -0
  15. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/cli/healthcheck.py +0 -0
  16. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/constants.py +0 -0
  17. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/docgen/__init__.py +0 -0
  18. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/logging.py +0 -0
  19. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/main.py +0 -0
  20. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/management/__init__.py +0 -0
  21. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/management/commands/__init__.py +0 -0
  22. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/management/commands/docgen.py +0 -0
  23. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/management/commands/start.py +0 -0
  24. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/management/commands/waitfordb.py +0 -0
  25. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/metrics.py +0 -0
  26. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/middleware.py +0 -0
  27. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/sentry.py +0 -0
  28. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/urls.py +0 -0
  29. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/utils.py +0 -0
  30. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/core/views.py +0 -0
  31. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/environments/permissions.py +0 -0
  32. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/features/__init__.py +0 -0
  33. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/features/multivariate/__init__.py +0 -0
  34. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/features/multivariate/serializers.py +0 -0
  35. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/features/serializers.py +0 -0
  36. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/features/versioning/__init__.py +0 -0
  37. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/features/versioning/serializers.py +0 -0
  38. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/__init__.py +0 -0
  39. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/conf.py +0 -0
  40. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/constants.py +0 -0
  41. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/logging.py +0 -0
  42. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/metrics.py +0 -0
  43. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/metrics_server.py +0 -0
  44. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/middleware.py +0 -0
  45. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/processors.py +0 -0
  46. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/gunicorn/utils.py +0 -0
  47. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/lint_tests.py +0 -0
  48. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/migrations/__init__.py +0 -0
  49. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/migrations/helpers/__init__.py +0 -0
  50. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/migrations/helpers/postgres_helpers.py +0 -0
  51. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/organisations/permissions.py +0 -0
  52. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/projects/permissions.py +0 -0
  53. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/prometheus/__init__.py +0 -0
  54. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/prometheus/utils.py +0 -0
  55. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/py.typed +0 -0
  56. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/test_tools/__init__.py +0 -0
  57. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/test_tools/plugin.py +0 -0
  58. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/test_tools/types.py +0 -0
  59. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/test_tools/utils.py +0 -0
  60. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/common/types.py +0 -0
  61. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/__init__.py +0 -0
  62. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/api.py +0 -0
  63. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/constants.py +0 -0
  64. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/dynamodb.py +0 -0
  65. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/py.typed +0 -0
  66. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/pydantic_types.py +0 -0
  67. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/types.py +0 -0
  68. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/utils.py +0 -0
  69. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/flagsmith_schemas/validators.py +0 -0
  70. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/__init__.py +0 -0
  71. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/admin.py +0 -0
  72. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/apps.py +0 -0
  73. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/decorators.py +0 -0
  74. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/exceptions.py +0 -0
  75. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/health.py +0 -0
  76. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/managers.py +0 -0
  77. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/metrics.py +0 -0
  78. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0001_initial.py +0 -0
  79. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0002_healthcheckmodel.py +0 -0
  80. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0003_add_completed_to_task.py +0 -0
  81. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0004_recreate_task_indexes.py +0 -0
  82. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0005_update_conditional_index_conditions.py +0 -0
  83. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0006_auto_20230221_0802.py +0 -0
  84. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0007_add_is_locked.py +0 -0
  85. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0008_add_get_task_to_process_function.py +0 -0
  86. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0009_add_recurring_task_run_first_run_at.py +0 -0
  87. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0010_task_priority.py +0 -0
  88. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0011_add_priority_to_get_tasks_to_process.py +0 -0
  89. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0012_add_locked_at_and_timeout.py +0 -0
  90. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0013_add_last_picked_at.py +0 -0
  91. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/0014_add_trace_context.py +0 -0
  92. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/__init__.py +0 -0
  93. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/sql/0008_get_recurring_tasks_to_process.sql +0 -0
  94. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/sql/0008_get_tasks_to_process.sql +0 -0
  95. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/sql/0011_get_tasks_to_process.sql +0 -0
  96. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/sql/0012_get_recurringtasks_to_process.sql +0 -0
  97. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/sql/0013_get_recurringtasks_to_process.sql +0 -0
  98. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/migrations/sql/__init__.py +0 -0
  99. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/models.py +0 -0
  100. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/monitoring.py +0 -0
  101. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/processor.py +0 -0
  102. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/py.typed +0 -0
  103. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/routers.py +0 -0
  104. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/serializers.py +0 -0
  105. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/task_registry.py +0 -0
  106. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/task_run_method.py +0 -0
  107. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/tasks.py +0 -0
  108. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/threads.py +0 -0
  109. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/types.py +0 -0
  110. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/urls.py +0 -0
  111. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/utils.py +0 -0
  112. {flagsmith_common-3.8.0 → flagsmith_common-3.8.2}/src/task_processor/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flagsmith-common
3
- Version: 3.8.0
3
+ Version: 3.8.2
4
4
  Summary: Flagsmith's common library
5
5
  Author: Matthew Elwell, Gagan Trivedi, Kim Gustyr, Zach Aysan, Francesco Lo Franco, Rodrigo López Dato, Evandro Myller, Wadii Zaim
6
6
  License-Expression: BSD-3-Clause
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "flagsmith-common"
3
- version = "3.8.0"
3
+ version = "3.8.2"
4
4
  description = "Flagsmith's common library"
5
5
  requires-python = ">=3.11,<4.0"
6
6
  dependencies = []
@@ -87,8 +87,8 @@ dev = [
87
87
  "pre-commit",
88
88
  "pydantic>=2.12.5",
89
89
  "pyfakefs (>=5.7.4, <6.0.0)",
90
- "pytest (>=8.3.4, <9.0.0)",
91
- "pytest-asyncio (>=0.25.3, <1.0.0)",
90
+ "pytest (>=9.0.3, <9.1.0)",
91
+ "pytest-asyncio (>=1.0.0, <2.0.0)",
92
92
  "pytest-cov (>=6.0.0, <7.0.0)",
93
93
  "pytest-django (>=4.10.0, <5.0.0)",
94
94
  "pytest-freezegun (>=0.4.2, <1.0.0)",
@@ -4,6 +4,8 @@ from dataclasses import dataclass, field
4
4
  from pathlib import Path
5
5
  from typing import Iterable, Iterator
6
6
 
7
+ from common.core.otel import get_otel_event_name
8
+
7
9
 
8
10
  class DocgenEventsWarning(UserWarning):
9
11
  """Raised by the events scanner when a call site can't be resolved."""
@@ -317,9 +319,11 @@ def _build_entry_from_emit_call(
317
319
  )
318
320
  return None
319
321
  attributes = scope.bound_attrs | _kwargs_as_attributes(node.keywords)
320
- name = f"{scope.domain}.{event_arg.value}" if scope.domain else event_arg.value
321
322
  return EventEntry(
322
- name=name,
323
+ name=get_otel_event_name(
324
+ logger_name=scope.domain or None,
325
+ body=event_arg.value,
326
+ ),
323
327
  level=func.attr,
324
328
  attributes=attributes,
325
329
  locations=[SourceLocation(path=path, line=node.lineno)],
@@ -54,6 +54,19 @@ _RESERVED_KEYS = frozenset(
54
54
  )
55
55
 
56
56
 
57
+ def get_otel_event_name(*, logger_name: str | None, body: str) -> str:
58
+ """Build the event name that reaches OTel from a structlog `(logger, event)`.
59
+
60
+ The body is normalised via `inflection.underscore` so hyphens and CamelCase
61
+ collapse to snake_case. Empty bodies fall back to ``"unknown"``. The logger
62
+ name, when present, is prefixed verbatim.
63
+ """
64
+ normalised = inflection.underscore(body) if body else "unknown"
65
+ if logger_name:
66
+ return f"{logger_name}.{normalised}"
67
+ return normalised
68
+
69
+
57
70
  def add_otel_trace_context(
58
71
  logger: structlog.types.WrappedLogger,
59
72
  method_name: str,
@@ -95,10 +108,10 @@ def make_structlog_otel_processor(logger_provider: LoggerProvider) -> Processor:
95
108
  attributes[key] = str(value)
96
109
 
97
110
  body = event_dict.get("event", "")
98
- logger_name = event_dict.get("logger")
99
- event_name = inflection.underscore(body) if body else "unknown"
100
- if logger_name:
101
- event_name = f"{logger_name}.{event_name}"
111
+ event_name = get_otel_event_name(
112
+ logger_name=event_dict.get("logger"),
113
+ body=body,
114
+ )
102
115
 
103
116
  # Some observability platforms don't surface OTel's EventName.
104
117
  # Keep a custom attribute for better visibility.
@@ -0,0 +1,9 @@
1
+ {% for event in flagsmith_events %}
2
+ ### `{{ event.name }}`
3
+
4
+ Logged at `{{ event.level }}` from:
5
+ {% for location in event.locations %} - `{{ location.path }}:{{ location.line }}`
6
+ {% endfor %}
7
+ Attributes:
8
+ {% for attr in event.attributes %} - `{{ attr }}`
9
+ {% endfor %}{% endfor %}
@@ -0,0 +1,10 @@
1
+ {% for metric in flagsmith_metrics %}
2
+ ### `{{ metric.name }}`
3
+
4
+ {{ metric.type|title }}.
5
+
6
+ {{ metric.documentation }}
7
+
8
+ Labels:
9
+ {% for label in metric.labels %} - `{{ label }}`
10
+ {% endfor %}{% endfor %}
@@ -1,20 +0,0 @@
1
- ---
2
- title: Events
3
- sidebar_label: Events
4
- sidebar_position: 30
5
- ---
6
-
7
- Flagsmith backend emits [OpenTelemetry events](https://opentelemetry.io/docs/specs/otel/logs/data-model/#events)
8
- that can be ingested to downstream observability systems and/or a data warehouse of your choice via OTLP.
9
- To learn how to configure this, see [OpenTelemetry](deployment-self-hosting/scaling-and-performance/opentelemetry).
10
-
11
- ## Event catalogue
12
- {% for event in flagsmith_events %}
13
- ### `{{ event.name }}`
14
-
15
- Logged at `{{ event.level }}` from:
16
- {% for location in event.locations %} - `{{ location.path }}:{{ location.line }}`
17
- {% endfor %}
18
- Attributes:
19
- {% for attr in event.attributes %} - `{{ attr }}`
20
- {% endfor %}{% endfor %}
@@ -1,24 +0,0 @@
1
- ---
2
- title: Metrics
3
- sidebar_label: Metrics
4
- sidebar_position: 20
5
- ---
6
-
7
- ## Prometheus
8
-
9
- To enable the Prometheus `/metrics` endpoint, set the `PROMETHEUS_ENABLED` environment variable to `true`.
10
-
11
- When enabled, Flagsmith serves the `/metrics` endpoint on port 9100.
12
-
13
- The metrics provided by Flagsmith are described below.
14
-
15
- {% for metric in flagsmith_metrics %}
16
- ### `{{ metric.name }}`
17
-
18
- {{ metric.type|title }}.
19
-
20
- {{ metric.documentation }}
21
-
22
- Labels:
23
- {% for label in metric.labels %} - `{{ label }}`
24
- {% endfor %}{% endfor %}