NODEJS通过发送json数据查询目标服务,实现服务器状态监控,发现异常发送到微信群提醒

nodejs,json · 浏览次数 : 0

小编点评

```javascript const loopCheck = () => { // 检测完所有服务器后,等待一段时间后再次执行循环检测 setTimeout(loopCheck, 60 * 1000); // 数据请求 dataRequest('your_data_url', 'your_token', 'your_server_ip'); }; const loopCheck_info = () => { // 数据请求2 dataRequest_info('your_data_url', 'your_token', 'your_server_ip'); }; // 解析数据 const dataParse = function(response) { // 检查响应体是否为空 if (!response) return; // 解析 JSON 数据 const jsonData = JSON.parse(response); // 获取数据数组 const rows = jsonData.data.rows; // 标志,表示是否找到了符合条件的条目 let found = false; // 遍历数据数组,查找状态为\"数据同步任务运行中\"的条目 for (const rowData of rows) { if (rowData.error === \"数据同步任务运行中...\") { found = true; // 更新最后更新时间和创建时间 const createTime = moment(rowData.updateTime, 'YYYY-MM-DD HH:mm:ss').toDate(); const currentTime = new Date(); // 打印超时信息 console.log('脚本监测到系统超时'); console.log('超时时间:', minutesDifference.toFixed(0), '分钟'); // 发送日志信息 await sendLogsToAPI(`${moment().format('YYYY-MM-DD HH:mm:ss')} \AEO ${serverIP} 异常 \状态超时: ${minutesDifference.toFixed(0)}分钟`); } } // 如果未找到符合条件的条目,输出提示信息 if (!found) { console.log('未找到符合条件的条目'); await sendLogsToAPI(`${moment().format('YYYY-MM-DD HH:mm:ss')} \AEO ${serverIP} 异常 \进程没有运行` ); } }; ```

正文

root@aea87fa6e6a2:/home/node# cat login2.js


const request = require('request-promise');
const moment = require('moment');
const cron = require('node-cron');

process.env.TZ = 'Asia/Shanghai'; // 设置时区为上海时区
const rp = require('request-promise');
// 三台服务器地址、用户名和密码数组
const nTime=30;
const servers = [
    { ip: '192.168.0.4', username: '0463511', password: 'i@123456' },
    { ip: '192.168.0.95', username: '0721702', password: '123456' },
    { ip: '192.168.0.196', username: '1820318', password: '123456' }
];

// 登录链接
const loginUrl = 'http://{{server}}/api/auth/login'; // {{server}} 是占位符,将 在每次迭代中替换为服务器地址
// 数据采集链接
const dataUrl = 'http://{{server}}/api/icsp/scheduleLog/page?page=1&limit=10';

// 定时器间隔(以毫秒为单位)
const interval = 60000;

// 循环检测主函数
async function loopCheck() {
    for (const server of servers) {
        try {
            serverIP=server.ip;
            // 构建当前服务器的登录链接
            const currentLoginUrl = loginUrl.replace('{{server}}', server.ip);
            // 构建当前服务器的数据采集链接
            const currentDataUrl = dataUrl.replace('{{server}}', server.ip);

            // 发送登录请求
            const response = await request.post({
                url: currentLoginUrl,
                json: true,
                body: {
                    userName: server.username,
                    password: server.password
                }
            });

            // 登录成功则输出信息
            if (response.statusCode === 200) {
                console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] 登录服 务器 ${server.ip} 成功`);

                // 获取登录凭证(token)
                const token = response.data.token;

                // 使用获取的 token 发起数据采集请求
                await dataRequest(currentDataUrl, token,server.ip);
            } else {
                console.error(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] 登录 服务器 ${server.ip} 失败:`, response.message);
            }
        } catch (error) {
            console.error(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] 登录服务 器 ${server.ip} 失败:`, error.message);
        }
                await sleep(3000);//服务器间的检测间隔
    }

    // 检测完所有服务器后,等待一段时间后再次执行循环检测
  //  setTimeout(loopCheck, interval);  //这里是循环检测入口
}


async function loopCheck_info() {
    for (const server of servers) {
        try {
            serverIP=server.ip;
            // 构建当前服务器的登录链接
            const currentLoginUrl = loginUrl.replace('{{server}}', server.ip);
            // 构建当前服务器的数据采集链接
            const currentDataUrl = dataUrl.replace('{{server}}', server.ip);

            // 发送登录请求
            const response = await request.post({
                url: currentLoginUrl,
                json: true,
                body: {
                    userName: server.username,
                    password: server.password
                }
            });

            // 登录成功则输出信息
            if (response.statusCode === 200) {
                console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] 登录服 务器 ${server.ip} 成功`);

                // 获取登录凭证(token)
                const token = response.data.token;

                // 使用获取的 token 发起数据采集请求
                await dataRequest_info(currentDataUrl, token,server.ip);
            } else {
                console.error(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] 登录 服务器 ${server.ip} 失败:`, response.message);
            }
        } catch (error) {
            console.error(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] 登录服务 器 ${server.ip} 失败:`, error.message);
        }
                await sleep(3000);//服务器间的检测间隔
    }

    // 检测完所有服务器后,等待一段时间后再次执行循环检测
  //  setTimeout(loopCheck, interval);  //这里是循环检测入口
}




