|
@@ -7,7 +7,7 @@ const SmsTemplate = require('./sms-templates');
|
|
|
|
|
|
|
|
const onlineHost = 'app2.pcoloring.com';
|
|
const onlineHost = 'app2.pcoloring.com';
|
|
|
const offlineHost = 'color.jccytech.cn';
|
|
const offlineHost = 'color.jccytech.cn';
|
|
|
-const artLatestUri = 'napi/number/v8/list/art/content?column=latest';
|
|
|
|
|
|
|
+const artLatestUri = 'napi/number/v9/list/art/content?column=latest';
|
|
|
const jigsawLatestUri = 'napi/jigsaw/mobi/list/latest';
|
|
const jigsawLatestUri = 'napi/jigsaw/mobi/list/latest';
|
|
|
const artPuzzleLatestUri = 'napi/puzzle/mobi/list/latest';
|
|
const artPuzzleLatestUri = 'napi/puzzle/mobi/list/latest';
|
|
|
|
|
|
|
@@ -19,41 +19,67 @@ async function checkArtLatest() {
|
|
|
let resp = await axios.get(onlineUrl);
|
|
let resp = await axios.get(onlineUrl);
|
|
|
onlineData = resp.data;
|
|
onlineData = resp.data;
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- console.error('Art线上latest数据请求出错, 请及时检查:', e.message);
|
|
|
|
|
- sendEmail('Art线上latest数据请求出错, 请及时检查', e.message);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ console.error('Art线上latest数据请求出错, 请及时检查:', [e.message]);
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 100,
|
|
|
|
|
+ title: 'Art线上latest数据请求出错, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: [e.message],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
let resp = await axios.get(offlineUrl);
|
|
let resp = await axios.get(offlineUrl);
|
|
|
offlineData = resp.data;
|
|
offlineData = resp.data;
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- console.error('Art 线下latest数据请求出错, 请及时检查:', e.message);
|
|
|
|
|
- sendEmail('Art 线下latest数据请求出错, 请及时检查', e.message);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ console.error('Art 线下latest数据请求出错, 请及时检查:', [e.message]);
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 100,
|
|
|
|
|
+ title: 'Art 线下latest数据请求出错, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: [e.message],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 检查数据是否一致: 看第一条即可
|
|
// 检查数据是否一致: 看第一条即可
|
|
|
if (!onlineData.data || onlineData.data.length <= 0) {
|
|
if (!onlineData.data || onlineData.data.length <= 0) {
|
|
|
- sendEmail('Art 线上latest数据有误, 请及时检查', 'latest数据为空');
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 100,
|
|
|
|
|
+ title: 'Art 线上latest数据有误, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: ['latest数据为空'],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
if (!offlineData.data || offlineData.data.length <= 0) {
|
|
if (!offlineData.data || offlineData.data.length <= 0) {
|
|
|
- sendEmail('Art 线下latest数据有误, 请及时检查', 'latest数据为空');
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 100,
|
|
|
|
|
+ title: 'Art 线下latest数据有误, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: ['latest数据为空'],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (onlineData.data[0]._id != offlineData.data[0]._id) {
|
|
if (onlineData.data[0]._id != offlineData.data[0]._id) {
|
|
|
- sendEmail('Art latest 线上线下数据不一致, 请及时检查', `${onlineUrl}<br>${offlineUrl}`);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_SYNC_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 100,
|
|
|
|
|
+ title: 'Art latest 线上线下数据不一致, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_SYNC_ERROR,
|
|
|
|
|
+ data: [onlineUrl, offlineUrl],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return true;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: true,
|
|
|
|
|
+ errcode: 0,
|
|
|
|
|
+ title: 'Art 服务恢复正常运行',
|
|
|
|
|
+ sms: SmsTemplate.SMS_RESUME,
|
|
|
|
|
+ data: ['Art 服务一切正常']
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function checkJigsawLatest() {
|
|
async function checkJigsawLatest() {
|
|
@@ -65,9 +91,13 @@ async function checkJigsawLatest() {
|
|
|
onlineData = resp.data;
|
|
onlineData = resp.data;
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error('Jigsaw 线上latest数据请求出错, 请及时检查:', e.message);
|
|
console.error('Jigsaw 线上latest数据请求出错, 请及时检查:', e.message);
|
|
|
- sendEmail('Jigsaw 线上latest数据请求出错, 请及时检查', e.message);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 200,
|
|
|
|
|
+ title: 'Jigsaw 线上latest数据请求出错, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: [e.message],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
@@ -75,30 +105,52 @@ async function checkJigsawLatest() {
|
|
|
offlineData = resp.data;
|
|
offlineData = resp.data;
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error('Jigsaw 线下latest数据请求出错, 请及时检查:', e.message);
|
|
console.error('Jigsaw 线下latest数据请求出错, 请及时检查:', e.message);
|
|
|
- sendEmail('Jigsaw 线下latest数据请求出错, 请及时检查', e.message);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 200,
|
|
|
|
|
+ title: 'Jigsaw 线下latest数据请求出错, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: [e.message],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 检查数据是否一致: 看第一条即可
|
|
// 检查数据是否一致: 看第一条即可
|
|
|
if (!onlineData.data || onlineData.data.length <= 0) {
|
|
if (!onlineData.data || onlineData.data.length <= 0) {
|
|
|
- sendEmail('Jigsaw 线上latest数据有误, 请及时检查', 'latest数据为空');
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 200,
|
|
|
|
|
+ title: 'Jigsaw 线上latest数据有误, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: ['latest数据为空'],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
if (!offlineData.data || offlineData.data.length <= 0) {
|
|
if (!offlineData.data || offlineData.data.length <= 0) {
|
|
|
- sendEmail('Jigsaw 线下latest数据有误, 请及时检查', 'latest数据为空');
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 200,
|
|
|
|
|
+ title: 'Jigsaw 线下latest数据有误, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: ['latest数据为空'],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (onlineData.data[0]._id != offlineData.data[0]._id) {
|
|
if (onlineData.data[0]._id != offlineData.data[0]._id) {
|
|
|
- sendEmail('Jigsaw latest 线上线下数据不一致, 请及时检查', `${onlineUrl}<br>${offlineUrl}`);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_SYNC_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 200,
|
|
|
|
|
+ title: 'Jigsaw latest 线上线下数据不一致, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_SYNC_ERROR,
|
|
|
|
|
+ data: [onlineUrl, offlineUrl],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return true;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: true,
|
|
|
|
|
+ errcode: 0,
|
|
|
|
|
+ title: 'Jigsaw 服务恢复正常运行',
|
|
|
|
|
+ sms: SmsTemplate.SMS_RESUME,
|
|
|
|
|
+ data: ['Jigsaw 服务一切正常']
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async function checkArtPuzzleLatest() {
|
|
async function checkArtPuzzleLatest() {
|
|
@@ -110,9 +162,13 @@ async function checkArtPuzzleLatest() {
|
|
|
onlineData = resp.data;
|
|
onlineData = resp.data;
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error('ArtPuzzle 线上latest数据请求出错, 请及时检查:', e.message);
|
|
console.error('ArtPuzzle 线上latest数据请求出错, 请及时检查:', e.message);
|
|
|
- sendEmail('ArtPuzzle 线上latest数据请求出错, 请及时检查', e.message);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 300,
|
|
|
|
|
+ title: 'ArtPuzzle 线上latest数据请求出错, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: [e.message],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
@@ -120,61 +176,147 @@ async function checkArtPuzzleLatest() {
|
|
|
offlineData = resp.data;
|
|
offlineData = resp.data;
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error('ArtPuzzle 线下latest数据请求出错, 请及时检查:', e.message);
|
|
console.error('ArtPuzzle 线下latest数据请求出错, 请及时检查:', e.message);
|
|
|
- sendEmail('ArtPuzzle 线下latest数据请求出错, 请及时检查', e.message);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 300,
|
|
|
|
|
+ title: 'ArtPuzzle 线下latest数据请求出错, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: [e.message],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (!onlineData.data || onlineData.data.length <= 0) {
|
|
if (!onlineData.data || onlineData.data.length <= 0) {
|
|
|
- sendEmail('ArtPuzzle 线上latest数据有误, 请及时检查', 'latest数据为空');
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 300,
|
|
|
|
|
+ title: 'ArtPuzzle 线上latest数据有误, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: ['latest数据为空'],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
if (!offlineData.data || offlineData.data.length <= 0) {
|
|
if (!offlineData.data || offlineData.data.length <= 0) {
|
|
|
- sendEmail('ArtPuzzle 线下latest数据有误, 请及时检查', 'latest数据为空');
|
|
|
|
|
- sendSms(SmsTemplate.SMS_API_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 300,
|
|
|
|
|
+ title: 'ArtPuzzle 线下latest数据有误, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_API_ERROR,
|
|
|
|
|
+ data: ['latest数据为空'],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 检查数据是否一致: 看第一条即可
|
|
// 检查数据是否一致: 看第一条即可
|
|
|
if (onlineData.data[0]._id != offlineData.data[0]._id) {
|
|
if (onlineData.data[0]._id != offlineData.data[0]._id) {
|
|
|
- sendEmail('ArtPuzzle latest 线上线下数据不一致, 请及时检查', `\r\n${onlineUrl}<br>${offlineUrl}`);
|
|
|
|
|
- sendSms(SmsTemplate.SMS_SYNC_ERROR);
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: false,
|
|
|
|
|
+ errcode: 300,
|
|
|
|
|
+ title: 'ArtPuzzle latest 线上线下数据不一致, 请及时检查',
|
|
|
|
|
+ sms: SmsTemplate.SMS_SYNC_ERROR,
|
|
|
|
|
+ data: [onlineUrl, offlineUrl],
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return true;
|
|
|
|
|
|
|
+ return {
|
|
|
|
|
+ result: true,
|
|
|
|
|
+ errcode: 0,
|
|
|
|
|
+ title: 'Jigsaw 服务恢复正常运行',
|
|
|
|
|
+ sms: SmsTemplate.SMS_RESUME,
|
|
|
|
|
+ data: ['Jigsaw 服务一切正常']
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-async function run() {
|
|
|
|
|
|
|
+async function run(lastErrCode = 0) {
|
|
|
console.log("check api...", new Date());
|
|
console.log("check api...", new Date());
|
|
|
try {
|
|
try {
|
|
|
- if (await checkArtLatest()) {
|
|
|
|
|
- console.log("check art latest OK! ");
|
|
|
|
|
- } else {
|
|
|
|
|
- console.error("check art latest error! ");
|
|
|
|
|
|
|
+ let result = null;
|
|
|
|
|
+ // 如果出现异常,连续检测3次才发送通知,减少误报,因为出现不少次因为网络原因一时半会请求不到数据就报警的情况
|
|
|
|
|
+ for (let i = 0; i < 3; i++) {
|
|
|
|
|
+ result = await checkArtLatest();
|
|
|
|
|
+ console.log(result);
|
|
|
|
|
+ if (!result.result) {
|
|
|
|
|
+ console.warn("检查Art服务出现异常,一分钟后重试");
|
|
|
|
|
+ await delay(60 * 1000);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.warn("Art服务一切正常");
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!result.result) {
|
|
|
|
|
+ console.error("连续3次检查Art服务异常,发送通知");
|
|
|
|
|
+ sendEmail(result.title, result.data);
|
|
|
|
|
+ sendSms(result.sms);
|
|
|
|
|
+ console.log("5分钟后再试");
|
|
|
|
|
+ setTimeout(run, 5 * 60 * 1000, result.errcode);
|
|
|
return;
|
|
return;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 如果上次时出错的情况, 那么属于服务恢复,发送恢复通知
|
|
|
|
|
+ if (lastErrCode == 100) {
|
|
|
|
|
+ sendEmail(result.title, result.data);
|
|
|
|
|
+ sendSms(result.sms);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (await checkJigsawLatest()) {
|
|
|
|
|
- console.log("check jigsaw latest OK! ");
|
|
|
|
|
- } else {
|
|
|
|
|
- console.error("check jigsaw latest error! ");
|
|
|
|
|
|
|
+ for (let i = 0; i < 3; i++) {
|
|
|
|
|
+ result = await checkJigsawLatest();
|
|
|
|
|
+ console.log(result);
|
|
|
|
|
+ if (!result.result) {
|
|
|
|
|
+ console.warn("检查Jigsaw服务出现异常,一分钟后重试");
|
|
|
|
|
+ await delay(60 * 1000);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.warn("Jigsaw服务一切正常");
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!result.result) {
|
|
|
|
|
+ console.error("连续3次检查Jigsaw服务异常,发送通知");
|
|
|
|
|
+ sendEmail(result.title, result.data);
|
|
|
|
|
+ sendSms(result.sms);
|
|
|
|
|
+ console.log("5分钟后再试");
|
|
|
|
|
+ setTimeout(run, 5 * 60 * 1000, result.errcode);
|
|
|
return;
|
|
return;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 如果上次时出错的情况, 那么属于服务恢复,发送恢复通知
|
|
|
|
|
+ if (lastErrCode == 200) {
|
|
|
|
|
+ sendEmail(result.title, result.data);
|
|
|
|
|
+ sendSms(result.sms);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (await checkArtPuzzleLatest()) {
|
|
|
|
|
- console.log("check art puzzle latest OK! ");
|
|
|
|
|
- } else {
|
|
|
|
|
- console.error("check art puzzle latest error! ");
|
|
|
|
|
|
|
+ for (let i = 0; i < 3; i++) {
|
|
|
|
|
+ result = await checkArtPuzzleLatest();
|
|
|
|
|
+ console.log(result);
|
|
|
|
|
+ if (!result.result) {
|
|
|
|
|
+ console.warn("检查ArtPuzzle服务出现异常,一分钟后重试");
|
|
|
|
|
+ await delay(60 * 1000);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.warn("ArtPuzzle服务一切正常");
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!result.result) {
|
|
|
|
|
+ console.error("连续3次检查ArtPuzzle服务异常,发送通知");
|
|
|
|
|
+ sendEmail(result.title, result.data);
|
|
|
|
|
+ sendSms(result.sms);
|
|
|
|
|
+ console.log("5分钟后再试");
|
|
|
|
|
+ setTimeout(run, 5 * 60 * 1000, result.errcode);
|
|
|
return;
|
|
return;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 如果上次时出错的情况, 那么属于服务恢复,发送恢复通知
|
|
|
|
|
+ if (lastErrCode == 300) {
|
|
|
|
|
+ sendEmail(result.title, result.data);
|
|
|
|
|
+ sendSms(result.sms);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
|
console.error(err.stack);
|
|
console.error(err.stack);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+function delay(ms) {
|
|
|
|
|
+ return new Promise(done => setTimeout(done, ms));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
module.exports = { run }
|
|
module.exports = { run }
|
|
|
|
|
|
|
|
|
|
|