def test_run(benchmark, instance):
    c = IbmDb2Check('ibm_db2', {}, [instance])

    # Run once to get the initial connection out of the way.
    c.check(instance)

    benchmark(c.check, instance)
def test_custom_queries(aggregator, instance):
    instance['custom_queries'] = [{
        'metric_prefix':
        'ibm_db2',
        'tags': ['test:ibm_db2'],
        'query':
        'SELECT files_closed, tbsp_name FROM TABLE(MON_GET_TABLESPACE(NULL, -1))',
        'columns': [
            {
                'name': 'tablespace.files_closed',
                'type': 'monotonic_count'
            },
            {
                'name': 'tablespace',
                'type': 'tag'
            },
        ],
    }]

    check = IbmDb2Check('ibm_db2', {}, [instance])
    check.check(instance)

    # There is also `SYSTOOLSPACE` but it seems that takes some time to come up
    table_spaces = ['USERSPACE1', 'TEMPSPACE1', 'SYSCATSPACE']

    for table_space in table_spaces:
        aggregator.assert_metric(
            'ibm_db2.tablespace.files_closed',
            metric_type=3,
            tags=[
                'db:datadog', 'foo:bar', 'test:ibm_db2',
                'tablespace:{}'.format(table_space)
            ],
        )
def test_table_space_state_change(aggregator, instance):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    check._table_space_states['USERSPACE1'] = 'test'
    check.check(instance)

    aggregator.assert_event(
        'State of `USERSPACE1` changed from `test` to `NORMAL`.')
def test_bad_config(aggregator, instance):
    instance['port'] = '60000'
    check = IbmDb2Check('ibm_db2', {}, [instance])
    check.check(instance)

    aggregator.assert_service_check(check.SERVICE_CHECK_CONNECT,
                                    check.CRITICAL)
Exemple #5
0
def test_table_space_tags(aggregator, instance, dd_run_check):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    dd_run_check(check)

    for metric in metrics.TABLESPACE:
        aggregator.assert_metric_has_tag_prefix(metric, 'tablespace:')
    aggregator.assert_service_check(check.SERVICE_CHECK_CONNECT,
                                    count=1,
                                    status=check.OK)
Exemple #6
0
def test_buffer_pool_tags(aggregator, instance, dd_run_check):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    dd_run_check(check)

    for metric in metrics.BUFFERPOOL:
        aggregator.assert_metric_has_tag_prefix(metric, 'bufferpool:')
    aggregator.assert_service_check(check.SERVICE_CHECK_CONNECT,
                                    count=1,
                                    status=check.OK)
Exemple #7
0
def test_table_space_state_change(aggregator, instance, dd_run_check):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    check._table_space_states['USERSPACE1'] = 'test'
    dd_run_check(check)

    aggregator.assert_event(
        'State of `USERSPACE1` changed from `test` to `NORMAL`.')
    aggregator.assert_service_check(check.SERVICE_CHECK_CONNECT,
                                    count=1,
                                    status=check.OK)
def test_parse_version(instance):
    raw_version = '11.01.0202'
    check = IbmDb2Check('ibm_db2', {}, [instance])
    expected = {
        'major': '11',
        'minor': '1',
        'mod': '2',
        'fix': '2',
    }
    assert check.parse_version(raw_version) == expected
def test_standard(aggregator, instance):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    check.check(instance)

    aggregator.assert_service_check(check.SERVICE_CHECK_CONNECT, check.OK)

    for metric in metrics.STANDARD:
        aggregator.assert_metric_has_tag(metric, 'db:datadog')
        aggregator.assert_metric_has_tag(metric, 'foo:bar')

    aggregator.assert_all_metrics_covered()
Exemple #10
0
def test_get_connection_data(instance):
    check = IbmDb2Check('ibm_db2', {}, [instance])

    expected = 'database=db1;hostname=host1;port=1000;protocol=tcpip;uid=user1;pwd=pass1'
    assert (expected, '', '') == check.get_connection_data('db1', 'user1', 'pass1', 'host1', 1000, 'none', None)

    expected = (
        'database=db1;hostname=host1;port=1000;protocol=tcpip;uid=user1;pwd=pass1;'
        'security=ssl;sslservercertificate=/path/cert'
    )
    assert (expected, '', '') == check.get_connection_data('db1', 'user1', 'pass1', 'host1', 1000, 'none', '/path/cert')
Exemple #11
0
def test_non_connection_errors_are_ignored(aggregator, instance):
    erroring_query = mock.Mock(side_effect=Exception("I'm broken"))
    erroring_query.__name__ = 'Erroring query'

    ibmdb2 = IbmDb2Check('ibm_db2', {}, [instance])
    ibmdb2._conn = mock.MagicMock()
    ibmdb2.get_connection = mock.MagicMock()
    ibmdb2._query_methods = (mock.Mock(), erroring_query, mock.Mock())

    ibmdb2.check(instance)
    for query_method in ibmdb2._query_methods:
        query_method.assert_called()
