Просмотр исходного кода

[服务监控][新增]:定时查看服务接口状态

release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
ad0e8141a8
11 измененных файлов: 430 добавлений и 0 удалений
  1. +52
    -0
      mallinkAdmin/src/main/resources/db/migration/V201905290800__ADD_SYS_MONITOR.sql
  2. +17
    -0
      mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java
  3. +72
    -0
      mallinkSchedule/src/main/java/com/iformall/schedule/SysMonitorSchedule.java
  4. +2
    -0
      mallinkSchedule/src/main/resources/application-dev.yml
  5. +2
    -0
      mallinkSchedule/src/main/resources/application-prod.yml
  6. +2
    -0
      mallinkSchedule/src/main/resources/application-test.yml
  7. +95
    -0
      mallinkService/src/main/java/com/iformall/domain/po/SysMonitor.java
  8. +16
    -0
      mallinkService/src/main/java/com/iformall/mapper/SysMonitorMapper.java
  9. +57
    -0
      mallinkService/src/main/java/com/iformall/service/SysMonitorService.java
  10. +59
    -0
      mallinkService/src/main/java/com/iformall/service/impl/SysMonitorServiceImpl.java
  11. +56
    -0
      mallinkService/src/main/resources/mapper/SysMonitorMapper.xml

+ 52
- 0
mallinkAdmin/src/main/resources/db/migration/V201905290800__ADD_SYS_MONITOR.sql Просмотреть файл

@@ -0,0 +1,52 @@
DROP TABLE IF EXISTS `sys_monitor`;
CREATE TABLE `sys_monitor` (
`id` bigint(20) NOT NULL,
`name` varchar(50) NOT NULL COMMENT '网址名称',
`url` varchar(255) NOT NULL COMMENT '网址url',
`type` tinyint(20) DEFAULT '1' COMMENT '1=网址监控',
`deploy` tinyint(20) DEFAULT '1' COMMENT '1=dev 2=test 3=release',
`err_msg` varchar(50) DEFAULT NULL COMMENT '错误信息',
PRIMARY KEY (`id`),
UNIQUE `id_UNIQUE` USING BTREE (`id`) comment ''
) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='网络监控' CHECKSUM=0 DELAY_KEY_WRITE=0;

INSERT INTO `sys_monitor` (`id`,`name`,`url`,`type`,`deploy`,`err_msg`) VALUES
(1, "dev-管理端","https://mall.youlane.cn/api/version", 1, 1, "{url}不响应"),
(2, "dev-C端","https://ciformall.youlane.cn/C/api/mall/version", 1, 1, "{name}: {url} 不响应"),
(3, "dev-B端","https://biformall.youlane.cn/B/api/mall/version", 1, 1, "{name}: {url}不响应"),
(4, "dev-Schedule","http://202.165.179.86:5000/S/version", 1, 1, "{name}: {url}不响应"),
(5, "dev-消息服务器","http://202.165.179.86:5001/mq/version", 1, 1, "{name}: {url}不响应"),
(6, "dev-websocket服务器","http://202.165.179.86:7100/W/version", 1, 1, "{name}: {url}不响应"),
(7, "dev-微信第三方开放平台","https://open.youlane.cn/O/version", 1, 1, "{name}: {url}不响应"),
(8, "dev-移动端数据塔台","https://mobile.youlane.cn/#/", 1, 1, "{name}: {url}不响应"),
(9, "dev-幸运卡牌","https://game.youlane.cn/luckCard/index.html", 1, 1, "{name}: {url}不响应"),
(10, "dev-幸运砸金蛋","https://game.youlane.cn/goldEgg/index.html", 1, 1, "{name}: {url}不响应"),
(11, "dev-幸运刮刮乐","https://game.youlane.cn/guaguale/index.html", 1, 1, "{name}: {url}不响应"),
(12, "dev-callback","http://202.165.179.86:9100/version", 1, 1, "{name}: {url}不响应"),

