kurrentdbclient 0.3__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.
Files changed (49) hide show
  1. kurrentdbclient/__init__.py +49 -0
  2. kurrentdbclient/asyncio_client.py +1662 -0
  3. kurrentdbclient/client.py +1914 -0
  4. kurrentdbclient/common.py +535 -0
  5. kurrentdbclient/connection.py +107 -0
  6. kurrentdbclient/connection_spec.py +371 -0
  7. kurrentdbclient/events.py +141 -0
  8. kurrentdbclient/exceptions.py +239 -0
  9. kurrentdbclient/gossip.py +104 -0
  10. kurrentdbclient/instrumentation/__init__.py +0 -0
  11. kurrentdbclient/instrumentation/opentelemetry/__init__.py +185 -0
  12. kurrentdbclient/instrumentation/opentelemetry/attributes.py +20 -0
  13. kurrentdbclient/instrumentation/opentelemetry/grpc.py +165 -0
  14. kurrentdbclient/instrumentation/opentelemetry/package.py +2 -0
  15. kurrentdbclient/instrumentation/opentelemetry/spanners.py +1097 -0
  16. kurrentdbclient/instrumentation/opentelemetry/utils.py +199 -0
  17. kurrentdbclient/instrumentation/opentelemetry/version.py +2 -0
  18. kurrentdbclient/persistent.py +1982 -0
  19. kurrentdbclient/projections.py +735 -0
  20. kurrentdbclient/protos/Grpc/cluster_pb2.py +92 -0
  21. kurrentdbclient/protos/Grpc/cluster_pb2.pyi +765 -0
  22. kurrentdbclient/protos/Grpc/cluster_pb2_grpc.py +514 -0
  23. kurrentdbclient/protos/Grpc/code_pb2.py +37 -0
  24. kurrentdbclient/protos/Grpc/code_pb2.pyi +357 -0
  25. kurrentdbclient/protos/Grpc/code_pb2_grpc.py +24 -0
  26. kurrentdbclient/protos/Grpc/gossip_pb2.py +46 -0
  27. kurrentdbclient/protos/Grpc/gossip_pb2.pyi +126 -0
  28. kurrentdbclient/protos/Grpc/gossip_pb2_grpc.py +98 -0
  29. kurrentdbclient/protos/Grpc/persistent_pb2.py +140 -0
  30. kurrentdbclient/protos/Grpc/persistent_pb2.pyi +1135 -0
  31. kurrentdbclient/protos/Grpc/persistent_pb2_grpc.py +399 -0
  32. kurrentdbclient/protos/Grpc/projections_pb2.py +99 -0
  33. kurrentdbclient/protos/Grpc/projections_pb2.pyi +558 -0
  34. kurrentdbclient/protos/Grpc/projections_pb2_grpc.py +485 -0
  35. kurrentdbclient/protos/Grpc/shared_pb2.py +62 -0
  36. kurrentdbclient/protos/Grpc/shared_pb2.pyi +218 -0
  37. kurrentdbclient/protos/Grpc/shared_pb2_grpc.py +24 -0
  38. kurrentdbclient/protos/Grpc/status_pb2.py +39 -0
  39. kurrentdbclient/protos/Grpc/status_pb2.pyi +67 -0
  40. kurrentdbclient/protos/Grpc/status_pb2_grpc.py +24 -0
  41. kurrentdbclient/protos/Grpc/streams_pb2.py +132 -0
  42. kurrentdbclient/protos/Grpc/streams_pb2.pyi +1038 -0
  43. kurrentdbclient/protos/Grpc/streams_pb2_grpc.py +269 -0
  44. kurrentdbclient/py.typed +0 -0
  45. kurrentdbclient/streams.py +1400 -0
  46. kurrentdbclient-0.3.dist-info/LICENSE +29 -0
  47. kurrentdbclient-0.3.dist-info/METADATA +3769 -0
  48. kurrentdbclient-0.3.dist-info/RECORD +49 -0
  49. kurrentdbclient-0.3.dist-info/WHEEL +4 -0
