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.
- kurrentdbclient/__init__.py +49 -0
- kurrentdbclient/asyncio_client.py +1662 -0
- kurrentdbclient/client.py +1914 -0
- kurrentdbclient/common.py +535 -0
- kurrentdbclient/connection.py +107 -0
- kurrentdbclient/connection_spec.py +371 -0
- kurrentdbclient/events.py +141 -0
- kurrentdbclient/exceptions.py +239 -0
- kurrentdbclient/gossip.py +104 -0
- kurrentdbclient/instrumentation/__init__.py +0 -0
- kurrentdbclient/instrumentation/opentelemetry/__init__.py +185 -0
- kurrentdbclient/instrumentation/opentelemetry/attributes.py +20 -0
- kurrentdbclient/instrumentation/opentelemetry/grpc.py +165 -0
- kurrentdbclient/instrumentation/opentelemetry/package.py +2 -0
- kurrentdbclient/instrumentation/opentelemetry/spanners.py +1097 -0
- kurrentdbclient/instrumentation/opentelemetry/utils.py +199 -0
- kurrentdbclient/instrumentation/opentelemetry/version.py +2 -0
- kurrentdbclient/persistent.py +1982 -0
- kurrentdbclient/projections.py +735 -0
- kurrentdbclient/protos/Grpc/cluster_pb2.py +92 -0
- kurrentdbclient/protos/Grpc/cluster_pb2.pyi +765 -0
- kurrentdbclient/protos/Grpc/cluster_pb2_grpc.py +514 -0
- kurrentdbclient/protos/Grpc/code_pb2.py +37 -0
- kurrentdbclient/protos/Grpc/code_pb2.pyi +357 -0
- kurrentdbclient/protos/Grpc/code_pb2_grpc.py +24 -0
- kurrentdbclient/protos/Grpc/gossip_pb2.py +46 -0
- kurrentdbclient/protos/Grpc/gossip_pb2.pyi +126 -0
- kurrentdbclient/protos/Grpc/gossip_pb2_grpc.py +98 -0
- kurrentdbclient/protos/Grpc/persistent_pb2.py +140 -0
- kurrentdbclient/protos/Grpc/persistent_pb2.pyi +1135 -0
- kurrentdbclient/protos/Grpc/persistent_pb2_grpc.py +399 -0
- kurrentdbclient/protos/Grpc/projections_pb2.py +99 -0
- kurrentdbclient/protos/Grpc/projections_pb2.pyi +558 -0
- kurrentdbclient/protos/Grpc/projections_pb2_grpc.py +485 -0
- kurrentdbclient/protos/Grpc/shared_pb2.py +62 -0
- kurrentdbclient/protos/Grpc/shared_pb2.pyi +218 -0
- kurrentdbclient/protos/Grpc/shared_pb2_grpc.py +24 -0
- kurrentdbclient/protos/Grpc/status_pb2.py +39 -0
- kurrentdbclient/protos/Grpc/status_pb2.pyi +67 -0
- kurrentdbclient/protos/Grpc/status_pb2_grpc.py +24 -0
- kurrentdbclient/protos/Grpc/streams_pb2.py +132 -0
- kurrentdbclient/protos/Grpc/streams_pb2.pyi +1038 -0
- kurrentdbclient/protos/Grpc/streams_pb2_grpc.py +269 -0
- kurrentdbclient/py.typed +0 -0
- kurrentdbclient/streams.py +1400 -0
- kurrentdbclient-0.3.dist-info/LICENSE +29 -0
- kurrentdbclient-0.3.dist-info/METADATA +3769 -0
- kurrentdbclient-0.3.dist-info/RECORD +49 -0
- 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()
|