jararaca 0.3.26__py3-none-any.whl → 0.3.28__py3-none-any.whl

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 jararaca might be problematic. Click here for more details.

jararaca/__init__.py CHANGED
@@ -18,12 +18,17 @@ if TYPE_CHECKING:
18
18
  use_app_type,
19
19
  )
20
20
  from jararaca.observability.decorators import TracedClass, TracedFunc, traced_class
21
+ from jararaca.observability.fastapi_exception_handler import (
22
+ setup_fastapi_exception_handler,
23
+ )
21
24
  from jararaca.observability.hooks import (
22
25
  add_event,
23
26
  get_tracing_provider,
24
27
  record_exception,
28
+ set_span_attribute,
25
29
  set_span_status,
26
30
  spawn_trace,
31
+ start_span,
27
32
  )
28
33
  from jararaca.observability.interceptor import ObservabilityInterceptor
29
34
  from jararaca.observability.providers.otel import OtelObservabilityProvider
@@ -233,8 +238,11 @@ if TYPE_CHECKING:
233
238
  "TracedFunc",
234
239
  "TracedClass",
235
240
  "traced_class",
241
+ "start_span",
236
242
  "spawn_trace",
243
+ "set_span_attribute",
237
244
  "add_event",
245
+ "setup_fastapi_exception_handler",
238
246
  "set_span_status",
239
247
  "record_exception",
240
248
  "get_tracing_provider",
