fdc-shared-kernel 0.0.71__tar.gz → 0.0.72__tar.gz

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 (79) hide show
  1. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/PKG-INFO +1 -1
  2. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/fdc_shared_kernel.egg-info/PKG-INFO +1 -1
  3. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/fdc_shared_kernel.egg-info/SOURCES.txt +2 -1
  4. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/pyproject.toml +1 -1
  5. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/event_executor/event_executor.py +29 -4
  6. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/logger/__init__.py +24 -10
  7. fdc_shared_kernel-0.0.72/shared_kernel/utils/thread_local_util.py +63 -0
  8. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/README.md +0 -0
  9. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/README_pypi.md +0 -0
  10. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/fdc_shared_kernel.egg-info/dependency_links.txt +0 -0
  11. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/fdc_shared_kernel.egg-info/requires.txt +0 -0
  12. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/fdc_shared_kernel.egg-info/top_level.txt +0 -0
  13. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/requirements.txt +0 -0
  14. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/setup.cfg +0 -0
  15. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/__init__.py +0 -0
  16. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/async_task_executor/__init__.py +0 -0
  17. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/async_task_executor/async_task_executor.py +0 -0
  18. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/auth/__init__.py +0 -0
  19. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/auth/jwt_helper.py +0 -0
  20. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/auth/token_handler.py +0 -0
  21. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/config/__init__.py +0 -0
  22. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/database/__init__.py +0 -0
  23. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/enums/__init__.py +0 -0
  24. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/enums/async_task_executor.py +0 -0
  25. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/enums/status_tracker.py +0 -0
  26. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/event_executor/__init__.py +0 -0
  27. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/event_executor/utils.py +0 -0
  28. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/exceptions/__init__.py +0 -0
  29. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/exceptions/configuration_exceptions.py +0 -0
  30. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/exceptions/custom_exceptions.py +0 -0
  31. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/exceptions/data_validation_exceptions.py +0 -0
  32. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/exceptions/http_exceptions.py +0 -0
  33. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/exceptions/infrastructure_exceptions.py +0 -0
  34. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/exceptions/operational_exceptions.py +0 -0
  35. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/exceptions/security_exceptions.py +0 -0
  36. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/http/__init__.py +0 -0
  37. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/http/httpx_http_client.py +0 -0
  38. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/http/request_http_client.py +0 -0
  39. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/interfaces/__init__.py +0 -0
  40. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/interfaces/databus.py +0 -0
  41. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/interfaces/http.py +0 -0
  42. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/interfaces/keyvault.py +0 -0
  43. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/messaging/__init__.py +0 -0
  44. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/messaging/aws_databus.py +0 -0
  45. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/messaging/http_databus.py +0 -0
  46. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/messaging/nats_databus.py +0 -0
  47. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/messaging/nats_publisher.py +0 -0
  48. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/messaging/nats_test.py +0 -0
  49. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/messaging/utils/aws_utility.py +0 -0
  50. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/messaging/utils/event_messages.py +0 -0
  51. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/metrics/__init__.py +0 -0
  52. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/metrics/status_tracker.py +0 -0
  53. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/models/__init__.py +0 -0
  54. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/registries/__init__.py +0 -0
  55. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/registries/service_event_registry.py +0 -0
  56. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/security/__init__.py +0 -0
  57. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/security/key_vault/__init__.py +0 -0
  58. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/security/key_vault/aws_secret_manager.py +0 -0
  59. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/security/key_vault/azure_keyvault.py +0 -0
  60. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/status_tracker/__init__.py +0 -0
  61. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/status_tracker/status_tracker.py +0 -0
  62. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/__init__.py +0 -0
  63. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/config/__init__.py +0 -0
  64. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/config/test_config.py +0 -0
  65. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/logger/__init__.py +0 -0
  66. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/logger/test_logger.py +0 -0
  67. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/messaging/__init__.py +0 -0
  68. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/messaging/test_aws_databus.py +0 -0
  69. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/messaging/test_event_executor.py +0 -0
  70. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/messaging/test_nats_interface.py +0 -0
  71. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/utils/__init__.py +0 -0
  72. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/utils/test_data_validators.py +0 -0
  73. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/utils/test_date_format_utils.py +0 -0
  74. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/tests/utils/test_string_utils.py +0 -0
  75. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/utils/__init__.py +0 -0
  76. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/utils/data_validators_utils.py +0 -0
  77. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/utils/date_format_utils.py +0 -0
  78. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/utils/string_utils.py +0 -0
  79. {fdc_shared_kernel-0.0.71 → fdc_shared_kernel-0.0.72}/shared_kernel/utils/template_renderer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.71
3
+ Version: 0.0.72
4
4
  Summary: Shared library for microservice
5
5
  Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fdc_shared_kernel
3
- Version: 0.0.71
3
+ Version: 0.0.72
4
4
  Summary: Shared library for microservice