// 数据请求
async function dataRequest(dataUrl, token,serverIP) {
    // 构建请求头,包含 token
    const headers = {
        'Authorization': token,
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    };

    // 发送数据采集请求
    const response = await request({
        url: dataUrl,
        method: 'GET',
        headers: headers
    });

    // 解析数据
    dataParse(response);
}




// 数据请求2
async function dataRequest_info(dataUrl, token,serverIP) {
    // 构建请求头,包含 token
    const headers = {
        'Authorization': token,
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    };

    // 发送数据采集请求
    const response = await request({
        url: dataUrl,
        method: 'GET',
        headers: headers
    });

    // 解析数据
    dataParse_info(response);
}




// 解析数据
async  function dataParse(response) {
    // 检查响应体是否为空
    if (!response) {
        console.error('Received empty response body.');
        return;
    }

    // 解析 JSON 数据
    const jsonData = JSON.parse(response);

    // 获取数据数组
    const rows = jsonData.data.rows;

    // 标志,表示是否找到了符合条件的条目
    let found = false;

    // 遍历数据数组,查找状态为"数据同步任务运行中"的条目
    for (const rowData of rows) {
        // 如果状态为"数据同步任务运行中",则打印对应的时间
        if (rowData.error === "数据同步任务运行中...") {
            found = true;//检测运行变量
                        //updateTime是最后更新时间,createTime是创建时间。这里用更新时间
            const createTime = moment(rowData.updateTime, 'YYYY-MM-DD HH:mm:ss').toDate();
            const currentTime = new Date();
            const minutesDifference = (currentTime.getTime() - createTime.getTime()) / (1000 * 60);

            // 如果时间差超过1小时,则打印超时信息
            if (minutesDifference > nTime) {
                console.log('脚本监测到系统超时');
                console.log('超时时间:', minutesDifference.toFixed(0), '分钟');
      await sendLogsToAPI(`${moment().format('YYYY-MM-DD HH:mm:ss')} \nAEO ${serverIP} 异常 \n状态超时: ${minutesDifference.toFixed(0)}分钟` );

            }

            console.log('时间:', rowData.updateTime);
                        await sleep(1000);
            break; // 找到符合条件的条目后直接跳出循环
        }
    }

    // 如果未找到符合条件的条目,则输出提示信息
    if (!found) {
        console.log('未找到符合条件的条目');
         await sendLogsToAPI(`${moment().format('YYYY-MM-DD HH:mm:ss')} \nAEO ${serverIP} 异常 \n进程没有运行` );
    }
}








// 解析数据
async  function dataParse_info(response) {
    // 检查响应体是否为空
    if (!response) {
        console.error('Received empty response body.');
        return;
    }

    // 解析 JSON 数据
    const jsonData = JSON.parse(response);

    // 获取数据数组
    const rows = jsonData.data.rows;

    // 标志,表示是否找到了符合条件的条目
    let found = false;

    // 遍历数据数组,查找状态为"数据同步任务运行中"的条目
    for (const rowData of rows) {
        // 如果状态为"数据同步任务运行中",则打印对应的时间
        if (rowData.error === "数据同步任务运行中...") {
            found = true;//检测运行变量
                        //updateTime是最后更新时间,createTime是创建时间。这里用更新时间
            const createTime = moment(rowData.updateTime, 'YYYY-MM-DD HH:mm:ss').toDate();
            const currentTime = new Date();
            const minutesDifference = (currentTime.getTime() - createTime.getTime()) / (1000 * 60);

            // 如果时间差超过1小时,则打印超时信息
            if (minutesDifference > nTime) {
                console.log('脚本监测到系统超时');
                console.log('超时时间:', minutesDifference.toFixed(0), '分钟');
      await sendLogsToAPI(`${moment().format('YYYY-MM-DD HH:mm:ss')} \nAEO ${serverIP} 异常 \n状态超时: ${minutesDifference.toFixed(0)}分钟`);

            }else{
                                 console.log('正常运行中');
          await sendLogsToAPI(`${moment().format('YYYY-MM-DD HH:mm:ss')} \nAEO ${serverIP} 正常 \n最后更新: ${minutesDifference.toFixed(0)}分钟前`);

            }

            console.log('时间:', rowData.updateTime);
                        await sleep(1000);
            break; // 找到符合条件的条目后直接跳出循环
        }
    }

    // 如果未找到符合条件的条目,则输出提示信息
    if (!found) {
        console.log('未找到符合条件的条目');
         await sendLogsToAPI(`${moment().format('YYYY-MM-DD HH:mm:ss')} \nAEO ${serverIP} 异常 \n进程没有运行` );
    }
}






