fastapi-factory-utilities 0.2.10__tar.gz → 0.2.12__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 fastapi-factory-utilities might be problematic. Click here for more details.

Files changed (70) hide show
  1. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/PKG-INFO +1 -1
  2. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/pyproject.toml +1 -1
  3. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/odm_plugin/repositories.py +2 -3
  4. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/builder.py +65 -14
  5. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/configs.py +13 -0
  6. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/LICENSE +0 -0
  7. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/README.md +0 -0
  8. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/__main__.py +0 -0
  9. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/__init__.py +0 -0
  10. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/api/__init__.py +0 -0
  11. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/api/tags.py +0 -0
  12. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/api/v1/sys/__init__.py +0 -0
  13. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/api/v1/sys/health.py +0 -0
  14. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/api/v1/sys/readiness.py +0 -0
  15. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/__init__.py +0 -0
  16. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/application.py +0 -0
  17. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/builder.py +0 -0
  18. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/config.py +0 -0
  19. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/enums.py +0 -0
  20. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/exceptions.py +0 -0
  21. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/fastapi_builder.py +0 -0
  22. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/plugin_manager/__init__.py +0 -0
  23. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/plugin_manager/exceptions.py +0 -0
  24. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/app/plugin_manager/plugin_manager.py +0 -0
  25. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/exceptions.py +0 -0
  26. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/__init__.py +0 -0
  27. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/example/__init__.py +0 -0
  28. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/httpx_plugin/__init__.py +0 -0
  29. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/odm_plugin/__init__.py +0 -0
  30. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/odm_plugin/builder.py +0 -0
  31. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/odm_plugin/configs.py +0 -0
  32. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/odm_plugin/depends.py +0 -0
  33. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/odm_plugin/documents.py +0 -0
  34. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/odm_plugin/exceptions.py +0 -0
  35. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/__init__.py +0 -0
  36. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/exceptions.py +0 -0
  37. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/plugins/opentelemetry_plugin/helpers.py +0 -0
  38. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/protocols.py +0 -0
  39. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/services/status/__init__.py +0 -0
  40. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/services/status/enums.py +0 -0
  41. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/services/status/exceptions.py +0 -0
  42. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/services/status/health_calculator_strategies.py +0 -0
  43. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/services/status/readiness_calculator_strategies.py +0 -0
  44. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/services/status/services.py +0 -0
  45. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/services/status/types.py +0 -0
  46. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/utils/configs.py +0 -0
  47. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/utils/importlib.py +0 -0
  48. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/utils/log.py +0 -0
  49. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/utils/status.py +0 -0
  50. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/utils/uvicorn.py +0 -0
  51. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/core/utils/yaml_reader.py +0 -0
  52. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/__init__.py +0 -0
  53. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/__main__.py +0 -0
  54. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/api/__init__.py +0 -0
  55. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/api/books/__init__.py +0 -0
  56. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/api/books/responses.py +0 -0
  57. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/api/books/routes.py +0 -0
  58. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/app.py +0 -0
  59. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/application.yaml +0 -0
  60. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/entities/books/__init__.py +0 -0
  61. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/entities/books/entities.py +0 -0
  62. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/entities/books/enums.py +0 -0
  63. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/entities/books/types.py +0 -0
  64. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/models/__init__.py +0 -0
  65. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/models/books/__init__.py +0 -0
  66. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/models/books/document.py +0 -0
  67. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/models/books/repository.py +0 -0
  68. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/services/books/__init__.py +0 -0
  69. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/example/services/books/services.py +0 -0
  70. {fastapi_factory_utilities-0.2.10 → fastapi_factory_utilities-0.2.12}/src/fastapi_factory_utilities/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fastapi_factory_utilities
3
- Version: 0.2.10
3
+ Version: 0.2.12
4
4
  Summary: Consolidate libraries and utilities to create microservices in Python with FastAPI, Beanie, Httpx, AioPika and OpenTelemetry.
5
5
  License: MIT
6
6
  Keywords: python,fastapi,beanie,httpx,opentelemetry,microservices
@@ -3,7 +3,7 @@ name = "fastapi_factory_utilities"
3
3
  homepage = "https://github.com/miragecentury/fastapi_factory_utilities"
4
4
  repository = "https://github.com/miragecentury/fastapi_factory_utilities"
5
5
  keywords = ["python", "fastapi", "beanie", "httpx", "opentelemetry", "microservices"]
6
- version = "0.2.10"
6
+ version = "0.2.12"
7
7
  description = "Consolidate libraries and utilities to create microservices in Python with FastAPI, Beanie, Httpx, AioPika and OpenTelemetry."
8
8
  authors = ["miragecentury <victorien.vanroye@gmail.com>"]
9
9
  maintainers = ["miragecentury <victorien.vanroye@gmail.com>"]
@@ -6,7 +6,6 @@ from collections.abc import AsyncGenerator, Callable
6
6
  from contextlib import asynccontextmanager
