from .db_collector import DBCollector from loguru import logger import pymysql, json class MysqlCollector(DBCollector): def __init__(self, db_url, user_name, password): self.VERSION_SQL = "SELECT @@GLOBAL.version;" self.PARAMETERS_SQL = "SHOW VARIABLES;" self.METRICS_SQL = "SHOW STATUS;" self.METRICS_SQL2 = "SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS where subsystem = 'transaction';" self.db_parameters = {} self.db_metrics = {} self.innodb_metrics = {} database = db_url.split("/")[1] host = db_url.split("/")[0].split(":")[0] port = int(db_url.split("/")[0].split(":")[1]) db = pymysql.connect(host=host, user=user_name, password=password, port=port, db=database, charset='utf8') cursor = db.cursor() try: # collect mysql version cursor.execute(self.VERSION_SQL) out = cursor.fetchall() self.version = out[0][0] # collect mysql parameters cursor.execute(self.PARAMETERS_SQL) out = cursor.fetchall() for row in out: self.db_parameters[row[0].lower()] = str(row[1]).lower() # collect mysql internal metrics cursor.execute(self.METRICS_SQL) out = cursor.fetchall() for row in out: self.db_metrics[row[0].lower()] = str(row[1]).lower() cursor.execute(self.METRICS_SQL2) out = cursor.fetchall() for row in out: self.innodb_metrics[row[0].lower()] = str(row[1]).lower() except Exception as e: logger.error(e) db.rollback() finally: db.close() def collect_parameters(self): parameters = {"global": {"global": self.db_parameters}, "local": None} return json.dumps(parameters) def collect_metrics(self): metrics = {"global": {"global": self.db_metrics, "innodb_metrics": self.innodb_metrics}, "local": None} return json.dumps(metrics) def collect_version(self): return self.version def collect_component_instances(self): pass