dt-extensions-sdk 1.7.3__py3-none-any.whl → 1.7.4__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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dt-extensions-sdk
3
- Version: 1.7.3
3
+ Version: 1.7.4
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
@@ -1,4 +1,4 @@
1
- dynatrace_extension/__about__.py,sha256=-BvmT9sstUN3n3QmUgym0fwfILxaCrccJsuxxXpn5H0,110
1
+ dynatrace_extension/__about__.py,sha256=mYwZ34U1NdFWsIoFPXD2wSIjr7MDYun_CILrVcKXdDU,110
2
2
  dynatrace_extension/__init__.py,sha256=MJNJYCFWLEwPmBLoETWFZddyUCMDgZfKkRycmmGM_w4,806
3
3
  dynatrace_extension/cli/__init__.py,sha256=HCboY_eJPoqjFmoPDsBL8Jk6aNvank8K7JpkVrgwzUM,123
4
4
  dynatrace_extension/cli/main.py,sha256=OTjJ4XHJvvYXj10a7WFFHVNnkyECPg1ClW6Os8piN8k,20168
@@ -17,10 +17,10 @@ dynatrace_extension/cli/create/extension_template/extension_name/__init__.py.tem
17
17
  dynatrace_extension/cli/create/extension_template/extension_name/__main__.py.template,sha256=cS79GVxJB-V-gocu4ZOjmZ54HXJNg89eXdLf89zDHJQ,1249
18
18
  dynatrace_extension/sdk/__init__.py,sha256=RsqQ1heGyCmSK3fhuEKAcxQIRCg4gEK0-eSkIehL5Nc,86
19
19
  dynatrace_extension/sdk/activation.py,sha256=KIoPWMZs3tKiMG8XhCfeNgRlz2vxDKcAASgSACcEfIQ,1456
20
- dynatrace_extension/sdk/callback.py,sha256=NW63fQBh-BeN-zfAeDY94wpSBoBHRsR3VLJCvxJPiaw,6703
20
+ dynatrace_extension/sdk/callback.py,sha256=S_ELy2D9Y2YhUsL2lBry3UZfmy3BrZgZM2hvKgQIQss,6949
21
21
  dynatrace_extension/sdk/communication.py,sha256=uTSURmgSHit2N1hHUc3-yKmEBVMHi6hDBrdb1EaCAsE,18419
22
22
  dynatrace_extension/sdk/event.py,sha256=J261imbFKpxfuAQ6Nfu3RRcsIQKKivy6fme1nww2g-8,388
23
- dynatrace_extension/sdk/extension.py,sha256=KZYVn5VDW19pfnqe6UnpzRVPYUasW8n8AYSvUYvvOUw,49723
23
+ dynatrace_extension/sdk/extension.py,sha256=ZbuoHQ-sbj4jUSz0w1Iz6IePrnC9a0BEwoXIdLKJsU8,49957
24
24
  dynatrace_extension/sdk/helper.py,sha256=m4gGHtIKYkfANC2MOGdxKUZlmH5tnZO6WTNqll27lyY,6476
25
25
  dynatrace_extension/sdk/metric.py,sha256=-kq7JWpk7UGvcjqafTt-o6k4urwhsGVXmnuQg7Sf9PQ,3622
26
26
  dynatrace_extension/sdk/runtime.py,sha256=7bC4gUJsVSHuL_E7r2EWrne95nm1BjZiMGkyNqA7ZCU,2796
@@ -31,8 +31,8 @@ dynatrace_extension/sdk/vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
31
31
  dynatrace_extension/sdk/vendor/mureq/LICENSE,sha256=8AVcgZgiT_mvK1fOofXtRRr2f1dRXS_K21NuxQgP4VM,671
32
32
  dynatrace_extension/sdk/vendor/mureq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  dynatrace_extension/sdk/vendor/mureq/mureq.py,sha256=znF4mvzk5L03CLNozRz8UpK-fMijmSkObDFwlbhwLUg,14656
34
- dt_extensions_sdk-1.7.3.dist-info/METADATA,sha256=irv3Te4njH0dWl4Yl-KyNN--ErS4PP7-xrghjwbtoqo,2721
35
- dt_extensions_sdk-1.7.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
36
- dt_extensions_sdk-1.7.3.dist-info/entry_points.txt,sha256=pweyOCgENGHjOlT6_kXYaBPOrE3p18K0UettqnNlnoE,55
37
- dt_extensions_sdk-1.7.3.dist-info/licenses/LICENSE.txt,sha256=3Zihv0lOVYHNfDkJC-tUAU6euP9r2NexsDW4w-zqgVk,1078
38
- dt_extensions_sdk-1.7.3.dist-info/RECORD,,
34
+ dt_extensions_sdk-1.7.4.dist-info/METADATA,sha256=L-E8TbTHsP72vnEmdYbBYHPJRTRsrOc81QUWsiunyLk,2721
35
+ dt_extensions_sdk-1.7.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
36
+ dt_extensions_sdk-1.7.4.dist-info/entry_points.txt,sha256=pweyOCgENGHjOlT6_kXYaBPOrE3p18K0UettqnNlnoE,55
37
+ dt_extensions_sdk-1.7.4.dist-info/licenses/LICENSE.txt,sha256=3Zihv0lOVYHNfDkJC-tUAU6euP9r2NexsDW4w-zqgVk,1078
38
+ dt_extensions_sdk-1.7.4.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.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.7.3"
6
+ __version__ = "1.7.4"
@@ -23,6 +23,7 @@ class WrappedCallback:
23
23
  kwargs: dict | None = None,
