dt-extensions-sdk 1.3.0__py3-none-any.whl → 1.3.1__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.
@@ -1,11 +1,12 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: dt-extensions-sdk
3
- Version: 1.3.0
3
+ Version: 1.3.1
4
4
  Project-URL: Documentation, https://github.com/dynatrace-extensions/dt-extensions-python-sdk#readme
5
5
  Project-URL: Issues, https://github.com/dynatrace-extensions/dt-extensions-python-sdk/issues
6
6
  Project-URL: Source, https://github.com/dynatrace-extensions/dt-extensions-python-sdk
7
7
  Author-email: dlopes7 <davidribeirolopes@gmail.com>
8
- License: MIT
8
+ License-Expression: MIT
9
+ License-File: LICENSE.txt
9
10
  Classifier: Development Status :: 4 - Beta
10
11
  Classifier: Programming Language :: Python
11
12
  Classifier: Programming Language :: Python :: 3.10
@@ -1,4 +1,4 @@
1
- dynatrace_extension/__about__.py,sha256=UOSMeuvYrIEfkKMe5OPGxqTQkGJsMCvBMaw2t3yMuJ4,110
1
+ dynatrace_extension/__about__.py,sha256=-jEpNU1eRpe8GBW_KoSO-6Flc820P-KhyssXl0K9kO4,110
2
2
  dynatrace_extension/__init__.py,sha256=BvQuknmA7ti3WJi3zEXZfY7aAxJrie37VNitWICsUvI,752
3
3
  dynatrace_extension/cli/__init__.py,sha256=HCboY_eJPoqjFmoPDsBL8Jk6aNvank8K7JpkVrgwzUM,123
4
4
  dynatrace_extension/cli/main.py,sha256=Z8gFcp0vIMBkzV6jUd5mwvP1U0JcLqAHoMLJw_6puz4,18260
@@ -16,10 +16,10 @@ dynatrace_extension/cli/create/extension_template/extension_name/__init__.py.tem
16
16
  dynatrace_extension/cli/create/extension_template/extension_name/__main__.py.template,sha256=NYuZ6BWZ6HOs4TCuboh6S0nuYp3F8MXW2lmjSpdREEA,1205
17
17
  dynatrace_extension/sdk/__init__.py,sha256=RsqQ1heGyCmSK3fhuEKAcxQIRCg4gEK0-eSkIehL5Nc,86
18
18
  dynatrace_extension/sdk/activation.py,sha256=goTbT1tD2kn8xfyXFdTy_cTZNcFPJpgbvQM8HOzKECA,1480
19
- dynatrace_extension/sdk/callback.py,sha256=PNRvOVzNpKvpsa0wCf7HRDkfo3wMsF2otVWI9a1AAkU,6307
20
- dynatrace_extension/sdk/communication.py,sha256=GVxIdLvhJW7mr1HHoS3qILGx7MNZm1ujocBrNYbfnUc,18494
19
+ dynatrace_extension/sdk/callback.py,sha256=eMpC0F3fCI82mWHIFgmy9QmKl7Kq_9dSaanHdV6o7hA,6511
20
+ dynatrace_extension/sdk/communication.py,sha256=QkJgEBblOen-jmvsb3ZfYZYglYUc7jHbkEgPtRj9l6w,19123
21
21
  dynatrace_extension/sdk/event.py,sha256=J261imbFKpxfuAQ6Nfu3RRcsIQKKivy6fme1nww2g-8,388
22
- dynatrace_extension/sdk/extension.py,sha256=gwESrAhlTtlJO-VfRFtfevmzDbd81Dj9r00u-kqs0iQ,42940
22
+ dynatrace_extension/sdk/extension.py,sha256=RnF7Czlmg6QrQLLlP90dM0tAIxdX3LrqaUi8M1p1Guo,43251
23
23
  dynatrace_extension/sdk/helper.py,sha256=ZNrO9ao2hE3KQ934vAYD74k0fCr6QTG-_bAvbk9-hi8,6562
24
24
  dynatrace_extension/sdk/metric.py,sha256=7VClzJCFJNDCxA-d69uTu1pdPtDZBTwq7fbafs_L6nQ,3690
25
25
  dynatrace_extension/sdk/runtime.py,sha256=jyYsM1x-gMnW68eWq8IoZZZBarHgIcr_nVeGDDgpRDk,2802
@@ -28,8 +28,8 @@ dynatrace_extension/sdk/vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
28
28
  dynatrace_extension/sdk/vendor/mureq/LICENSE,sha256=8AVcgZgiT_mvK1fOofXtRRr2f1dRXS_K21NuxQgP4VM,671
29
29
  dynatrace_extension/sdk/vendor/mureq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  dynatrace_extension/sdk/vendor/mureq/mureq.py,sha256=znF4mvzk5L03CLNozRz8UpK-fMijmSkObDFwlbhwLUg,14656
