Skip to content

Commit b359f8a

Browse files
committed
Linter fixes
1 parent 345fea4 commit b359f8a

File tree

7 files changed

+53
-39
lines changed

7 files changed

+53
-39
lines changed

dynatrace_extension/sdk/communication.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ def get_extension_config(self) -> str:
343343
def get_feature_sets(self) -> dict[str, list[str]]:
344344
# This is only called from dt-sdk run, where PyYaml is installed because of dt-cli
345345
# Do NOT move this to the top of the file
346-
import yaml # noqa: PLC0415
346+
import yaml
347347

348348
# Grab the feature sets from the extension.yaml file
349349
extension_yaml = yaml.safe_load(self.extension_config)

dynatrace_extension/sdk/extension.py

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,10 @@
33
# SPDX-License-Identifier: MIT
44

55
import logging
6-
import sched
76
import signal
87
import sys
98
import threading
109
import time
11-
from apscheduler.schedulers.background import BackgroundScheduler
12-
from apscheduler.executors.pool import ThreadPoolExecutor
13-
from apscheduler.triggers.interval import IntervalTrigger
1410
from argparse import ArgumentParser
1511
from collections.abc import Callable
1612
from datetime import datetime, timedelta, timezone
@@ -20,6 +16,10 @@
2016
from threading import Lock, RLock, active_count
2117
from typing import Any, ClassVar, NamedTuple
2218

19+
from apscheduler.executors.pool import ThreadPoolExecutor # type: ignore
20+
from apscheduler.schedulers.background import BackgroundScheduler # type: ignore
21+
from apscheduler.triggers.interval import IntervalTrigger # type: ignore
22+
2323
from .activation import ActivationConfig, ActivationType
2424
from .callback import WrappedCallback
2525
from .communication import CommunicationClient, DebugClient, HttpClient
@@ -175,9 +175,9 @@ def _add_sfm_metric(metric: Metric, sfm_metrics: list[Metric] | None = None):
175175

176176

177177
class ExecutorType(str, Enum):
178-
CALLBACKS = 'callbacks'
179-
INTERNAL = 'internal'
180-
HEARTBEAT = 'heartbeat'
178+
CALLBACKS = "callbacks"
179+
INTERNAL = "internal"
180+
HEARTBEAT = "heartbeat"
181181

182182

183183
class Extension:
@@ -249,11 +249,13 @@ def __init__(self, name: str = "") -> None:
249249
self._running_callbacks_lock: Lock = Lock()
250250

251251
# Scheduler and executors for the callbacks and internal methods
252-
self._scheduler = BackgroundScheduler(executors={
253-
ExecutorType.CALLBACKS: ThreadPoolExecutor(max_workers=CALLBACKS_THREAD_POOL_SIZE),
254-
ExecutorType.INTERNAL: ThreadPoolExecutor(max_workers=INTERNAL_THREAD_POOL_SIZE),
255-
ExecutorType.HEARTBEAT: ThreadPoolExecutor(max_workers=HEARTBEAT_THREAD_POOL_SIZE)
256-
})
252+
self._scheduler = BackgroundScheduler(
253+
executors={
254+
ExecutorType.CALLBACKS: ThreadPoolExecutor(max_workers=CALLBACKS_THREAD_POOL_SIZE),
255+
ExecutorType.INTERNAL: ThreadPoolExecutor(max_workers=INTERNAL_THREAD_POOL_SIZE),
256+
ExecutorType.HEARTBEAT: ThreadPoolExecutor(max_workers=HEARTBEAT_THREAD_POOL_SIZE),
257+
}
258+
)
257259

258260
# Extension metrics
259261
self._metrics_lock = RLock()
@@ -376,10 +378,12 @@ def _schedule_callback(self, callback: WrappedCallback):
376378
callback.running_in_sim = self._running_in_sim
377379
self._scheduled_callbacks.append(callback)
378380

