zoukankan      html  css  js  c++  java
  • Python3.5+SQL+Prometheus+Grafana报表/监控

    参考资料:
     
    行列结合,作为prometheus_client的输出。 话不多说,直接上脚本。
     
    cat mysql_ccpay.py
    #coding=utf-8
    import sys
    import pymysql
    import os
    from prometheus_client import Gauge,start_http_server
    import time
    #v_host=os.popen('echo $HOSTNAME')
    #hostname=v_host.read()
    #hstname="".join(hostname)
    #print(hostname.strip())
    class MySQL_Status_Output:
        def __init__(self,host,port,user,password):
            try:
                self.db = pymysql.connect(host=host,port=port,user=user,password=password)
            except Exception as e:
                print('Database Connection Error')
                print(e)
        def mysql_select_colum_sql(self,sql):
            try:
                self.cursor = self.db.cursor(cursor = pymysql.cursors.DictCursor)
                self.cursor.execute(sql)
                v_result=self.cursor.fetchall()
                return v_result
            except Exception as e:
                print('SQL Result One Column Error')
                print(e)
        def mysql_select_sql(self,sql):
            try:
                self.cursor = self.db.cursor()
                self.cursor.execute(sql)
                col=self.cursor.description
                v_result=self.cursor.fetchall()
                return v_result,col
            except Exception as e:
                print('SQL Result More Column Error')
                print(e)
        def close_db(self):
            self.db.close()
    def ccpay_sql_one_exec(sql_exec):
        try:
            pro_db = MySQL_Status_Output('127.0.0.1',3306,'dbadmin','dbadmin')
            ccpay_sql = pro_db.mysql_select_colum_sql(sql_exec)
            pro_db.close_db()
            #print('输出行数为:',len(ccpay_sql))
            if int(len(ccpay_sql))==1:
                for i in range(len(ccpay_sql)):
                    c=ccpay_sql[i]
                    a=list(c.keys())
                    for j in range(len(a)):
                        print(a[j],':',c.get(a[j]))
                        ccpayGauge.labels(mylabelname=a[j]).set(c.get(a[j]))
            else:
                pass
        except Exception as e:
            print('One Colum ccpayGauge Error')
            print(e)
    def ccpay_sql_more_exec(sql_exec):
        try:
            pro_db = MySQL_Status_Output('127.0.0.1',3306,'dbadmin','dbadmin')
            ccpay_sql,col_name = pro_db.mysql_select_sql(sql_exec)
            if int(len(ccpay_sql))>1:
                bs_name=[]
                for i in range(len(ccpay_sql)):
                    bs_name.append(ccpay_sql[i][0])
                print(bs_name)
                for bsname in range(len(bs_name)):
                    col_name_list=[]
                    for i in range(len(col_name)):
                        col_name_list.append(col_name[i][0])
                    col_name_tuple=tuple(col_name_list)
                    ccpay_value_list=[]
                    for j in range(len(ccpay_sql)):
                        if ccpay_sql[j][0]==bs_name[bsname]:
                            ccpay_value_list=ccpay_sql[j]
                            me=dict(zip(col_name_tuple,ccpay_value_list))
                            for key in me:
                                bn=str(bs_name[bsname]+key)
                                bkey=str(me[key])
                                if str(bs_name[bsname])==str(bkey):
                                    #print(bs_name[bsname])
                                    pass
                                else:
                                    print(bn,':',bkey)
                                    ccpayGauge.labels(mylabelname=bn).set(bkey)
        except Exception as e:
            print('More Colums ccpayGauge Error')
            print(e)

    if __name__ == "__main__":
        start_http_server(9500)
        ccpayGauge = Gauge('ccpayGauge','Description of gauge', ['mylabelname'])
        while True:
            time.sleep(60)
            try:
                ccpay_sql_one_exec(" select count(1) '全盘交易笔数',count(case when trade_status !='FAILED' then 1 else null end) '全盘出码成功',count(case when trade_status ='SUCCESS' then 1 else null end) '全盘交易成功',count(case when notify_status ='SUCCESS' then 1 else null end) '全盘通知成功',sum(case when  trade_status ='SUCCESS' then TRADE_AMOUNT else null end)/100 '全盘成功金额',count(case when trade_status ='FAILED' and trade_errmsg = '指定设备无响应' then 1 else null end) '指定设备无响应',count(case when trade_status ='FAILED' and trade_errmsg = '找不到可用的设备' then 1 else null end) '找不到可用的设备',TRUNCATE(count(case when trade_status ='SUCCESS' then 1 else null end)*100/count(1),2) '全盘交易成功率' from ifpay_ccpay.trade_info where CREATE_TIME > curdate() ")
                ccpay_sql_one_exec(" select count(1) '可用设备' from ifpay_ccpay.machine where ENABLE_STATUS = '1' ")
                ccpay_sql_one_exec(" select count(distinct qrcode_url.qrcode_num) '新生码交易成功笔数' from ifpay_ccpay.trade_info inner join ifpay_ccpay.qrcode_url on trade_info.qrcode_num=qrcode_url.qrcode_num where trade_status='SUCCESS' and date(trade_info.create_time)=date(current_date()) and date(trade_info.create_time)=date(qrcode_url.created_date) ")
                ccpay_sql_more_exec(" select MERCHANT_name '商户名称',total '交易笔数',qrcode '出码成功',success '交易成功',notify '通知成功',(case when amount is null then 0 else amount end) '成功金额' from (select a.MERCHANT_name MERCHANT_name,count(1) total,count(case when trade_status !='FAILED' then 1 else null end) qrcode,count(case when trade_status ='SUCCESS' then 1 else null end) success,count(case when notify_status ='SUCCESS' then 1 else null end) notify,sum(case when  trade_status ='SUCCESS' then TRADE_AMOUNT else null end)/100 amount from ifpay_ccpay.trade_info,ifpay_ccpay.merchant a where MERCHANT_NO=a.MERCHANT_id  and CREATE_TIME > curdate() group by a.MERCHANT_name) a ")
            except Exception as e:
                print('Is Wrong')
                print(e)
     
    输出结果:
     
    Grafana输出

     
  • 相关阅读:
    Linux系统Tomcat进程使用shutdown无法关闭进程
    统一延长复工,带薪休假,几十万中小微企业面临的困境
    由数据迁移至MongoDB导致的数据不一致问题及解决方案
    整理了一周的Python资料,包含各阶段所需网站、项目,收藏了慢慢来
    2019,我是如何转向战略成功,并成功跑通一个现金流项目的
    500行代码,教你用python写个微信飞机大战
    会用python把linux命令写一遍的人,进大厂有多容易?
    Python 开发植物大战僵尸游戏
    分享一个 pycharm 专业版的永久使用方法
    mongodb 启动 WARNING: soft rlimits too low, transparent_hugepage/enabled is 'always'. never
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/10032594.html
Copyright © 2011-2022 走看看