Example #1
0
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()
Example #2
0
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()
Example #3
0
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()
Example #4
0
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()
Example #5
0
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()
Example #6
0
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()
Example #7
0
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()
Example #9
0
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)
Example #10
0
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()
Example #11
0
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
    )
Example #12
0
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()
Example #13
0
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)
Example #14
0
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)
Example #16
0
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]
Example #17
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)
Example #18
0
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()
Example #19
0
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
    )
Example #20
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)
Example #21
0
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()
Example #22
0
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()
Example #23
0
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()
Example #24
0
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()
Example #25
0
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()
Example #26
0
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()