379-
self._scheduler.add_job(self._run_callback, args=[callback],
381+
self._scheduler.add_job(
382+
self._run_callback,
383+
args=[callback],
380384
executor=ExecutorType.CALLBACKS,
381385
trigger=IntervalTrigger(seconds=callback.interval.total_seconds()),
382-
next_run_time=datetime.now() + timedelta(seconds=callback.initial_wait_time())
386+
next_run_time=datetime.now() + timedelta(seconds=callback.initial_wait_time()),
383387
)
384388

385389
def schedule(
@@ -813,10 +817,15 @@ def _parse_args(self):
813817

814818
if not self._is_fastcheck:
815819
try:
816-
# TODO: is it surely okay to schedule hearbeat this way? Originally it was scheduled in the very same scheduler, which would starve heartbeat if any callback took too long
820+
# TODO: is it surely okay to schedule hearbeat this way? Originally it was scheduled in the very same scheduler,
821+
# which would starve heartbeat if any callback took too long
817822
# On the other hand, those callbacks inserted specific potentially risky jobs to different executors, so it should be okay?
818823
# Why did heartbeat have a different priority (higher or lower?)
819-
self._scheduler.add_job(self._heartbeat, executor=ExecutorType.HEARTBEAT, trigger=IntervalTrigger(seconds=HEARTBEAT_INTERVAL.total_seconds()))
824+
self._scheduler.add_job(
825+
self._heartbeat,
826+
executor=ExecutorType.HEARTBEAT,
827+
trigger=IntervalTrigger(seconds=HEARTBEAT_INTERVAL.total_seconds()),
828+
)
820829
self.initialize()
821830
if not self.is_helper:
822831
self.schedule(self.query, timedelta(minutes=1))
@@ -870,40 +879,49 @@ def _run_callback(self, callback: WrappedCallback):
870879
with self._running_callbacks_lock:
871880
self._running_callbacks.pop(current_thread_id, None)
872881

873-
874882
def _start_extension_loop(self):
875883
api_logger.debug(f"Starting main loop for monitoring configuration: '{self.monitoring_config_name}'")
876884

877885
# These were scheduled before the extension started, schedule them now
878886
for callback in self._scheduled_callbacks_before_run:
879887
self._schedule_callback(callback)
880888

881-
882-
self._scheduler.add_job(self._send_metrics, executor=ExecutorType.INTERNAL,
889+
self._scheduler.add_job(
890+
self._send_metrics,
891+
executor=ExecutorType.INTERNAL,
883892
trigger=IntervalTrigger(seconds=METRIC_SENDING_INTERVAL.total_seconds()),
884-
next_run_time=datetime.now())
893+
next_run_time=datetime.now(),
894+
)
885895

886-
self._scheduler.add_job(self._send_buffered_events, executor=ExecutorType.INTERNAL,
896+
self._scheduler.add_job(
897+
self._send_buffered_events,
898+
executor=ExecutorType.INTERNAL,
887899
trigger=IntervalTrigger(seconds=METRIC_SENDING_INTERVAL.total_seconds()),
888-
next_run_time=datetime.now())
900+
next_run_time=datetime.now(),
901+
)
889902

890-
self._scheduler.add_job(self._send_sfm_metrics, executor=ExecutorType.INTERNAL,
903+
self._scheduler.add_job(
904+
self._send_sfm_metrics,
905+
executor=ExecutorType.INTERNAL,
891906
trigger=IntervalTrigger(seconds=SFM_METRIC_SENDING_INTERVAL.total_seconds()),
892-
next_run_time=datetime.now())
907+
next_run_time=datetime.now(),
908+
)
893909

894-
self._scheduler.add_job(self._update_cluster_time_diff, executor=ExecutorType.INTERNAL,
910+
self._scheduler.add_job(
911+
self._update_cluster_time_diff,
912+
executor=ExecutorType.INTERNAL,
895913
trigger=IntervalTrigger(seconds=TIME_DIFF_INTERVAL.total_seconds()),
896-
next_run_time=datetime.now())
914+
next_run_time=datetime.now(),
915+
)
897916

898917
self._scheduler.start()
899-
918+
900919
try:
901920
while self._scheduler.running:
902921
time.sleep(1)
903922
except Exception:
904923
self._scheduler.shutdown()
905924

906-
907925
def _send_metrics(self):
908926
with self._metrics_lock:
909927
with self._internal_callbacks_results_lock:
@@ -1167,11 +1185,6 @@ def _send_buffered_events(self):
11671185
def _send_dt_event(self, event: dict[str, str | int | dict[str, str]]):
11681186
self._client.send_dt_event(event)
11691187

1170-
def _get_and_set_next_internal_callback_timestamp(self, callback_name: str, interval: timedelta):
1171-
next_timestamp = self._next_internal_callbacks_timestamps[callback_name]
1172-
self._next_internal_callbacks_timestamps[callback_name] += interval
1173-
return next_timestamp.timestamp()
1174-
11751188
def get_version(self) -> str:
11761189
"""Return the extension version."""
11771190
return self.activation_config.version

dynatrace_extension/sdk/status.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ def __init__(self, send_sfm_logs_function: Callable) -> None:
159159
self._ep_records: dict[str, EndpointStatusRecord] = {}
160160
self._send_sfm_logs_function = send_sfm_logs_function
161161
self._logs_to_send: list[str] = []
162-
self._datetime_now = datetime.now # Mockable datetime function
162+
self._datetime_now = datetime.now # Mockable datetime function
163163

164164
def contains_any_status(self) -> bool:
165165
return len(self._ep_records) > 0

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ dependencies = [
7373
"ruff>=0.9.10",
7474
"typer[all]",
7575
"pyyaml",
76-
"pytest"
76+
"pytest",
77+
"apscheduler"
7778
]
7879

7980
[tool.hatch.envs.lint.scripts]

tests/sdk/test_endpoints_sfm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def setUp(self, extension_name=""):
1212
self.ext.logger = MagicMock()
1313
self.ext._running_in_sim = True
1414
self.ext._client = MagicMock()
15-
self.ext._client.send_sfm_logs = MagicMock(side_effect=lambda *args, **kwargs: [])
15+
self.ext._client.send_sfm_logs = MagicMock()
1616
self.ext._is_fastcheck = False
1717
self.i = 0
1818
self.test_cases = None

tests/sdk/test_extension.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import threading
22
import time
33
import unittest
4-
from datetime import datetime, timedelta
4+
from datetime import timedelta
55
from unittest.mock import MagicMock, mock_open, patch
66

77
import pytest

tests/sdk/test_status.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def callback():
2828
ext._running_in_sim = True
2929
ext._client = DebugClient("", "", MagicMock())
3030
ext._is_fastcheck = False
31-
ext.schedule(callback, timedelta(seconds=1))
31+
ext.schedule(callback, timedelta(seconds=1))
3232
ext._scheduler.start()
3333
time.sleep(0.1)
3434
status = ext._build_current_status()

0 commit comments

Comments
 (0)