const sendLogsToAPI =  (logs) => {
  const resData = {
    "msgtype": "text",
    "text": {
      "content": logs,
    }
  };

  const options = {
    method: "POST",
   uri: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=17e3b586-20b3-eca2ffa84130",
       // uri: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=8ff711ab-f80b-4874-7adf0831a8bc",
    headers: {
      "content-type": "application/json",
    },
    body:JSON.stringify(resData),
  };

  try {
    const response =  rp(options);
    console.log('提示成功!');
  } catch (error) {
    console.error('请求出错:', error);
  }
};



// 休眠函数
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}



// 开始循环检测
//loopCheck();


// 在每分钟的第 30 秒执行目标函数
cron.schedule('35 8 * * *', () => {
    console.log('目标函数在8:35执行!');
        loopCheck_info();
    // 在这里调用你想要定时执行的函数
});

cron.schedule('*/30 9-20 * * *', () => {
    console.log('目标函数在每分钟的第 50分钟执行!');
        loopCheck();
    // 在这里调用你想要定时执行的函数
});

 

与NODEJS通过发送json数据查询目标服务,实现服务器状态监控,发现异常发送到微信群提醒相似的内容:

NODEJS通过发送json数据查询目标服务,实现服务器状态监控,发现异常发送到微信群提醒

root@aea87fa6e6a2:/home/node# cat login2.js const request = require('request-promise'); const moment = require('moment'); const cron = require('node-c

在nodejs中体验http/2

前言 2015年,HTTP/2 发布,直到2021年公司的项目才开始在实践中应用;自己对http2诸多特点的理解只存在于字面上,于是尝试在nodejs中实践一下,加深自己的理解。 多路复用 同域名下所有通信都在单个连接上完成,消除了因多个 TCP 连接而带来的延时和内存消耗,这在大量请求同时发出的情

Nodejs 应用编译构建提速建议

前端构建的提速是一项比较复杂且细节的工程, 目前产品上在持续跟踪构建慢的应用, 努力优化编译速度, 但前端本身拥有一个比较自由的技术环境, 没有统一的构建工具与流程, 另外语言本身的执行效率、单线程的构建也不好让编译机发挥其最大能力, 所以目前全局的通用优化手段还是会比较局限, 还是依赖项目自身的优化. 希望大家一起努力共建美好的明天.

NodeJS 实战系列:如何设计 try catch

本文将通过一个 NodeJS 程序里无效的错误捕获示例,来讲解错误捕获里常见的陷阱。错误捕获不是凭感觉添加 try catch 语句,它的首要目的是提供有效的错误排查信息,只有精心设计的错误捕获才有可能完成这个使命。针对哪些方面去精心设计就是本篇文章里想讨论的内容

NodeJS 实战系列:DevOps 尚未解决的问题

本文将通过展示 NodeJS 应用里环境变量的提取过程,来一窥 DevOps 技术是如何应用在现在云平台上的运维工作中的。同时我也想让大家在这里看到 DevOps 的另外一面,即它并非全能,从本地开发到持续部署再到实际运行,有一些运维鸿沟依然还未被填平。“人工操作”依然是工作中的最大风险。

pnpm配置

之前通过 nvm 来管理了 nodejs 版本,结果安装 pnpm 之后,安装全局依赖报错,如下: PS C:\Users\Administrator> pnpm i -g commitizen ERROR Unable to find the global bin directory Run "p

安装nodejs易遇到的坑

@目录背景描述流程步骤小结 背景描述 我的服务器是centos7.9,打算先直接通过yum安装,但是yum不能指定node版本,我直接指定显示404找不到,然后我设置了下node下载的源,还是不行。那我走手动下载安装的方式吧 流程步骤 首先根据这篇文章要安装前置扩展 yum install cent

图数据挖掘:网络的基本概念和表示方法

网络(network)是一些通过链接(links)连接起来的对象集合,它包含以下成分:对象:节点(nodes)/顶点(vertices), 用N表示;交互:链接(links)/边(edges),用E表示;对象和交互组成的系统我们就称为网络(或图,graph),用G(N,E)表示。

如何使用zx编写shell脚本

前言 在这篇文章中,我们将学习谷歌的zx库提供了什么,以及我们如何使用它来用Node.js编写shell脚本。然后,我们将学习如何通过构建一个命令行工具来使用zx的功能,帮助我们为新的Node.js项目引导配置。 编写Shell脚本的问题 创建一个由Bash或者zsh执行的shell脚本,是自动化重

BS系统的登录鉴权流程演变

登录鉴权方式是随着前后端架构的变化而变化的。早期的系统是前后端不分离的。通常前端是freemaker/velocity/jsp+html。后端是SSH或SSM。后来Vue等前端框架的兴起,使得前后端得以分离。前端是Vue+nodejs,后端是SSM或SpirngBoot。SpringBoot大大简化...