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)
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)
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)
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()
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')
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()
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)
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
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)
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)
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