Selaa lähdekoodia

游戏告警钉钉通知(测试)

Letianhua 1 vuosi sitten
vanhempi
commit
800275290d

+ 2 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/GameDataApplication.java

@@ -6,12 +6,14 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @Slf4j
 @EnableDiscoveryClient
 @SpringBootApplication
 @Configuration
 @EnableDubbo
+@EnableScheduling
 public class GameDataApplication {
 
     public static void main(String[] args) {

+ 4 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameMonitorAlarmController.java

@@ -2,6 +2,8 @@ package com.zanxiang.game.data.serve.controller;
 
 import com.zanxiang.game.data.serve.service.IGameMonitorAlarmService;
 import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -13,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
  * @description: 游戏监控告警控制器
  * @date 2023/12/13 16:20
  */
+@Api(tags = {"游戏监控告警"})
 @RestController
 @RequestMapping("/monitor/alarm")
 public class GameMonitorAlarmController {
@@ -20,6 +23,7 @@ public class GameMonitorAlarmController {
     @Autowired
     private IGameMonitorAlarmService gameMonitorAlarmService;
 
+    @ApiOperation(value = "发送钉钉消息")
     @PutMapping("/sendMsg")
     public ResultVO<Boolean> sendDingMsgToUser() {
         return ResultVO.ok(gameMonitorAlarmService.sendMsgToUser());

+ 101 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsMonitorAlarm.java

@@ -0,0 +1,101 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 游戏告警监控表
+ * </p>
+ *
+ * @author tianhua
+ * @time 2023/7/11
+ * @Description
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Table(AdsMonitorAlarm.TABLE_NAME)
+@PK({"dt", "id", "gameId", "userId"})
+public class AdsMonitorAlarm implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "ads_monitor_alarm";
+
+    /**
+     * 告警时间
+     */
+    private LocalDate dt;
+
+    /**
+     * 游戏策略配置表ID
+     */
+    private Long id;
+
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 区服ID
+     */
+    @Column
+    private Long serverId;
+
+    /**
+     * 角色ID
+     */
+    @Column
+    private Long roleId;
+
+    /**
+     * 投手ID
+     */
+    @Column
+    private Long pitcherId;
+
+    /**
+     * SDK来源
+     */
+    @Column
+    private String sourceSystem;
+
+    /**
+     * 告警内容
+     */
+    @Column
+    private String message;
+
+    /**
+     * 游戏策略配置参数
+     */
+    @Column
+    private String configExplain;
+
+    /**
+     * 策略类型:1-追踪玩家;2-玩家流失;3-新用户追踪
+     */
+    @Column
+    private Integer configType;
+
+    /**
+     * 报警状态,0表示未报警,1标识已报警
+     */
+    @Column
+    private Integer warnStatus;
+
+}

+ 103 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameMonitorAlarmVO.java

@@ -0,0 +1,103 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.nutz.dao.entity.annotation.Column;
+
+import java.time.LocalDate;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: 游戏监控告警实体类
+ * @date 2023/12/14 13:57
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameMonitorAlarmVO {
+
+    /**
+     * 告警时间
+     */
+    private LocalDate dt;
+
+    /**
+     * 游戏策略配置表ID
+     */
+    private Long id;
+
+    /**
+     * SDK来源
+     */
+    private String sourceSystem;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 用户昵称
+     */
+    private String nickname;
+
+    /**
+     * 区服ID
+     */
+    private Long serverId;
+
+    /**
+     * 区服名
+     */
+    private String serverName;
+
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 游戏名
+      */
+    private String gameName;
+
+    /**
+     * 角色ID
+     */
+    private Long roleId;
+
+    /**
+     * 角色名
+     */
+    private String roleName;
+
+    /**
+     * 投手ID
+     */
+    private Long pitcherId;
+
+    /**
+     * 告警内容
+     */
+    private String message;
+
+    /**
+     * 策略内容
+     */
+    private String configExplain;
+
+    /**
+     * 报警状态,0表示未报警,1标识已报警
+     */
+    private Integer warnStatus;
+    
+}

+ 98 - 3
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameMonitorAlarmServiceImpl.java

@@ -2,13 +2,23 @@ package com.zanxiang.game.data.serve.service.impl;
 
 import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.rpc.IDingTalkMsgRpc;
+import com.zanxiang.game.data.serve.pojo.entity.AdsMonitorAlarm;
+import com.zanxiang.game.data.serve.pojo.vo.GameMonitorAlarmVO;
 import com.zanxiang.game.data.serve.service.IGameMonitorAlarmService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.nutz.dao.Chain;
+import org.nutz.dao.Cnd;
 import org.nutz.dao.Dao;
+import org.nutz.dao.Sqls;
+import org.nutz.dao.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author tianhua
@@ -17,6 +27,7 @@ import java.time.LocalDateTime;
  * @date 2023/12/13 16:24
  */
 @Service
+@Slf4j
 public class GameMonitorAlarmServiceImpl implements IGameMonitorAlarmService {
 
     @Autowired
@@ -26,12 +37,96 @@ public class GameMonitorAlarmServiceImpl implements IGameMonitorAlarmService {
     private IDingTalkMsgRpc dingTalkMsgRpc;
 
     public boolean sendMsgToUser() {
-        LocalDateTime now = LocalDateTime.now();
-        String msg = "这是一条测试钉钉消息,发送时间:" + now;
-        dingTalkMsgRpc.sendByUserId(401L, msg);
+        //数据库查表
+        Sql sql = Sqls.create(getMonitorAlarmInfoSql());
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(GameMonitorAlarmVO.class));
+        dao.execute(sql);
+        //结果
+        List<GameMonitorAlarmVO> list = sql.getList(GameMonitorAlarmVO.class).stream().map(vo -> {
+            if (vo.getRoleId() == 783288031894606439L) {
+                String s = alarmStr(vo);
+                log.error("s:{}", s);
+                dingTalkMsgRpc.sendByUserId(401L, alarmStr(vo));
+                dao.update(AdsMonitorAlarm.class, Chain.make("warn_status", 0),
+                        Cnd.where("role_id", "=", "783288031894606439"));
+            }
+            log.error("s:");
+            return vo;
+        }).collect(Collectors.toList());
+
+        //修改数据库 状态值
 
         return true;
     }
 
+    /**
+     * 生成告警信息字符串
+     */
+    private String alarmStr(GameMonitorAlarmVO vo) {
+        StringBuilder msgStr = new StringBuilder(0);
+        msgStr.append("策略响应时间:")
+                .append(vo.getDt())
+                .append(";用户ID:")
+                .append(vo.getUserId())
+                .append(";用户名:")
+                .append(vo.getUsername())
+                .append(";用户昵称:")
+                .append(vo.getNickname())
+                .append(";游戏名称:")
+                .append(vo.getGameName())
+                .append(";区服名称:")
+                .append(vo.getServerName())
+                .append(";角色ID:")
+                .append(vo.getRoleId())
+                .append(";角色名称:")
+                .append(vo.getRoleName())
+                .append(";响应策略内容:")
+                .append(vo.getMessage())
+                .append(";该用户响应的策略属于:")
+                .append(vo.getConfigExplain());
+
+        return msgStr.toString();
+    }
 
+    /**
+     * 游戏监控告警sql
+     * @return String
+     */
+    private String getMonitorAlarmInfoSql() {
+        return """
+                SELECT
+                	a.dt ,
+                	a.id ,
+                	a.source_system ,
+                	a.user_id ,
+                	b.username ,
+                	b.nickname ,
+                	a.server_id ,
+                	e.server_name ,
+                	a.game_id ,
+                	d.game_name ,
+                	a.role_id ,
+                	c.role_name ,
+                	a.pitcher_id ,
+                	a.message ,
+                	a.config_explain ,
+                	a.warn_status
+                FROM game_ads.ads_monitor_alarm a
+                LEFT JOIN dm_game_order.t_game_user b on a.source_system = b.source_system AND a.user_id = b.id
+                LEFT JOIN (
+                	SELECT
+                		source_system ,
+                		role_id ,
+                		role_name ,
+                		ROW_NUMBER()over(partition by role_id , source_system order by update_time desc, user_id desc) as num
+                	FROM dm_game_order.t_game_user_role
+                ) c on a.source_system = c.source_system AND a.role_id = c.role_id AND c.num = 1
+                LEFT JOIN dm_game_order.t_game d on a.source_system = d.source_system AND a.game_id = d.id
+                LEFT JOIN dm_game_order.t_game_server e on a.source_system = e.source_system AND a.game_id = e.game_id AND a.server_id = e.server_id
+                WHERE a.warn_status = 0
+                """;
+    }
+    
+    
 }

+ 44 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/task/GameMonitorAlarmTask.java

@@ -0,0 +1,44 @@
+package com.zanxiang.game.data.serve.task;
+
+import com.zanxiang.game.data.serve.service.IGameMonitorAlarmService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: 游戏监控告警定时任务
+ * @date 2023/12/13 19:08
+ */
+@Slf4j
+@Component
+@RefreshScope
+public class GameMonitorAlarmTask {
+
+    @Autowired
+    private IGameMonitorAlarmService gameMonitorAlarmService;
+
+    @Value("${sys-config.task_is_run}")
+    private boolean run;
+
+    /**
+     * 任务每5分钟运行一次
+     */
+    @Scheduled(cron = "0 0/5 * * * ? ")
+    public void run() {
+        if (!run) {
+            return;
+        }
+        log.error("游戏监控告警定时任务开始.");
+        try {
+            gameMonitorAlarmService.sendMsgToUser();
+        } catch (Exception e) {
+            log.error("定时任务游戏监控告警出错", e);
+        }
+    }
+
+}