@@ -412,6 +420,13 @@ _dynamic_imports: "dict[str, tuple[str, str, str | None]]" = {
412
420
  "TracedClass": (__SPEC_PARENT__, "observability.decorators", None),
413
421
  "traced_class": (__SPEC_PARENT__, "observability.decorators", None),
414
422
  "spawn_trace": (__SPEC_PARENT__, "observability.hooks", None),
423
+ "setup_fastapi_exception_handler": (
424
+ __SPEC_PARENT__,
425
+ "observability.fastapi_exception_handler",
426
+ None,
427
+ ),
428
+ "set_span_attribute": (__SPEC_PARENT__, "observability.hooks", None),
429
+ "start_span": (__SPEC_PARENT__, "observability.hooks", None),
415
430
  "add_event": (__SPEC_PARENT__, "observability.hooks", None),
416
431
  "set_span_status": (__SPEC_PARENT__, "observability.hooks", None),
417
432
  "record_exception": (__SPEC_PARENT__, "observability.hooks", None),
@@ -0,0 +1,3 @@
1
+ TRACEPARENT_KEY = "traceparent"
2
+
3
+ __all__ = ["TRACEPARENT_KEY"]
@@ -37,7 +37,7 @@ AttributeMap = Mapping[str, AttributeValue]
37
37
 
38
38
  class TracingContextProvider(Protocol):
39
39
 
40
- def start_trace_context(
40
+ def start_span_context(
41
41
  self, trace_name: str, context_attributes: AttributeMap | None
42
42
  ) -> ContextManager[Any]: ...
43
43
 
@@ -56,7 +56,13 @@ class TracingContextProvider(Protocol):
56
56
  escaped: bool = False,
57
57
  ) -> None: ...
58
58
 
59
+ def set_span_attribute(
60
+ self,
61
+ key: str,
62
+ value: AttributeValue,
63
+ ) -> None: ...
59
64
 
65
+ def update_span_name(self, new_name: str) -> None: ...
60
66
  class TracingContextProviderFactory(Protocol):
61
67
 
62
68
  def root_setup(
@@ -117,7 +123,7 @@ class TracedFunc:
117
123
  ) -> Any:
118
124
 
119
125
  if ctx_provider := get_tracing_ctx_provider():
120
- with ctx_provider.start_trace_context(
126
+ with ctx_provider.start_span_context(
121
127
  self.trace_name,
122
128
  self.trace_mapper(*args, **kwargs),
123
129
  ):
@@ -0,0 +1,33 @@
1
+ from fastapi import FastAPI, Request, Response
2
+ from fastapi.exception_handlers import (
3
+ http_exception_handler,
4
+ request_validation_exception_handler,
5
+ )
6
+ from fastapi.exceptions import RequestValidationError
7
+ from fastapi.responses import JSONResponse
8
+ from starlette.exceptions import HTTPException
9
+
10
+ from jararaca.observability.constants import TRACEPARENT_KEY
11
+
12
+
13
+ def setup_fastapi_exception_handler(
14
+ app: FastAPI, trace_header_name: str = "traceparent"
15
+ ) -> None:
16
+ async def base_http_exception_handler(
17
+ request: Request, exc: HTTPException | RequestValidationError
18
+ ) -> JSONResponse | Response:
19
+
20
+ if isinstance(exc, RequestValidationError):
21
+ response = await request_validation_exception_handler(request, exc)
22
+ response.headers[trace_header_name] = request.scope.get(TRACEPARENT_KEY, "")
23
+ return response
24
+ else:
25
+ err_response = await http_exception_handler(request, exc)
26
+
27
+ err_response.headers[trace_header_name] = request.scope.get(
28
+ TRACEPARENT_KEY, ""
29
+ )
30
+ return err_response
31
+
32
+ app.exception_handlers[HTTPException] = base_http_exception_handler
33
+ app.exception_handlers[RequestValidationError] = base_http_exception_handler
@@ -1,21 +1,23 @@
1
+ import logging
1
2
  from contextlib import contextmanager
2
3
  from typing import Any, Generator, Literal
3
4
 
4
5
  from jararaca.observability.decorators import (
5
6
  AttributeMap,
7
+ AttributeValue,
6
8
  TracingContextProvider,
7
9
  get_tracing_ctx_provider,
8
10
  )
9
11
 
10
12
 
11
13
  @contextmanager
12
- def spawn_trace(
14
+ def start_span(
13
15
  name: str,
14
16
  attributes: AttributeMap | None = None,
15
17
  ) -> Generator[None, Any, None]:
16
18
 
17
19
  if trace_context_provider := get_tracing_ctx_provider():
18
- with trace_context_provider.start_trace_context(
20
+ with trace_context_provider.start_span_context(
19
21
  trace_name=name, context_attributes=attributes
20
22
  ):
21
23
  yield
@@ -23,6 +25,19 @@ def spawn_trace(
23
25
  yield
24
26
 
25
27
 
28
+ def spawn_trace(
29
+ name: str,
30
+ attributes: AttributeMap | None = None,
31
+ ) -> None:
32
+ logging.warning(
33
+ "spawn_trace is deprecated, use start_span as context manager instead."
34
+ )
35
+ if trace_context_provider := get_tracing_ctx_provider():
36
+ trace_context_provider.start_span_context(
37
+ trace_name=name, context_attributes=attributes
38
+ )
39
+
40
+
26
41
  def add_event(
27
42
  name: str,
28
43
  attributes: AttributeMap | None = None,
@@ -55,5 +70,17 @@ def record_exception(
55
70
  )
56
71
 
57
72
 
73
+ def set_span_attribute(
74
+ key: str,
75
+ value: AttributeValue,
76
+ ) -> None:
77
+
78
+ if trace_context_provider := get_tracing_ctx_provider():
79
+ trace_context_provider.set_span_attribute(
80
+ key=key,
81
+ value=value,
82
+ )
83
+
84
+
58
85
  def get_tracing_provider() -> TracingContextProvider | None:
59
86
  return get_tracing_ctx_provider()
@@ -34,8 +34,10 @@ from jararaca.microservice import (
34
34
  Microservice,
35
35
  use_app_transaction_context,
36
36
  )
37
+ from jararaca.observability.constants import TRACEPARENT_KEY
37
38
  from jararaca.observability.decorators import (
38
39
  AttributeMap,
40
+ AttributeValue,
39
41
  TracingContextProvider,
40
42
  TracingContextProviderFactory,
41
43
  )
@@ -50,7 +52,7 @@ class OtelTracingContextProvider(TracingContextProvider):
50
52
  self.app_context = app_context
51
53
 
52
54
  @contextmanager
53
- def start_trace_context(
55
+ def start_span_context(
54
56
  self,
55
57
  trace_name: str,
56
58
  context_attributes: AttributeMap | None,
@@ -82,6 +84,14 @@ class OtelTracingContextProvider(TracingContextProvider):
82
84
  span = trace.get_current_span()
83
85
  span.record_exception(exception, attributes=attributes, escaped=escaped)
84
86
 
87
+ def set_span_attribute(self, key: str, value: AttributeValue) -> None:
88
+ span = trace.get_current_span()
89
+ span.set_attribute(key, value)
90
+
91
+ def update_span_name(self, new_name: str) -> None:
92
+ span = trace.get_current_span()
93
+ span.update_name(new_name)
94
+
85
95
 
86
96
  class OtelTracingContextProviderFactory(TracingContextProviderFactory):
87
97
 
@@ -185,10 +195,15 @@ class OtelTracingContextProviderFactory(TracingContextProviderFactory):
185
195
  },
186
196
  ) as root_span:
187
197
  cx = root_span.get_span_context()
198
+ span_traceparent_id = hex(cx.trace_id)[2:].rjust(32, "0")
188
199
  if app_tx_ctx.transaction_data.context_type == "http":
189
- app_tx_ctx.transaction_data.response.headers["traceparent"] = hex(
190
- cx.trace_id
191
- )[2:].rjust(32, "0")
200
+ app_tx_ctx.transaction_data.request.scope[TRACEPARENT_KEY] = (
201
+ span_traceparent_id
202
+ )
203
+ elif app_tx_ctx.transaction_data.context_type == "websocket":
204
+ app_tx_ctx.transaction_data.websocket.scope[TRACEPARENT_KEY] = (
205
+ span_traceparent_id
206
+ )
192
207
  tracing_headers: ImplicitHeaders = {}
193
208
  TraceContextTextMapPropagator().inject(tracing_headers)
194
209
  W3CBaggagePropagator().inject(tracing_headers)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jararaca
3
- Version: 0.3.26
3
+ Version: 0.3.28
4
4
  Summary: A simple and fast API framework for Python
5
5
  Home-page: https://github.com/LuscasLeo/jararaca
6
6
  Author: Lucas S
@@ -1,7 +1,7 @@
1
1
  LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
2
2
  README.md,sha256=YmCngjU8llW0l7L3tuXkkfr8qH7V9aBMgfp2jEzeiKg,3517
3
- pyproject.toml,sha256=JXte3h2WM1G5riLSBoE2nBXWnybbJhqtoFl-N6Vt3ZI,2739
4
- jararaca/__init__.py,sha256=zQRbt5BrXFVvJW8pKaA9_KdkGFB6Njmr-9SyX0ZfenM,23331
3
+ pyproject.toml,sha256=CEt_9xw3r5w6k6x7hD62Gb3uU3hHAyMaAmldYFK7jjM,2739
4
+ jararaca/__init__.py,sha256=gp2ib_dYm5EP97FY3E8Av4CDCbgX6vuQhGNvNBpu0IQ,23866
5
5
  jararaca/__main__.py,sha256=-O3vsB5lHdqNFjUtoELDF81IYFtR-DSiiFMzRaiSsv4,67
6
6
  jararaca/broker_backend/__init__.py,sha256=GzEIuHR1xzgCJD4FE3harNjoaYzxHMHoEL0_clUaC-k,3528
7
7
  jararaca/broker_backend/mapper.py,sha256=vTsi7sWpNvlga1PWPFg0rCJ5joJ0cdzykkIc2Tuvenc,696
@@ -26,11 +26,13 @@ jararaca/messagebus/message.py,sha256=U6cyd2XknX8mtm0333slz5fanky2PFLWCmokAO56vv
26
26
  jararaca/messagebus/publisher.py,sha256=JTkxdKbvxvDWT8nK8PVEyyX061vYYbKQMxRHXrZtcEY,2173
27
27
  jararaca/messagebus/worker.py,sha256=DiKDUhcU4rEjjA_3KqCmnN3X5yyokZq_-SbLryjS_PM,69237
28
28
  jararaca/microservice.py,sha256=DW4RVeqgrx4J-dAg17sbzTn_sLXuvV1UOQFde2fpqds,11471
29
- jararaca/observability/decorators.py,sha256=xTt4HEmpm_m1OUS29kaoZLMCT2YYToJUzQziepl8qfQ,6062
30
- jararaca/observability/hooks.py,sha256=vQCxb5m4uFse0lJIAuzSd84acu7iGDNgf4kpaWYkju8,1499
29
+ jararaca/observability/constants.py,sha256=quhqXBjDWVrr8Vr3tglgYo7zsQyz_y-z_dtqfUzYaa8,63
30
+ jararaca/observability/decorators.py,sha256=W6RpGBUPJJX-FiYhp3HaCC-fh7-FZwDG4gBVZiE9dKU,6229
31
+ jararaca/observability/fastapi_exception_handler.py,sha256=jSLhuR5Og3vRnIoZucRA5jPnvR6DEsM1ax7tQuEo5rc,1264
32
+ jararaca/observability/hooks.py,sha256=ATGFPQxhkry1NdW18ywJ9onstlnW8Yx2FD487eY9M8o,2156
31
33
  jararaca/observability/interceptor.py,sha256=U4ZLM0f8j6Q7gMUKKnA85bnvD-Qa0ii79Qa_X8KsXAQ,1498
32
34
  jararaca/observability/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- jararaca/observability/providers/otel.py,sha256=DCNjGhcpF-XdlGTiYoQg9F_1ftcggTItDfJ_PjlZm0s,10808
35
+ jararaca/observability/providers/otel.py,sha256=vsaiIDWuSbpZ4UyzRMSH64o4BxzsZzO7P39mJHUD6rU,11442
34
36
  jararaca/persistence/base.py,sha256=xnGUbsLNz3gO-9iJt-Sn5NY13Yc9-misP8wLwQuGGoM,1024
35
37
  jararaca/persistence/exports.py,sha256=Ghx4yoFaB4QVTb9WxrFYgmcSATXMNvrOvT8ybPNKXCA,62
36
38
  jararaca/persistence/interceptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -76,8 +78,8 @@ jararaca/tools/typescript/interface_parser.py,sha256=VBx-TYQPjAiHLiYgzGdRl_p4xDb
76
78
  jararaca/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
79
  jararaca/utils/rabbitmq_utils.py,sha256=ytdAFUyv-OBkaVnxezuJaJoLrmN7giZgtKeet_IsMBs,10918
78
80
  jararaca/utils/retry.py,sha256=DzPX_fXUvTqej6BQ8Mt2dvLo9nNlTBm7Kx2pFZ26P2Q,4668
79
- jararaca-0.3.26.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
80
- jararaca-0.3.26.dist-info/METADATA,sha256=tQ8LaLhplQLYw8LPWadDAQ-lJw7Air5NCI_UGhAN550,5149
81
- jararaca-0.3.26.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
82
- jararaca-0.3.26.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
83
- jararaca-0.3.26.dist-info/RECORD,,
81
+ jararaca-0.3.28.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
82
+ jararaca-0.3.28.dist-info/METADATA,sha256=5yQgnOm6ZduUsne5HQP-uq8_wgAZX-bOA3QeX4oTbgI,5149
83
+ jararaca-0.3.28.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
84
+ jararaca-0.3.28.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
85
+ jararaca-0.3.28.dist-info/RECORD,,
pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "jararaca"
3
- version = "0.3.26"
3
+ version = "0.3.28"
4
4
  description = "A simple and fast API framework for Python"
5
5
  authors = ["Lucas S <me@luscasleo.dev>"]
6
6
  readme = "README.md"