服务器巡检报告-基于categraf 采集数据-存入Prometheus-写入mysql后生成报告

zserverpiclass.py

# 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 );''')





zserverpimain.py

# 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)


zserverpitemp.html

<!--
#Create by:ember.zhang
#为什么不问问神奇的海螺呢丶
 -->
<html>
<head>
    <title>服务器巡检报告 -- {{ cdate }}</title>
    <style type='text/css'>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            font-size: 14px;
            line-height: 1.6;
            color: #333;
            background-color: #f5f7fa;
            padding: 20px;
        }
        .container {
            width: 100%;
            max-width: 1200px;
            margin: 0 auto;
            background-color: #fff;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
            padding: 30px;
        }
        h2 {
            text-align: center;
            color: #2c3e50;
            margin-bottom: 30px;
            padding-bottom: 15px;
            border-bottom: 2px solid #23a85b;
        }
        .index-table {
            margin-bottom: 40px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 15px 0;
            border-radius: 6px;
            overflow: hidden;
            box-shadow: 0 1px 3px rgba(0,0,0,0.1);
        }
        th, td {
            padding: 12px 15px;
            text-align: left;
            border-bottom: 1px solid #e0e0e0;
        }
        th {
            background-color: #34db6c;
            color: white;
            font-weight: 600;
        }
        tr:last-child td {
            border-bottom: none;
        }
        tr:hover td {
            background-color: #f9f9f9;
        }
        .section-title {
            color: #2c3e50;
            margin: 30px 0 15px;
            padding-left: 10px;
            border-left: 4px solid #34db7a;
        }
        .node-section {
            margin-bottom: 40px;
            padding-bottom: 20px;
            border-bottom: 1px dashed #e0e0e0;
        }
        .node-section:last-child {
            border-bottom: none;
        }
        .back-to-top {
            display: inline-block;
            color: #3498db;
            text-decoration: none;
            font-weight: 500;
            padding: 5px 10px;
            border: 1px solid #3498db;
            border-radius: 4px;
            float: right;
            transition: all 0.3s ease;
        }
        .back-to-top:hover {
            background-color: #3498db;
            color: white;
        }
        .status-warning {
            background-color: #fdecea;
            color: #e74c3c;
            font-weight: 600;
            text-align: center;
        }
        .status-normal {
            background-color: #eafaf1;
            color: #27ae60;
            font-weight: 600;
            text-align: center;
        }
        .category-header {
            background-color: #2c3e50;
            color: white;
            font-weight: 600;
        }
        a {
            color: #3498db;
            text-decoration: none;
        }
        a:hover {
            color: #2980b9;
            text-decoration: underline;
        }
        .index-link {
            font-weight: 500;
        }
        .disk-table th,
        .mem-table th,
        .cpu-table th {
            background-color: #2980b9;
        }
    </style>
