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

zserverpiclass.py

python 复制代码
# 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

python 复制代码
# 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

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相关表及函数

sql 复制代码
-- 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;
相关推荐
网硕互联的小客服2 小时前
遇到网站500内部服务器错误如何处理?如何预防这样的问题发生?
运维·服务器·安全
秋氘渔2 小时前
智演沙盘 —— 基于大模型的智能面试评估系统
python·mysql·django·drf
杰克崔3 小时前
进程内mmap锁相互干扰问题
linux·运维·服务器·车载系统
木泽八3 小时前
python实现pdf拆分与合并
服务器·python·pdf
计算机毕设指导63 小时前
基于微信小程序的鸟博士系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven
断春风3 小时前
如何避免 MySQL 死锁?——从原理到实战的系统性解决方案
数据库·mysql
恒创科技HK3 小时前
2026年香港服务器有哪些区域可选?
运维·服务器
玉成2263 小时前
MySQL两表之间数据迁移由于字段排序规则设置的不一样导致失败
数据库·mysql
xjxijd3 小时前
工业元宇宙 IDC 支撑:数字孪生算法 + 边缘服务器,生产调度响应速度提 3 倍
运维·服务器·算法