如何监控PostgreSQL存储过程/函数代码运行?本文介绍用python+微信/邮件的方式进行报警、监控。

首先要有一张表、用于存放PostgreSQL存储过程/函数代码运行异常的信息。

处理原则:若出现异常;把“发生时间+所在的程序+原因”通过微信/邮件发给对应人员。当然发送一次即可;起到通知的效果。

一、媒介

通过什么方式进行发送内容;下面介绍微信/邮件两种方式

1、python发送微信

py_wechar.py的内容

企业微信号;大家可以到企业微信上配置

#!/usr/bin/python3

#coding=utf-8

import json

import time

import urllib.request as urllib2

options = {

'WeiXin': {

'corp_id': '*',  #微信企业号ID

'agent_id': '*', #微信企业号应用ID

'agent_secret': '*',  #微信企业号密钥

'to_user': '@all'  #发送给谁

},

}

class WeiXinSendMsg:

def __init__(self, wx_conf):

self.corp_id = wx_conf.get('corp_id')

self.agent_secret = wx_conf.get('agent_secret')

self.agent_id = wx_conf.get('agent_id')

self.to_user = wx_conf.get('to_user')

self.token = self.get_token()

self.token_update_time = int(time.time())

def get_token(self):

get_token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + self.corp_id + '&corpsecret=' + self.agent_secret

token = json.loads(urllib2.urlopen(get_token_url).read().decode('utf-8'))['access_token']

if token:

return token

# 微信发送端的token每1800秒会更新一次

def update_token(self):

if int(time.time()) - self.token_update_time >= 1800:

self.token = self.get_token()

self.token_update_time = int(time.time())

def send_message(self, msg):

try:

self.update_token()

send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.token

send_val = {"touser":self.to_user, "toparty":"", "msgtype":"text", "agentid":self.agent_id, "text":{"content":msg}, "safe":"0"}

send_data = json.dumps(send_val, ensure_ascii=True).encode("utf-8")

send_request = urllib2.Request(send_url, send_data)

response = json.loads(urllib2.urlopen(send_request).read())

except Exception as e:

print('Exception WeiXin send_message:', e)

if __name__ == '__main__':

WeiXin = WeiXinSendMsg(options.get('WeiXin'))

WeiXin.send_message('hello world / 测试')

2、python发送邮件

py_email.py的内容

#!/usr/bin/python3

#coding=utf-8

import smtplib

from email.header import Header

from email.mime.text import MIMEText

from email.utils import parseaddr, formataddr

options = {

'Email': {

'smtp_server': 'smtp.exmail.qq.com',  #邮箱服务器地址

'from_addr': 'monitor@qq.com',  #发送人账号

'password': '123456', #发送人密码

'to_addr': ['hanbo@126.com', 'hanbo@163.com'], #发送给谁

}

}

class EmailSendMsg:

def __init__(self, email_conf):

self.smtp_server = email_conf.get('smtp_server')

self.from_addr = email_conf.get('from_addr')

self.password = email_conf.get('password')

self.to_addr = email_conf.get('to_addr')

# def __del__(self):

#     self.server.quit()

def format_addr(self, str):

name, addr = parseaddr(str)

return formataddr(( \

Header(name, 'utf-8').encode(), \

addr.encode('utf-8') if isinstance(addr, unicode) else addr))

def send_msg(self, text):

try:

self.server = smtplib.SMTP(self.smtp_server, 25)

self.server.set_debuglevel(1)

self.server.login(self.from_addr, self.password)

msg = MIMEText(text, 'plain', 'utf-8')

msg['From'] = self.format_addr(u'监控 ' % self.from_addr)

for i in range(len(self.to_addr)):

msg['To'] = self.format_addr(u'' % self.to_addr[i])

msg['Subject'] = Header(u'异常报警…', 'utf-8').encode()

self.server.sendmail(self.from_addr, self.to_addr, msg.as_string())

self.server.quit()

except Exception as e:

print 'Exception Email send_message:', e

if __name__ == '__main__':

Email = EmailSendMsg(options.get('Email'))

Email.send_msg('hello world!')

二、python连接数据库

看这个链接可以研究下python如何连接PostgreSQL数据库

三、python报警

上面我们知道如何通过python发送微信内容、以及python连接PostgreSQL数据库。现在我们要如何获取报警时机;报警内容。

python_alert.py

#!/usr/bin/python3

import psycopg2

from config import config

from py_wechar import WeiXinSendMsg,options

def get_errors():

""" query data from the vendors table """

conn = None

try:

params = config()

WeiXin = WeiXinSendMsg(options.get('WeiXin'))

conn = psycopg2.connect(**params)

cur = conn.cursor()

cur.execute("select error_time, error_desc, proc_name from adsas.tbl_error_log where deal_status = 0 order by id")

rows = cur.fetchall()

if cur.rowcount > 0 :

WeiXin.send_message("The number of parts: {}".format(cur.rowcount))

for row in rows:

# WeiXin.send_message('-'*60)

# WeiXin.send_message('发生时间:{}'.format(row[0]))

# WeiXin.send_message('错误原因:{}'.format(row[1]))

# WeiXin.send_message('报警代码:{}'.format(row[2]))