5
5
  Author-email: Shikhil S <shikhil.s@dbizsolution.com>, Ahammed Akdham N <ahammedakdham.n@dbizsolution.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -73,4 +73,5 @@ shared_kernel/utils/__init__.py
73
73
  shared_kernel/utils/data_validators_utils.py
74
74
  shared_kernel/utils/date_format_utils.py
75
75
  shared_kernel/utils/string_utils.py
76
- shared_kernel/utils/template_renderer.py
76
+ shared_kernel/utils/template_renderer.py
77
+ shared_kernel/utils/thread_local_util.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "fdc_shared_kernel"
7
- version = "0.0.71"
7
+ version = "0.0.72"
8
8
  requires-python = ">=3.7"
9
9
  readme = "README_pypi.md"
10
10
  description = "Shared library for microservice"
@@ -11,10 +11,14 @@ from shared_kernel.logger import Logger
11
11
  from shared_kernel.messaging.utils.event_messages import AWSEventMessage, EventMessage
12
12
  from shared_kernel.status_tracker import StatusTracker
13
13
  from shared_kernel.enums import TaskStatus
14
+ from shared_kernel.utils.thread_local_util import ThreadLocalStorage
15
+
14
16
 
15
17
  app_config = Config()
16
18
  logger = Logger(app_config.get("APP_NAME"))
17
19
 
20
+ thread_local_storage = ThreadLocalStorage()
21
+
18
22
  class EventExecutor:
19
23
 
20
24
  _instance = None
@@ -143,6 +147,8 @@ class EventExecutor:
143
147
  logger.error(
144
148
  f"Error processing event {event_msg.event_name} trace-id: {event_msg.event_meta.trace_id}. span-id: {event_msg.event_meta.trace_id} : {str(e)}"
145
149
  )
150
+ logger.info("Error processing event",type="distributed_trace",is_success="False",failure_reason=str(e))
151
+
146
152
  # adding the failure reason to the event meta
147
153
  event_msg.event_meta.failure_reason = str(e)
148
154
 
@@ -203,16 +209,28 @@ class EventExecutor:
203
209
  logger.info(f"Initiating callback for message: {message}")
204
210
  event_msg = AWSEventMessage(message)
205
211
  event_name = event_msg.event_name
212
+
213
+ # Set thread-local context
214
+ thread_local_storage.set_all({
215
+ "trace_id": event_msg.event_meta.trace_id,
216
+ "span_id": event_msg.event_meta.span_id,
217
+ "org_id": event_msg.event_meta.org_id if hasattr(event_msg.event_meta, 'org_id') else None,
218
+ "event_name": event_msg.event_name,
219
+ "event_payload": json.dumps(event_msg.event_payload)
220
+ })
221
+ logger.info("Event recieved",type="distributed_trace")
222
+ # Process the message
206
223
  success = self._process_message(event_msg, callback)
207
- finally:
208
224
 
209
- # update the event stats whether its successful or failure
225
+ finally:
226
+ # Update the event stats whether it succeeded or failed
210
227
  if event_name:
211
228
  self._update_event_stats(event_name, success)
212
229
 
213
230
  if success:
214
231
  logger.info(
215
- f"Event {event_msg.event_name} completed successfully. trace-id: {event_msg.event_meta.trace_id}. span-id: {event_msg.event_meta.span_id}."
232
+ f"Event {event_msg.event_name} completed successfully. "
233
+ f"trace-id: {event_msg.event_meta.trace_id}. span-id: {event_msg.event_meta.span_id}."
216
234
  )
217
235
  self.status_tracker.update_task(
218
236
  span_id=event_msg.event_meta.span_id,
@@ -221,10 +239,17 @@ class EventExecutor:
221
239
  status=TaskStatus.COMPLETED.value,
222
240
  task_id=event_msg.event_meta.job_id,
223
241
  )
242
+ logger.info("Event processed successfully",type="distributed_trace",is_success="True",time_in_seconds= event_msg.event_meta.time_taken)
224
243
  else:
225
244
  logger.warning(
226
- f"Event {event_msg.event_name} failed during processing. trace-id: {event_msg.event_meta.trace_id}. span-id: {event_msg.event_meta.span_id}."
245
+ f"Event {event_msg.event_name} failed during processing. "
246
+ f"trace-id: {event_msg.event_meta.trace_id}. span-id: {event_msg.event_meta.span_id}."
227
247
  )
248
+
249
+ # Clean up thread-local storage
250
+ thread_local_storage.clear()
251
+
252
+ # Delete the message from the queue
228
253
  self.databus.delete_message(event_msg)
229
254
 
230
255
  def _task_done_callback(self, future: Future, event_name: str, event_semaphore: Semaphore) -> None:
@@ -2,6 +2,7 @@ import logging
2
2
  import os
3
3
  import json
4
4
  from shared_kernel.config import Config
5
+ from shared_kernel.utils.thread_local_util import ThreadLocalStorage
5
6
  class JSONFormatter(logging.Formatter):