@@ -0,0 +1,165 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Can't cancel streaming response when grpc is being instrumented.
3
+ # https://github.com/open-telemetry/opentelemetry-python-contrib/issues/2014
4
+ from __future__ import annotations
5
+
6
+ from collections import OrderedDict
7
+ from types import FunctionType
8
+ from typing import Any, Callable, Mapping, Sequence, Tuple
9
+
10
+ import grpc
11
+ import opentelemetry.trace as trace_api
12
+ from grpc._channel import _Rendezvous
13
+ from opentelemetry.instrumentation.utils import unwrap
14
+ from opentelemetry.propagate import inject
15
+ from opentelemetry.semconv.trace import SpanAttributes
16
+ from wrapt import wrap_function_wrapper
17
+
18
+ try:
19
+ from opentelemetry.instrumentation.grpc._client import (
20
+ OpenTelemetryClientInterceptor,
21
+ _carrier_setter,
22
+ )
23
+ from opentelemetry.instrumentation.grpc._utilities import RpcInfo
24
+ from opentelemetry.instrumentation.grpc.grpcext._interceptor import (
25
+ _StreamClientInfo,
26
+ )
27
+
28
+ except ImportError: # pragma: no cover
29
+ OpenTelemetryClientInterceptor = None # type: ignore
30
+
31
+
32
+ def try_wrap_opentelemetry_intercept_grpc_server_stream() -> None:
33
+
34
+ if OpenTelemetryClientInterceptor is not None:
35
+ wrap_function_wrapper(
36
+ OpenTelemetryClientInterceptor,
37
+ "_intercept_server_stream",
38
+ _wrap_grpc_intercept_server_stream(),
39
+ )
40
+ else:
41
+ pass # pragma: no cover
42
+
43
+
44
+ def try_unwrap_opentelemetry_intercept_grpc_server_stream() -> None:
45
+ if OpenTelemetryClientInterceptor is not None:
46
+ unwrap(OpenTelemetryClientInterceptor, "_intercept_server_stream")
47
+ else:
48
+ pass # pragma: no cover
49
+
50
+
51
+ def _wrap_grpc_intercept_server_stream() -> Callable[..., InterceptServerStream]:
52
+ def _intercept_server_stream(
53
+ _: FunctionType,
54
+ instance: OpenTelemetryClientInterceptor,
55
+ args: Sequence[Any],
56
+ kwargs: Mapping[str, Any],
57
+ ) -> InterceptServerStream:
58
+ return _replacement_intercept_server_stream(instance, *args, **kwargs)
59
+
60
+ return _intercept_server_stream
61
+
62
+
63
+ def _replacement_intercept_server_stream(
64
+ self: OpenTelemetryClientInterceptor,
65
+ request_or_iterator: Any,
66
+ metadata: Tuple[Tuple[str, str], ...],
67
+ client_info: _StreamClientInfo,
68
+ invoker: Callable[..., _Rendezvous],
69
+ ) -> InterceptServerStream:
70
+ if not metadata:
71
+ mutable_metadata = OrderedDict() # pragma: no cover
72
+ else:
73
+ mutable_metadata = OrderedDict(metadata)
74
+
75
+ with self._start_span( # type: ignore[no-untyped-call]
76
+ client_info.full_method,
77
+ end_on_exit=False,
78
+ record_exception=False,
79
+ set_status_on_exception=False,
80
+ ) as span:
81
+ inject(mutable_metadata, setter=_carrier_setter)
82
+ metadata = tuple(mutable_metadata.items())
83
+ rpc_info = RpcInfo( # type: ignore[no-untyped-call]
84
+ full_method=client_info.full_method,
85
+ metadata=metadata,
86
+ timeout=client_info.timeout,
87
+ )
88
+
89
+ if client_info.is_client_stream:
90
+ rpc_info.request = request_or_iterator
91
+ try:
92
+ rendezvous = invoker(request_or_iterator, metadata)
93
+ except grpc.RpcError as err: # pragma: no cover
94
+ span.set_status(
95
+ trace_api.Status(
96
+ status_code=trace_api.StatusCode.ERROR,
97
+ description=f"{type(err).__name__}: {err}",
98
+ )
99
+ )
100
+ err_code_value_int = err.code().value[0] # type: ignore[index]
101
+ span.set_attribute(SpanAttributes.RPC_GRPC_STATUS_CODE, err_code_value_int)
102
+ span.record_exception(err)
103
+ span.end()
104
+ raise err
105
+ except Exception as err:
106
+ span.set_status(
107
+ trace_api.Status(
108
+ status_code=trace_api.StatusCode.ERROR,
109
+ description=f"{type(err).__name__}: {err}",
110
+ )
111
+ )
112
+ span.record_exception(err)
113
+ span.end()
114
+ raise err
115
+ else:
116
+ return InterceptServerStream(rendezvous, span)
117
+
118
+
119
+ class InterceptServerStream:
120
+ def __init__(self, rendezvous: _Rendezvous, span: trace_api.Span) -> None:
121
+ self._rendezvous = rendezvous
122
+ self._span = span
123
+
124
+ def __iter__(self) -> InterceptServerStream:
125
+ return self
126
+
127
+ def __next__(self) -> Any:
128
+ try:
129
+ return next(self._rendezvous)
130
+ except StopIteration:
131
+ self._span.end()
132
+ raise
133
+ except grpc.RpcError as err:
134
+ err_code_value_int = err.code().value[0] # type: ignore[index]
135
+ self._span.set_attribute(
136
+ SpanAttributes.RPC_GRPC_STATUS_CODE, err_code_value_int
137
+ )
138
+ self._span.set_status(
139
+ trace_api.Status(
140
+ status_code=trace_api.StatusCode.ERROR,
141
+ description=f"{type(err).__name__}: {err}",
142
+ )
143
+ )
144
+ self._span.record_exception(err)
145
+ self._span.end()
146
+ raise
147
+ except Exception as err: # pragma: no cover
148
+ self._span.set_status(
149
+ trace_api.Status(
150
+ status_code=trace_api.StatusCode.ERROR,
151
+ description=f"{type(err).__name__}: {err}",
152
+ )
153
+ )
154
+ self._span.record_exception(err)
155
+ self._span.end()
156
+ raise
157
+
158
+ def __del__(self) -> None:
159
+ self.cancel()
160
+ span = self._span
161
+ if span.is_recording():
162
+ span.end()
163
+
164
+ def cancel(self) -> None:
165
+ self._rendezvous.cancel()
@@ -0,0 +1,2 @@
1
+ # -*- coding: utf-8 -*-
2
+ _instruments = (f"{__name__.split('.')[0]} >= 0.1",)