def test_snmp_getnext_call(check): instance = common.generate_instance_config( common.PLAY_WITH_GET_NEXT_METRICS) # Test that we invoke next with the correct keyword arguments that are hard to test otherwise with mock.patch("datadog_checks.snmp.snmp.hlapi.nextCmd") as nextCmd: check.check(instance) _, kwargs = nextCmd.call_args assert ("ignoreNonIncreasingOid", False) in kwargs.items() assert ("lexicographicMode", False) in kwargs.items() check = SnmpCheck('snmp', common.IGNORE_NONINCREASING_OID, {}, {}) check.check(instance) _, kwargs = nextCmd.call_args assert ("ignoreNonIncreasingOid", True) in kwargs.items() assert ("lexicographicMode", False) in kwargs.items()
def test_profile_sys_object(aggregator): instance = common.generate_instance_config([]) init_config = { 'profiles': { 'profile1': { 'definition': common.SUPPORTED_METRIC_TYPES, 'sysobjectid': '1.3.6.1.4.1.8072.3.2.10' } } } check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) for metric in common.SUPPORTED_METRIC_TYPES: metric_name = "snmp." + metric['name'] aggregator.assert_metric(metric_name, tags=common.CHECK_TAGS, count=1) aggregator.assert_all_metrics_covered()
def test_profile_sys_object_unknown(aggregator, caplog): """If the fetched sysObjectID is not referenced by any profiles, check fails.""" caplog.set_level(logging.WARNING) unknown_sysobjectid = '1.2.3.4.5' init_config = { 'profiles': { 'profile1': {'definition': {'metrics': common.SUPPORTED_METRIC_TYPES, 'sysobjectid': unknown_sysobjectid}} } } # Via config... instance = common.generate_instance_config([]) check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) aggregator.assert_service_check("snmp.can_check", status=SnmpCheck.CRITICAL, tags=common.CHECK_TAGS, at_least=1) aggregator.all_metrics_asserted() # Via network discovery... host = socket.gethostbyname(common.HOST) network = ipaddress.ip_network(u'{}/29'.format(host), strict=False).with_prefixlen instance = { 'name': 'snmp_conf', 'network_address': network, 'port': common.PORT, 'community_string': 'public', 'retries': 0, 'discovery_interval': 0, } check = SnmpCheck('snmp', init_config, [instance]) check._start_discovery() time.sleep(2) # Give discovery a chance to fail finding a matching profile. check.check(instance) check._running = False check._thread.join() for record in caplog.records: if "Host {} didn't match a profile".format(host) in record.message: break else: pytest.fail()
def test_profile_sys_object_prefix(aggregator, most_specific_oid, least_specific_oid): instance = common.generate_instance_config([]) most_specific_profile = { 'metrics': common.SUPPORTED_METRIC_TYPES, 'sysobjectid': most_specific_oid } least_specific_profile = { 'metrics': common.CAST_METRICS, 'sysobjectid': least_specific_oid } init_config = { 'profiles': { 'most': { 'definition': most_specific_profile }, 'least': { 'definition': least_specific_profile } } } check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) matching_profile_tags = common.CHECK_TAGS + ['snmp_profile:most'] ignored_profile_tags = common.CHECK_TAGS + ['snmp_profile:least'] for metric in most_specific_profile['metrics']: metric_name = "snmp." + metric['name'] aggregator.assert_metric(metric_name, tags=matching_profile_tags, count=1) for metric in least_specific_profile['metrics']: metric_name = "snmp." + metric['name'] aggregator.assert_metric(metric_name, tags=ignored_profile_tags, count=0) aggregator.assert_metric('snmp.sysUpTimeInstance', tags=matching_profile_tags, count=1) aggregator.assert_all_metrics_covered()
def test_timeout(aggregator, caplog): caplog.set_level(logging.WARNING) instance = common.generate_instance_config([]) instance['community_string'] = 'public_delay' instance['timeout'] = 1 instance['retries'] = 0 check = SnmpCheck('snmp', {}, [instance]) check.check(instance) aggregator.assert_service_check("snmp.can_check", status=SnmpCheck.CRITICAL, at_least=1) aggregator.all_metrics_asserted() for record in caplog.records: if "No SNMP response received before timeout for instance" in record.message: break else: pytest.fail()
def test_discovery(aggregator): host = socket.gethostbyname(common.HOST) network = ipaddress.ip_network(u'{}/29'.format(host), strict=False).with_prefixlen check_tags = ['snmp_device:{}'.format(host), 'snmp_profile:profile1'] instance = { 'name': 'snmp_conf', # Make sure the check handles bytes 'network_address': network.encode('utf-8'), 'port': common.PORT, 'community_string': 'public', 'retries': 0, 'discovery_interval': 0, } init_config = { 'profiles': { 'profile1': { 'definition': { 'metrics': common.SUPPORTED_METRIC_TYPES, 'sysobjectid': '1.3.6.1.4.1.8072.*' } } } } check = SnmpCheck('snmp', init_config, [instance]) try: for _ in range(30): check.check(instance) if len(aggregator.metric_names) > 1: break time.sleep(1) aggregator.reset() finally: check._running = False check._thread.join() for metric in common.SUPPORTED_METRIC_TYPES: metric_name = "snmp." + metric['name'] aggregator.assert_metric(metric_name, tags=check_tags, count=1) aggregator.assert_metric('snmp.sysUpTimeInstance') aggregator.assert_metric('snmp.discovered_devices_count', tags=['network:{}'.format(network)]) aggregator.assert_all_metrics_covered()
def test_profile_sysoid_list(aggregator, caplog): definition = { 'metric_tags': [{'OID': '1.3.6.1.2.1.1.2', 'symbol': 'sysoid', 'tag': 'snmp_oid'}], 'metrics': [{'OID': "1.3.6.1.2.1.7.1.0", 'name': "IAmACounter32"}], 'sysobjectid': ['1.3.6.1.4.1.232.1.2', '1.3.6.1.4.1.1.2.1.3.4'], } init_config = {'profiles': {'profile1': {'definition': definition}}} devices_matched = [ {'community_string': 'hpe-proliant', 'sysobjectid': '1.3.6.1.4.1.232.1.2'}, {'community_string': 'generic-router', 'sysobjectid': '1.3.6.1.4.1.1.2.1.3.4'}, ] common_tags = common.CHECK_TAGS + ['snmp_profile:profile1'] for device in devices_matched: instance = common.generate_instance_config([]) instance['community_string'] = device['community_string'] check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) tags = common_tags + ['snmp_oid:{}'.format(device['sysobjectid'])] aggregator.assert_metric('snmp.IAmACounter32', tags=tags, count=1) aggregator.assert_metric('snmp.devices_monitored', tags=tags, count=1, value=1) common.assert_common_metrics(aggregator, tags) aggregator.assert_all_metrics_covered() aggregator.reset() caplog.at_level(logging.WARNING) devices_not_matched = [ {'community_string': 'cisco-3850', 'sysobjectid': '1.3.6.1.4.1.9.1.1745'}, ] for device in devices_not_matched: instance = common.generate_instance_config([]) instance['community_string'] = device['community_string'] check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) assert 'No profile matching sysObjectID 1.3.6.1.4.1.9.1.1745' in caplog.text aggregator.assert_metric('snmp.devices_monitored', tags=common.CHECK_TAGS, count=1, value=1) common.assert_common_metrics(aggregator, common.CHECK_TAGS) aggregator.assert_all_metrics_covered() aggregator.reset() caplog.clear()
def test_discovery_devices_monitored_count(read_mock, aggregator): read_mock.return_value = '["192.168.0.1","192.168.0.2"]' host = socket.gethostbyname(common.HOST) network = ipaddress.ip_network(u'{}/29'.format(host), strict=False).with_prefixlen check_tags = [ 'autodiscovery_subnet:{}'.format(to_native_string(network)), ] instance = { 'name': 'snmp_conf', # Make sure the check handles bytes 'network_address': to_native_string(network), 'port': common.PORT, 'community_string': 'public', 'retries': 0, 'discovery_interval': 0, } init_config = { 'profiles': { 'profile1': { 'definition': { 'metrics': common.SUPPORTED_METRIC_TYPES, 'sysobjectid': '1.3.6.1.4.1.8072.*' } } } } check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) check._running = False aggregator.assert_metric('snmp.discovered_devices_count', tags=['network:{}'.format(network)]) for device_ip in ['192.168.0.1', '192.168.0.2']: tags = check_tags + ['snmp_device:{}'.format(device_ip)] aggregator.assert_metric('snmp.devices_monitored', metric_type=aggregator.GAUGE, value=1, count=1, tags=tags) aggregator.assert_all_metrics_covered()
def test_custom_mib(aggregator): instance = common.generate_instance_config(common.DUMMY_MIB_OID) instance["community_string"] = "dummy" check = SnmpCheck('snmp', common.MIBS_FOLDER, [instance]) check.check(instance) # Test metrics for metric in common.DUMMY_MIB_OID: metric_name = "snmp." + (metric.get('name') or metric.get('symbol')) aggregator.assert_metric(metric_name, tags=common.CHECK_TAGS, at_least=1) # Test service check aggregator.assert_service_check("snmp.can_check", status=SnmpCheck.OK, tags=common.CHECK_TAGS, at_least=1)
def test_profile_by_file(aggregator): instance = common.generate_instance_config([]) instance['profile'] = 'profile1' with temp_dir() as tmp: profile_file = os.path.join(tmp, 'profile1.yaml') with open(profile_file, 'w') as f: f.write(yaml.safe_dump({'metrics': common.SUPPORTED_METRIC_TYPES})) init_config = {'profiles': {'profile1': {'definition_file': profile_file}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) common_tags = common.CHECK_TAGS + ['snmp_profile:profile1'] for metric in common.SUPPORTED_METRIC_TYPES: metric_name = "snmp." + metric['name'] aggregator.assert_metric(metric_name, tags=common_tags, count=1) aggregator.assert_metric('snmp.sysUpTimeInstance', count=1) common.assert_common_metrics(aggregator) aggregator.assert_all_metrics_covered()
def test_extract_value_inferred(aggregator): instance = common.generate_instance_config( [ { "MIB": "DUMMY-MIB", 'symbol': { 'OID': "1.3.6.1.4.1.123456789.4.0", 'name': "aTemperatureValueInferred", 'extract_value': r'(\d+)C', }, } ] ) instance["community_string"] = "dummy" check = SnmpCheck('snmp', common.MIBS_FOLDER, [instance]) check.check(instance) aggregator.assert_metric( 'snmp.aTemperatureValueInferred', metric_type=aggregator.GAUGE, count=1, value=22, tags=common.CHECK_TAGS )
def test_profile(aggregator): instance = common.generate_instance_config([]) instance['profile'] = 'profile1' init_config = { 'profiles': { 'profile1': { 'definition': { 'metrics': common.SUPPORTED_METRIC_TYPES } } } } check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) for metric in common.SUPPORTED_METRIC_TYPES: metric_name = "snmp." + metric['name'] aggregator.assert_metric(metric_name, tags=common.CHECK_TAGS, count=1) aggregator.assert_all_metrics_covered()
def test_meraki_cloud_controller(aggregator): instance = common.generate_instance_config([]) path = os.path.join(os.path.dirname(snmp.__file__), 'data', 'profiles', 'meraki-cloud-controller.yaml') instance['community_string'] = 'meraki-cloud-controller' instance['profile'] = 'meraki' instance['enforce_mib_constraints'] = False init_config = {'profiles': {'meraki': {'definition_file': path}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) dev_metrics = ['devStatus', 'devClientCount'] dev_tags = ['device:Gymnasium', 'product:MR16-HW', 'network:L_NETWORK'] + common.CHECK_TAGS for metric in dev_metrics: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=dev_tags, count=1) if_tags = ['interface:wifi0', 'index:4'] + common.CHECK_TAGS if_metrics = ['devInterfaceSentPkts', 'devInterfaceRecvPkts', 'devInterfaceSentBytes', 'devInterfaceSentBytes'] for metric in if_metrics: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=if_tags, count=1)
def test_profile_sys_object_unknown(aggregator): """If the fetched sysObjectID is not referenced by any profiles, check fails.""" instance = common.generate_instance_config([]) init_config = { 'profiles': { 'profile1': { 'definition': common.SUPPORTED_METRIC_TYPES, 'sysobjectid': '1.2.3.4.5' } } } check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) aggregator.assert_service_check("snmp.can_check", status=SnmpCheck.CRITICAL, tags=common.CHECK_TAGS, at_least=1) aggregator.all_metrics_asserted()
def run_profile_check(profile, recording_name, profile_name, set_profile=False): """ Run a single check with the given `profile`, with the provided `recording_name` used as `community_string` by the docker SNMP endpoint. If `set_profile` is True, we don't rely on `sysObjectID` matching and pass the profile explicitly. """ instance = common.generate_instance_config([]) instance['community_string'] = recording_name instance['enforce_mib_constraints'] = False if set_profile: instance['profile'] = profile_name init_config = {'profiles': {profile_name: {'definition_file': profile}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance)
def test_failed_to_collect_metrics(): config = InstanceConfig({ "ip_address": "127.0.0.123", "community_string": "public", "metrics": [{ "OID": "1.2.3", "name": "foo" }] }) instance = common.generate_instance_config(common.SUPPORTED_METRIC_TYPES) instance.pop('ip_address') instance['network_address'] = '192.168.0.0/24' check = SnmpCheck('snmp', {}, [instance]) check._config = config check.fetch_results = mock.Mock(return_value=ValueError("invalid value")) check.check(instance) assert len(check.warnings) == 1 assert 'Failed to collect metrics for 127.0.0.123' in check.warnings[0]
def test_extract_value_table(aggregator): instance = common.generate_instance_config( [ { "MIB": "IF-MIB", 'table': { 'OID': '1.3.6.1.2.1.2.2', 'name': 'ifTable', }, 'symbols': [ { 'OID': "1.3.6.1.2.1.2.2.1.2", 'name': "extractValue", 'extract_value': r'ip(\d)tnl0', } ], 'metric_tags': [ { 'column': { 'OID': '1.3.6.1.2.1.31.1.1.1.1', 'name': 'ifName', }, 'table': 'ifXTable', 'tag': 'interface', } ], } ] ) instance["community_string"] = "public" tags = common.CHECK_TAGS + ['interface:ip6tnl0'] check = SnmpCheck('snmp', common.MIBS_FOLDER, [instance]) check.check(instance) aggregator.assert_metric('snmp.extractValue', metric_type=aggregator.GAUGE, count=1, value=6, tags=tags)
def test_metric_tag_profile_sysoid(aggregator): instance = common.generate_instance_config([]) definition = { 'metric_tags': [{'OID': '1.3.6.1.2.1.1.5', 'symbol': 'sysName', 'tag': 'snmp_host'}], 'metrics': common.SUPPORTED_METRIC_TYPES, 'sysobjectid': '1.3.6.1.4.1.8072.3.2.10', } init_config = {'profiles': {'profile1': {'definition': definition}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) tags = list(common.CHECK_TAGS) tags.append('snmp_host:41ba948911b9') tags.append('snmp_profile:profile1') for metric in common.SUPPORTED_METRIC_TYPES: metric_name = "snmp." + metric['name'] aggregator.assert_metric(metric_name, tags=tags, count=1) aggregator.assert_metric('snmp.sysUpTimeInstance', count=1) aggregator.assert_service_check("snmp.can_check", status=SnmpCheck.OK, tags=tags, at_least=1) aggregator.all_metrics_asserted()
def test_timeout(aggregator, caplog): caplog.set_level(logging.WARNING) instance = common.generate_instance_config([]) instance['community_string'] = 'public_delay' instance['timeout'] = 1 instance['retries'] = 0 check = SnmpCheck('snmp', {'oid_batch_size': 1}, [instance]) check.check(instance) aggregator.assert_service_check("snmp.can_check", status=SnmpCheck.WARNING, at_least=1) # All metrics but `ifAdminStatus` should still arrive aggregator.assert_metric('snmp.ifInDiscards', count=4) aggregator.assert_metric('snmp.ifOutDiscards', count=4) aggregator.assert_metric('snmp.ifInErrors', count=4) aggregator.assert_metric('snmp.ifOutErrors', count=4) aggregator.assert_metric('snmp.sysUpTimeInstance', count=1) common.assert_common_metrics(aggregator) aggregator.assert_all_metrics_covered() assert ( len([record for record in caplog.records if "No SNMP response received before timeout" in record.message]) > 0 )
def test_removing_host(): """If a discovered host is failing 3 times in a row, we stop querying it.""" instance = common.generate_instance_config(common.SUPPORTED_METRIC_TYPES) discovered_instance = instance.copy() discovered_instance['ip_address'] = '1.1.1.1' discovered_instance['retries'] = 0 instance.pop('ip_address') instance['network_address'] = '192.168.0.0/24' check = SnmpCheck('snmp', {}, [instance]) warnings = [] check.warning = warnings.append check._config.discovered_instances['1.1.1.1'] = InstanceConfig( discovered_instance) check._start_discovery = lambda: None check._executor = futures.ThreadPoolExecutor(max_workers=1) check.check(instance) assert len(warnings) == 1 msg = 'No SNMP response received before timeout' assert all(msg in warning for warning in warnings) check.check(instance) assert len(warnings) == 2 assert all(msg in warning for warning in warnings) check.check(instance) assert len(warnings) == 3 assert all(msg in warning for warning in warnings) # Instance has been removed assert check._config.discovered_instances == {} check.check(instance) # No new warnings produced assert len(warnings) == 3 assert all(msg in warning for warning in warnings)
def test_idrac(aggregator): instance = common.generate_instance_config([]) # We need the full path as we're not in installed mode path = os.path.join(os.path.dirname(snmp.__file__), 'data', 'profiles', 'idrac.yaml') instance['community_string'] = 'idrac' instance['profile'] = 'idrac' instance['enforce_mib_constraints'] = False init_config = {'profiles': {'idrac': {'definition_file': path}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) if_counts = [ 'adapterRxPackets', 'adapterTxPackets', 'adapterRxBytes', 'adapterTxBytes', 'adapterRxErrors', 'adapterTxErrors', 'adapterRxDropped', 'adapterTxDropped', 'adapterRxMulticast', 'adapterCollisions', ] status_gauges = [ 'systemStateChassisStatus', 'systemStatePowerUnitStatusRedundancy', 'systemStatePowerSupplyStatusCombined', 'systemStateAmperageStatusCombined', 'systemStateCoolingUnitStatusRedundancy', 'systemStateCoolingDeviceStatusCombined', 'systemStateTemperatureStatusCombined', 'systemStateMemoryDeviceStatusCombined', 'systemStateChassisIntrusionStatusCombined', 'systemStatePowerUnitStatusCombined', 'systemStateCoolingUnitStatusCombined', 'systemStateProcessorDeviceStatusCombined', 'systemStateTemperatureStatisticsStatusCombined', ] disk_gauges = [ 'physicalDiskState', 'physicalDiskCapacityInMB', 'physicalDiskUsedSpaceInMB', 'physicalDiskFreeSpaceInMB', ] interfaces = ['eth0', 'en1'] for interface in interfaces: tags = ['adapter:{}'.format(interface)] + common.CHECK_TAGS for count in if_counts: aggregator.assert_metric( 'snmp.{}'.format(count), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1 ) indexes = ['26', '29'] for index in indexes: tags = ['chassis_index:{}'.format(index)] + common.CHECK_TAGS for gauge in status_gauges: aggregator.assert_metric('snmp.{}'.format(gauge), metric_type=aggregator.GAUGE, tags=tags, count=1) powers = ['supply1', 'supply2'] for power in powers: tags = ['supply_name:{}'.format(power)] + common.CHECK_TAGS aggregator.assert_metric('snmp.enclosurePowerSupplyState', metric_type=aggregator.GAUGE, tags=tags, count=1) disks = ['disk1', 'disk2'] for disk in disks: tags = ['disk_name:{}'.format(disk)] + common.CHECK_TAGS for gauge in disk_gauges: aggregator.assert_metric('snmp.{}'.format(gauge), metric_type=aggregator.GAUGE, tags=tags, count=1) aggregator.assert_all_metrics_covered()
def test_f5_router(aggregator): instance = common.generate_instance_config([]) # We need the full path as we're not in installed mode path = os.path.join(os.path.dirname(snmp.__file__), 'data', 'profiles', 'generic-router.yaml') # Use the generic profile against the f5 device instance['community_string'] = 'f5' instance['profile'] = 'router' instance['enforce_mib_constraints'] = False init_config = {'profiles': {'router': {'definition_file': path}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) if_counts = [ 'ifInErrors', 'ifInDiscards', 'ifOutErrors', 'ifOutDiscards', 'ifHCInOctets', 'ifHCInUcastPkts', 'ifHCInMulticastPkts', 'ifHCInBroadcastPkts', 'ifHCOutOctets', 'ifHCOutUcastPkts', 'ifHCOutMulticastPkts', 'ifHCOutBroadcastPkts', ] if_gauges = ['ifAdminStatus', 'ifOperStatus'] # We only get a subset of metrics ip_counts = [ 'ipSystemStatsHCInReceives', 'ipSystemStatsInHdrErrors', 'ipSystemStatsOutFragReqds', 'ipSystemStatsOutFragFails', 'ipSystemStatsHCOutTransmits', 'ipSystemStatsReasmReqds', 'ipSystemStatsHCInMcastPkts', 'ipSystemStatsReasmFails', 'ipSystemStatsHCOutMcastPkts', ] interfaces = [ '1.0', 'mgmt', '/Common/internal', '/Common/http-tunnel', '/Common/socks-tunnel' ] for interface in interfaces: tags = ['interface:{}'.format(interface)] + common.CHECK_TAGS for metric in if_counts: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1) for metric in if_gauges: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) for version in ['ipv4', 'ipv6']: tags = ['ipversion:{}'.format(version)] + common.CHECK_TAGS for metric in ip_counts: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1) aggregator.assert_all_metrics_covered()
def test_cisco_nexus(aggregator): instance = common.generate_instance_config([]) instance['community_string'] = 'cisco_nexus' instance['profile'] = 'cisco-nexus' instance['enforce_mib_constraints'] = False # We need the full path as we're not in installed mode definition_file_path = os.path.join(os.path.dirname(snmp.__file__), 'data', 'profiles', 'cisco-nexus.yaml') init_config = {'profiles': {'cisco-nexus': {'definition_file': definition_file_path}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) tcp_counts = [ 'tcpActiveOpens', 'tcpPassiveOpens', 'tcpAttemptFails', 'tcpEstabResets', 'tcpHCInSegs', 'tcpHCOutSegs', 'tcpRetransSegs', 'tcpInErrs', 'tcpOutRsts', ] tcp_gauges = ['tcpCurrEstab'] udp_counts = ['udpHCInDatagrams', 'udpNoPorts', 'udpInErrors', 'udpHCOutDatagrams'] if_counts = ['ifInErrors', 'ifInDiscards', 'ifOutErrors', 'ifOutDiscards'] ifx_counts = [ 'ifHCInOctets', 'ifHCInUcastPkts', 'ifHCInMulticastPkts', 'ifHCInBroadcastPkts', 'ifHCOutOctets', 'ifHCOutUcastPkts', 'ifHCOutMulticastPkts', 'ifHCOutBroadcastPkts', ] if_gauges = ['ifAdminStatus', 'ifOperStatus'] interfaces = ["GigabitEthernet1/0/{}".format(i) for i in range(1, 9)] for interface in interfaces: tags = ['interface:{}'.format(interface)] + common.CHECK_TAGS aggregator.assert_metric('snmp.cieIfResetCount', metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1) for interface in interfaces: tags = ['interface:{}'.format(interface)] + common.CHECK_TAGS for metric in if_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1 ) for metric in if_gauges: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) for interface in interfaces: tags = ['interface:{}'.format(interface)] + common.CHECK_TAGS for metric in ifx_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1 ) for metric in tcp_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=common.CHECK_TAGS, count=1 ) for metric in tcp_gauges: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=common.CHECK_TAGS, count=1 ) for metric in udp_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=common.CHECK_TAGS, count=1 ) sensors = [1, 9, 11, 12, 12, 14, 17, 26, 29, 31] for sensor in sensors: tags = ['sensor_id:{}'.format(sensor), 'sensor_type:8'] + common.CHECK_TAGS aggregator.assert_metric('snmp.entSensorValue', metric_type=aggregator.GAUGE, tags=tags, count=1) fru_metrics = ["cefcFRUPowerAdminStatus", "cefcFRUPowerOperStatus", "cefcFRUCurrent"] frus = [6, 7, 15, 16, 19, 27, 30, 31] for fru in frus: tags = ['fru:{}'.format(fru)] + common.CHECK_TAGS for metric in fru_metrics: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) cpus = [3173, 6692, 11571, 19529, 30674, 38253, 52063, 54474, 55946, 63960] cpu_metrics = ["cpmCPUTotalMonIntervalValue", "cpmCPUMemoryUsed", "cpmCPUMemoryFree"] for cpu in cpus: tags = ['cpu:{}'.format(cpu)] + common.CHECK_TAGS for metric in cpu_metrics: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) aggregator.assert_all_metrics_covered()
def test_3850(aggregator): instance = common.generate_instance_config([]) # We need the full path as we're not in installed mode path = os.path.join(os.path.dirname(snmp.__file__), 'data', 'profiles', 'cisco-3850.yaml') instance['community_string'] = '3850' instance['profile'] = 'cisco-3850' instance['enforce_mib_constraints'] = False init_config = {'profiles': {'cisco-3850': {'definition_file': path}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) tcp_counts = [ 'tcpActiveOpens', 'tcpPassiveOpens', 'tcpAttemptFails', 'tcpEstabResets', 'tcpHCInSegs', 'tcpHCOutSegs', 'tcpRetransSegs', 'tcpInErrs', 'tcpOutRsts', ] tcp_gauges = ['tcpCurrEstab'] udp_counts = ['udpHCInDatagrams', 'udpNoPorts', 'udpInErrors', 'udpHCOutDatagrams'] if_counts = ['ifInErrors', 'ifInDiscards', 'ifOutErrors', 'ifOutDiscards'] ifx_counts = [ 'ifHCInOctets', 'ifHCInUcastPkts', 'ifHCInMulticastPkts', 'ifHCInBroadcastPkts', 'ifHCOutOctets', 'ifHCOutUcastPkts', 'ifHCOutMulticastPkts', 'ifHCOutBroadcastPkts', ] if_gauges = ['ifAdminStatus', 'ifOperStatus'] # We're not covering all interfaces interfaces = ["GigabitEthernet1/0/{}".format(i) for i in range(1, 48)] for interface in interfaces: tags = ['interface:{}'.format(interface)] + common.CHECK_TAGS for metric in if_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1 ) for metric in if_gauges: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) interfaces = ["Gi1/0/{}".format(i) for i in range(1, 48)] for interface in interfaces: tags = ['interface:{}'.format(interface)] + common.CHECK_TAGS for metric in ifx_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1 ) for metric in tcp_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=common.CHECK_TAGS, count=1 ) for metric in tcp_gauges: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=common.CHECK_TAGS, count=1 ) for metric in udp_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=common.CHECK_TAGS, count=1 ) sensors = [1006, 1007, 1008, 2006, 2007, 2008] for sensor in sensors: tags = ['sensor_id:{}'.format(sensor), 'sensor_type:8'] + common.CHECK_TAGS aggregator.assert_metric('snmp.entSensorValue', metric_type=aggregator.GAUGE, tags=tags, count=1) fru_metrics = ["cefcFRUPowerAdminStatus", "cefcFRUPowerOperStatus", "cefcFRUCurrent"] frus = [1001, 1010, 2001, 2010] for fru in frus: tags = ['fru:{}'.format(fru)] + common.CHECK_TAGS for metric in fru_metrics: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) cpus = [1000, 2000] cpu_metrics = ["cpmCPUTotalMonIntervalValue", "cpmCPUMemoryUsed", "cpmCPUMemoryFree"] for cpu in cpus: tags = ['cpu:{}'.format(cpu)] + common.CHECK_TAGS for metric in cpu_metrics: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) cie_metrics = ["cieIfLastInTime", "cieIfLastOutTime", "cieIfInputQueueDrops", "cieIfOutputQueueDrops"] for interface in interfaces: tags = ['interface:{}'.format(interface)] + common.CHECK_TAGS for metric in cie_metrics: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) aggregator.assert_metric('snmp.cieIfResetCount', metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1) aggregator.assert_all_metrics_covered()
def test_router(aggregator): instance = common.generate_instance_config([]) # We need the full path as we're not in installed mode path = os.path.join(os.path.dirname(snmp.__file__), 'data', 'profiles', 'generic-router.yaml') instance['community_string'] = 'network' instance['profile'] = 'router' instance['enforce_mib_constraints'] = False init_config = {'profiles': {'router': {'definition_file': path}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) tcp_counts = [ 'tcpActiveOpens', 'tcpPassiveOpens', 'tcpAttemptFails', 'tcpEstabResets', 'tcpHCInSegs', 'tcpHCOutSegs', 'tcpRetransSegs', 'tcpInErrs', 'tcpOutRsts', ] tcp_gauges = ['tcpCurrEstab'] udp_counts = ['udpHCInDatagrams', 'udpNoPorts', 'udpInErrors', 'udpHCOutDatagrams'] if_counts = [ 'ifInErrors', 'ifInDiscards', 'ifOutErrors', 'ifOutDiscards', 'ifHCInOctets', 'ifHCInUcastPkts', 'ifHCInMulticastPkts', 'ifHCInBroadcastPkts', 'ifHCOutOctets', 'ifHCOutUcastPkts', 'ifHCOutMulticastPkts', 'ifHCOutBroadcastPkts', ] if_gauges = ['ifAdminStatus', 'ifOperStatus'] ip_counts = [ 'ipSystemStatsHCInReceives', 'ipSystemStatsHCInOctets', 'ipSystemStatsInHdrErrors', 'ipSystemStatsInNoRoutes', 'ipSystemStatsInAddrErrors', 'ipSystemStatsInUnknownProtos', 'ipSystemStatsInTruncatedPkts', 'ipSystemStatsHCInForwDatagrams', 'ipSystemStatsReasmReqds', 'ipSystemStatsReasmOKs', 'ipSystemStatsReasmFails', 'ipSystemStatsInDiscards', 'ipSystemStatsHCInDelivers', 'ipSystemStatsHCOutRequests', 'ipSystemStatsOutNoRoutes', 'ipSystemStatsHCOutForwDatagrams', 'ipSystemStatsOutDiscards', 'ipSystemStatsOutFragReqds', 'ipSystemStatsOutFragOKs', 'ipSystemStatsOutFragFails', 'ipSystemStatsOutFragCreates', 'ipSystemStatsHCOutTransmits', 'ipSystemStatsHCOutOctets', 'ipSystemStatsHCInMcastPkts', 'ipSystemStatsHCInMcastOctets', 'ipSystemStatsHCOutMcastPkts', 'ipSystemStatsHCOutMcastOctets', 'ipSystemStatsHCInBcastPkts', 'ipSystemStatsHCOutBcastPkts', ] ip_if_counts = [ 'ipIfStatsHCInOctets', 'ipIfStatsInHdrErrors', 'ipIfStatsInNoRoutes', 'ipIfStatsInAddrErrors', 'ipIfStatsInUnknownProtos', 'ipIfStatsInTruncatedPkts', 'ipIfStatsHCInForwDatagrams', 'ipIfStatsReasmReqds', 'ipIfStatsReasmOKs', 'ipIfStatsReasmFails', 'ipIfStatsInDiscards', 'ipIfStatsHCInDelivers', 'ipIfStatsHCOutRequests', 'ipIfStatsHCOutForwDatagrams', 'ipIfStatsOutDiscards', 'ipIfStatsOutFragReqds', 'ipIfStatsOutFragOKs', 'ipIfStatsOutFragFails', 'ipIfStatsOutFragCreates', 'ipIfStatsHCOutTransmits', 'ipIfStatsHCOutOctets', 'ipIfStatsHCInMcastPkts', 'ipIfStatsHCInMcastOctets', 'ipIfStatsHCOutMcastPkts', 'ipIfStatsHCOutMcastOctets', 'ipIfStatsHCInBcastPkts', 'ipIfStatsHCOutBcastPkts', ] for interface in ['eth0', 'eth1']: tags = ['interface:{}'.format(interface)] + common.CHECK_TAGS for metric in if_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1 ) for metric in if_gauges: aggregator.assert_metric('snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=tags, count=1) for metric in tcp_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=common.CHECK_TAGS, count=1 ) for metric in tcp_gauges: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=common.CHECK_TAGS, count=1 ) for metric in udp_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=common.CHECK_TAGS, count=1 ) for version in ['ipv4', 'ipv6']: tags = ['ipversion:{}'.format(version)] + common.CHECK_TAGS for metric in ip_counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1 ) for metric in ip_if_counts: for interface in ['17', '21']: tags = ['ipversion:{}'.format(version), 'interface:{}'.format(interface)] + common.CHECK_TAGS aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=tags, count=1 ) aggregator.assert_all_metrics_covered()
def test_f5(aggregator): instance = common.generate_instance_config([]) # We need the full path as we're not in installed mode path = os.path.join(os.path.dirname(snmp.__file__), 'data', 'profiles', 'f5-big-ip.yaml') instance['community_string'] = 'f5' instance['enforce_mib_constraints'] = False init_config = {'profiles': {'f5-big-ip': {'definition_file': path}}} check = SnmpCheck('snmp', init_config, [instance]) check.check(instance) gauges = [ 'sysStatMemoryTotal', 'sysStatMemoryUsed', 'sysGlobalTmmStatMemoryTotal', 'sysGlobalTmmStatMemoryUsed', 'sysGlobalHostOtherMemoryTotal', 'sysGlobalHostOtherMemoryUsed', 'sysGlobalHostSwapTotal', 'sysGlobalHostSwapUsed', 'sysTcpStatOpen', 'sysTcpStatCloseWait', 'sysTcpStatFinWait', 'sysTcpStatTimeWait', 'sysUdpStatOpen', 'sysClientsslStatCurConns', ] counts = [ 'sysTcpStatAccepts', 'sysTcpStatAcceptfails', 'sysTcpStatConnects', 'sysTcpStatConnfails', 'sysUdpStatAccepts', 'sysUdpStatAcceptfails', 'sysUdpStatConnects', 'sysUdpStatConnfails', 'sysClientsslStatEncryptedBytesIn', 'sysClientsslStatEncryptedBytesOut', 'sysClientsslStatDecryptedBytesIn', 'sysClientsslStatDecryptedBytesOut', 'sysClientsslStatHandshakeFailures', ] cpu_rates = [ 'sysMultiHostCpuUser', 'sysMultiHostCpuNice', 'sysMultiHostCpuSystem', 'sysMultiHostCpuIdle', 'sysMultiHostCpuIrq', 'sysMultiHostCpuSoftirq', 'sysMultiHostCpuIowait', ] if_gauges = ['ifAdminStatus', 'ifOperStatus'] if_counts = ['ifHCInOctets', 'ifInErrors', 'ifHCOutOctets', 'ifOutErrors'] interfaces = ['1.0', 'mgmt', '/Common/internal', '/Common/http-tunnel', '/Common/socks-tunnel'] for metric in gauges: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=common.CHECK_TAGS, count=1 ) for metric in counts: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=common.CHECK_TAGS, count=1 ) for metric in cpu_rates: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.RATE, tags=['cpu:0'] + common.CHECK_TAGS, count=1 ) aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.RATE, tags=['cpu:1'] + common.CHECK_TAGS, count=1 ) for metric in if_counts: for interface in interfaces: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.MONOTONIC_COUNT, tags=['interface:{}'.format(interface)] + common.CHECK_TAGS, count=1, ) for metric in if_gauges: for interface in interfaces: aggregator.assert_metric( 'snmp.{}'.format(metric), metric_type=aggregator.GAUGE, tags=['interface:{}'.format(interface)] + common.CHECK_TAGS, count=1, ) aggregator.assert_all_metrics_covered()