Exemple #12
0
def test_connection_errors_stops_execution(aggregator, instance):
    erroring_query = mock.Mock(side_effect=ConnectionError("I'm broken"))
    erroring_query.__name__ = 'Erroring query'

    ibmdb2 = IbmDb2Check('ibm_db2', {}, [instance])
    ibmdb2._conn = mock.MagicMock()
    ibmdb2.get_connection = mock.MagicMock()
    ibmdb2._query_methods = (mock.Mock(), erroring_query, mock.Mock())

    with pytest.raises(ConnectionError):
        ibmdb2.check(instance)

    ibmdb2._query_methods[0].assert_called()
    ibmdb2._query_methods[1].assert_called()
    ibmdb2._query_methods[2].assert_not_called()
def test_metadata(aggregator, instance, datadog_agent):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    check.check_id = CHECK_ID

    check.check(instance)

    # only major and minor are consistent values
    major, minor = DB2_VERSION.split('.')

    version_metadata = {
        'version.scheme': 'ibm_db2',
        'version.major': '11',
        'version.minor': '1',
    }

    datadog_agent.assert_metadata(CHECK_ID, version_metadata)
Exemple #14
0
def test_retry_connection(aggregator, instance):
    ibmdb2 = IbmDb2Check('ibm_db2', {}, [instance])
    conn1 = mock.MagicMock()
    ibmdb2._conn = conn1
    ibmdb2.get_connection = mock.MagicMock()

    exception_msg = "[IBM][CLI Driver] CLI0106E  Connection is closed. SQLSTATE=08003"

    def mock_exception(*args, **kwargs):
        raise ConnectionError(exception_msg)

    with mock.patch('ibm_db.exec_immediate', side_effect=mock_exception):

        with pytest.raises(ConnectionError, match='CLI0106E  Connection is closed. SQLSTATE=08003'):
            ibmdb2.check(instance)
        # new connection made
        assert ibmdb2._conn != conn1
Exemple #15
0
def test_query_function_error(aggregator, instance):
    exception_msg = (
        '[IBM][CLI Driver][DB2/NT64] SQL0440N  No authorized routine named "MON_GET_INSTANCE" of type '
        '"FUNCTION" having compatible arguments was found.  SQLSTATE=42884'
    )

    def query_instance(*args, **kwargs):
        raise Exception(exception_msg)

    ibmdb2 = IbmDb2Check('ibm_db2', {}, [instance])
    ibmdb2.log = mock.MagicMock()
    ibmdb2._conn = mock.MagicMock()
    ibmdb2.get_connection = mock.MagicMock()
    ibmdb2.query_instance = query_instance

    with pytest.raises(Exception):
        ibmdb2.query_instance()
        ibmdb2.log.warning.assert_called_with('Encountered error running `%s`: %s', 'query_instance', exception_msg)
Exemple #16
0
def test_custom_queries_init_config(aggregator, instance, dd_run_check):
    init_config = {
        'global_custom_queries': [{
            'metric_prefix':
            'ibm_db2',
            'tags': ['test:ibm_db2'],
            'query':
            'SELECT files_closed, tbsp_name FROM TABLE(MON_GET_TABLESPACE(NULL, -1))',
            'columns': [
                {
                    'name': 'tablespace.files_closed',
                    'type': 'monotonic_count'
                },
                {
                    'name': 'tablespace',
                    'type': 'tag'
                },
            ],
        }]
    }

    check = IbmDb2Check('ibm_db2', init_config, [instance])
    dd_run_check(check)

    # There is also `SYSTOOLSPACE` but it seems that takes some time to come up
    table_spaces = ['USERSPACE1', 'TEMPSPACE1', 'SYSCATSPACE']

    for table_space in table_spaces:
        aggregator.assert_metric(
            'ibm_db2.tablespace.files_closed',
            metric_type=3,
            tags=[
                'db:datadog', 'foo:bar', 'test:ibm_db2',
                'tablespace:{}'.format(table_space)
            ],
        )
    aggregator.assert_service_check(check.SERVICE_CHECK_CONNECT,
                                    count=1,
                                    status=check.OK)
def test_table_space_tags(aggregator, instance):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    check.check(instance)

    for metric in metrics.TABLESPACE:
        aggregator.assert_metric_has_tag_prefix(metric, 'tablespace:')
def test_buffer_pool_tags(aggregator, instance):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    check.check(instance)

    for metric in metrics.BUFFERPOOL:
        aggregator.assert_metric_has_tag_prefix(metric, 'bufferpool:')
def test_standard(aggregator, instance):
    check = IbmDb2Check('ibm_db2', {}, [instance])
    check.check(instance)

    _assert_standard(aggregator)
Exemple #20
0
 def __init__(self, config):
     self.target, self.username, self.password = IbmDb2Check.get_connection_data(
         config['db'], config['username'], config['password'],
         config['host'], config['port'])
     self.db_name = config['db']
     self.conn = None