6
7
  """
7
8
  Custom JSON formatter to structure log records as JSON.
@@ -16,8 +17,21 @@ class JSONFormatter(logging.Formatter):
16
17
  "level": record.levelname,
17
18
  "message": record.getMessage(),
18
19
  }
19
- if hasattr(record, 'extra_data'):
20
- log_record.update(record.extra_data)
20
+ # Get meta_data if present
21
+ meta_data = getattr(record, 'meta_data', {})
22
+
23
+ # Check if 'type' is in meta_data and is 'distributed_trace'
24
+ if meta_data.get("type") == "distributed_trace":
25
+ thread_context = ThreadLocalStorage.get_all()
26
+ # Add each data from thread local storage
27
+ log_record["trace_id"] = thread_context.get("trace_id")
28
+ log_record["span_id"] = thread_context.get("span_id")
29
+ log_record["org_id"] = thread_context.get("org_id")
30
+ log_record["event_name"] = thread_context.get("event_name")
31
+ log_record["event_payload"] = thread_context.get("event_payload")
32
+ log_record.update(meta_data)
33
+ if hasattr(record, 'meta_data'):
34
+ log_record.update(record.meta_data)
21
35
  if record.exc_info:
22
36
  log_record["exception"] = self.formatException(record.exc_info)
23
37
  return json.dumps(log_record)
@@ -100,17 +114,17 @@ class Logger:
100
114
  self.logger.addHandler(json_file_handler)
101
115
 
102
116
  def info(self, message, *args, **kwargs):
103
- extra_data = {"extra_data": kwargs}
104
- self.logger.info(message, *args, extra=extra_data, stacklevel=2)
117
+ meta_data = {"meta_data": kwargs}
118
+ self.logger.info(message, *args, extra=meta_data, stacklevel=2)
105
119
 
106
120
  def error(self, message, *args, **kwargs):
107
- extra_data = {"extra_data": kwargs}
108
- self.logger.error(message, exc_info=True, *args, extra=extra_data, stacklevel=2)
121
+ meta_data = {"meta_data": kwargs}
122
+ self.logger.error(message, exc_info=True, *args, extra=meta_data, stacklevel=2)
109
123
 
110
124
  def debug(self, message, *args, **kwargs):
111
- extra_data = {"extra_data": kwargs}
112
- self.logger.debug(message, *args, extra=extra_data, stacklevel=2)
125
+ meta_data = {"meta_data": kwargs}
126
+ self.logger.debug(message, *args, extra=meta_data, stacklevel=2)
113
127
 
114
128
  def warning(self, message, *args, **kwargs):
115
- extra_data = {"extra_data": kwargs}
116
- self.logger.warning(message, *args, extra=extra_data, stacklevel=2)
129
+ meta_data = {"meta_data": kwargs}
130
+ self.logger.warning(message, *args, extra=meta_data, stacklevel=2)
@@ -0,0 +1,63 @@
1
+ import threading
2
+
3
+
4
+ class ThreadLocalStorage:
5
+ """
6
+ Utility class for managing thread-local storage with class-level methods and variables.
7
+ """
8
+
9
+ # Class-level thread-local storage
10
+ _storage = threading.local()
11
+
12
+ @classmethod
13
+ def set(cls, key: str, value: any) -> None:
14
+ """
15
+ Sets a value in the thread-local storage.
16
+
17
+ :param key: The key for the value.
18
+ :param value: The value to be stored.
19
+ """
20
+ if not hasattr(cls._storage, "data"):
21
+ cls._storage.data = {}
22
+ cls._storage.data[key] = value
23
+
24
+ @classmethod
25
+ def set_all(cls, values: dict) -> None:
26
+ """
27
+ Sets multiple key-value pairs in the thread-local storage.
28
+
29
+ :param values: A dictionary of key-value pairs to store.
30
+ """
31
+ if not hasattr(cls._storage, "data"):
32
+ cls._storage.data = {}
33
+ cls._storage.data.update(values)
34
+
35
+ @classmethod
36
+ def get(cls, key: str, default=None) -> any:
37
+ """
38
+ Retrieves a value from the thread-local storage.
39
+
40
+ :param key: The key for the value.
41
+ :param default: The default value to return if the key is not found.
42
+ :return: The value associated with the key, or the default value.
43
+ """
44
+ if hasattr(cls._storage, "data") and key in cls._storage.data:
45
+ return cls._storage.data[key]
46
+ return default
47
+
48
+ @classmethod
49
+ def get_all(cls) -> dict:
50
+ """
51
+ Retrieves all key-value pairs from the thread-local storage.
52
+
53
+ :return: A dictionary of all thread-local data.
54
+ """
55
+ return getattr(cls._storage, "data", {}).copy() if hasattr(cls._storage, "data") else {}
56
+
57
+ @classmethod
58
+ def clear(cls) -> None:
59
+ """
60
+ Clears all values from the thread-local storage.
61
+ """
62
+ if hasattr(cls._storage, "data"):
63
+ cls._storage.data.clear()