From b93b5545d526259f20e6163d530e910f03291044 Mon Sep 17 00:00:00 2001 From: Ilia Kurenkov Date: Fri, 20 Sep 2024 21:26:28 +0200 Subject: [PATCH] Remove more esoteric uses of 'six' --- cisco_aci/datadog_checks/cisco_aci/models.py | 397 +++++++++--------- cisco_aci/tests/fixtures/metadata.py | 5 +- cisco_aci/tests/test_fabric.py | 71 ++-- .../datadog_checks/dev/compat.py | 14 - .../datadog_checks/dev/structures.py | 5 +- .../manifest_validator/common/validator.py | 6 +- .../datadog_checks/directory/traverse.py | 20 +- iis/tests/test_e2e.py | 27 +- snmp/datadog_checks/snmp/parsing/metrics.py | 4 +- .../datadog_checks/sqlserver/sqlserver.py | 3 +- 10 files changed, 248 insertions(+), 304 deletions(-) delete mode 100644 datadog_checks_dev/datadog_checks/dev/compat.py diff --git a/cisco_aci/datadog_checks/cisco_aci/models.py b/cisco_aci/datadog_checks/cisco_aci/models.py index 45a58244ed045..3081d8ffd685c 100644 --- a/cisco_aci/datadog_checks/cisco_aci/models.py +++ b/cisco_aci/datadog_checks/cisco_aci/models.py @@ -3,199 +3,210 @@ # Licensed under a 3-clause BSD style license (see LICENSE) import re +from enum import IntEnum, StrEnum +from typing import Optional + +from pydantic import BaseModel, ConfigDict, Field, computed_field, field_validator, model_validator + +""" +Cisco ACI Response Models +""" + + +class NodeAttributes(BaseModel): + address: Optional[str] = None + fabric_st: Optional[str] = Field(default=None, alias="fabricSt") + role: Optional[str] = None + dn: Optional[str] = None + name: Optional[str] = None + model: Optional[str] = None + version: Optional[str] = None + serial: Optional[str] = None + vendor: Optional[str] = Field(default='cisco') + namespace: Optional[str] = Field(default='default') -import six - -if six.PY3: - from enum import IntEnum, StrEnum - from typing import Optional - - from pydantic import BaseModel, ConfigDict, Field, computed_field, field_validator, model_validator - - """ - Cisco ACI Response Models - """ - - class NodeAttributes(BaseModel): - address: Optional[str] = None - fabric_st: Optional[str] = Field(default=None, alias="fabricSt") - role: Optional[str] = None - dn: Optional[str] = None - name: Optional[str] = None - model: Optional[str] = None - version: Optional[str] = None - serial: Optional[str] = None - vendor: Optional[str] = Field(default='cisco') - namespace: Optional[str] = Field(default='default') - - @computed_field - @property - def device_type(self) -> str: - if self.role in ['leaf', 'spine']: - return 'switch' - return 'other' - - class Node(BaseModel): - attributes: NodeAttributes - - class EthpmPhysIfAttributes(BaseModel): - oper_st: Optional[str] = Field(default=None, alias="operSt") - oper_router_mac: Optional[str] = Field(default=None, alias="operRouterMac") - - class EthpmPhysIf(BaseModel): - attributes: EthpmPhysIfAttributes - - class L1PhysIfAttributes(BaseModel): - admin_st: Optional[str] = Field(default=None, alias="adminSt") - id: Optional[str] = None - name: Optional[str] = None - desc: Optional[str] = None - router_mac: Optional[str] = Field(default=None, alias="routerMac") - - @model_validator(mode='before') - @classmethod - def validate_name(cls, data: dict) -> dict: - if isinstance(data, dict): - name = data.get('name') - id = data.get('id') - if not name or name == '': - data['name'] = id - return data - - class PhysIf(BaseModel): - attributes: L1PhysIfAttributes - children: Optional[list] = Field(default_factory=list) - - @computed_field - @property - def ethpm_phys_if(self) -> Optional[EthpmPhysIf]: - for child in self.children: - if 'ethpmPhysIf' in child: - return EthpmPhysIf(**child['ethpmPhysIf']) - return None + @computed_field + @property + def device_type(self) -> str: + if self.role in ['leaf', 'spine']: + return 'switch' + return 'other' - """ - NDM Models - """ - - class DeviceMetadata(BaseModel): - id: Optional[str] = Field(default=None) - id_tags: list = Field(default_factory=list) - tags: list = Field(default_factory=list) - name: Optional[str] = Field(default=None) - ip_address: Optional[str] = Field(default=None) - model: Optional[str] = Field(default=None) - fabric_st: Optional[str] = Field(default=None, exclude=True) - vendor: Optional[str] = Field(default=None) - version: Optional[str] = Field(default=None) - serial_number: Optional[str] = Field(default=None) - device_type: Optional[str] = Field(default=None) - integration: Optional[str] = Field(default='cisco-aci') - - @computed_field - @property - def status(self) -> int: - mapping = { - 'active': 1, - 'inactive': 2, - 'disabled': 2, - 'discovering': 2, - 'undiscovered': 2, - 'unsupported': 2, - 'unknown': 2, - } - return mapping.get(self.fabric_st, 2) - - class DeviceMetadataList(BaseModel): - device_metadata: list = Field(default_factory=list) - - class AdminStatus(IntEnum): - UP = 1 - DOWN = 2 - - class OperStatus(IntEnum): - UP = 1 - DOWN = 2 - - class Status(StrEnum): - UP = "up" - DOWN = "down" - WARNING = "warning" - OFF = "off" - - class InterfaceMetadata(BaseModel): - device_id: Optional[str] = Field(default=None) - id_tags: list = Field(default_factory=list) - index: Optional[int] = Field(default=None) - name: Optional[str] = Field(default=None) - description: Optional[str] = Field(default=None) - mac_address: Optional[str] = Field(default=None) - admin_status: Optional[AdminStatus] = Field(default=None) - oper_status: Optional[OperStatus] = Field(default=None) - integration: Optional[str] = Field(default='cisco-aci') - - model_config = ConfigDict(validate_assignment=True, use_enum_values=True) - - @field_validator("admin_status", mode="before") - @classmethod - def parse_admin_status(cls, admin_status: AdminStatus | None) -> AdminStatus | None: - if not admin_status: - return None - if admin_status == "up" or admin_status == 1: - return AdminStatus.UP - return AdminStatus.DOWN - - @field_validator("oper_status", mode="before") - @classmethod - def parse_oper_status(cls, oper_status: OperStatus | None) -> OperStatus | None: - if not oper_status: - return None - if oper_status == "up" or oper_status == 1: - return OperStatus.UP - return OperStatus.DOWN - - @field_validator("index", mode="before") - @classmethod - def parse_index(cls, index: str | int | None) -> int | None: - if type(index) == str: - split = re.split('eth|/', index) - return int(split[-1]) - if type(index) == int: - return index - return None - @computed_field - @property - def status(self) -> Status: - if self.admin_status == AdminStatus.UP: - if self.oper_status == OperStatus.UP: - return Status.UP - if self.oper_status == OperStatus.DOWN: - return Status.DOWN - return Status.WARNING - if self.admin_status == AdminStatus.DOWN: - if self.oper_status == OperStatus.UP: - return Status.DOWN - if self.oper_status == OperStatus.DOWN: - return Status.OFF - return Status.WARNING - return Status.DOWN - - class InterfaceMetadataList(BaseModel): - interface_metadata: list = Field(default_factory=list) - - class NetworkDevicesMetadata(BaseModel): - namespace: str = None - devices: Optional[list[DeviceMetadata]] = Field(default_factory=list) - interfaces: Optional[list[InterfaceMetadata]] = Field(default_factory=list) - collect_timestamp: Optional[int] = None - size: Optional[int] = Field(default=0, exclude=True) - - model_config = ConfigDict(validate_assignment=True, use_enum_values=True) - - def append_metadata(self, metadata: DeviceMetadata | InterfaceMetadata): - if isinstance(metadata, DeviceMetadata): - self.devices.append(metadata) - if isinstance(metadata, InterfaceMetadata): - self.interfaces.append(metadata) - self.size += 1 +class Node(BaseModel): + attributes: NodeAttributes + + +class EthpmPhysIfAttributes(BaseModel): + oper_st: Optional[str] = Field(default=None, alias="operSt") + oper_router_mac: Optional[str] = Field(default=None, alias="operRouterMac") + + +class EthpmPhysIf(BaseModel): + attributes: EthpmPhysIfAttributes + + +class L1PhysIfAttributes(BaseModel): + admin_st: Optional[str] = Field(default=None, alias="adminSt") + id: Optional[str] = None + name: Optional[str] = None + desc: Optional[str] = None + router_mac: Optional[str] = Field(default=None, alias="routerMac") + + @model_validator(mode='before') + @classmethod + def validate_name(cls, data: dict) -> dict: + if isinstance(data, dict): + name = data.get('name') + id = data.get('id') + if not name or name == '': + data['name'] = id + return data + + +class PhysIf(BaseModel): + attributes: L1PhysIfAttributes + children: Optional[list] = Field(default_factory=list) + + @computed_field + @property + def ethpm_phys_if(self) -> Optional[EthpmPhysIf]: + for child in self.children: + if 'ethpmPhysIf' in child: + return EthpmPhysIf(**child['ethpmPhysIf']) + return None + + +""" +NDM Models +""" + + +class DeviceMetadata(BaseModel): + id: Optional[str] = Field(default=None) + id_tags: list = Field(default_factory=list) + tags: list = Field(default_factory=list) + name: Optional[str] = Field(default=None) + ip_address: Optional[str] = Field(default=None) + model: Optional[str] = Field(default=None) + fabric_st: Optional[str] = Field(default=None, exclude=True) + vendor: Optional[str] = Field(default=None) + version: Optional[str] = Field(default=None) + serial_number: Optional[str] = Field(default=None) + device_type: Optional[str] = Field(default=None) + integration: Optional[str] = Field(default='cisco-aci') + + @computed_field + @property + def status(self) -> int: + mapping = { + 'active': 1, + 'inactive': 2, + 'disabled': 2, + 'discovering': 2, + 'undiscovered': 2, + 'unsupported': 2, + 'unknown': 2, + } + return mapping.get(self.fabric_st, 2) + + +class DeviceMetadataList(BaseModel): + device_metadata: list = Field(default_factory=list) + + +class AdminStatus(IntEnum): + UP = 1 + DOWN = 2 + + +class OperStatus(IntEnum): + UP = 1 + DOWN = 2 + + +class Status(StrEnum): + UP = "up" + DOWN = "down" + WARNING = "warning" + OFF = "off" + + +class InterfaceMetadata(BaseModel): + device_id: Optional[str] = Field(default=None) + id_tags: list = Field(default_factory=list) + index: Optional[int] = Field(default=None) + name: Optional[str] = Field(default=None) + description: Optional[str] = Field(default=None) + mac_address: Optional[str] = Field(default=None) + admin_status: Optional[AdminStatus] = Field(default=None) + oper_status: Optional[OperStatus] = Field(default=None) + integration: Optional[str] = Field(default='cisco-aci') + + model_config = ConfigDict(validate_assignment=True, use_enum_values=True) + + @field_validator("admin_status", mode="before") + @classmethod + def parse_admin_status(cls, admin_status: AdminStatus | None) -> AdminStatus | None: + if not admin_status: + return None + if admin_status == "up" or admin_status == 1: + return AdminStatus.UP + return AdminStatus.DOWN + + @field_validator("oper_status", mode="before") + @classmethod + def parse_oper_status(cls, oper_status: OperStatus | None) -> OperStatus | None: + if not oper_status: + return None + if oper_status == "up" or oper_status == 1: + return OperStatus.UP + return OperStatus.DOWN + + @field_validator("index", mode="before") + @classmethod + def parse_index(cls, index: str | int | None) -> int | None: + if type(index) == str: + split = re.split('eth|/', index) + return int(split[-1]) + if type(index) == int: + return index + return None + + @computed_field + @property + def status(self) -> Status: + if self.admin_status == AdminStatus.UP: + if self.oper_status == OperStatus.UP: + return Status.UP + if self.oper_status == OperStatus.DOWN: + return Status.DOWN + return Status.WARNING + if self.admin_status == AdminStatus.DOWN: + if self.oper_status == OperStatus.UP: + return Status.DOWN + if self.oper_status == OperStatus.DOWN: + return Status.OFF + return Status.WARNING + return Status.DOWN + + +class InterfaceMetadataList(BaseModel): + interface_metadata: list = Field(default_factory=list) + + +class NetworkDevicesMetadata(BaseModel): + namespace: str = None + devices: Optional[list[DeviceMetadata]] = Field(default_factory=list) + interfaces: Optional[list[InterfaceMetadata]] = Field(default_factory=list) + collect_timestamp: Optional[int] = None + size: Optional[int] = Field(default=0, exclude=True) + + model_config = ConfigDict(validate_assignment=True, use_enum_values=True) + + def append_metadata(self, metadata: DeviceMetadata | InterfaceMetadata): + if isinstance(metadata, DeviceMetadata): + self.devices.append(metadata) + if isinstance(metadata, InterfaceMetadata): + self.interfaces.append(metadata) + self.size += 1 diff --git a/cisco_aci/tests/fixtures/metadata.py b/cisco_aci/tests/fixtures/metadata.py index 08cd4a837da9b..0052b27c5448e 100644 --- a/cisco_aci/tests/fixtures/metadata.py +++ b/cisco_aci/tests/fixtures/metadata.py @@ -2,10 +2,7 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -import six - -if six.PY3: - from datadog_checks.cisco_aci.models import DeviceMetadataList, InterfaceMetadata, NetworkDevicesMetadata +from datadog_checks.cisco_aci.models import DeviceMetadataList, InterfaceMetadata, NetworkDevicesMetadata DEVICE_METADATA = [ { diff --git a/cisco_aci/tests/test_fabric.py b/cisco_aci/tests/test_fabric.py index 567c763534602..2b9c97d7a2a0b 100644 --- a/cisco_aci/tests/test_fabric.py +++ b/cisco_aci/tests/test_fabric.py @@ -2,21 +2,17 @@ # All rights reserved # Licensed under Simplified BSD License (see LICENSE) -import six +from freezegun import freeze_time from datadog_checks.base.utils.containers import hash_mutable from datadog_checks.cisco_aci import CiscoACICheck from datadog_checks.cisco_aci.api import Api -if six.PY3: - from .fixtures.metadata import ( - EXPECTED_INTERFACE_METADATA, - EXPECTED_METADATA_EVENTS, - ) - -from freezegun import freeze_time - from . import common +from .fixtures.metadata import ( + EXPECTED_INTERFACE_METADATA, + EXPECTED_METADATA_EVENTS, +) def test_fabric_mocked(aggregator): @@ -86,38 +82,35 @@ def test_fabric_mocked(aggregator): with freeze_time("2012-01-14 03:21:34"): check.check({}) - if six.PY3: - ndm_metadata = aggregator.get_event_platform_events("network-devices-metadata") - expected_metadata = [event.model_dump(mode="json", exclude_none=True) for event in EXPECTED_METADATA_EVENTS] - assert ndm_metadata == expected_metadata + ndm_metadata = aggregator.get_event_platform_events("network-devices-metadata") + expected_metadata = [event.model_dump(mode="json", exclude_none=True) for event in EXPECTED_METADATA_EVENTS] + assert ndm_metadata == expected_metadata - interface_tag_mapping = { - 'default:10.0.200.0': (device_hn101, hn101), - 'default:10.0.200.1': (device_hn102, hn102), - 'default:10.0.200.5': (device_hn201, hn201), - 'default:10.0.200.2': (device_hn202, hn202), - } + interface_tag_mapping = { + 'default:10.0.200.0': (device_hn101, hn101), + 'default:10.0.200.1': (device_hn102, hn102), + 'default:10.0.200.5': (device_hn201, hn201), + 'default:10.0.200.2': (device_hn202, hn202), + } - for interface in EXPECTED_INTERFACE_METADATA: - device_hn, hn = interface_tag_mapping.get(interface.device_id) - device_namespace, device_ip = interface.device_id.split(':') - interface_tags = [ - 'port:{}'.format(interface.name), - 'medium:broadcast', - 'snmpTrapSt:enable', - 'node_id:{}'.format(hn.split('-')[-1]), - 'fabric_pod_id:1', - 'device_ip:{}'.format(device_ip), - 'device_namespace:{}'.format(device_namespace), - 'device_hostname:{}'.format(device_hn), - 'device_id:{}'.format(interface.device_id), - 'port.status:{}'.format(interface.status), - 'dd.internal.resource:ndm_device_user_tags:{}'.format(interface.device_id), - 'dd.internal.resource:ndm_interface_user_tags:{}:{}'.format(interface.device_id, interface.index), - ] - aggregator.assert_metric( - 'cisco_aci.fabric.port.status', value=1.0, tags=interface_tags, hostname=device_hn - ) + for interface in EXPECTED_INTERFACE_METADATA: + device_hn, hn = interface_tag_mapping.get(interface.device_id) + device_namespace, device_ip = interface.device_id.split(':') + interface_tags = [ + 'port:{}'.format(interface.name), + 'medium:broadcast', + 'snmpTrapSt:enable', + 'node_id:{}'.format(hn.split('-')[-1]), + 'fabric_pod_id:1', + 'device_ip:{}'.format(device_ip), + 'device_namespace:{}'.format(device_namespace), + 'device_hostname:{}'.format(device_hn), + 'device_id:{}'.format(interface.device_id), + 'port.status:{}'.format(interface.status), + 'dd.internal.resource:ndm_device_user_tags:{}'.format(interface.device_id), + 'dd.internal.resource:ndm_interface_user_tags:{}:{}'.format(interface.device_id, interface.index), + ] + aggregator.assert_metric('cisco_aci.fabric.port.status', value=1.0, tags=interface_tags, hostname=device_hn) metric_name = 'cisco_aci.fabric.port.ingr_total.bytes.cum' aggregator.assert_metric( diff --git a/datadog_checks_dev/datadog_checks/dev/compat.py b/datadog_checks_dev/datadog_checks/dev/compat.py deleted file mode 100644 index d890c422df626..0000000000000 --- a/datadog_checks_dev/datadog_checks/dev/compat.py +++ /dev/null @@ -1,14 +0,0 @@ -# (C) Datadog, Inc. 2018-present -# All rights reserved -# Licensed under a 3-clause BSD style license (see LICENSE) -import six - -if six.PY3: - from json import JSONDecodeError - - FileNotFoundError = FileNotFoundError - PermissionError = PermissionError -else: - JSONDecodeError = ValueError - FileNotFoundError = IOError - PermissionError = IOError diff --git a/datadog_checks_dev/datadog_checks/dev/structures.py b/datadog_checks_dev/datadog_checks/dev/structures.py index 317a3004f53bb..9834f308de087 100644 --- a/datadog_checks_dev/datadog_checks/dev/structures.py +++ b/datadog_checks_dev/datadog_checks/dev/structures.py @@ -6,14 +6,11 @@ from shutil import rmtree from tempfile import mkdtemp -import six - from ._env import e2e_active, get_env_vars, remove_env_vars, set_env_vars, tear_down_env from .warn import warning -@six.add_metaclass(abc.ABCMeta) -class LazyFunction(object): +class LazyFunction(abc.ABC): """Abstract base class for lazy function calls.""" @abc.abstractmethod diff --git a/datadog_checks_dev/datadog_checks/dev/tooling/manifest_validator/common/validator.py b/datadog_checks_dev/datadog_checks/dev/tooling/manifest_validator/common/validator.py index 20fd40589bb3d..add075a5cf969 100644 --- a/datadog_checks_dev/datadog_checks/dev/tooling/manifest_validator/common/validator.py +++ b/datadog_checks_dev/datadog_checks/dev/tooling/manifest_validator/common/validator.py @@ -7,8 +7,6 @@ import os from typing import Dict # noqa: F401 -import six - from ...datastructures import JSONDict from ...git import git_show_file from ...utils import get_metadata_file, has_logs, is_metric_in_metadata_file, read_metadata_rows @@ -29,8 +27,7 @@ def __repr__(self): return str(self) -@six.add_metaclass(abc.ABCMeta) -class BaseManifestValidator(object): +class BaseManifestValidator(abc.ABC): def __init__( self, is_extras=False, @@ -64,6 +61,7 @@ def should_validate(self): return True return False + @abc.abstractmethod def validate(self, check_name, manifest, should_fix): # type: (str, Dict, bool) -> None """Validates the decoded manifest. Will perform inline changes if fix is true""" diff --git a/directory/datadog_checks/directory/traverse.py b/directory/datadog_checks/directory/traverse.py index 09526805a0698..38db22d2c6cfe 100644 --- a/directory/datadog_checks/directory/traverse.py +++ b/directory/datadog_checks/directory/traverse.py @@ -1,18 +1,13 @@ # (C) Datadog, Inc. 2018-present # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) -import platform -import sys - -import six - try: from os import scandir except ImportError: from scandir import scandir -def _walk(top, onerror=None, followlinks=False): +def walk(top, onerror=None, followlinks=False): """A simplified and modified version of stdlib's `os.walk` that yields the `os.DirEntry` objects that `scandir` produces during traversal instead of paths as strings. @@ -72,16 +67,3 @@ def _walk(top, onerror=None, followlinks=False): for dir_entry in dirs: for entry in walk(dir_entry.path, onerror, followlinks): yield entry - - -if six.PY3 or platform.system() != 'Windows': - walk = _walk -else: - # Fix for broken unicode handling on Windows on Python 2.x, see: - # https://github.com/benhoyt/scandir/issues/54 - file_system_encoding = sys.getfilesystemencoding() - - def walk(top, onerror, followlinks): - if isinstance(top, bytes): - top = top.decode(file_system_encoding) - return _walk(top, onerror, followlinks) diff --git a/iis/tests/test_e2e.py b/iis/tests/test_e2e.py index 8eae4525e3389..21903d36fe02b 100644 --- a/iis/tests/test_e2e.py +++ b/iis/tests/test_e2e.py @@ -2,12 +2,8 @@ # All rights reserved # Licensed under Simplified BSD License (see LICENSE) -import socket - import pytest -import six -from datadog_checks.base import AgentCheck from datadog_checks.dev.subprocess import run_command from datadog_checks.dev.utils import get_active_env from datadog_checks.iis import IIS @@ -22,31 +18,18 @@ def test_e2e(dd_agent_check, aggregator, instance): Check should run without error if IIS is installed """ aggregator = dd_agent_check(instance) - if six.PY3: - aggregator.assert_service_check('iis.windows.perf.health', IIS.OK) + aggregator.assert_service_check('iis.windows.perf.health', IIS.OK) @pytest.fixture def iis_host(aggregator): - if six.PY2: - # the python2 version of the check uses the configured hostname, - # which is the hostnane of the docker host. - return 'iis_host:{}'.format(socket.gethostname()) - else: - # the python3 version of the check uses the perf counter server field, - # which is the hostname of the container. - result = run_container_command(['hostname']) - hostname = result.stdout.strip() - return 'iis_host:{}'.format(hostname) + result = run_container_command(['hostname']) + hostname = result.stdout.strip() + return 'iis_host:{}'.format(hostname) def normalize_tags(tags): - if six.PY2: - # The python2 version of the check calls self.normalize_tag - a = AgentCheck() - return [a.normalize_tag(tag) for tag in tags] - else: - return tags + return tags def run_container_command(command): diff --git a/snmp/datadog_checks/snmp/parsing/metrics.py b/snmp/datadog_checks/snmp/parsing/metrics.py index 3b5aea30d7290..92b8707509793 100644 --- a/snmp/datadog_checks/snmp/parsing/metrics.py +++ b/snmp/datadog_checks/snmp/parsing/metrics.py @@ -8,8 +8,6 @@ from logging import Logger # noqa: F401 from typing import Dict, List, NamedTuple, Optional, Pattern, Sequence, TypedDict, Union, cast -import six - from datadog_checks.base import ConfigurationError from ..models import OID @@ -558,7 +556,7 @@ def _parse_index_slices(metric_tag): if not isinstance(rule, dict) or set(rule) != {'start', 'end'}: raise ConfigurationError('Transform rule must contain start and end. Invalid rule: {}'.format(rule)) start, end = rule['start'], rule['end'] - if not isinstance(start, six.integer_types) or not isinstance(end, six.integer_types): + if not isinstance(start, int) or not isinstance(end, int): raise ConfigurationError('Transform rule start and end must be integers. Invalid rule: {}'.format(rule)) if start > end: raise ConfigurationError( diff --git a/sqlserver/datadog_checks/sqlserver/sqlserver.py b/sqlserver/datadog_checks/sqlserver/sqlserver.py index 80e878c97833d..c2f9599b308d5 100644 --- a/sqlserver/datadog_checks/sqlserver/sqlserver.py +++ b/sqlserver/datadog_checks/sqlserver/sqlserver.py @@ -7,7 +7,6 @@ import time from collections import defaultdict -import six from cachetools import TTLCache from datadog_checks.base import AgentCheck @@ -905,7 +904,7 @@ def collect_metrics(self): instance_results = {} engine_edition = self.static_info_cache.get(STATIC_INFO_ENGINE_EDITION, "") # Execute the `fetch_all` operations first to minimize the database calls - for cls, metric_names in six.iteritems(self.instance_per_type_metrics): + for cls, metric_names in self.instance_per_type_metrics.items(): if not metric_names: instance_results[cls] = None, None else: