nucliadb-telemetry 6.4.0.post4161__py3-none-any.whl → 6.4.0.post4171__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 nucliadb-telemetry might be problematic. Click here for more details.
- nucliadb_telemetry/grpc.py +19 -9
- nucliadb_telemetry/jetstream.py +70 -9
- {nucliadb_telemetry-6.4.0.post4161.dist-info → nucliadb_telemetry-6.4.0.post4171.dist-info}/METADATA +1 -1
- {nucliadb_telemetry-6.4.0.post4161.dist-info → nucliadb_telemetry-6.4.0.post4171.dist-info}/RECORD +6 -6
- {nucliadb_telemetry-6.4.0.post4161.dist-info → nucliadb_telemetry-6.4.0.post4171.dist-info}/WHEEL +1 -1
- {nucliadb_telemetry-6.4.0.post4161.dist-info → nucliadb_telemetry-6.4.0.post4171.dist-info}/top_level.txt +0 -0
nucliadb_telemetry/grpc.py
CHANGED
|
@@ -31,7 +31,7 @@ from opentelemetry.propagate import extract, inject
|
|
|
31
31
|
from opentelemetry.propagators.textmap import CarrierT, Setter
|
|
32
32
|
from opentelemetry.sdk.trace import Span, TracerProvider
|
|
33
33
|
from opentelemetry.semconv.trace import SpanAttributes
|
|
34
|
-
from opentelemetry.trace import SpanKind, Tracer
|
|
34
|
+
from opentelemetry.trace import SpanKind, Tracer, set_span_in_context
|
|
35
35
|
from opentelemetry.trace.status import Status, StatusCode
|
|
36
36
|
|
|
37
37
|
from nucliadb_telemetry import grpc_metrics, logger
|
|
@@ -52,7 +52,11 @@ _carrier_setter = _CarrierSetter()
|
|
|
52
52
|
|
|
53
53
|
def finish_span_grpc(span: Span, result):
|
|
54
54
|
code = result._cython_call._status.code()
|
|
55
|
-
|
|
55
|
+
|
|
56
|
+
# grpc.StatusCode value is a tuple like:
|
|
57
|
+
# <StatusCode.OK: (0, 'ok')>
|
|
58
|
+
# so we cannot compare it with the code we get from the result directly
|
|
59
|
+
if code == grpc.StatusCode.OK.value[0]: # type: ignore
|
|
56
60
|
span.set_status(
|
|
57
61
|
Status(
|
|
58
62
|
status_code=StatusCode.OK,
|
|
@@ -87,19 +91,25 @@ def start_span_client(
|
|
|
87
91
|
SpanAttributes.RPC_SERVICE: service,
|
|
88
92
|
}
|
|
89
93
|
|
|
90
|
-
# add some attributes from the metadata
|
|
91
|
-
if client_call_details.metadata is not None:
|
|
92
|
-
mutable_metadata = OrderedDict(tuple(client_call_details.metadata))
|
|
93
|
-
inject(mutable_metadata, setter=_carrier_setter) # type: ignore
|
|
94
|
-
for key, value in mutable_metadata.items():
|
|
95
|
-
client_call_details.metadata.add(key=key, value=value) # type: ignore
|
|
96
|
-
|
|
97
94
|
span = tracer.start_span(
|
|
98
95
|
name=method_name,
|
|
99
96
|
kind=SpanKind.CLIENT,
|
|
100
97
|
attributes=attributes,
|
|
101
98
|
set_status_on_exception=set_status_on_exception,
|
|
102
99
|
)
|
|
100
|
+
|
|
101
|
+
# Create a context containing the new span
|
|
102
|
+
span_context = set_span_in_context(span)
|
|
103
|
+
|
|
104
|
+
if client_call_details.metadata is not None:
|
|
105
|
+
mutable_metadata = OrderedDict(tuple(client_call_details.metadata))
|
|
106
|
+
else:
|
|
107
|
+
mutable_metadata = OrderedDict()
|
|
108
|
+
inject(mutable_metadata, context=span_context, setter=_carrier_setter)
|
|
109
|
+
if client_call_details.metadata is not None:
|
|
110
|
+
for key, value in mutable_metadata.items():
|
|
111
|
+
client_call_details.metadata.add(key=key, value=value) # type: ignore
|
|
112
|
+
|
|
103
113
|
return span
|
|
104
114
|
|
|
105
115
|
|
nucliadb_telemetry/jetstream.py
CHANGED
|
@@ -19,11 +19,13 @@
|
|
|
19
19
|
|
|
20
20
|
from datetime import datetime
|
|
21
21
|
from functools import partial
|
|
22
|
-
from typing import Any, Callable, Dict, List, Optional, Union
|
|
22
|
+
from typing import Any, Awaitable, Callable, Dict, List, Optional, Union
|
|
23
|
+
from urllib.parse import ParseResult
|
|
23
24
|
|
|
24
25
|
import nats
|
|
25
26
|
from nats.aio.client import Client
|
|
26
27
|
from nats.aio.msg import Msg
|
|
28
|
+
from nats.aio.subscription import Subscription
|
|
27
29
|
from nats.js.client import JetStreamContext
|
|
28
30
|
from opentelemetry.propagate import extract, inject
|
|
29
31
|
from opentelemetry.sdk.trace import TracerProvider
|
|
@@ -32,6 +34,7 @@ from opentelemetry.trace import SpanKind, Tracer
|
|
|
32
34
|
|
|
33
35
|
from nucliadb_telemetry import logger, metrics
|
|
34
36
|
from nucliadb_telemetry.common import set_span_exception
|
|
37
|
+
from nucliadb_telemetry.utils import get_telemetry
|
|
35
38
|
|
|
36
39
|
msg_consume_time_histo = metrics.Histogram(
|
|
37
40
|
# time it takes from when msg was queue to when it finished processing
|
|
@@ -107,7 +110,13 @@ class JetStreamContextTelemetry:
|
|
|
107
110
|
async def add_stream(self, name: str, subjects: List[str]):
|
|
108
111
|
return await self.js.add_stream(name=name, subjects=subjects)
|
|
109
112
|
|
|
110
|
-
async def subscribe(
|
|
113
|
+
async def subscribe(
|
|
114
|
+
self,
|
|
115
|
+
subject: str,
|
|
116
|
+
queue: Optional[str] = None,
|
|
117
|
+
cb: Optional[Callable[[Msg], Awaitable[None]]] = None,
|
|
118
|
+
**kwargs,
|
|
119
|
+
):
|
|
111
120
|
tracer = self.tracer_provider.get_tracer(f"{self.service_name}_js_subscriber")
|
|
112
121
|
|
|
113
122
|
async def wrapper(origin_cb, tracer, msg: Msg):
|
|
@@ -134,7 +143,7 @@ class JetStreamContextTelemetry:
|
|
|
134
143
|
)
|
|
135
144
|
|
|
136
145
|
wrapped_cb = partial(wrapper, cb, tracer)
|
|
137
|
-
return await self.js.subscribe(cb=wrapped_cb, **kwargs)
|
|
146
|
+
return await self.js.subscribe(subject, queue=queue, cb=wrapped_cb, **kwargs)
|
|
138
147
|
|
|
139
148
|
async def publish(
|
|
140
149
|
self,
|
|
@@ -215,7 +224,13 @@ class NatsClientTelemetry:
|
|
|
215
224
|
self.service_name = service_name
|
|
216
225
|
self.tracer_provider = tracer_provider
|
|
217
226
|
|
|
218
|
-
async def subscribe(
|
|
227
|
+
async def subscribe(
|
|
228
|
+
self,
|
|
229
|
+
subject: str,
|
|
230
|
+
queue: str = "",
|
|
231
|
+
cb: Optional[Callable[[Msg], Awaitable[None]]] = None,
|
|
232
|
+
**kwargs,
|
|
233
|
+
) -> Subscription:
|
|
219
234
|
tracer = self.tracer_provider.get_tracer(f"{self.service_name}_nc_subscriber")
|
|
220
235
|
|
|
221
236
|
async def wrapper(origin_cb, tracer, msg: Msg):
|
|
@@ -233,22 +248,22 @@ class NatsClientTelemetry:
|
|
|
233
248
|
raise error
|
|
234
249
|
|
|
235
250
|
wrapped_cb = partial(wrapper, cb, tracer)
|
|
236
|
-
return await self.nc.subscribe(cb=wrapped_cb, **kwargs)
|
|
251
|
+
return await self.nc.subscribe(subject, queue=queue, cb=wrapped_cb, **kwargs)
|
|
237
252
|
|
|
238
253
|
async def publish(
|
|
239
254
|
self,
|
|
240
255
|
subject: str,
|
|
241
|
-
body: bytes,
|
|
256
|
+
body: bytes = b"",
|
|
257
|
+
reply: str = "",
|
|
242
258
|
headers: Optional[Dict[str, str]] = None,
|
|
243
|
-
|
|
244
|
-
):
|
|
259
|
+
) -> None:
|
|
245
260
|
tracer = self.tracer_provider.get_tracer(f"{self.service_name}_nc_publisher")
|
|
246
261
|
headers = {} if headers is None else headers
|
|
247
262
|
inject(headers)
|
|
248
263
|
|
|
249
264
|
with start_span_message_publisher(tracer, subject) as span:
|
|
250
265
|
try:
|
|
251
|
-
await self.nc.publish(subject, body,
|
|
266
|
+
await self.nc.publish(subject, body, reply, headers)
|
|
252
267
|
msg_sent_counter.inc({"subject": subject, "status": metrics.OK})
|
|
253
268
|
except Exception as error:
|
|
254
269
|
set_span_exception(span, error)
|
|
@@ -274,3 +289,49 @@ class NatsClientTelemetry:
|
|
|
274
289
|
raise error
|
|
275
290
|
|
|
276
291
|
return result
|
|
292
|
+
|
|
293
|
+
# Other methods we use but don't need telemetry
|
|
294
|
+
|
|
295
|
+
@property
|
|
296
|
+
def is_connected(self) -> bool:
|
|
297
|
+
return self.nc.is_connected
|
|
298
|
+
|
|
299
|
+
@property
|
|
300
|
+
def connected_url(self) -> Optional[ParseResult]:
|
|
301
|
+
return self.nc.connected_url
|
|
302
|
+
|
|
303
|
+
def jetstream(self, **opts) -> nats.js.JetStreamContext:
|
|
304
|
+
return self.nc.jetstream(**opts)
|
|
305
|
+
|
|
306
|
+
def jsm(self, **opts) -> nats.js.JetStreamManager:
|
|
307
|
+
return self.nc.jsm(**opts)
|
|
308
|
+
|
|
309
|
+
async def drain(self) -> None:
|
|
310
|
+
return await self.nc.drain()
|
|
311
|
+
|
|
312
|
+
async def flush(self, timeout: int = nats.aio.client.DEFAULT_FLUSH_TIMEOUT) -> None:
|
|
313
|
+
return await self.nc.flush(timeout)
|
|
314
|
+
|
|
315
|
+
async def close(self) -> None:
|
|
316
|
+
return await self.nc.close()
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def get_traced_nats_client(nc: Client, service_name: str) -> Union[Client, NatsClientTelemetry]:
|
|
320
|
+
tracer_provider = get_telemetry(service_name)
|
|
321
|
+
if tracer_provider is not None:
|
|
322
|
+
return NatsClientTelemetry(nc, service_name, tracer_provider)
|
|
323
|
+
else:
|
|
324
|
+
return nc
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def get_traced_jetstream(
|
|
328
|
+
nc: Union[Client, NatsClientTelemetry], service_name: str
|
|
329
|
+
) -> Union[JetStreamContext, JetStreamContextTelemetry]:
|
|
330
|
+
jetstream = nc.jetstream()
|
|
331
|
+
tracer_provider = get_telemetry(service_name)
|
|
332
|
+
|
|
333
|
+
if tracer_provider is not None and jetstream is not None: # pragma: no cover
|
|
334
|
+
logger.info(f"Configuring {service_name} jetstream with telemetry")
|
|
335
|
+
return JetStreamContextTelemetry(jetstream, service_name, tracer_provider)
|
|
336
|
+
else:
|
|
337
|
+
return jetstream
|
{nucliadb_telemetry-6.4.0.post4161.dist-info → nucliadb_telemetry-6.4.0.post4171.dist-info}/RECORD
RENAMED
|
@@ -3,11 +3,11 @@ nucliadb_telemetry/batch_span.py,sha256=5cE7wt-H6wMXnJ5GUgjZyKvBWfaaZ-VWHS1m8d36
|
|
|
3
3
|
nucliadb_telemetry/common.py,sha256=i5xxHlxeNZ1MPCoBvDDNkRDiYhvq6ghKwuaBnYGyhGU,1222
|
|
4
4
|
nucliadb_telemetry/context.py,sha256=rhLs4NWGMjKzLjr6kTTjq-gaR0sAPJudkS-KjpW9LWc,2505
|
|
5
5
|
nucliadb_telemetry/errors.py,sha256=QTKp-ErpsRb-xN3m6kMpq6tpOrOMQxsHVJAofKPo3Rk,4478
|
|
6
|
-
nucliadb_telemetry/grpc.py,sha256=
|
|
6
|
+
nucliadb_telemetry/grpc.py,sha256=cNJRJLr0aRedKr5V_ufGqeidnMlBouML3QbFKkugTqg,15162
|
|
7
7
|
nucliadb_telemetry/grpc_metrics.py,sha256=L2XMcJDxioNUYPX_IbKl_zvrG8uOFpF_a67c6yJq-Jw,5174
|
|
8
8
|
nucliadb_telemetry/grpc_sentry.py,sha256=3eS_DVIX5MzvbJBkykf8JyZUf1b_b9w1KLhjoiW7oV0,2659
|
|
9
9
|
nucliadb_telemetry/jaeger.py,sha256=HMQK8x_oaol5tCx3hCjaMG5Uzvsy_WWhKnD-FEZoYA4,7036
|
|
10
|
-
nucliadb_telemetry/jetstream.py,sha256=
|
|
10
|
+
nucliadb_telemetry/jetstream.py,sha256=w6CLN_oGmQT0FgfMmQdtrASsEw5mCk3KW8TwaWCEl-E,11971
|
|
11
11
|
nucliadb_telemetry/logs.py,sha256=ag1e7tKEoNFgB1FuAmyTxdIHtTFwOJlGxPl2s1bhUic,9311
|
|
12
12
|
nucliadb_telemetry/metrics.py,sha256=euexqkmlZip6QFbMfvJW1fSuha96J4ZHnMWixeVJnAs,8652
|
|
13
13
|
nucliadb_telemetry/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -30,7 +30,7 @@ nucliadb_telemetry/tests/grpc/helloworld_pb2.py,sha256=ht4dmi0pAy6qDrwcjkbtSf_hO
|
|
|
30
30
|
nucliadb_telemetry/tests/grpc/helloworld_pb2.pyi,sha256=mBZCQE6z7riQw6fOegJgZ5lHmXqO23_zxL8iQMqSqms,1191
|
|
31
31
|
nucliadb_telemetry/tests/grpc/helloworld_pb2_grpc.py,sha256=_jxUNxl4Fx-JztK9RO5R6osjNP2sVNVPAxLnmczEYOc,2677
|
|
32
32
|
nucliadb_telemetry/tests/grpc/helloworld_pb2_grpc.pyi,sha256=Y6teCx-PhPU-rI6w5ItLBKaTb34FLpngPnuDVWtNve4,958
|
|
33
|
-
nucliadb_telemetry-6.4.0.
|
|
34
|
-
nucliadb_telemetry-6.4.0.
|
|
35
|
-
nucliadb_telemetry-6.4.0.
|
|
36
|
-
nucliadb_telemetry-6.4.0.
|
|
33
|
+
nucliadb_telemetry-6.4.0.post4171.dist-info/METADATA,sha256=K1Paf3JNS3nY907ZhPn1BZ3EiVDURjsEdLmyNeoSVFk,11057
|
|
34
|
+
nucliadb_telemetry-6.4.0.post4171.dist-info/WHEEL,sha256=ooBFpIzZCPdw3uqIQsOo4qqbA4ZRPxHnOH7peeONza0,91
|
|
35
|
+
nucliadb_telemetry-6.4.0.post4171.dist-info/top_level.txt,sha256=3qEHI_5ttqQIL2gkNYwSlKsFyBBiEzDiIy9UKISzOaQ,19
|
|
36
|
+
nucliadb_telemetry-6.4.0.post4171.dist-info/RECORD,,
|
|
File without changes
|