(101, "test-管理端","https://admintest.malls.iformall.com/api/version", 1, 2, "{name}: {url}不响应"),
(102, "test-C端","https://ctest.malls.iformall.com/C/api/mall/version", 1, 2, "{name}: {url} 不响应"),
(103, "test-B端","https://btest.malls.iformall.com/B/api/mall/version", 1, 2, "{name}: {url}不响应"),
(104, "test-Schedule","https://stest.malls.iformall.com/S/version", 1, 2, "{name}: {url}不响应"),
(105, "test-消息服务器","https://stest.malls.iformall.com/mq/version", 1, 2, "{name}: {url}不响应"),
(106, "test-websocket服务器","https://stest.malls.iformall.com/W/version", 1, 2, "{name}: {url}不响应"),
(107, "test-微信第三方开放平台","https://opentest.malls.iformall.com/O/version", 1, 2, "{name}: {url}不响应"),
(108, "test-移动端数据塔台","https://mobiletest.malls.iformall.com/#/", 1, 2, "{name}: {url}不响应"),
(109, "test-幸运卡牌","https://gametest.malls.iformall.com/game/luckCard/index.html", 1, 2, "{name}: {url}不响应"),
(110, "test-幸运砸金蛋","https://gametest.malls.iformall.com/game/goldEgg/index.html", 1, 2, "{name}: {url}不响应"),
(111, "test-幸运刮刮乐","https://gametest.malls.iformall.com/game/guaguale/index.html", 1, 2, "{name}: {url}不响应"),
(112, "test-callback","https://callbacktest.malls.iformall.com/api/version", 1, 2, "{name}: {url}不响应"),

(201, "生产环境-管理端","https://admin.malls.iformall.com/api/version", 1, 3, "{name}: {url}不响应"),
(202, "生产环境-C端","https://c.malls.iformall.com/C/api/mall/version", 1, 3, "{name}: {url} 不响应"),
(203, "生产环境-B端","https://b.malls.iformall.com/B/api/mall/version", 1, 3, "{name}: {url}不响应"),
(204, "生产环境-Schedule","https://s.malls.iformall.com/S/version", 1, 3, "{name}: {url}不响应"),
(205, "生产环境-消息服务器","https://s.malls.iformall.com/mq/version", 1, 3, "{name}: {url}不响应"),
(206, "生产环境-websocket服务器","https://s.malls.iformall.com/W/version", 1, 3, "{name}: {url}不响应"),
(207, "生产环境-微信第三方开放平台","https://open.malls.iformall.com/O/version", 1, 3, "{name}: {url}不响应"),
(208, "生产环境-移动端数据塔台","https://mobile.malls.iformall.com/#/", 1, 3, "{name}: {url}不响应"),
(209, "生产环境-幸运卡牌","https://game.malls.iformall.com/game/luckCard/index.html", 1, 3, "{name}: {url}不响应"),
(210, "生产环境-幸运砸金蛋","https://game.malls.iformall.com/game/goldEgg/index.html", 1, 3, "{name}: {url}不响应"),
(211, "生产环境-幸运刮刮乐","https://game.malls.iformall.com/game/guaguale/index.html", 1, 3, "{name}: {url}不响应"),
(212, "生产环境-callback","https://callback.malls.iformall.com/api/version", 1, 3, "{name}: {url}不响应")
;

+ 17
- 0
mallinkSchedule/src/main/java/com/iformall/ScheduleApplication.java Просмотреть файл

