| @@ -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}不响应") | |||||
| ; | |||||
| @@ -32,6 +32,12 @@ public class ScheduleApplication { | |||||
| @Value("${fm.upload_dir}") | @Value("${fm.upload_dir}") | ||||
| private String uploadDir; | private String uploadDir; | ||||
| @Value("${fm.monitor_emails}") | |||||
| private String fmMonitorEmails; | |||||
| @Value("${fm.monitor_enable}") | |||||
| private boolean fmMonitor; | |||||
| @Bean | @Bean | ||||
| public boolean isFmException() { | public boolean isFmException() { | ||||
| return fmException; | return fmException; | ||||
| @@ -52,6 +58,17 @@ public class ScheduleApplication { | |||||
| return uploadDir; | return uploadDir; | ||||
| } | } | ||||
| @Bean | |||||
| public String fmMonitorEmails() { | |||||
| return fmMonitorEmails; | |||||
| } | |||||
| @Bean | |||||
| public boolean isFmMonitor() { | |||||
| return fmMonitor; | |||||
| } | |||||
| public static void main(String[] args) { | public static void main(String[] args) { | ||||
| SpringApplication.run(ScheduleApplication.class, args); | SpringApplication.run(ScheduleApplication.class, args); | ||||
| @@ -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); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -108,6 +108,8 @@ fm: | |||||
| deploy: 1 | deploy: 1 | ||||
| open: true | open: true | ||||
| upload_dir: /home/test/server/uploads/ | 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: | logging: | ||||
| level: | level: | ||||
| @@ -93,6 +93,8 @@ fm: | |||||
| deploy: 3 | deploy: 3 | ||||
| open: true | open: true | ||||
| upload_dir: /home/ec2-user/server/uploads/ | 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: | logging: | ||||
| level: | level: | ||||
| @@ -93,6 +93,8 @@ fm: | |||||
| deploy: 2 | deploy: 2 | ||||
| open: true | open: true | ||||
| upload_dir: /home/ec2-user/server/uploads/ | 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: | logging: | ||||
| level: | level: | ||||
| @@ -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)); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -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); | |||||
| } | |||||
| @@ -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); | |||||
| } | |||||
| @@ -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); | |||||
| } | |||||
| } | |||||
| @@ -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> | |||||