</head>
<body>
    <div class="container">
        <a name='index' />
        <h2>服务器巡检报告 -- {{ cdate }}</h2>

        <!-- 索引表 -->
        <table class="index-table">
            <thead>
                <tr>
                    <th style='width: 100px;'>节点IP</th>
                    <th>主机名</th>
                    <th>操作系统</th>
                    <th>所属项目</th>
                    <th>服务</th>
                    <th>运行时间</th>
                    <th>告警</th>
                    <th>检查时间</th>
                </tr>
            </thead>
            {% for ihc in zdatah %}
            <tr>
                <td><a href='#{{ ihc["hostip"] }}' class="index-link">{{ ihc["hostip"] }}</a></td>
                <td>{{ ihc["hostname"] }}</td>
                <td>{{ ihc["os"] }}</td>
                <td>{{ ihc["server"] }}</td>
                <td>{{ ihc["service"] }}</td>
                <td>{{ ihc["uptime"] }}</td>
                {% if ihc["alarm"] == 1  %}
                <td class="status-warning">Warning</td>
                {% else %}
                <td class="status-normal">Normal</td>
                {% endif  %}
                <td>{{ ihc["checktime"] }}</td>
            </tr>
            {% endfor %}
        </table>

        <!-- 节点详情 -->
        {% for ic in zjdata %}
        <div class="node-section">
            <a name='{{ ic["cpu"]["hostip"] }}' />
            <div>
                <a href='#index' class="back-to-top">返回目录</a>
                <h3 class="section-title">节点IP: {{ ic["cpu"]["hostip"] }}</h3>
            </div>

            <!-- CPU信息 -->
            <table class="cpu-table">
                <thead>
                    <tr>
                        <th class="category-header" colspan="3">CPU信息</th>
                    </tr>
                    <tr>
                        <th style='width: 100px;'>节点IP</th>
                        <th>CPU使用率</th>
                        <th>检查时间</th>
                    </tr>
                </thead>
                <tr>
                    <td style='text-align: center;'>{{ ic["cpu"]["hostip"] }}</td>
                    {% if ic["cpu"]["alarm"] == 1  %}
                    <td class="status-warning">{{ ic["cpu"]["cpuuse"] }}</td>
                    {% else %}
                    <td class="status-normal">{{ ic["cpu"]["cpuuse"] }}</td>
                    {% endif  %}
                    <td>{{ ic["cpu"]["checktime"] }}</td>
                </tr>
            </table>

            <!-- 内存信息 -->
            <table class="mem-table">
                <thead>
                    <tr>
                        <th class="category-header" colspan="5">内存信息</th>
                    </tr>
                    <tr>
                        <th style='width: 100px;'>节点IP</th>
                        <th>总量</th>
                        <th>已用</th>
                        <th>使用率</th>
                        <th>检查时间</th>
                    </tr>
                </thead>
                <tr>
                    <td style='text-align: center;'>{{ ic["mem"]["hostip"] }}</td>
                    <td>{{ ic["mem"]["memtotal"] }}</td>
                    <td>{{ ic["mem"]["memuse"] }}</td>
                    {% if ic["mem"]["alarm"] == 1  %}
                    <td class="status-warning">{{ ic["mem"]["useratio"] }}</td>
                    {% else %}
                    <td class="status-normal">{{ ic["mem"]["useratio"] }}</td>
                    {% endif  %}
                    <td>{{ ic["mem"]["checktime"] }}</td>
                </tr>
            </table>

            <!-- 磁盘信息 -->
            <table class="disk-table">
                <thead>
                    <tr>
                        <th class="category-header" colspan="10">磁盘信息</th>
                    </tr>
                    <tr>
                        <th style='width: 100px;'>节点IP</th>
                        <th>文件系统</th>
                        <th>类型</th>
                        <th>总量</th>
                        <th>已用</th>
                        <th>可用</th>
                        <th>使用率</th>
                        <th>模式</th>
                        <th>路径</th>
                        <th>检查时间</th>
                    </tr>
                </thead>
                {% for icd in ic["disk"] %}
                <tr>
                    <td style='text-align: center;'>{{ icd["hostip"] }}</td>
                    <td>{{ icd["device"] }}</td>
                    <td>{{ icd["fstype"] }}</td>
                    <td>{{ icd["disktotal"] }}</td>
                    <td>{{ icd["diskuse"] }}</td>
                    <td>{{ icd["diskavail"] }}</td>
                    {% if icd["alarm"] == 1  %}
                    <td class="status-warning">{{ icd["useratio"] }}</td>
                    {% else %}
                    <td class="status-normal">{{ icd["useratio"] }}</td>
                    {% endif  %}
                    <td>{{ icd["mode"] }}</td>
                    <td>{{ icd["path"] }}</td>
                    <td>{{ icd["checktime"] }}</td>
                </tr>
                {% endfor %}
            </table>
        </div>
        {% endfor %}
    </div>
</body>
</html>

zapp db相关表及函数

-- 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;


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为什么不问问神奇的海螺呢丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值