@@ -32,6 +32,12 @@ public class ScheduleApplication {
@Value("${fm.upload_dir}")
private String uploadDir;

@Value("${fm.monitor_emails}")
private String fmMonitorEmails;

@Value("${fm.monitor_enable}")
private boolean fmMonitor;

@Bean
public boolean isFmException() {
return fmException;
@@ -52,6 +58,17 @@ public class ScheduleApplication {
return uploadDir;
}

@Bean
public String fmMonitorEmails() {
return fmMonitorEmails;
}

@Bean
public boolean isFmMonitor() {
return fmMonitor;
}



public static void main(String[] args) {
SpringApplication.run(ScheduleApplication.class, args);


+ 72
- 0
mallinkSchedule/src/main/java/com/iformall/schedule/SysMonitorSchedule.java Просмотреть файл

@@ -0,0 +1,72 @@
package com.iformall.schedule;

import com.iformall.domain.po.SysMonitor;
import com.iformall.mapper.*;
import com.iformall.service.MailService;
import com.iformall.utils.HttpUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class SysMonitorSchedule {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private String fmMonitorEmails;

@Autowired
private boolean isFmMonitor;

@Autowired
private MailService mailService;

@Autowired
private SysMonitorMapper sysMonitorMapper;

@Scheduled(cron = "0 */5 * * * *?") // 每隔5分钟检查一下各个网址
public void checkUrls() {
if(isFmMonitor) {
SysMonitor q = new SysMonitor();
List<SysMonitor> sysMonitors = sysMonitorMapper.findList(q);

for (SysMonitor sysMonitor : sysMonitors) {
checkSysMonitor(sysMonitor);
}
}
}

private void checkSysMonitor(SysMonitor sysMonitor) {
boolean isNormal = true;
try {
String result = HttpUtil.doGet(sysMonitor.getUrl());
if(StringUtils.isBlank(result)) {
isNormal = false;
} else {
logger.info(result);
}
} catch (RuntimeException e) {
logger.error(e.getMessage());
isNormal = false;
}

if(!isNormal) {
String[] receivers = fmMonitorEmails.split(",");

String content = sysMonitor.getErrMsg();
content = content.replace("{name}", sysMonitor.getName());
content = content.replace("{url}", sysMonitor.getUrl());

//发送邮件
mailService.sendSimpleMail(receivers, sysMonitor.getName() + "访问异常", content);
}
}


}

+ 2
- 0
mallinkSchedule/src/main/resources/application-dev.yml Просмотреть файл

@@ -108,6 +108,8 @@ fm:
deploy: 1
open: true
upload_dir: /home/test/server/uploads/
monitor_emails: hupeng@iformall.com,wuguoqiang@iformall.com,gongbiao@iformall.com,luozukai@iformall.com,sunmingming@iformall.com,huanghui@iformall.com,wangmei@iformall.com
monitor_enable: true

logging:
level:


+ 2
- 0
mallinkSchedule/src/main/resources/application-prod.yml Просмотреть файл

@@ -93,6 +93,8 @@ fm:
deploy: 3
open: true
upload_dir: /home/ec2-user/server/uploads/
monitor_emails: hupeng@iformall.com,wuguoqiang@iformall.com,gongbiao@iformall.com,luozukai@iformall.com,sunmingming@iformall.com,huanghui@iformall.com,wangmei@iformall.com
monitor_enable: false

logging:
level:


+ 2
- 0
mallinkSchedule/src/main/resources/application-test.yml Просмотреть файл

@@ -93,6 +93,8 @@ fm:
deploy: 2
open: true
upload_dir: /home/ec2-user/server/uploads/
monitor_emails: hupeng@iformall.com,wuguoqiang@iformall.com,gongbiao@iformall.com,luozukai@iformall.com,sunmingming@iformall.com,huanghui@iformall.com,wangmei@iformall.com
monitor_enable: false

logging:
level:


+ 95
- 0
mallinkService/src/main/java/com/iformall/domain/po/SysMonitor.java Просмотреть файл

@@ -0,0 +1,95 @@
package com.iformall.domain.po;

import lombok.Data;
import javax.persistence.*;
import javax.persistence.Transient;
import java.util.List;
import javax.persistence.Id;
import java.io.Serializable;

@Table(name = "sys_monitor")
@Data
public class SysMonitor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
protected Long id;
@Transient
protected List<Long> ids;
@Transient
protected String sortColumns;

@io.swagger.annotations.ApiModelProperty(value="网址url",name="name")
private String name;
@io.swagger.annotations.ApiModelProperty(value="网址url",name="url")
private String url;
@io.swagger.annotations.ApiModelProperty(value="1=网址监控",name="type")
private Integer type;
@io.swagger.annotations.ApiModelProperty(value="1=dev 2=test 3=release",name="deploy")
private Integer deploy;
@io.swagger.annotations.ApiModelProperty(value="",name="errMsg")
private String errMsg;



public static enum Field
{
Id_ASC("`id` ASC"),Id_DESC("`id` DESC")
,Name_ASC("`name` ASC"),Name_DESC("`name` DESC")
,Url_ASC("`url` ASC"),Url_DESC("`url` DESC")
,Type_ASC("`type` ASC"),Type_DESC("`type` DESC")
,Deploy_ASC("`deploy` ASC"),Deploy_DESC("`deploy` DESC")
,ErrMsg_ASC("`err_msg` ASC"),ErrMsg_DESC("`err_msg` DESC")
;
private String value;
Field(String value){
this.value = value;
}
public String getValue() {
return value;
}
public void setCol(String value) {
this.value = value;
}
@Override
public String toString() {
return this.getValue();
}
}
public void setSortColumns(SysMonitor.Field... fields)
{
if (fields == null || fields.length == 0) {
return;
}
for (int k = 0; k < fields.length; k++) {
if (fields[k] == null) {
return;
}
}
StringBuilder sb = new StringBuilder(fields[0].toString());
for (int k = 1; k < fields.length; k++) {
sb.append(",");
sb.append(fields[k].toString());
}
this.sortColumns = sb.toString();
}
public void setSortColumns(String sortColumns)
{
if (sortColumns == null || "".equals(sortColumns.trim())) {
return;
}
if (sortColumns.contains(",")) {
String[] cols = sortColumns.split(",");
java.util.List<Field> fList = new java.util.ArrayList();
for (int k = 0; k < cols.length; k++) {
fList.add(Field.valueOf(cols[k]));
}
this.setSortColumns(fList.toArray(new Field[fList.size()]));
} else {
this.setSortColumns(Field.valueOf(sortColumns));
}
}
}

+ 16
- 0
mallinkService/src/main/java/com/iformall/mapper/SysMonitorMapper.java Просмотреть файл

@@ -0,0 +1,16 @@
package com.iformall.mapper;

import java.util.*;
import com.iformall.common.CommonMapper;
import com.iformall.domain.po.SysMonitor;

public interface SysMonitorMapper extends CommonMapper<SysMonitor, Long> {

List<SysMonitor> findList(SysMonitor sysMonitor);

}

+ 57
- 0
mallinkService/src/main/java/com/iformall/service/SysMonitorService.java Просмотреть файл

@@ -0,0 +1,57 @@
package com.iformall.service;

import com.github.pagehelper.PageInfo;
import com.iformall.domain.po.SysMonitor;

import java.util.List;

public interface SysMonitorService {

/**
* 根据实体查询分页列表
*
* @param record
* @param pageIndex
* @param pageSize
* @return
*/
PageInfo<SysMonitor> listAsPage(SysMonitor record, Integer pageIndex, Integer pageSize);

/**
* 根据实体查询列表
*
* @param record
* @return
*/
List<SysMonitor> getList(SysMonitor record);
/**
* 根据Id获得实体
*
* @param id
* @return
*/
SysMonitor getById(Long id);
/**
* 保存或更新实体
*
* @param record
*/
void saveOrUpdate(SysMonitor record);

/**
* 根据Id删除实体
*
* @param id
*/
void deleteById(Long id);

}

+ 59
- 0
mallinkService/src/main/java/com/iformall/service/impl/SysMonitorServiceImpl.java Просмотреть файл

@@ -0,0 +1,59 @@
package com.iformall.service.impl;

import java.util.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.iformall.domain.po.SysMonitor;
import com.iformall.mapper.SysMonitorMapper;
import com.iformall.service.SysMonitorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.iformall.common.IdWorker;

@Service
public class SysMonitorServiceImpl implements SysMonitorService {
@Autowired
SysMonitorMapper sysMonitorMapper;


@Override
public PageInfo<SysMonitor> listAsPage(SysMonitor record, Integer pageIndex, Integer pageSize) {
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> sysMonitorMapper.findList(record));
}

@Override
public List<SysMonitor> getList(SysMonitor record) {
return sysMonitorMapper.findList(record);
}

@Override
public SysMonitor getById(Long id) {
return sysMonitorMapper.selectByPrimaryKey(id);
}

@Override
public void saveOrUpdate(SysMonitor record) {
if (record.getId() == null) {
//record.setId(UUID.randomUUID().toString().replaceAll("-", ""));
final IdWorker idWorker = IdWorker.get();
record.setId(idWorker.nextId());
sysMonitorMapper.insertSelective(record);
} else {
sysMonitorMapper.updateByPrimaryKeySelective(record);
}
}

@Override
public void deleteById(Long id) {
sysMonitorMapper.deleteByPrimaryKey(id);
}
}

+ 56
- 0
mallinkService/src/main/resources/mapper/SysMonitorMapper.xml Просмотреть файл

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iformall.mapper.SysMonitorMapper">
<resultMap id="BaseResultMap" type="com.iformall.domain.po.SysMonitor">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="url" jdbcType="VARCHAR" property="url" />
<result column="type" jdbcType="INTEGER" property="type" />
<result column="deploy" jdbcType="INTEGER" property="deploy" />
<result column="err_msg" jdbcType="VARCHAR" property="errMsg" />
</resultMap>
<sql id="allColumns">
`id`,`name`,`url`,`type`,`deploy`,`err_msg`
</sql>

<sql id="dynamicWhereConditions">
where 1 = 1
<if test=" null != id ">
and `id` = #{id}
</if>
<if test=" null != name ">
and `name` = #{name}
</if>
<if test=" null != url ">
and `url` = #{url}
</if>
<if test=" null != type ">
and `type` = #{type}
</if>
<if test=" null != deploy ">
and `deploy` = #{deploy}
</if>
<if test=" null != errMsg ">
and `err_msg` like concat('%', #{errMsg},'%')
</if>
<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>
<if test=" null != sortColumns"> order by ${sortColumns} </if>
</sql>
<select id="findList" parameterType="com.iformall.domain.po.SysMonitor" resultMap="BaseResultMap">
select <include refid="allColumns" /> from sys_monitor
<include refid="dynamicWhereConditions" />
</select>
</mapper>

Загрузка…
Отмена
Сохранить