24
24
  running_in_sim=False,
25
25
  activation_type: ActivationType | None = None,
26
+ offset_seconds: float | None = None,
26
27
  ):
27
28
  self.callback: Callable = callback
28
29
  if args is None:
@@ -48,6 +49,7 @@ class WrappedCallback:
48
49
  self.timeouts_count = 0 # counter per interval = 1 min by default
49
50
  self.exception_count = 0 # counter per interval = 1 min by default
50
51
  self.iterations = 0 # how many times we ran the callback iterator for this callback
52
+ self.offset_seconds = offset_seconds or self.calculate_initial_wait_time()
51
53
 
52
54
  def get_current_time_with_cluster_diff(self):
53
55
  return datetime.now() + timedelta(milliseconds=self.cluster_time_diff)
@@ -97,24 +99,28 @@ class WrappedCallback:
97
99
  def name(self):
98
100
  return self.callback.__name__
99
101
 
102
+ def calculate_initial_wait_time(self) -> float:
103
+ """
104
+ Here we chose a random second between 5 and 55 to start the callback
105
+ This is to distribute load for extension running on this host
106
+ """
107
+
108
+ now = self.get_current_time_with_cluster_diff()
109
+ random_second = random.randint(5, 55) # noqa: S311
110
+ next_execution = datetime.now().replace(second=random_second, microsecond=0)
111
+ if next_execution <= now:
112
+ # The random chosen second already passed this minute
113
+ next_execution += timedelta(minutes=1)
114
+ wait_time = (next_execution - now).total_seconds()
115
+ self.logger.debug(f"Randomly choosing next execution time for callback {self} to be {next_execution}")
116
+ return wait_time
117
+
100
118
  def initial_wait_time(self) -> float:
101
- if not self.running_in_sim:
102
- """
103
- Here we chose a random second between 5 and 55 to start the callback
104
- This is to distribute load for extension running on this host
105
- When running from the simulator, this is not done
106
- """
107
-
108
- now = self.get_current_time_with_cluster_diff()
109
- random_second = random.randint(5, 55) # noqa: S311
110
- next_execution = datetime.now().replace(second=random_second, microsecond=0)
111
- if next_execution <= now:
112
- # The random chosen second already passed this minute
113
- next_execution += timedelta(minutes=1)
114
- wait_time = (next_execution - now).total_seconds()
115
- self.logger.debug(f"Randomly choosing next execution time for callback {self} to be {next_execution}")
116
- return wait_time
117
- return 0
119
+ # When running from the simulator, we don't want any offset
120
+ if self.running_in_sim:
121
+ return 0
122
+
123
+ return self.offset_seconds
118
124
 
119
125
  def get_adjusted_metric_timestamp(self) -> datetime:
120
126
  """
@@ -151,4 +157,8 @@ class WrappedCallback:
151
157
  This is done using execution total, the interval and the start timestamp
152
158
  :return: float
153
159
  """
154
- return self.start_timestamp_monotonic + self.interval.total_seconds() * (self.iterations or 1)
160
+ return (
161
+ self.initial_wait_time()
162
+ + self.start_timestamp_monotonic
163
+ + self.interval.total_seconds() * (self.iterations or 1)
164
+ )
@@ -385,6 +385,7 @@ class Extension:
385
385
  interval: timedelta | int,
386
386
  args: tuple | None = None,
387
387
  activation_type: ActivationType | None = None,
388
+ offset_seconds: float | None = None,
388
389
  ) -> None:
389
390
  """Schedule a method to be executed periodically.
390
391
 
@@ -398,6 +399,7 @@ class Extension:
398
399
  args: Arguments to the callback, if any
399
400
  activation_type: Optional activation type when this callback should run,
400
401
  can be 'ActivationType.LOCAL' or 'ActivationType.REMOTE'
402
+ offset_seconds: Optional offset of first execution represented in seconds. Offset is random if `offset_seconds` is `None`.
401
403
  """
402
404
 
403
405
  if isinstance(interval, int):
@@ -407,7 +409,10 @@ class Extension:
407
409
  msg = f"Interval must be at least 1 second, got {interval.total_seconds()} seconds"
408
410
  raise ValueError(msg)
409
411
 
410
- callback = WrappedCallback(interval, callback, api_logger, args, activation_type=activation_type)
412
+ callback = WrappedCallback(
413
+ interval, callback, api_logger, args, activation_type=activation_type, offset_seconds=offset_seconds
414
+ )
415
+
411
416
  if self._is_fastcheck:
412
417
  self._scheduled_callbacks_before_run.append(callback)
413
418
  else: