dt-extensions-sdk 1.2.1__tar.gz → 1.2.2__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 (83) hide show
  1. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/PKG-INFO +1 -1
  2. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/api/extension.rst +1 -1
  3. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/__about__.py +1 -1
  4. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/callback.py +2 -1
  5. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/extension.py +4 -0
  6. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/test_extension.py +25 -25
  7. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/test_status.py +3 -3
  8. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/.github/workflows/gh-pages-docs.yml +0 -0
  9. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/.github/workflows/publish.yml +0 -0
  10. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/.gitignore +0 -0
  11. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/LICENSE.txt +0 -0
  12. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/README.md +0 -0
  13. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/dt-sdk-header.png +0 -0
  14. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/dt-sdk-logo.png +0 -0
  15. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/favicon.ico +0 -0
  16. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/img/migrate-01-new-extension.png +0 -0
  17. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/img/migrate-02-type.png +0 -0
  18. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/img/migrate-03-import.png +0 -0
  19. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/img/migrate-04-import-remote.png +0 -0
  20. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/img/migrate-05-activation.png +0 -0
  21. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/_static/img/migrate-06-activation-config.png +0 -0
  22. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/api/events/event_severity.rst +0 -0
  23. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/api/events/event_type.rst +0 -0
  24. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/api/events/index.rst +0 -0
  25. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/api/metrics/index.rst +0 -0
  26. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/api/metrics/metric.rst +0 -0
  27. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/api/metrics/metric_type.rst +0 -0
  28. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/assemble.rst +0 -0
  29. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/build.rst +0 -0
  30. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/create.rst +0 -0
  31. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/gencerts.rst +0 -0
  32. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/help.rst +0 -0
  33. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/run.rst +0 -0
  34. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/sign.rst +0 -0
  35. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/upload.rst +0 -0
  36. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/cli/wheel.rst +0 -0
  37. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/conf.py +0 -0
  38. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/guides/building.rst +0 -0
  39. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/guides/extension_structure.rst +0 -0
  40. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/guides/installation.rst +0 -0
  41. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/guides/migration.rst +0 -0
  42. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/index.rst +0 -0
  43. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/docs/requirements.txt +0 -0
  44. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/__init__.py +0 -0
  45. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/__init__.py +0 -0
  46. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/__init__.py +0 -0
  47. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/create.py +0 -0
  48. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/extension_template/.gitignore.template +0 -0
  49. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/extension_template/README.md.template +0 -0
  50. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/extension_template/activation.json.template +0 -0
  51. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/extension_template/extension/activationSchema.json.template +0 -0
  52. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/extension_template/extension/extension.yaml.template +0 -0
  53. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/extension_template/extension_name/__init__.py.template +0 -0
  54. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/extension_template/extension_name/__main__.py.template +0 -0
  55. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/create/extension_template/setup.py.template +0 -0
  56. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/main.py +0 -0
  57. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/cli/schema.py +0 -0
  58. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/__init__.py +0 -0
  59. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/activation.py +0 -0
  60. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/communication.py +0 -0
  61. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/event.py +0 -0
  62. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/helper.py +0 -0
  63. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/metric.py +0 -0
  64. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/runtime.py +0 -0
  65. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/snapshot.py +0 -0
  66. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/vendor/__init__.py +0 -0
  67. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/vendor/mureq/LICENSE +0 -0
  68. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/vendor/mureq/__init__.py +0 -0
  69. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/dynatrace_extension/sdk/vendor/mureq/mureq.py +0 -0
  70. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/pyproject.toml +0 -0
  71. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/__init__.py +0 -0
  72. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/cli/__init__.py +0 -0
  73. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/cli/test_dt_sdk.py +0 -0
  74. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/cli/test_templates.py +0 -0
  75. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/cli/test_types.py +0 -0
  76. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/data/snapshot.json +0 -0
  77. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/__init__.py +0 -0
  78. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/test_activation.py +0 -0
  79. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/test_callback.py +0 -0
  80. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/test_communication.py +0 -0
  81. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/test_metric.py +0 -0
  82. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/test_runtime_properties.py +0 -0
  83. {dt_extensions_sdk-1.2.1 → dt_extensions_sdk-1.2.2}/tests/sdk/test_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dt-extensions-sdk
3
- Version: 1.2.1
3
+ Version: 1.2.2
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
- Extension
1
+ pExtension
2
2
  =========
3
3
 
4
4
  .. autoclass:: dynatrace_extension.Extension
@@ -2,4 +2,4 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
- __version__ = "1.2.1"
5
+ __version__ = "1.2.2"
@@ -51,7 +51,8 @@ class WrappedCallback:
51
51
 
52
52
  def __call__(self):
53
53
  self.logger.debug(f"Running scheduled callback {self}")
54
- self.start_timestamp = self.get_current_time_with_cluster_diff()
54
+ if self.executions_total == 0:
55
+ self.start_timestamp = self.get_current_time_with_cluster_diff()
55
56
  self.running = True
56
57
  self.executions_total += 1
57
58
  self.executions_per_interval += 1
@@ -342,6 +342,10 @@ class Extension:
342
342
  if isinstance(interval, int):
343
343
  interval = timedelta(seconds=interval)
344
344
 
345
+ if interval.total_seconds() < 1:
346
+ msg = f"Interval must be at least 1 second, got {interval.total_seconds()} seconds"
347
+ raise ValueError(msg)
348
+
345
349
  callback = WrappedCallback(interval, callback, api_logger, args, activation_type=activation_type)
346
350
  if self._is_fastcheck:
347
351
  self._scheduled_callbacks_before_run.append(callback)
@@ -94,10 +94,10 @@ class TestExtension(unittest.TestCase):
94
94
  nonlocal callback_call_count
95
95
  callback_call_count += 1
96
96
 
97
- extension.schedule(callback, timedelta(seconds=0.01))
98
- extension.schedule(callback, timedelta(seconds=0.02))
97
+ extension.schedule(callback, timedelta(seconds=1))
98
+ extension.schedule(callback, timedelta(seconds=1))
99
99
  extension._scheduler.run(blocking=False)
100
- time.sleep(0.1)
100
+ time.sleep(1)
101
101
 
102
102
  self.assertEqual(extension._scheduled_callbacks[0].executions_total, 1)
103
103
  self.assertEqual(extension._scheduled_callbacks[1].executions_total, 1)
@@ -132,7 +132,7 @@ class TestExtension(unittest.TestCase):
132
132
 
133
133
  def initialize(self):
134
134
  self.callback_call_count = 0
135
- self.schedule(self.callback, timedelta(seconds=0.01))
135
+ self.schedule(self.callback, timedelta(seconds=1))
136
136
 
137
137
  extension = MyExt()
138
138
  extension.logger = MagicMock()
@@ -141,7 +141,7 @@ class TestExtension(unittest.TestCase):
141
141
  extension._client = MagicMock()
142
142
 
143
143
  extension._scheduler.run(blocking=False)
144
- time.sleep(0.1)
144
+ time.sleep(1)
145
145
 
146
146
  self.assertEqual(len(extension._scheduled_callbacks), 2)
147
147
  self.assertEqual(extension._scheduled_callbacks[0].executions_total, 1)
@@ -160,7 +160,7 @@ class TestExtension(unittest.TestCase):
160
160
  self.callback_that_schedules_another_callback_call_count += 1
161
161
  if not self.another_callback_scheduled:
162
162
  self.another_callback_scheduled = True
163
- self.schedule(self.another_callback, timedelta(seconds=0.01))
163
+ self.schedule(self.another_callback, timedelta(seconds=1))
164
164
 
165
165
  def another_callback(self):
166
166
  self.another_callback_call_count += 1
@@ -171,17 +171,17 @@ class TestExtension(unittest.TestCase):
171
171
  extension._is_fastcheck = False
172
172
  extension._client = MagicMock()
173
173
 
174
- extension.schedule(extension.callback_that_schedules_another_callback, timedelta(seconds=0.01))
174
+ extension.schedule(extension.callback_that_schedules_another_callback, timedelta(seconds=1))
175
175
  self.assertEqual(len(extension._scheduled_callbacks), 2)
176
176
 
177
177
  extension._scheduler.run(blocking=False)
178
- time.sleep(0.1)
178
+ time.sleep(1)
179
179
 
180
180
  self.assertEqual(len(extension._scheduled_callbacks), 3)
181
181
  self.assertEqual(extension._scheduled_callbacks[1].executions_total, 1)
182
182
  self.assertEqual(extension.callback_that_schedules_another_callback_call_count, 1)
183
183
  extension._scheduler.run(blocking=False)
184
- time.sleep(0.1)
184
+ time.sleep(1)
185
185
 
186
186
  self.assertEqual(len(extension._scheduled_callbacks), 3)
187
187
  self.assertEqual(extension._scheduled_callbacks[1].executions_total, 2)
@@ -190,7 +190,7 @@ class TestExtension(unittest.TestCase):
190
190
  self.assertGreaterEqual(extension.callback_that_schedules_another_callback_call_count, 1)
191
191
 
192
192
  extension._scheduler.run(blocking=False)
193
- time.sleep(0.1)
193
+ time.sleep(1)
194
194
  assert len(extension._scheduled_callbacks) == 3
195
195
 
196
196
  def test_callback_scheduled_exception(self):
@@ -215,11 +215,11 @@ class TestExtension(unittest.TestCase):
215
215
 
216
216
  def run_scheduler():
217
217
  nonlocal extension, callback, callback_wait, callback_call_count
218
- extension.schedule(callback, timedelta(seconds=0.01))
218
+ extension.schedule(callback, timedelta(seconds=1))
219
219
  extension._scheduler.run(blocking=False)
220
- time.sleep(0.1)
220
+ time.sleep(1)
221
221
  extension._scheduler.run(blocking=False)
222
- time.sleep(0.1)
222
+ time.sleep(1)
223
223
  if callback_call_count < 2:
224
224
  callback_wait.notify()
225
225
 
@@ -235,7 +235,7 @@ class TestExtension(unittest.TestCase):
235
235
  super().__init__()
236
236
  self.called_callback = False
237
237
 
238
- @schedule_method(timedelta(seconds=0.01))
238
+ @schedule_method(timedelta(seconds=1))
239
239
  def callback(self):
240
240
  self.called_callback = True
241
241
 
@@ -250,14 +250,14 @@ class TestExtension(unittest.TestCase):
250
250
  def test_schedule_function_decorator(self):
251
251
  callback_done = False
252
252
 
253
- @schedule_function(timedelta(seconds=0.01))
253
+ @schedule_function(timedelta(seconds=1))
254
254
  def callback():
255
255
  nonlocal callback_done
256
256
  callback_done = True
257
257
 
258
258
  extension = _HelperExtension()
259
259
  extension._scheduler.run(blocking=False)
260
- time.sleep(0.01)
260
+ time.sleep(1)
261
261
 
262
262
  self.assertEqual(len(extension._scheduled_callbacks), 1)
263
263
  self.assertTrue(callback_done)
@@ -277,12 +277,12 @@ class TestExtension(unittest.TestCase):
277
277
  msg = "test exception"
278
278
  raise RuntimeError(msg)
279
279
 
280
- extension.schedule(callback, timedelta(seconds=0.01))
280
+ extension.schedule(callback, timedelta(seconds=1))
281
281
  extension._scheduler.run(blocking=False)
282
- time.sleep(0.1)
282
+ time.sleep(1)
283
283
  self.assertEqual(extension._build_current_status().status, StatusValue.GENERIC_ERROR)
284
284
  extension._scheduler.run(blocking=False)
285
- time.sleep(0.1)
285
+ time.sleep(1)
286
286
  self.assertEqual(extension._build_current_status().status, StatusValue.OK)
287
287
 
288
288
  def test_register_fastcheck(self):
@@ -486,16 +486,16 @@ class TestExtension(unittest.TestCase):
486
486
  extension._client = MagicMock()
487
487
 
488
488
  def callback():
489
- time.sleep(0.25)
489
+ time.sleep(1.1)
490
490
  return 1
491
491
 
492
- extension.schedule(callback, timedelta(seconds=0.2))
492
+ extension.schedule(callback, timedelta(seconds=1))
493
493
  extension._scheduler.run(blocking=False)
494
- time.sleep(0.3)
494
+ time.sleep(2)
495
495
  sfm = extension._prepare_sfm_metrics()
496
496
  expected_values = {
497
497
  "dsfm:datasource.python.threads": 0,
498
- "dsfm:datasource.python.execution.time": 0.3,
498
+ "dsfm:datasource.python.execution.time": 1.1,
499
499
  "dsfm:datasource.python.execution.total.count": 1,
500
500
  "dsfm:datasource.python.execution.count": 1,
501
501
  "dsfm:datasource.python.execution.ok.count": 0,
@@ -515,9 +515,9 @@ class TestExtension(unittest.TestCase):
515
515
  msg = "Ups ..."
516
516
  raise Exception(msg)
517
517
 
518
- extension.schedule(callback, timedelta(seconds=0.2))
518
+ extension.schedule(callback, timedelta(seconds=1))
519
519
  extension._scheduler.run(blocking=False)
520
- time.sleep(0.1)
520
+ time.sleep(1)
521
521
  sfm = extension._prepare_sfm_metrics()
522
522
  expected_values = {
523
523
  "dsfm:datasource.python.threads": 0,
@@ -85,11 +85,11 @@ class TestStatus(unittest.TestCase):
85
85
  extension._client = MagicMock()
86
86
 
87
87
  def callback():
88
- time.sleep(0.1)
88
+ time.sleep(1)
89
89
 
90
- extension.schedule(callback, timedelta(seconds=0.01))
90
+ extension.schedule(callback, timedelta(seconds=1))
91
91
  extension._scheduler.run(blocking=False)
92
- time.sleep(0.2)
92
+ time.sleep(2)
93
93
 
94
94
  self.assertTrue(extension._scheduled_callbacks[1].status.is_error())
95
95
  self.assertIn("longer than the interval", extension._scheduled_callbacks[1].status.message)