str_error='发生时间:{}\n错误原因:{}\n报警代码:{}'.format(row[0],row[1],row[2])

WeiXin.send_message(str_error)

cur.execute("update adsas.tbl_error_log set deal_status = 1 where deal_status = 0 ")

conn.commit()

cur.close()

except (Exception, psycopg2.DatabaseError) as error:

print(error)

finally:

if conn is not None:

conn.close()

if __name__ == '__main__':

get_errors()

四、部署

可以通过cron/或者开源的定时任务系统进行报警;

报警信息:

python监控程序执行_python如何监控PostgreSQL代码运行相关推荐

  1. python多线程执行_python多线程实现同时执行两个while循环

    如果想同时执行两个while True循环,可以使用多线程threading来实现. 完整代码 #coding=gbk from time import sleep, ctime import thr ...

  2. python 定时执行_python定时执行任务 轻量级

    python 中有一个轻量级的定时任务调度的库:schedule.他可以完成每分钟,每小时,每天,周几,特定日期的定时任务.因此十分方便我们执行一些轻量级的定时任务. 代码如下:1 import sc ...

  3. python多线程扫描_Python多线程扫描端口代码示例

    本文代码实现Python多线程扫描端口,具体实现代码如下. #coding:utf-8 import socket import thread import time socket.setdefaul ...

  4. python生成数字_Python生成数字图片代码分享

    本文向大家分享了几段Python生成数字图片的代码,喜欢的朋友可以参考.具体如下: 最终版本 # -*- coding:utf-8 -*- from PIL import Image,ImageFon ...

  5. python sorted下标_Python列表实用的代码片段

    Python列表知识点汇总,我总结成了 5 个字:增删改查序. 就是对列表进行新增元素.删除元素.改变元素.查询元素.列表排序. 接下来对应展开为 Python 习题. 增 对列表新增元素,有四种方式 ...

  6. python递归实例_python实现递归实例代码

    # 递归:在某个函数内部自己调用了自己# 递归和循环一样,必须要有退出条件.如果没有退出条件,就会无限调用自身,相当于死循环. 工具/原料 python3.6 pycharm 方法/步骤 1 def ...

  7. python——关于“霍兰德人格分析雷达图”代码运行错误解决

    问题描述: 嵩天老师课上代码运行时出现两个问题: 1.无Qt平台插件错误(解决了很久):This application failed to start because no Qt platform ...

  8. python 多线程并发怎么还是顺序执行_python thread 并发且顺序运行示例

    python怎么实现用多线程顺序执行 python 的GIL规定每个时刻只能有一个线程访问python虚拟机,所以你要用python的多线程来做计算是很不合算的,但是对于IO密集型的应用,例如网络交互 ...

  9. python mysql实例_Python操作Mysql实例代码

    本文介绍了Python操作MYSQL.执行SQL语句.获取结果集.遍历结果集.取得某个字段.获取表字段名.将图片插入数据库.执行事务等各种代码实例和详细介绍,代码居多,是一桌丰盛唯美的代码大餐. 实例 ...

最新文章

  1. Openshift创建Router和Registry
  2. 旅游网站的主页代码_一个在优化的网站主页内容应该如何设计?
  3. 网络编程 -- gethostbyname() 函数解析
  4. 开发app用户协议_家电商城APP开发,方便用户选购家电商品
  5. JS笔记:检测客户端(引擎、浏览器、平台、操作系统)
  6. 星来客机器人餐厅_在50米高空聚餐,在铁窗内吃饭,盘点全球特色餐厅,看看有多奇葩...
  7. oracle导库需要删除原始库,导入dmp文件时,需要删除原有ORACLE数据库实例
  8. oracle display set,Check if the DISPLAY variable is set
  9. Linux 工程师技术 系统服务管理进阶
  10. JavaScript遭嫌弃,“反JS”主义者兴起
  11. db2有主键时默认hash分区_Spark RDD依赖关系以及分区属性
  12. 学习用MaxScipt批处理Max文件
  13. 老韩思考:一个卖豆腐的能转行IT吗? 你的卖点在哪里?
  14. 微信小程序打开另一个小程序
  15. 关于MATLAB powergui 无法调整为discrete的解决方法
  16. schtasks /run 拒绝访问
  17. Java 抽奖活动循环编程练习
  18. 带图傻瓜式自己动手修改新浪微博各种尾巴
  19. 关于惠普暗影精灵2 pro用一段时间之后,插上电源充不了电的问题
  20. 【Spring Cloud】新闻头条微服务项目:自媒体前后端搭建素材管理(含优化)

热门文章

  1. 调色师必须了解的LUT知识
  2. Windows中导出电脑文件名或者文件结构的方法
  3. MapInfo MapXtreme 2005 WebGIS 简单鹰眼设计(转)
  4. 当ListView有Header时,onItemClick里的position不正确
  5. SqlParameter[] 添加参数
  6. ubuntu 下安装和启动SSH 服务
  7. win7系统office向程序发送命令时出现错误
  8. inetd -- internet超级服务器
  9. WPF Unleashed Chapter 2:XAML Demystified 翻译(第二部分)
  10. mysql 授权指定库,mysql创建新用户并给授权指定的数据库权限