7
7
  from typing import Any, Generic, TypeVar, get_args
8
8
  from uuid import UUID
9
- from venv import create
10
9
 
11
10
  from motor.motor_asyncio import AsyncIOMotorClientSession, AsyncIOMotorDatabase
12
11
  from pydantic import BaseModel
@@ -79,7 +78,7 @@ class AbstractRepository(ABC, Generic[DocumentGenericType, EntityGenericType]):
79
78
  UnableToCreateEntityDueToDuplicateKeyError: If the entity cannot be created due to a duplicate key error.
80
79
  OperationError: If the operation fails.
81
80
  """
82
- insert_time: datetime.datetime = datetime.datetime.now(tz=datetime.timezone.utc)
81
+ insert_time: datetime.datetime = datetime.datetime.now(tz=datetime.UTC)
83
82
  try:
84
83
  entity_dump: dict[str, Any] = entity.model_dump()
85
84
  entity_dump["created_at"] = insert_time
@@ -120,7 +119,7 @@ class AbstractRepository(ABC, Generic[DocumentGenericType, EntityGenericType]):
120
119
  ValueError: If the entity cannot be created from the document.
121
120
  OperationError: If the operation fails.
122
121
  """
123
- update_time: datetime.datetime = datetime.datetime.now(tz=datetime.timezone.utc)
122
+ update_time: datetime.datetime = datetime.datetime.now(tz=datetime.UTC)
124
123
  try:
125
124
  entity_dump: dict[str, Any] = entity.model_dump()
126
125
  entity_dump["updated_at"] = update_time
@@ -1,9 +1,20 @@
1
1
  """Provides a factory function to build a objets for OpenTelemetry."""
2
2
 
3
3
  from typing import Any, Self
4
+ from urllib.parse import ParseResult, urlparse
4
5
 
5
- from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
6
- from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
6
+ from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import (
7
+ OTLPMetricExporter as OTLPMetricExporterGRPC,
8
+ )
9
+ from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
10
+ OTLPSpanExporter as OTLPSpanExporterGRPC,
11
+ )
12
+ from opentelemetry.exporter.otlp.proto.http.metric_exporter import (
13
+ OTLPMetricExporter as OTLPMetricExporterHTTP,
14
+ )
15
+ from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
16
+ OTLPSpanExporter as OTLPSpanExporterHTTP,
17
+ )
7
18
  from opentelemetry.metrics import set_meter_provider
8
19
  from opentelemetry.propagate import set_global_textmap
9
20
  from opentelemetry.propagators.b3 import B3MultiFormat
@@ -31,24 +42,30 @@ from fastapi_factory_utilities.core.utils.yaml_reader import (
31
42
  YamlFileReader,
32
43
  )
33
44
 
34
- from .configs import OpenTelemetryConfig
45
+ from .configs import OpenTelemetryConfig, ProtocolEnum
35
46
  from .exceptions import OpenTelemetryPluginConfigError
36
47
 
48
+ GRPC_PORT: int = 4317
49
+ HTTP_PORT: int = 4318
50
+
37
51
 
38
52
  class OpenTelemetryPluginBuilder:
39
53
  """Configure the injection bindings for OpenTelemetryPlugin."""
40
54
 
41
- def __init__(self, application: ApplicationAbstractProtocol) -> None:
55
+ def __init__(self, application: ApplicationAbstractProtocol, settings: OpenTelemetryConfig | None = None) -> None:
42
56
  """Instantiate the OpenTelemetryPluginFactory.
43
57
 
44
58
  Args:
45
59
  application (BaseApplicationProtocol): The application object.
60
+ settings (OpenTelemetryConfig | None): The OpenTelemetry configuration object.
46
61
  """
47
62
  self._application: ApplicationAbstractProtocol = application
48
63
  self._resource: Resource | None = None
49
- self._config: OpenTelemetryConfig | None = None
64
+ self._config: OpenTelemetryConfig | None = settings
50
65
  self._meter_provider: MeterProvider | None = None
51
66
  self._tracer_provider: TracerProvider | None = None
67
+ self._trace_exporter: OTLPSpanExporterGRPC | OTLPSpanExporterHTTP | None = None
68
+ self._metric_exporter: OTLPMetricExporterGRPC | OTLPMetricExporterHTTP | None = None
52
69
 
53
70
  @property
54
71
  def resource(self) -> Resource | None:
@@ -161,11 +178,27 @@ class OpenTelemetryPluginBuilder:
161
178
 
162
179
  # TODO: Extract to a dedicated method for the exporter and period reader setup
163
180
 
181
+ url_parsed: ParseResult = urlparse(self._config.endpoint.unicode_string())
182
+
183
+ exporter: OTLPMetricExporterGRPC | OTLPMetricExporterHTTP
164
184
  # Setup the Exporter
