#!/usr/bin/env python """igcollect - MySQL Query Results This script executes a single query and prints the results. The columns returned by the query are going to be appended to the given prefix. The query must return numeric values. Copyright (c) 2017 InnoGames GmbH """ from __future__ import print_function from argparse import ArgumentParser from time import time from mysql.connector import connect def parse_args(): parser = ArgumentParser() parser.add_argument('--prefix', default='mysql_query') parser.add_argument('--dbname', default='mysql') parser.add_argument('--user', default='root') parser.add_argument('--host', default='localhost') parser.add_argument('--password', default='password') parser.add_argument( '--unix-socket', default='/var/run/mysqld/mysqld.sock', ) parser.add_argument( '--query', required=True, action='append', dest='queries', ) parser.add_argument('--key-column') return parser.parse_args() def main(): """The main program""" args = parse_args() items = [] now = str(int(time())) cnx = connect( user=args.user, password=args.password, host=args.host, db=args.dbname, unix_socket=args.unix_socket, ) cur = cnx.cursor() for query in args.queries: cur.execute(query) if not cur.rowcount: raise Exception('No result') rows = [dict(zip(cur.column_names, r)) for r in cur.fetchall()] if args.key_column: items.extend(get_row_data(rows, args.key_column)) else: items.extend(get_column_data(rows)) for key, value in items: print(args.prefix + '.' + str(key), value, now) cur.close() cnx.close() def get_column_data(rows): if len(rows) > 1: raise Exception('Multiple rows') for row in rows: return row.items() def get_row_data(rows, key_column): first_row = rows[0] if key_column not in first_row: raise Exception('Key column is not there') if len(first_row) < 2: raise Exception('No column to print values') if len(first_row) > 2: raise Exception('More than 2 columns') for row in rows: key = row.pop(key_column) for value in row.values(): yield key, value if __name__ == '__main__': main()