qena-shared-lib 0.1.0__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.
@@ -0,0 +1,84 @@
1
+ from asyncio import open_connection
2
+
3
+ from pydantic_core import to_json
4
+
5
+ from ..logging import LoggerProvider
6
+ from ._base import BaseLogstashSender, LogstashLogRecord, SenderResponse
7
+
8
+ __all__ = ["TCPSender"]
9
+
10
+
11
+ class TCPSender(BaseLogstashSender):
12
+ def __init__(
13
+ self,
14
+ host: str,
15
+ port: int,
16
+ service_name: str,
17
+ max_log_retry: int = 5,
18
+ log_queue_size: int = 100,
19
+ failed_log_queue_size: int = 500,
20
+ ):
21
+ super().__init__(
22
+ service_name=service_name,
23
+ max_log_retry=max_log_retry,
24
+ log_queue_size=log_queue_size,
25
+ failed_log_queue_size=failed_log_queue_size,
26
+ )
27
+
28
+ self._client = AsyncTcpClient(host=host, port=port)
29
+ self._logger = LoggerProvider.default().get_logger("logstash.tcpsender")
30
+
31
+ async def _send(self, log: LogstashLogRecord) -> SenderResponse:
32
+ await self._client.write(log.to_dict())
33
+
34
+ return SenderResponse(sent=True)
35
+
36
+ async def _hook_on_start_async(self):
37
+ await self._client.open()
38
+
39
+ async def _hook_on_stop_async(self):
40
+ await self._client.close()
41
+
42
+
43
+ class AsyncTcpClient:
44
+ def __init__(self, host: str, port: int):
45
+ self._host = host
46
+ self._port = port
47
+ self._writer = None
48
+ self._client_closed = False
49
+
50
+ async def write(self, json: dict):
51
+ if self._client_closed:
52
+ raise RuntimeError("async tcp client already closed")
53
+
54
+ if self._writer_closed():
55
+ await self._connect()
56
+
57
+ assert self._writer is not None
58
+
59
+ self._writer.write(to_json(json))
60
+ self._writer.write(b"\n")
61
+
62
+ try:
63
+ await self._writer.drain()
64
+ except ConnectionResetError:
65
+ await self._connect()
66
+
67
+ async def open(self):
68
+ await self._connect()
69
+
70
+ async def close(self):
71
+ if not self._writer_closed() and self._writer is not None:
72
+ self._writer.write_eof()
73
+ await self._writer.drain()
74
+ self._writer.close()
75
+
76
+ self._client_closed = True
77
+
78
+ def _writer_closed(self) -> bool:
79
+ return self._writer is None or self._writer.is_closing()
80
+
81
+ async def _connect(self):
82
+ _, self._writer = await open_connection(
83
+ host=self._host, port=self._port
84
+ )
File without changes
@@ -0,0 +1,52 @@
1
+ from ._base import AbstractRabbitMQService, RabbitMqManager
2
+ from ._channel import BaseChannel
3
+ from ._exception_handlers import (
4
+ handle_general_mq_exception,
5
+ handle_microservice_exception,
6
+ handle_rabbitmq_exception,
7
+ handle_validation_error,
8
+ )
9
+ from ._exceptions import RabbitMQException
10
+ from ._listener import (
11
+ CONSUMER_ATTRIBUTE,
12
+ LISTENER_ATTRIBUTE,
13
+ RPC_WORKER_ATTRIBUTE,
14
+ BackoffRetryDelay,
15
+ Consumer,
16
+ FixedRetryDelay,
17
+ ListenerBase,
18
+ ListenerContext,
19
+ RetryDelayJitter,
20
+ RetryPolicy,
21
+ RpcWorker,
22
+ consume,
23
+ execute,
24
+ )
25
+ from ._publisher import Publisher
26
+ from ._rpc_client import RpcClient
27
+
28
+ __all__ = [
29
+ "AbstractRabbitMQService",
30
+ "BackoffRetryDelay",
31
+ "BaseChannel",
32
+ "consume",
33
+ "CONSUMER_ATTRIBUTE",
34
+ "Consumer",
35
+ "execute",
36
+ "FixedRetryDelay",
37
+ "handle_general_mq_exception",
38
+ "handle_microservice_exception",
39
+ "handle_rabbitmq_exception",
40
+ "handle_validation_error",
41
+ "LISTENER_ATTRIBUTE",
42
+ "ListenerBase",
43
+ "ListenerContext",
44
+ "Publisher",
45
+ "RabbitMQException",
46
+ "RabbitMqManager",
47
+ "RetryDelayJitter",
48
+ "RetryPolicy",
49
+ "RPC_WORKER_ATTRIBUTE",
50
+ "RpcClient",
51
+ "RpcWorker",
52
+ ]