# Create by:ember.zhang
# 为什么不问问神奇的海螺呢丶
import json
import pymysql
import requests
import pandas as pd
from jinja2 import Environment, FileSystemLoader
from sqlalchemy import create_engine
def schtml(cdate, zdatah, zjdata, rp):
env = Environment(loader=FileSystemLoader('/data/zz/zscript/serverpi/'))
template = env.get_template('zserverpitemp.html')
with open('/data/zz/zscript/serverpi/zserverpireport/%s' % rp, 'w+') as fout:
html_content = template.render(cdate=cdate,
zdatah=zdatah,
zjdata=zjdata)
fout.write(html_content)
print("服务器巡检报告已生成"+cdate)
# def schtml(cdate, zdatah, zjdata, rp):
# env = Environment(loader=FileSystemLoader('E:/MagicConch/montior/program/serverpi/'))
# template = env.get_template('zserverpi.html')
# with open('E:/MagicConch/montior/program/serverpi/zserverpireport/%s' % rp, 'w+') as fout:
# html_content = template.render(cdate=cdate,
# zdatah=zdatah,
# zjdata=zjdata)
# fout.write(html_content)
# 传入文件
def post_file(file, wx_url, id_url):
# wx_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=29d012fd-001c-4073-b5c1-b396ea1d9681'
data = {'file': open(file, 'rb')}
# 请求id_url(将文件上传微信临时平台),返回media_id
# id_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=29d012fd-001c-4073-b5c1-b396ea1d9681&type=file'
response = requests.post(url=id_url, files=data)
print(response.text)
json_res = response.json()
media_id = json_res['media_id']
data = {"msgtype": "file",
"file": {"media_id": media_id}
}
# 发送文件
result = requests.post(url=wx_url, json=data)
return (result)
# 发送文字
def send_message(message, person_list, wx_url):
# wx_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=29d012fd-001c-4073-b5c1-b396ea1d9681&type'
data = {
"msgtype": "text",
"text": {
"content": message,
"mentioned_list": person_list # 需@人的姓名
}
}
r = requests.post(url=wx_url,
json=data) # url中的xxx是你的机器人webhook对应片段,不要轻易泄露出去否则任何人都可以控制你的机器人哦
# 读取mysql 巡检数据 返回DataFrame格式
def rmysql(v_sql):
db = pymysql.connect(host='10.12.8.120', user='root', password='root@mnxxxx', database='zapp', autocommit=True)
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute(v_sql)
# # 使用 fetchone() 方法获取单条数据.
result = cursor.fetchall() # 所有结果
column = [index[0] for index in cursor.description] # 列名
data = pd.DataFrame([list(i) for i in result], columns=column) # row是数据库返回的一条一条记录,其中的每一天和column写成字典,最后就是字典数组
db.close()
return data
# 写入数据库
def wmysql(v_sql):
db = pymysql.connect(host='10.12.8.120', user='root', password='root@mn8120', database='zapp', autocommit=True)
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute(v_sql)
# # 使用 fetchone() 方法获取单条数据.
# data = cursor.fetchone()
# return data
# 关闭数据库连接
db.close()
def rtdf(value,cname):
listz = []
for i in range(len(value)):
tt = value[i]['metric']
tt.update({'checktime': value[i]['value'][0]})
tt.update({cname: value[i]['value'][1]})
listz.append(tt)
return pd.json_normalize(listz)
class pm:
def __init__(self, serveraddr):
self.serveraddr = serveraddr
self.hh = 'http://' + self.serveraddr + ':7746' + '/api/v1/query?query='
self.engine = create_engine('mysql+mysqlconnector://root:root%40mnxxxx@10.12.8.120:3306/zapp')
self.getHost()
self.getCpu()
self.getMemory()
self.getDisk()
# 主机
def getHost(self):
wmysql(v_sql='''truncate table tm_host;''')
hsql = 'system_uptime'
url = self.hh + hsql
response = requests.request('get', url)
if response.status_code == 200:
hdf=rtdf(value=response.json()['data']['result'],cname='uptime')
hdf[['ident','uptime','checktime']].to_sql('tm_host', con=self.engine, index=False, if_exists='append')
wmysql(v_sql='''INSERT into tb_zhost (hostip,hostname,os,server,service,uptime,checktime)
SELECT SUBSTRING_INDEX(a.ident,'-',-1),
IF(left(a.ident,LENGTH(a.ident)-1-LENGTH(SUBSTRING_INDEX(a.ident,'-',-1)))='',a.ident,left(a.ident,LENGTH(a.ident)-1-LENGTH(SUBSTRING_INDEX(a.ident,'-',-1)))),
t.os,ifnull(bg.name,'/'),ifnull(t.note,'/'),concat(FORMAT(uptime/3600/24,2),'天') ,
CAST(from_unixtime( a.checktime,'%Y-%m-%d') as char) as checktime from tm_host a
inner join n9e_v6.target t on a.ident =t.ident
left join n9e_v6.target_busi_group tb on t.ident =tb.target_ident
LEFT join n9e_v6.busi_group bg on tb.group_id =bg.id
WHERE not exists
(SELECT 1 from tb_zhost b where CAST(from_unixtime(a.checktime,'%Y-%m-%d')as char) = CAST(b.checktime as char )and SUBSTRING_INDEX(a.ident,'-',-1) =b.hostip );''')
#cpu
def getCpu(self):
wmysql(v_sql='''truncate table tm_cpu;''')
csql = 'avg_over_time (cpu_usage_active [1d])'
url = self.hh + csql
response = requests.request('GET', url)
if response.status_code == 200:
cdf = rtdf(value=response.json()['data']['result'], cname='cpuuse')
cdf[['ident','cpuuse','checktime']].to_sql('tm_cpu', con=self.engine, index=False, if_exists='append')
wmysql(v_sql='''INSERT into tb_zcpu(hostip,cpuuse,checktime)
select SUBSTRING_INDEX(ident,'-',-1),
CONCAT(FORMAT(a.cpuuse,2),'%') as cpuuse,
CAST(from_unixtime( a.checktime,'%Y-%m-%d') as char) as checktime from tm_cpu a
WHERE not exists
(SELECT 1 from tb_zcpu b where CAST(from_unixtime(a.checktime,'%Y-%m-%d')as char) = cast(b.checktime as char )and SUBSTRING_INDEX(ident,'-',-1) =b.hostip );''')
# 内存
def getMemory(self):
wmysql(v_sql='''truncate table tm_mem;''')
musql = 'avg_over_time (mem_used [1d])'
mtsql = 'mem_total'
muurl = self.hh+musql
mturl = self.hh+mtsql
response = requests.request('get', muurl)
if response.status_code == 200:
mudf = rtdf(value=response.json()['data']['result'], cname='memuse')
response = requests.request('get', mturl)
if response.status_code == 200:
mtdf = rtdf(value=response.json()['data']['result'], cname='memtotal')
mdf=pd.merge(mudf,mtdf, on='ident',how='inner')[['ident','memuse','memtotal','checktime_x']]
mdf.to_sql('tm_mem', con=self.engine, index=False, if_exists='append')
wmysql(v_sql='''INSERT into tb_zmem(hostip,memuse,memtotal,useratio,checktime)
select SUBSTRING_INDEX(ident,'-',-1),
concat(FORMAT(memuse/1073741824,2),'G') as memuse,
concat(FORMAT(memtotal/1073741824,2),'G') as memtotal,
concat(FORMAT(memuse/memtotal *100,2),'%' ) as useratio,
CAST(from_unixtime( a.checktime_x,'%Y-%m-%d') as char) as checktime from tm_mem a
WHERE not exists
(SELECT 1 from tb_zmem b where CAST(from_unixtime(a.checktime_x,'%Y-%m-%d')as char) = cast(b.checktime as char ) and SUBSTRING_INDEX(ident,'-',-1) =b.hostip );''')
# 磁盘
def getDisk(self):
wmysql(v_sql='''truncate table tm_disk;''')
dtsql = 'disk_total'
dusql = 'disk_used'
dturl = self.hh+dtsql
duurl = self.hh+dusql
response = requests.request('get', dturl)
if response.status_code == 200:
dtdf = rtdf(value=response.json()['data']['result'], cname='disktotal')
response = requests.request('get', duurl)
if response.status_code == 200:
dudf = rtdf(value=response.json()['data']['result'], cname='diskuse')
ddf=pd.merge(dtdf,dudf, on=['ident','device','fstype','mode','path'],how='inner')[['ident','device','fstype','mode','path','diskuse','disktotal','checktime_x']]
ddf.to_sql('tm_disk', con=self.engine, index=False, if_exists='append')
wmysql('''INSERT into tb_zdisk(hostip,device,fstype,diskuse,disktotal,diskavail,useratio,mode,path,checktime)
select SUBSTRING_INDEX(ident,'-',-1),
a.device,
a.fstype,
concat(FORMAT(a.diskuse/1073741824,2),'G') as diskuse,
concat(FORMAT(a.disktotal/1073741824,2),'G') as disktotal,
concat(FORMAT((a.disktotal-a.diskuse)/1073741824,2),'G') as diskavail,
concat(FORMAT(a.diskuse/a.disktotal *100,2),'%' ) as useratio,
a.mode,
a.path,
CAST(from_unixtime( a.checktime_x,'%Y-%m-%d') as char) as checktime from tm_disk a
WHERE not exists
(SELECT 1 from tb_zdisk b where CAST(from_unixtime(a.checktime_x,'%Y-%m-%d')as char) = cast(b.checktime as char ) and SUBSTRING_INDEX(ident,'-',-1) =b.hostip and a.device=b.device );''')
# Create by:ember.zhang
# 为什么不问问神奇的海螺呢丶
import zserverpiclass as z
from datetime import datetime
pm = z.pm(serveraddr='10.12.8.120')
datah=z.rmysql(v_sql='''
select hostip,hostname,os,`server`,service,uptime,
getha(hostip,NULL) as alarm,
checktime
from tb_zhost where checktime =CURDATE();
''')
datac=z.rmysql(v_sql='''
select hostip,cpuuse as cpuuse,checktime ,
if(replace(cpuuse,'%','')>80,1,0) as alarm
from tb_zcpu where checktime =CURDATE();
''')
datam=z.rmysql(v_sql='''
select hostip,memtotal,memuse,
useratio,checktime ,
IF(replace(useratio,'%','')>90,1,0) as alarm
from tb_zmem where checktime =CURDATE();
''')
datad = z.rmysql(v_sql='''
select hostip,device,fstype,diskuse,
disktotal,diskavail,useratio,mode,path,checktime ,
if(replace(useratio,'%','')>90,1,0) as alarm
from tb_zdisk where checktime =CURDATE();
''')
zjdata = []
for i in datam.to_dict('records'):
# print(i)
icdatc = datac[(datac['hostip'] == i['hostip'])].to_dict('records')
iddata = datad[(datad['hostip'] == i['hostip'])].to_dict('records')
# print(iddata)
idata = {'cpu': icdatc[0], 'mem': i, 'disk': iddata}
# print(idata)
zjdata.append(idata)
zdatah = datah.to_dict('records')
cdate = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
rp = 'serverpireport' + cdate.replace(' ', '').replace(':', '') + '.html'
z.schtml(zdatah=zdatah, zjdata=zjdata, cdate=cdate, rp=rp)
#0 8 * * * /usr/local/bin/python3 /data/zz/zscript/serverpi/zserverpimain.py >> /data/zz/zscript/serverpi/run.log 2>&1
# #发送巡检报告
# wx_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=8eb4a70d-39c6-40af-a6ee-88e79114f32e'
# id_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=8eb4a70d-39c6-40af-a6ee-88e79114f32e&type=file'
# z.post_file('/zscript/serverpi/zserverpireport/%s' % rp, wx_url=wx_url, id_url=id_url)
#
# #发送通知
# wx_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=8eb4a70d-39c6-40af-a6ee-88e79114f32e&type'
# z.send_message(message='今日巡检报告已生成,请注意查收', person_list='@all', wx_url=wx_url)
-- zapp.tb_zcpu definition
CREATE TABLE `tb_zcpu` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键自增',
`hostip` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主机ip',
`cpuuse` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '使用率',
`checktime` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '检查时间',
`inserttime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '写入时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=746 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='cpu信息';
-- zapp.tb_zdisk definition
CREATE TABLE `tb_zdisk` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键自增',
`hostip` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主机ip',
`device` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '文件系统',
`fstype` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '文件系统类型',
`diskuse` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '总量',
`disktotal` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '已用',
`diskavail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '可用',
`useratio` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '已用百分比',
`mode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '模式',
`path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '路径',
`checktime` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '检查时间',
`inserttime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '写入时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2922 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='磁盘信息';
-- zapp.tb_zhost definition
CREATE TABLE `tb_zhost` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键Id',
`hostip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主机ip',
`hostname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主机名',
`os` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '操作系统',
`server` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '所属项目',
`service` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '运行服务',
`uptime` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '运行时间',
`checktime` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '检查时间',
`inserttime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '数据写入时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=714 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='主机信息';
-- zapp.tb_zmem definition
CREATE TABLE `tb_zmem` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键自增',
`hostip` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主机ip',
`memuse` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '已用',
`memtotal` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '总量',
`useratio` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '已用百分比',
`checktime` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '检查时间',
`inserttime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '写入时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=714 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='内存信息';
-- zapp.tm_cpu definition
CREATE TABLE `tm_cpu` (
`ident` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`cpuuse` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`checktime` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- zapp.tm_disk definition
CREATE TABLE `tm_disk` (
`ident` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`device` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`fstype` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`mode` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`diskuse` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`disktotal` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`checktime_x` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- zapp.tm_host definition
CREATE TABLE `tm_host` (
`ident` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`os` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`server` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`service` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`uptime` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`checktime` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- zapp.tm_mem definition
CREATE TABLE `tm_mem` (
`ident` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`memuse` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`memtotal` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`checktime_x` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- `zapp`.`getalarm`
CREATE DEFINER=`root`@`%` FUNCTION `zapp`.`getalarm`(inhostip VARCHAR(100),indate date) RETURNS tinyint
BEGIN
DECLARE outalarm TINYINT;
IF indate is NULL THEN
set indate =CURRENT_DATE() ;
end if;
WITH za as (
select
if(FORMAT(cpuuse,2)>80,1,0) as alarm
from tb_targetc where DATE_FORMAT(inserttime,'%Y-%m-%d') =indate
and hostip =inhostip
UNION all
select
IF(FORMAT((memTotal-(buffers+cached+memFree))/memTotal *100,2)>80,1,0) as alarm
from tb_targetm where DATE_FORMAT(inserttime,'%Y-%m-%d') =indate
and hostip =inhostip
UNION all
select
if(FORMAT(useratio*100,2)>80,1,0) as alarm
from tb_targetd where DATE_FORMAT(inserttime,'%Y-%m-%d') =indate
and hostip =inhostip
)
select if(sum(alarm) >0,1,0) into outalarm from za
;
RETURN outalarm;
END;
-- `zapp`.`getha`
CREATE DEFINER=`root`@`%` FUNCTION `zapp`.`getha`(inhostip VARCHAR(100),indate date) RETURNS tinyint
BEGIN
DECLARE outalarm TINYINT;
IF indate is NULL THEN
set indate =CURRENT_DATE() ;
end if;
WITH za as (
select
if(replace(cpuuse,'%','')>80,1,0) as alarm
from tb_zcpu where checktime =indate
and hostip =inhostip
UNION all
select
IF(replace(useratio,'%','')>90,1,0) as alarm
from tb_zmem where checktime =indate
and hostip =inhostip
UNION all
select
if(replace(useratio,'%','')>90,1,0) as alarm
from tb_zdisk where checktime =indate
and hostip =inhostip
)
select if(sum(alarm) >0,1,0) into outalarm from za
;
RETURN outalarm;
END;