diff --git a/src/instana/__init__.py b/src/instana/__init__.py index 1654f01f..f7db3304 100644 --- a/src/instana/__init__.py +++ b/src/instana/__init__.py @@ -172,7 +172,7 @@ def boot_agent(): # gevent_inst, # noqa: F401 # grpcio, # noqa: F401 logging, # noqa: F401 - # mysqlclient, # noqa: F401 + mysqlclient, # noqa: F401 # pika, # noqa: F401 pep0249, # noqa: F401 psycopg2, # noqa: F401 diff --git a/src/instana/instrumentation/mysqlclient.py b/src/instana/instrumentation/mysqlclient.py index 5b7270f8..82165869 100644 --- a/src/instana/instrumentation/mysqlclient.py +++ b/src/instana/instrumentation/mysqlclient.py @@ -2,17 +2,17 @@ # (c) Copyright Instana Inc. 2019 -from ..log import logger -from .pep0249 import ConnectionFactory +from instana.log import logger +from instana.instrumentation.pep0249 import ConnectionFactory try: import MySQLdb - cf = ConnectionFactory(connect_func=MySQLdb.connect, module_name='mysql') + cf = ConnectionFactory(connect_func=MySQLdb.connect, module_name="mysql") - setattr(MySQLdb, 'connect', cf) - if hasattr(MySQLdb, 'Connect'): - setattr(MySQLdb, 'Connect', cf) + setattr(MySQLdb, "connect", cf) + if hasattr(MySQLdb, "Connect"): + setattr(MySQLdb, "Connect", cf) logger.debug("Instrumenting mysqlclient") except ImportError: diff --git a/tests/clients/test_mysqlclient.py b/tests/clients/test_mysqlclient.py index 518eff30..4f5f6013 100644 --- a/tests/clients/test_mysqlclient.py +++ b/tests/clients/test_mysqlclient.py @@ -1,22 +1,23 @@ # (c) Copyright IBM Corp. 2021 # (c) Copyright Instana Inc. 2020 -import logging -import unittest - import MySQLdb - -from ..helpers import testenv -from instana.singletons import agent, tracer - -logger = logging.getLogger(__name__) - - -class TestMySQLPython(unittest.TestCase): - def setUp(self): - self.db = MySQLdb.connect(host=testenv['mysql_host'], port=testenv['mysql_port'], - user=testenv['mysql_user'], passwd=testenv['mysql_pw'], - db=testenv['mysql_db']) +import pytest + +from instana.singletons import agent, tracer +from tests.helpers import testenv + + +class TestMySQLPython: + @pytest.fixture(autouse=True) + def _resource(self): + self.db = MySQLdb.connect( + host=testenv["mysql_host"], + port=testenv["mysql_port"], + user=testenv["mysql_user"], + passwd=testenv["mysql_pw"], + db=testenv["mysql_db"], + ) database_setup_query = """ DROP TABLE IF EXISTS users; CREATE TABLE users( @@ -36,251 +37,260 @@ def setUp(self): setup_cursor.close() self.cursor = self.db.cursor() - self.recorder = tracer.recorder + self.recorder = tracer.span_processor self.recorder.clear_spans() tracer.cur_ctx = None - - def tearDown(self): + yield if self.cursor and self.cursor.connection.open: - self.cursor.close() + self.cursor.close() if self.db and self.db.open: - self.db.close() + self.db.close() agent.options.allow_exit_as_root = False def test_vanilla_query(self): affected_rows = self.cursor.execute("""SELECT * from users""") - self.assertEqual(1, affected_rows) + assert affected_rows == 1 result = self.cursor.fetchone() - self.assertEqual(3, len(result)) + assert len(result) == 3 spans = self.recorder.queued_spans() - self.assertEqual(0, len(spans)) + assert len(spans) == 0 def test_basic_query(self): - with tracer.start_active_span('test'): + with tracer.start_as_current_span("test"): affected_rows = self.cursor.execute("""SELECT * from users""") result = self.cursor.fetchone() - self.assertEqual(1, affected_rows) - self.assertEqual(3, len(result)) + assert affected_rows == 1 + assert len(result) == 3 spans = self.recorder.queued_spans() - self.assertEqual(2, len(spans)) + assert len(spans) == 2 db_span, test_span = spans - self.assertEqual("test", test_span.data["sdk"]["name"]) - self.assertEqual(test_span.t, db_span.t) - self.assertEqual(db_span.p, test_span.s) + assert test_span.data["sdk"]["name"] == "test" + assert test_span.t == db_span.t + assert db_span.p == test_span.s - self.assertIsNone(db_span.ec) + assert not db_span.ec - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv['mysql_db']) - self.assertEqual(db_span.data["mysql"]["user"], testenv['mysql_user']) - self.assertEqual(db_span.data["mysql"]["stmt"], 'SELECT * from users') - self.assertEqual(db_span.data["mysql"]["host"], testenv['mysql_host']) - self.assertEqual(db_span.data["mysql"]["port"], testenv['mysql_port']) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert db_span.data["mysql"]["stmt"] == "SELECT * from users" + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] def test_basic_query_as_root_exit_span(self): agent.options.allow_exit_as_root = True affected_rows = self.cursor.execute("""SELECT * from users""") result = self.cursor.fetchone() - self.assertEqual(1, affected_rows) - self.assertEqual(3, len(result)) + assert affected_rows == 1 + assert len(result) == 3 spans = self.recorder.queued_spans() - self.assertEqual(1, len(spans)) + assert len(spans) == 1 db_span = spans[0] - self.assertIsNone(db_span.ec) + assert not db_span.ec - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv['mysql_db']) - self.assertEqual(db_span.data["mysql"]["user"], testenv['mysql_user']) - self.assertEqual(db_span.data["mysql"]["stmt"], 'SELECT * from users') - self.assertEqual(db_span.data["mysql"]["host"], testenv['mysql_host']) - self.assertEqual(db_span.data["mysql"]["port"], testenv['mysql_port']) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert db_span.data["mysql"]["stmt"] == "SELECT * from users" + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] def test_basic_insert(self): - with tracer.start_active_span('test'): + with tracer.start_as_current_span("test"): affected_rows = self.cursor.execute( - """INSERT INTO users(name, email) VALUES(%s, %s)""", - ('beaker', 'beaker@muppets.com')) + """INSERT INTO users(name, email) VALUES(%s, %s)""", + ("beaker", "beaker@muppets.com"), + ) - self.assertEqual(1, affected_rows) + assert affected_rows == 1 spans = self.recorder.queued_spans() - self.assertEqual(2, len(spans)) + assert len(spans) == 2 db_span, test_span = spans - self.assertEqual("test", test_span.data["sdk"]["name"]) - self.assertEqual(test_span.t, db_span.t) - self.assertEqual(db_span.p, test_span.s) + assert test_span.data["sdk"]["name"] == "test" + assert test_span.t == db_span.t + assert db_span.p == test_span.s - self.assertIsNone(db_span.ec) + assert not db_span.ec - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv['mysql_db']) - self.assertEqual(db_span.data["mysql"]["user"], testenv['mysql_user']) - self.assertEqual(db_span.data["mysql"]["stmt"], 'INSERT INTO users(name, email) VALUES(%s, %s)') - self.assertEqual(db_span.data["mysql"]["host"], testenv['mysql_host']) - self.assertEqual(db_span.data["mysql"]["port"], testenv['mysql_port']) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert ( + db_span.data["mysql"]["stmt"] + == "INSERT INTO users(name, email) VALUES(%s, %s)" + ) + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] def test_executemany(self): - with tracer.start_active_span('test'): - affected_rows = self.cursor.executemany("INSERT INTO users(name, email) VALUES(%s, %s)", - [('beaker', 'beaker@muppets.com'), ('beaker', 'beaker@muppets.com')]) + with tracer.start_as_current_span("test"): + affected_rows = self.cursor.executemany( + "INSERT INTO users(name, email) VALUES(%s, %s)", + [("beaker", "beaker@muppets.com"), ("beaker", "beaker@muppets.com")], + ) self.db.commit() - self.assertEqual(2, affected_rows) + assert affected_rows == 2 spans = self.recorder.queued_spans() - self.assertEqual(2, len(spans)) + assert len(spans) == 2 db_span, test_span = spans - self.assertEqual("test", test_span.data["sdk"]["name"]) - self.assertEqual(test_span.t, db_span.t) - self.assertEqual(db_span.p, test_span.s) + assert test_span.data["sdk"]["name"] == "test" + assert test_span.t == db_span.t + assert db_span.p == test_span.s - self.assertIsNone(db_span.ec) + assert not db_span.ec - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv['mysql_db']) - self.assertEqual(db_span.data["mysql"]["user"], testenv['mysql_user']) - self.assertEqual(db_span.data["mysql"]["stmt"], 'INSERT INTO users(name, email) VALUES(%s, %s)') - self.assertEqual(db_span.data["mysql"]["host"], testenv['mysql_host']) - self.assertEqual(db_span.data["mysql"]["port"], testenv['mysql_port']) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert ( + db_span.data["mysql"]["stmt"] + == "INSERT INTO users(name, email) VALUES(%s, %s)" + ) + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] def test_call_proc(self): - with tracer.start_active_span('test'): - callproc_result = self.cursor.callproc('test_proc', ('beaker',)) + with tracer.start_as_current_span("test"): + callproc_result = self.cursor.callproc("test_proc", ("beaker",)) - self.assertIsInstance(callproc_result, tuple) + assert isinstance(callproc_result, tuple) spans = self.recorder.queued_spans() - self.assertEqual(2, len(spans)) + assert len(spans) == 2 db_span, test_span = spans - self.assertEqual("test", test_span.data["sdk"]["name"]) - self.assertEqual(test_span.t, db_span.t) - self.assertEqual(db_span.p, test_span.s) + assert test_span.data["sdk"]["name"] == "test" + assert test_span.t == db_span.t + assert db_span.p == test_span.s - self.assertIsNone(db_span.ec) + assert not db_span.ec - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv['mysql_db']) - self.assertEqual(db_span.data["mysql"]["user"], testenv['mysql_user']) - self.assertEqual(db_span.data["mysql"]["stmt"], 'test_proc') - self.assertEqual(db_span.data["mysql"]["host"], testenv['mysql_host']) - self.assertEqual(db_span.data["mysql"]["port"], testenv['mysql_port']) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert db_span.data["mysql"]["stmt"] == "test_proc" + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] def test_error_capture(self): affected_rows = None try: - with tracer.start_active_span('test'): + with tracer.start_as_current_span("test"): affected_rows = self.cursor.execute("""SELECT * from blah""") except Exception: pass - self.assertIsNone(affected_rows) + assert not affected_rows spans = self.recorder.queued_spans() - self.assertEqual(2, len(spans)) + assert len(spans) == 2 db_span, test_span = spans - self.assertEqual("test", test_span.data["sdk"]["name"]) - self.assertEqual(test_span.t, db_span.t) - self.assertEqual(db_span.p, test_span.s) + assert test_span.data["sdk"]["name"] == "test" + assert test_span.t == db_span.t + assert db_span.p == test_span.s - self.assertEqual(1, db_span.ec) - self.assertEqual(db_span.data["mysql"]["error"], '(1146, "Table \'%s.blah\' doesn\'t exist")' % testenv['mysql_db']) + assert db_span.ec == 2 + assert ( + db_span.data["mysql"]["error"] + == f"(1146, \"Table '{testenv['mysql_db']}.blah' doesn't exist\")" + ) - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv['mysql_db']) - self.assertEqual(db_span.data["mysql"]["user"], testenv['mysql_user']) - self.assertEqual(db_span.data["mysql"]["stmt"], 'SELECT * from blah') - self.assertEqual(db_span.data["mysql"]["host"], testenv['mysql_host']) - self.assertEqual(db_span.data["mysql"]["port"], testenv['mysql_port']) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert db_span.data["mysql"]["stmt"] == "SELECT * from blah" + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] def test_connect_cursor_ctx_mgr(self): - with tracer.start_active_span("test"): + with tracer.start_as_current_span("test"): with self.db as connection: with connection.cursor() as cursor: affected_rows = cursor.execute("""SELECT * from users""") - self.assertEqual(1, affected_rows) + assert affected_rows == 1 spans = self.recorder.queued_spans() - self.assertEqual(2, len(spans)) + assert len(spans) == 2 db_span, test_span = spans - self.assertEqual("test", test_span.data["sdk"]["name"]) - self.assertEqual(test_span.t, db_span.t) - self.assertEqual(db_span.p, test_span.s) + assert test_span.data["sdk"]["name"] == "test" + assert test_span.t == db_span.t + assert db_span.p == test_span.s - self.assertIsNone(db_span.ec) + assert not db_span.ec - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv["mysql_db"]) - self.assertEqual(db_span.data["mysql"]["user"], testenv["mysql_user"]) - self.assertEqual(db_span.data["mysql"]["stmt"], "SELECT * from users") - self.assertEqual(db_span.data["mysql"]["host"], testenv["mysql_host"]) - self.assertEqual(db_span.data["mysql"]["port"], testenv["mysql_port"]) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert db_span.data["mysql"]["stmt"] == "SELECT * from users" + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] def test_connect_ctx_mgr(self): - with tracer.start_active_span("test"): + with tracer.start_as_current_span("test"): with self.db as connection: cursor = connection.cursor() cursor.execute("""SELECT * from users""") - spans = self.recorder.queued_spans() - self.assertEqual(2, len(spans)) + assert len(spans) == 2 db_span, test_span = spans - self.assertEqual("test", test_span.data["sdk"]["name"]) - self.assertEqual(test_span.t, db_span.t) - self.assertEqual(db_span.p, test_span.s) + assert test_span.data["sdk"]["name"] == "test" + assert test_span.t == db_span.t + assert db_span.p == test_span.s - self.assertIsNone(db_span.ec) + assert not db_span.ec - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv["mysql_db"]) - self.assertEqual(db_span.data["mysql"]["user"], testenv["mysql_user"]) - self.assertEqual(db_span.data["mysql"]["stmt"], "SELECT * from users") - self.assertEqual(db_span.data["mysql"]["host"], testenv["mysql_host"]) - self.assertEqual(db_span.data["mysql"]["port"], testenv["mysql_port"]) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert db_span.data["mysql"]["stmt"] == "SELECT * from users" + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] def test_cursor_ctx_mgr(self): - with tracer.start_active_span("test"): + with tracer.start_as_current_span("test"): connection = self.db with connection.cursor() as cursor: affected_rows = cursor.execute("""SELECT * from users""") - - self.assertEqual(1, affected_rows) + assert affected_rows == 1 spans = self.recorder.queued_spans() - self.assertEqual(2, len(spans)) + assert len(spans) == 2 db_span, test_span = spans - self.assertEqual("test", test_span.data["sdk"]["name"]) - self.assertEqual(test_span.t, db_span.t) - self.assertEqual(db_span.p, test_span.s) + assert test_span.data["sdk"]["name"] == "test" + assert test_span.t == db_span.t + assert db_span.p == test_span.s - self.assertIsNone(db_span.ec) + assert not db_span.ec - self.assertEqual(db_span.n, "mysql") - self.assertEqual(db_span.data["mysql"]["db"], testenv["mysql_db"]) - self.assertEqual(db_span.data["mysql"]["user"], testenv["mysql_user"]) - self.assertEqual(db_span.data["mysql"]["stmt"], "SELECT * from users") - self.assertEqual(db_span.data["mysql"]["host"], testenv["mysql_host"]) - self.assertEqual(db_span.data["mysql"]["port"], testenv["mysql_port"]) + assert db_span.n == "mysql" + assert db_span.data["mysql"]["db"] == testenv["mysql_db"] + assert db_span.data["mysql"]["user"] == testenv["mysql_user"] + assert db_span.data["mysql"]["stmt"] == "SELECT * from users" + assert db_span.data["mysql"]["host"] == testenv["mysql_host"] + assert db_span.data["mysql"]["port"] == testenv["mysql_port"] diff --git a/tests/conftest.py b/tests/conftest.py index 1e180620..e2161a6c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -40,7 +40,6 @@ collect_ignore_glob.append("*clients/test_cassandra*") collect_ignore_glob.append("*clients/test_couchbase*") collect_ignore_glob.append("*clients/test_google*") -collect_ignore_glob.append("*clients/test_mysql*") collect_ignore_glob.append("*clients/test_pika*") collect_ignore_glob.append("*clients/test_pymongo*") collect_ignore_glob.append("*clients/test_redis*")