31
- dt_extensions_sdk-1.3.0.dist-info/METADATA,sha256=qyJXkr0QueRXicxxBHw_wO4X9gNQsHGZf0DelNJUabM,2648
32
- dt_extensions_sdk-1.3.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
33
- dt_extensions_sdk-1.3.0.dist-info/entry_points.txt,sha256=pweyOCgENGHjOlT6_kXYaBPOrE3p18K0UettqnNlnoE,55
34
- dt_extensions_sdk-1.3.0.dist-info/licenses/LICENSE.txt,sha256=3Zihv0lOVYHNfDkJC-tUAU6euP9r2NexsDW4w-zqgVk,1078
35
- dt_extensions_sdk-1.3.0.dist-info/RECORD,,
31
+ dt_extensions_sdk-1.3.1.dist-info/METADATA,sha256=LwKOdwizaSteiT3s-yPkAXYRyqkiqQC11TaPXiGlJ-Q,2685
32
+ dt_extensions_sdk-1.3.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
33
+ dt_extensions_sdk-1.3.1.dist-info/entry_points.txt,sha256=pweyOCgENGHjOlT6_kXYaBPOrE3p18K0UettqnNlnoE,55
34
+ dt_extensions_sdk-1.3.1.dist-info/licenses/LICENSE.txt,sha256=3Zihv0lOVYHNfDkJC-tUAU6euP9r2NexsDW4w-zqgVk,1078
35
+ dt_extensions_sdk-1.3.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.26.3
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -3,4 +3,4 @@
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
5
 
6
- __version__ = "1.3.0"
6
+ __version__ = "1.3.1"
@@ -9,7 +9,7 @@ from timeit import default_timer as timer
9
9
  from typing import Callable, Dict, Optional, Tuple
10
10
 
11
11
  from .activation import ActivationType
12
- from .communication import Status, StatusValue
12
+ from .communication import MultiStatus, Status, StatusValue
13
13
 
14
14
 
15
15
  class WrappedCallback:
@@ -60,8 +60,13 @@ class WrappedCallback:
60
60
  start_time = timer()
61
61
  failed = False
62
62
  try:
63
- self.callback(*self.callback_args, **self.callback_kwargs)
64
- self.status = Status(StatusValue.OK)
63
+ ret = self.callback(*self.callback_args, **self.callback_kwargs)
64
+ if isinstance(ret, Status):
65
+ self.status = ret
66
+ elif isinstance(ret, MultiStatus):
67
+ self.status = ret.build()
68
+ else:
69
+ self.status = Status(StatusValue.OK)
65
70
  except Exception as e:
66
71
  failed = True
67
72
  self.logger.exception(f"Error running callback {self}: {e!r}")
@@ -59,6 +59,29 @@ class Status:
59
59
  return self.status not in (StatusValue.OK, StatusValue.EMPTY)
60
60
 
61
61
 
62
+ class MultiStatus:
63
+
64
+ def __init__(self):
65
+ self.statuses = []
66
+
67
+ def add_status(self, status: StatusValue, message):
68
+ self.statuses.append(Status(status, message))
69
+
70
+ def build(self) -> Status:
71
+ ret = Status(StatusValue.OK)
72
+ if len(self.statuses) == 0:
73
+ return ret
74
+
75
+ messages = []
76
+ for stored_status in self.statuses:
77
+ print(stored_status) # noqa: T201
78
+ if stored_status.is_error():
79
+ ret.status = stored_status.status
80
+ messages.append(stored_status.message)
81
+ ret.message = "\n".join(messages)
82
+ return ret
83
+
84
+
62
85
  class CommunicationClient(ABC):
63
86
  """
64
87
  Abstract class for extension communication
@@ -32,6 +32,7 @@ TIME_DIFF_INTERVAL = timedelta(seconds=60)
32
32
 
33
33
  CALLBACKS_THREAD_POOL_SIZE = 100
34
34
  INTERNAL_THREAD_POOL_SIZE = 20
35
+ HEARTBEAT_THREAD_POOL_SIZE = 10
35
36
 
36
37
  RFC_3339_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
37
38
  DATASOURCE_TYPE = "python"
@@ -220,6 +221,7 @@ class Extension:
220
221
  # Executors for the callbacks and internal methods
221
222
  self._callbacks_executor = ThreadPoolExecutor(max_workers=CALLBACKS_THREAD_POOL_SIZE)
222
223
  self._internal_executor = ThreadPoolExecutor(max_workers=INTERNAL_THREAD_POOL_SIZE)
224
+ self._heartbeat_executor = ThreadPoolExecutor(max_workers=HEARTBEAT_THREAD_POOL_SIZE)
223
225
 
224
226
  # Extension metrics
225
227
  self._metrics_lock = RLock()
@@ -827,7 +829,7 @@ class Extension:
827
829
  self._scheduler.enterabs(next_timestamp, 1, self._timediff_iteration)
828
830
 
829
831
  def _heartbeat_iteration(self):
830
- self._internal_executor.submit(self._heartbeat)
832
+ self._heartbeat_executor.submit(self._heartbeat)
831
833
  next_timestamp = self._get_and_set_next_internal_callback_timestamp("heartbeat", HEARTBEAT_INTERVAL)
832
834
  self._scheduler.enterabs(next_timestamp, 2, self._heartbeat_iteration)
833
835
 
@@ -976,7 +978,9 @@ class Extension:
976
978
  if callback.status.is_error():
977
979
  overall_status.status = callback.status.status
978
980
  messages.append(f"{callback}: {callback.status.message}")
979
-
981
+ continue
982
+ if callback.status.message is not None and callback.status.message != "":
983
+ messages.append(f"{callback}: {callback.status.message}")
980
984
  overall_status.message = "\n".join(messages)
981
985
  return overall_status
982
986