165
- exporter = OTLPMetricExporter(
166
- endpoint=f"{self._config.endpoint.unicode_string()}v1/metrics",
167
- timeout=self._config.timeout,
168
- )
185
+ if url_parsed.port == GRPC_PORT or self._config.protocol == ProtocolEnum.OTLP_GRPC:
186
+ exporter = OTLPMetricExporterGRPC(
187
+ endpoint=f"{self._config.endpoint.unicode_string()}",
188
+ timeout=self._config.timeout,
189
+ insecure=True if str(self._config.endpoint).startswith("http") else False,
190
+ )
191
+ elif url_parsed.port == HTTP_PORT or self._config.protocol == ProtocolEnum.OTLP_HTTP:
192
+ exporter = OTLPMetricExporterHTTP(
193
+ endpoint=f"{self._config.endpoint.unicode_string()}/v1/metrics",
194
+ timeout=self._config.timeout,
195
+ )
196
+ else:
197
+ raise OpenTelemetryPluginConfigError(
198
+ "The endpoint port is not supported. Use 4317 for gRPC or 4318 for HTTP or set the protocol."
199
+ )
200
+
201
+ self._metric_exporter = exporter
169
202
 
170
203
  # Setup the Metric Reader
171
204
  meter_config: OpenTelemetryMeterConfig = self._config.meter_config
@@ -213,11 +246,28 @@ class OpenTelemetryPluginBuilder:
213
246
  if self._config.tracer_config is None:
214
247
  raise OpenTelemetryPluginConfigError("The tracer configuration is missing.")
215
248
 
249
+ exporter: OTLPSpanExporterGRPC | OTLPSpanExporterHTTP
250
+ url_parsed: ParseResult = urlparse(self._config.endpoint.unicode_string())
216
251
  # Setup the Exporter
217
- exporter = OTLPSpanExporter(
218
- endpoint=f"{self._config.endpoint.unicode_string()}v1/traces",
219
- timeout=self._config.timeout,
220
- )
252
+ if url_parsed.port == GRPC_PORT or self._config.protocol == ProtocolEnum.OTLP_GRPC:
253
+ insecure: bool = False if str(self._config.endpoint).startswith("https") else True
254
+ endpoint: str = f"{self._config.endpoint.unicode_string()}"
255
+ exporter = OTLPSpanExporterGRPC(
256
+ endpoint=endpoint,
257
+ # timeout=self._config.timeout,
258
+ insecure=insecure,
259
+ )
260
+ elif url_parsed.port == HTTP_PORT or self._config.protocol == ProtocolEnum.OTLP_HTTP:
261
+ exporter = OTLPSpanExporterHTTP(
262
+ endpoint=f"{self._config.endpoint.unicode_string()}/v1/traces",
263
+ # timeout=self._config.timeout,
264
+ )
265
+ else:
266
+ raise OpenTelemetryPluginConfigError(
267
+ "The endpoint port is not supported. Use 4317 for gRPC or 4318 for HTTP or set the protocol."
268
+ )
269
+
270
+ self._trace_exporter = exporter
221
271
 
222
272
  # Setup the Span Processor
223
273
  tracer_config: OpenTelemetryTracerConfig = self._config.tracer_config
@@ -259,7 +309,8 @@ class OpenTelemetryPluginBuilder:
259
309
  Self: The OpenTelemetryPluginFactory object.
260
310
  """
261
311
  self.build_resource()
262
- self.build_config()
312
+ if self._config is None:
313
+ self.build_config()
263
314
  self.build_meter_provider()
264
315
  self.build_tracer_provider()
265
316
 
@@ -1,11 +1,19 @@
1
1
  """Provides the configuration model for the OpenTelemetry plugin."""
2
2
 
3
+ from enum import StrEnum
3
4
  from typing import Annotated
4
5
 
5
6
  from pydantic import BaseModel, ConfigDict, Field, UrlConstraints
6
7
  from pydantic_core import Url
7
8
 
8
9
 
10
+ class ProtocolEnum(StrEnum):
11
+ """Defines the protocol enum for OpenTelemetry."""
12
+
13
+ OTLP_GRPC = "otlp_grpc"
14
+ OTLP_HTTP = "otlp_http"
15
+
16
+
9
17
  class OpenTelemetryMeterConfig(BaseModel):
10
18
  """Provides the configuration model for the OpenTelemetry meter as sub-model."""
11
19
 
@@ -77,6 +85,11 @@ class OpenTelemetryConfig(BaseModel):
77
85
  description="The collector endpoint.",
78
86
  )
79
87
 
88
+ protocol: ProtocolEnum | None = Field(
89
+ default=None,
90
+ description="The protocol to use for the collector.",
91
+ )
92
+
80
93
  timeout: int = Field(
81
94
  default=TEN_SECONDS_IN_SECONDS,
82
95
  description="The timeout in seconds for the collector.",