浏览代码

项目功能优化

liukaixiong 5 年之前
父节点
当前提交
153fc7555e
共有 59 个文件被更改,包括 2526 次插入517 次删除
  1. 1 1
      jay-monitor-data-api/pom.xml
  2. 1 2
      jay-monitor-data-client/pom.xml
  3. 6 0
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/MonitorSendProducer.java
  4. 6 0
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/ClientMonitorAutoConfiguration.java
  5. 9 13
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/KafkaMonitorAutoConfiguration.java
  6. 1 1
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/ext/MonitorRuleCallback.java
  7. 5 5
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/ext/MonitorRuleFactory.java
  8. 47 47
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/ext/kafka/KafkaMonitorProducer.java
  9. 46 46
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/ext/kafka/consumer/KafkaMonitorConsumerListener.java
  10. 59 10
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/utils/MonitorUtils.java
  11. 2 2
      jay-monitor-data-client/src/test/java/com/jay/monitor/data/client/ext/TestMQMonitorRule.java
  12. 1 1
      jay-monitor-data-core/pom.xml
  13. 3 2
      jay-monitor-data-server/pom.xml
  14. 2 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/BeanConfig.java
  15. 2 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/OSSConfig.java
  16. 52 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/props/AlertProperties.java
  17. 17 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/ApiController.java
  18. 118 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/TraceController.java
  19. 3 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/costs/MdConstants.java
  20. 2 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/daos/PartitionOperation.java
  21. 1 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/job/ScheduledJob.java
  22. 34 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/request/trace/MQRequest.java
  23. 34 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/request/trace/URLRequest.java
  24. 2 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/CountReport.java
  25. 9 7
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/DayAlertProcess.java
  26. 2 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/TopSlowTimeListReport.java
  27. 5 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/DingDingAlertMsgProcess.java
  28. 5 3
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/mysql/AvgSlowUrlTopReportInvoke.java
  29. 3 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/mysql/MaxSlowUrlTopReportInvoke.java
  30. 4 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/AbstractStoreProcess.java
  31. 7 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlMQStoreProcess.java
  32. 6 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlUrlStoreProcess.java
  33. 18 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/utils/DataUtils.java
  34. 11 0
      jay-monitor-data-server/src/main/resources/application-com.yml
  35. 12 3
      jay-monitor-data-server/src/main/resources/application-dev.yml
  36. 20 5
      jay-monitor-data-server/src/main/resources/application-test.yml
  37. 9 0
      jay-monitor-data-server/src/main/resources/application-uat.yml
  38. 61 0
      jay-monitor-data-server/src/main/resources/mybatis/mapper/JayMonitorMqMapperExt.xml
  39. 54 1
      jay-monitor-data-server/src/main/resources/mybatis/mapper/JayMonitorUrlMapperExt.xml
  40. 二进制
      jay-monitor-data-server/src/main/resources/static/fonts/iconfont.eot
  41. 231 154
      jay-monitor-data-server/src/main/resources/static/fonts/iconfont.svg
  42. 二进制
      jay-monitor-data-server/src/main/resources/static/fonts/iconfont.ttf
  43. 二进制
      jay-monitor-data-server/src/main/resources/static/fonts/iconfont.woff
  44. 二进制
      jay-monitor-data-server/src/main/resources/static/fonts/iconfont.woff2
  45. 3 2
      jay-monitor-data-server/src/main/resources/static/js/elab-common.js
  46. 8 0
      jay-monitor-data-server/src/main/resources/static/js/elab-config.js
  47. 4 0
      jay-monitor-data-server/src/main/resources/static/js/elab-service-config.js
  48. 57 0
      jay-monitor-data-server/src/main/resources/static/lib/json-viewer/jquery.json-viewer.css
  49. 158 0
      jay-monitor-data-server/src/main/resources/static/lib/json-viewer/jquery.json-viewer.js
  50. 二进制
      jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.eot
  51. 82 1
      jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.svg
  52. 二进制
      jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.ttf
  53. 二进制
      jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.woff
  54. 二进制
      jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.woff2
  55. 615 1
      jay-monitor-data-server/src/main/resources/static/lib/layui/lay/modules/laydate.js
  56. 200 194
      jay-monitor-data-server/src/main/resources/templates/index.html
  57. 246 0
      jay-monitor-data-server/src/main/resources/templates/trace/mqList.html
  58. 241 0
      jay-monitor-data-server/src/main/resources/templates/trace/urlList.html
  59. 1 1
      pom.xml

+ 1 - 1
jay-monitor-data-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>com.jay.monitor.data</groupId>
         <artifactId>jay-monitor-data-web</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>1.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 2
jay-monitor-data-client/pom.xml

@@ -5,13 +5,12 @@
     <parent>
         <groupId>com.jay.monitor.data</groupId>
         <artifactId>jay-monitor-data-web</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>1.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>jay-monitor-data-client</artifactId>
 
-
     <dependencies>
         <dependency>
             <groupId>com.alibaba</groupId>

+ 6 - 0
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/MonitorSendProducer.java

@@ -47,6 +47,12 @@ public class MonitorSendProducer implements ApplicationContextAware, Initializin
         sendMsg(null, dataDTO);
     }
 
+    /**
+     * 发送消息
+     *
+     * @param ruleKey 规则标识 -> 如果有该规则则会回到用户拓展的类 具体参考:MonitorRuleCallback实现
+     * @param baseDTO 监控发送数据
+     */
     public static void sendMsg(String ruleKey, BaseDTO baseDTO) {
         if (isEnableProducer) {
             if (!StringUtils.isEmpty(ruleKey)) {

+ 6 - 0
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/ClientMonitorAutoConfiguration.java

@@ -4,6 +4,7 @@ import com.alibaba.druid.pool.DruidDataSource;
 import com.jay.monitor.data.client.MonitorDataClient;
 import com.jay.monitor.data.client.MonitorSendProducer;
 import com.jay.monitor.data.client.config.props.MonitorProperties;
+import com.jay.monitor.data.client.ext.MonitorRuleFactory;
 import com.jay.monitor.data.client.filter.DruidMonitorFilter;
 import com.jay.monitor.data.core.enums.MonitorDataConstants;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -49,4 +50,9 @@ public class ClientMonitorAutoConfiguration {
         return monitorFilter;
     }
 
+    @Bean
+    public MonitorRuleFactory monitorRuleFactory() {
+        return new MonitorRuleFactory();
+    }
+
 }

+ 9 - 13
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/KafkaMonitorAutoConfiguration.java

@@ -1,12 +1,8 @@
 package com.jay.monitor.data.client.config;
 
-import com.jay.monitor.data.client.ext.MonitorRuleFactory;
-import com.jay.monitor.data.client.ext.kafka.KafkaMonitorProducer;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.kafka.core.KafkaTemplate;
-import org.springframework.kafka.listener.MessageListener;
 
 /**
  * @Module 配置类
@@ -18,15 +14,15 @@ import org.springframework.kafka.listener.MessageListener;
 @ConditionalOnBean(value = {KafkaTemplate.class})
 public class KafkaMonitorAutoConfiguration {
 
-    @Bean
-    public KafkaMonitorProducer kafkaMonitorProducer() {
-        return new KafkaMonitorProducer();
-    }
+//    @Bean
+//    public KafkaMonitorProducer kafkaMonitorProducer() {
+//        return new KafkaMonitorProducer();
+//    }
 
-    @Bean
-    @ConditionalOnBean(value = {MessageListener.class})
-    public MonitorRuleFactory monitorRuleFactory() {
-        return new MonitorRuleFactory();
-    }
+//    @Bean
+//    @ConditionalOnBean(value = {MessageListener.class})
+//    public MonitorRuleFactory monitorRuleFactory() {
+//        return new MonitorRuleFactory();
+//    }
 
 }

+ 1 - 1
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/ext/MonitorRuleCallback.java

@@ -25,5 +25,5 @@ public interface MonitorRuleCallback {
      *
      * @return
      */
-    public void registerRule(Map<String, BiConsumer<String, BaseDTO>> ruleMap);
+    public void registerRule(Map<String, BiConsumer<String, ? super BaseDTO>> ruleMap);
 }

+ 5 - 5
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/ext/MonitorRuleFactory.java

@@ -25,7 +25,7 @@ public class MonitorRuleFactory implements InitializingBean {
     @Autowired(required = false)
     private List<MonitorRuleCallback> monitorRuleCallbacks;
 
-    private Map<String, BiConsumer<String, BaseDTO>> mqRuleMap = new HashMap<>();
+    private Map<String, BiConsumer<String, ? super BaseDTO>> ruleMap = new HashMap<>();
 
     /**
      * 应用规则数据
@@ -35,16 +35,16 @@ public class MonitorRuleFactory implements InitializingBean {
      */
     public void applyRule(BaseDTO baseDTO, String key) {
         if (baseDTO instanceof JsonTextData && baseDTO instanceof SearchIndexData) {
-            if (mqRuleMap != null) {
+            if (ruleMap != null) {
                 JsonTextData jsonTextData = (JsonTextData) baseDTO;
                 if (!StringUtils.isEmpty(jsonTextData.getJsonContent())) {
                     // 默认通用的数据处理
-                    BiConsumer<String, BaseDTO> consumer = mqRuleMap.get(MonitorRuleCallback.allMatchRuleType);
+                    BiConsumer<String, ? super BaseDTO> consumer = ruleMap.get(MonitorRuleCallback.allMatchRuleType);
                     if (consumer != null) {
                         consumer.accept(jsonTextData.getJsonContent(), baseDTO);
                     }
 
-                    consumer = mqRuleMap.get(key);
+                    consumer = ruleMap.get(key);
                     if (consumer != null) {
                         consumer.accept(jsonTextData.getJsonContent(), baseDTO);
                     }
@@ -64,7 +64,7 @@ public class MonitorRuleFactory implements InitializingBean {
     private void builderMqMap() {
         if (monitorRuleCallbacks != null) {
             for (MonitorRuleCallback monitorRuleCallback : monitorRuleCallbacks) {
-                monitorRuleCallback.registerRule(mqRuleMap);
+                monitorRuleCallback.registerRule(ruleMap);
             }
         }
     }

+ 47 - 47
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/ext/kafka/KafkaMonitorProducer.java

@@ -1,47 +1,47 @@
-package com.jay.monitor.data.client.ext.kafka;
-
-import com.jay.monitor.data.client.MonitorSendProducer;
-import com.jay.monitor.data.client.utils.MonitorUtils;
-import com.jay.monitor.data.core.model.serializable.MQDataDTO;
-import org.apache.kafka.clients.producer.RecordMetadata;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.kafka.support.ProducerListener;
-import org.springframework.stereotype.Component;
-
-/**
- * @Module 生产者监听器
- * @Description kafka发送的时候会回调该接口告诉你成功或者失败
- * @Author liukaixiong
- * @Date 2020/10/29 16:10
- */
-@Component
-public class KafkaMonitorProducer implements ProducerListener<String, String>, InitializingBean {
-    private Logger logger = LoggerFactory.getLogger(getClass());
-
-    @Override
-    public void onSuccess(String topic, Integer partition, String key, String value, RecordMetadata recordMetadata) {
-        try {
-            MQDataDTO mq = MonitorUtils.builderProducerMqDataDTO(topic, topic, partition + "", recordMetadata.offset(), value, 1);
-            MonitorSendProducer.sendMsg(mq);
-        } catch (Exception e) {
-            logger.warn("success监控发送器发送失败" + e.getMessage());
-        }
-    }
-
-    @Override
-    public void onError(String topic, Integer partition, String key, String value, Exception exception) {
-        try {
-            MQDataDTO mq = MonitorUtils.builderProducerMqDataDTO(topic, topic, partition + "", null, value, -1);
-            MonitorSendProducer.sendMsg(mq);
-        } catch (Exception e) {
-            logger.warn("error监控发送器发送失败 :" + e.getMessage());
-        }
-    }
-
-    @Override
-    public void afterPropertiesSet() throws Exception {
-
-    }
-}
+//package com.jay.monitor.data.client.ext.kafka;
+//
+//import com.jay.monitor.data.client.MonitorSendProducer;
+//import com.jay.monitor.data.client.utils.MonitorUtils;
+//import com.jay.monitor.data.core.model.serializable.MQDataDTO;
+//import org.apache.kafka.clients.producer.RecordMetadata;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.InitializingBean;
+//import org.springframework.kafka.support.ProducerListener;
+//import org.springframework.stereotype.Component;
+//
+///**
+// * @Module 生产者监听器
+// * @Description kafka发送的时候会回调该接口告诉你成功或者失败
+// * @Author liukaixiong
+// * @Date 2020/10/29 16:10
+// */
+//@Component
+//public class KafkaMonitorProducer implements ProducerListener<String, String>, InitializingBean {
+//    private Logger logger = LoggerFactory.getLogger(getClass());
+//
+//    @Override
+//    public void onSuccess(String topic, Integer partition, String key, String value, RecordMetadata recordMetadata) {
+//        try {
+//            MQDataDTO mq = MonitorUtils.builderProducerMqDataDTO(topic, topic, partition + "", recordMetadata.offset(), value, 1);
+//            MonitorSendProducer.sendMsg(topic, mq);
+//        } catch (Exception e) {
+//            logger.warn("success监控发送器发送失败" + e.getMessage());
+//        }
+//    }
+//
+//    @Override
+//    public void onError(String topic, Integer partition, String key, String value, Exception exception) {
+//        try {
+//            MQDataDTO mq = MonitorUtils.builderProducerMqDataDTO(topic, topic, partition + "", null, value, -1);
+//            MonitorSendProducer.sendMsg(topic, mq);
+//        } catch (Exception e) {
+//            logger.warn("error监控发送器发送失败 :" + e.getMessage());
+//        }
+//    }
+//
+//    @Override
+//    public void afterPropertiesSet() throws Exception {
+//
+//    }
+//}

+ 46 - 46
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/ext/kafka/consumer/KafkaMonitorConsumerListener.java

@@ -1,46 +1,46 @@
-package com.jay.monitor.data.client.ext.kafka.consumer;
-
-import com.jay.monitor.data.client.MonitorSendProducer;
-import com.jay.monitor.data.client.ext.MonitorRuleFactory;
-import com.jay.monitor.data.client.utils.MonitorUtils;
-import com.jay.monitor.data.core.model.serializable.MQDataDTO;
-import org.apache.kafka.clients.consumer.ConsumerRecord;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.kafka.listener.AcknowledgingMessageListener;
-import org.springframework.kafka.support.Acknowledgment;
-
-/**
- * @Module 监听器
- * @Description kafka监控消费者监听器
- * @Author liukaixiong
- * @Date 2020/10/27 19:14
- */
-public class KafkaMonitorConsumerListener implements AcknowledgingMessageListener<String, String> {
-    private Logger logger = LoggerFactory.getLogger(getClass());
-
-    private MonitorRuleFactory monitorRuleFactory;
-
-    public AcknowledgingMessageListener listener;
-
-    public KafkaMonitorConsumerListener(AcknowledgingMessageListener listener, MonitorRuleFactory monitorRuleFactory) {
-        this.listener = listener;
-    }
-
-    @Override
-    public void onMessage(ConsumerRecord<String, String> data, Acknowledgment acknowledgment) {
-        try {
-            listener.onMessage(data, acknowledgment);
-            // todo 不在一个事务消息内,无法获取准确的LOGId
-            sendMonitorData(data, 1);
-        } catch (Exception e) {
-            sendMonitorData(data, -1);
-            throw e;
-        }
-    }
-
-    private void sendMonitorData(ConsumerRecord<String, String> data, Integer status) {
-        MQDataDTO mqDataDTO = MonitorUtils.builderConsumerMqDataDTO(data.topic(), data.key(), data.partition() + "", data.offset(), data.value(), status);
-        MonitorSendProducer.sendMsg(data.topic(), mqDataDTO);
-    }
-}
+//package com.jay.monitor.data.client.ext.kafka.consumer;
+//
+//import com.jay.monitor.data.client.MonitorSendProducer;
+//import com.jay.monitor.data.client.ext.MonitorRuleFactory;
+//import com.jay.monitor.data.client.utils.MonitorUtils;
+//import com.jay.monitor.data.core.model.serializable.MQDataDTO;
+//import org.apache.kafka.clients.consumer.ConsumerRecord;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.kafka.listener.AcknowledgingMessageListener;
+//import org.springframework.kafka.support.Acknowledgment;
+//
+///**
+// * @Module 监听器
+// * @Description kafka监控消费者监听器
+// * @Author liukaixiong
+// * @Date 2020/10/27 19:14
+// */
+//public class KafkaMonitorConsumerListener implements AcknowledgingMessageListener<String, String> {
+//    private Logger logger = LoggerFactory.getLogger(getClass());
+//
+//    private MonitorRuleFactory monitorRuleFactory;
+//
+//    public AcknowledgingMessageListener listener;
+//
+//    public KafkaMonitorConsumerListener(AcknowledgingMessageListener listener, MonitorRuleFactory monitorRuleFactory) {
+//        this.listener = listener;
+//    }
+//
+//    @Override
+//    public void onMessage(ConsumerRecord<String, String> data, Acknowledgment acknowledgment) {
+//        try {
+//            listener.onMessage(data, acknowledgment);
+//            // todo 不在一个事务消息内,无法获取准确的LOGId
+//            sendMonitorData(data, 1);
+//        } catch (Exception e) {
+//            sendMonitorData(data, -1);
+//            throw e;
+//        }
+//    }
+//
+//    private void sendMonitorData(ConsumerRecord<String, String> data, Integer status) {
+//        MQDataDTO mqDataDTO = MonitorUtils.builderConsumerMqDataDTO(data.topic(), data.key(), data.partition() + "", data.offset(), data.value(), status);
+//        MonitorSendProducer.sendMsg(data.topic(), mqDataDTO);
+//    }
+//}

+ 59 - 10
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/utils/MonitorUtils.java

@@ -14,7 +14,7 @@ import java.util.Date;
  */
 public class MonitorUtils {
 
-    public static MQDataDTO builderMqDataDTO(String topic, String key, String partitionName, String msgId, String value, Integer status) {
+    public static MQDataDTO builderMqDataDTO(String topic, String key, String partitionName, String msgId, String value, Integer status, Long requestTime) {
         MQDataDTO mq = new MQDataDTO();
         mq.setTopic(topic);
         mq.setMsgId(msgId);
@@ -24,12 +24,61 @@ public class MonitorUtils {
         mq.setJsonContent(value);
         mq.setGroupKeyName(key);
         mq.setStatus(status);
+        mq.setRequestTime(requestTime);
         mq.setInvokeType(MQInvokeType.producer);
         return mq;
     }
 
+    /**
+     * 发送RMQ消息
+     *
+     * @param topic         topic
+     * @param key           key
+     * @param partitionName 分区号,对应rmq-》tag
+     * @param msgId         消息编号
+     * @param value         值
+     * @param status        状态
+     * @return
+     */
+    public static MQDataDTO builderProducerRMQDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status) {
+        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, null);
+        mqDataDTO.setInvokeType(MQInvokeType.producer);
+        mqDataDTO.setMqType(MQTypeEnum.rocketMQ.name());
+        return mqDataDTO;
+    }
+
+    /**
+     * 构建RMQ的消费者消息
+     *
+     * @param topic         topic
+     * @param key           key
+     * @param partitionName 分区号
+     * @param msgId         消息编号
+     * @param value         值
+     * @param status        状态
+     * @param requestTime   请求时长
+     * @return
+     */
+    public static MQDataDTO builderConsumerRMQDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Long requestTime) {
+        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, requestTime);
+        mqDataDTO.setInvokeType(MQInvokeType.consumer);
+        mqDataDTO.setMqType(MQTypeEnum.rocketMQ.name());
+        return mqDataDTO;
+    }
+
+    /**
+     * 构建生产者监控数据
+     *
+     * @param topic         topic
+     * @param key           key
+     * @param partitionName kafka/分区 -> RMQ/Tag
+     * @param msgId         消息编号
+     * @param value         消息内容
+     * @param status        成功或者失败
+     * @return
+     */
     public static MQDataDTO builderProducerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status) {
-        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status);
+        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, null);
         mqDataDTO.setInvokeType(MQInvokeType.producer);
         return mqDataDTO;
     }
@@ -37,16 +86,16 @@ public class MonitorUtils {
     /**
      * 构建消费者监控数据
      *
-     * @param topic                 topic
-     * @param key                   key
-     * @param partitionName         kafka/分区 -> RMQ/Tag
-     * @param msgId
-     * @param value
-     * @param status
+     * @param topic         topic
+     * @param key           key
+     * @param partitionName kafka/分区 -> RMQ/Tag
+     * @param msgId         消息编号
+     * @param value         消息内容
+     * @param status        成功或者失败
      * @return
      */
-    public static MQDataDTO builderConsumerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status) {
-        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status);
+    public static MQDataDTO builderConsumerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Long requestTime) {
+        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, requestTime);
         mqDataDTO.setInvokeType(MQInvokeType.consumer);
         return mqDataDTO;
     }

+ 2 - 2
jay-monitor-data-client/src/test/java/com/jay/monitor/data/client/ext/TestMQMonitorRule.java

@@ -14,8 +14,8 @@ import java.util.function.BiConsumer;
  */
 @Component
 public class TestMQMonitorRule implements MonitorRuleCallback {
-
     @Override
-    public void registerRule(Map<String, BiConsumer<String, BaseDTO>> ruleMap) {
+    public void registerRule(Map<String, BiConsumer<String, ? super BaseDTO>> ruleMap) {
+
     }
 }

+ 1 - 1
jay-monitor-data-core/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>com.jay.monitor.data</groupId>
         <artifactId>jay-monitor-data-web</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>1.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 3 - 2
jay-monitor-data-server/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <groupId>com.jay.monitor.data</groupId>
         <artifactId>jay-monitor-data-web</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>1.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>jay-monitor-data-server</artifactId>
@@ -152,13 +152,13 @@
 
     </dependencies>
     <build>
+        <finalName>jay-monitor-data-server</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
         </plugins>
-
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
@@ -181,6 +181,7 @@
         </resources>
     </build>
     <repositories>
+        <!-- 仅仅针对 markdown-plugin 这个jar包的下载镜像文件 -->
         <repository>
             <id>jitpack.io</id>
             <url>http://jitpack.io</url>

+ 2 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/BeanConfig.java

@@ -3,6 +3,7 @@ package com.jay.monitor.data.server.config;
 import com.alipay.remoting.rpc.protocol.UserProcessor;
 import com.jay.monitor.data.core.enums.MonitorDataConstants;
 import com.jay.monitor.data.server.MonitorDataServer;
+import com.jay.monitor.data.server.config.props.AlertProperties;
 import com.jay.monitor.data.server.config.props.MonitorProperties;
 import com.jay.monitor.data.server.factory.DataIdFactory;
 import com.jay.monitor.data.server.factory.IdGenerateService;
@@ -12,7 +13,6 @@ import com.jay.monitor.data.server.store.SplitDataManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -32,7 +32,7 @@ import java.util.List;
 //@ComponentScan(basePackages = {"com.jay.monitor.data.server"}, excludeFilters = {
 //        @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class, ControllerAdvice.class})
 //})
-@EnableConfigurationProperties({MonitorProperties.class, OAuth2ClientProperties.class})
+@EnableConfigurationProperties({MonitorProperties.class, AlertProperties.class})
 public class BeanConfig {
 
     private Logger logger = LoggerFactory.getLogger(getClass());

+ 2 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/OSSConfig.java

@@ -4,6 +4,7 @@ import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
 import com.jay.monitor.data.server.componts.OOSInvoke;
 import com.jay.monitor.data.server.config.props.OSSProperties;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -18,9 +19,8 @@ import org.springframework.context.annotation.Configuration;
 @EnableConfigurationProperties(value = {OSSProperties.class})
 public class OSSConfig {
 
-
     @Bean
-//    @ConditionalOnProperty(value = "spring.oss")
+    @ConditionalOnProperty(value = {"spring.oss.endpoint","spring.oss.access-key-id","spring.oss.access-key-secret"})
     public OOSInvoke oosInvoke(OSSProperties ossProperties) {
         OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
         OOSInvoke oosInvoke = new OOSInvoke(ossClient, ossProperties);

+ 52 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/props/AlertProperties.java

@@ -0,0 +1,52 @@
+package com.jay.monitor.data.server.config.props;
+
+import com.jay.monitor.data.server.enums.AlertMsgEnums;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @Module 属性配置
+ * @Description 告警配置
+ * @Author liukaixiong
+ * @Date 2020/12/22 16:09
+ */
+@ConfigurationProperties(prefix = "spring.alert")
+public class AlertProperties {
+    /**
+     * 是否开启告警推送
+     */
+    private boolean isEnable = true;
+
+    /**
+     * 推送类型
+     */
+    private AlertMsgEnums alertType;
+
+    /**
+     * 推送的第三方URL
+     */
+    private String url;
+
+    public boolean isEnable() {
+        return isEnable;
+    }
+
+    public void setEnable(boolean enable) {
+        isEnable = enable;
+    }
+
+    public AlertMsgEnums getAlertType() {
+        return alertType;
+    }
+
+    public void setAlertType(AlertMsgEnums alertType) {
+        this.alertType = alertType;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

+ 17 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/ApiController.java

@@ -1,6 +1,9 @@
 package com.jay.monitor.data.server.controllers;
 
 import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.core.model.response.ResponseCommonModel;
+import com.jay.monitor.data.core.utils.ResponseUtils;
+import com.jay.monitor.data.server.report.DayAlertProcess;
 import com.jay.monitor.data.server.store.StoreDataManager;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +29,9 @@ public class ApiController {
     @Autowired
     private StoreDataManager storeDataManager;
 
+    @Autowired
+    private DayAlertProcess alertProcess;
+
     @RequestMapping(value = "/log/mq", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
     @ResponseBody
     public String searchMqIdLog(@RequestParam(value = "date", required = false) String date, @RequestParam("id") String id) throws Exception {
@@ -43,4 +49,15 @@ public class ApiController {
         }
         return storeDataManager.selectContentById(MsgTypeEnums.URL, date, id);
     }
+
+    @RequestMapping(value = "/alert/send", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
+    @ResponseBody
+    public ResponseCommonModel alertSend(@RequestParam(value = "date", required = false) String date) throws Exception {
+        if (StringUtils.isEmpty(date)) {
+            date = sdf.format(new Date());
+        }
+        alertProcess.alert(date);
+        return ResponseUtils.trues();
+    }
+
 }

+ 118 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/TraceController.java

@@ -0,0 +1,118 @@
+package com.jay.monitor.data.server.controllers;//package com.jay.monitor.data.server.controllers;
+
+import com.jay.monitor.data.core.model.response.PageInfoModel;
+import com.jay.monitor.data.core.model.response.PageResponseModel;
+import com.jay.monitor.data.server.models.entity.JayMonitorMq;
+import com.jay.monitor.data.server.models.entity.JayMonitorUrl;
+import com.jay.monitor.data.server.models.request.trace.MQRequest;
+import com.jay.monitor.data.server.models.request.trace.URLRequest;
+import com.jay.monitor.data.server.store.mysql.MysqlMQStoreProcess;
+import com.jay.monitor.data.server.store.mysql.MysqlUrlStoreProcess;
+import com.jay.monitor.data.server.utils.DataUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+//import com.jay.monitor.data.server.services.impl.DefaultBackstageRouteService;
+
+/**
+ * 后台路由管理
+ *
+ * @author liukx
+ * @Date 2019-02-28 15:16
+ */
+@Controller
+@RequestMapping(value = "/trace")
+public class TraceController {
+
+    final static private String page = "/trace/";
+
+    @Value("${spring.cat.url}")
+    private String catUrl;
+
+    @Autowired
+    private MysqlMQStoreProcess mqStoreProcess;
+
+    @Autowired
+    private MysqlUrlStoreProcess urlStoreProcess;
+
+    @RequestMapping(value = "/mqList.html", method = RequestMethod.GET)
+    public String list(Model model) throws Exception {
+        model.addAttribute("catUrl", catUrl);
+        return page + "mqList";
+    }
+
+    @RequestMapping(value = "/urlList.html", method = RequestMethod.GET)
+    public String urlList(Model model) throws Exception {
+        model.addAttribute("catUrl", catUrl);
+        return page + "urlList";
+    }
+
+    @RequestMapping(value = "/mqList", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public PageResponseModel<JayMonitorMq> findMQList(@RequestBody MQRequest request) throws Exception {
+        String date = DataUtils.parseDayString(request.getDate());
+        // 将参数对应的全部匹配赋值
+        List<JayMonitorMq> mqList = mqStoreProcess.searchDataByList(date, request.getPageSize(), request);
+        PageResponseModel<JayMonitorMq> pageResponseModel = new PageResponseModel<JayMonitorMq>();
+        PageInfoModel pageInfoModel = new PageInfoModel();
+        pageInfoModel.setRowTotal(20);
+        pageInfoModel.setPageSize(1);
+        pageInfoModel.setResultSet(mqList);
+        pageResponseModel.setPageModel(pageInfoModel);
+        return pageResponseModel;
+    }
+
+    @RequestMapping(value = "/urlList", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public PageResponseModel<JayMonitorUrl> findUrlList(@RequestBody URLRequest request) throws Exception {
+        String date = DataUtils.parseDayString(request.getDate());
+        // 将参数对应的全部匹配赋值
+        List<JayMonitorUrl> mqList = urlStoreProcess.searchDataByList(date, request.getPageSize(), request);
+        PageResponseModel<JayMonitorUrl> pageResponseModel = new PageResponseModel<JayMonitorUrl>();
+        PageInfoModel pageInfoModel = new PageInfoModel();
+        pageInfoModel.setRowTotal(20);
+        pageInfoModel.setPageSize(1);
+        pageInfoModel.setResultSet(mqList);
+        pageResponseModel.setPageModel(pageInfoModel);
+        return pageResponseModel;
+    }
+
+//    @RequestMapping(value = "/getObjectById", method = RequestMethod.GET)
+//    @ResponseBody
+//    public ObjectResponseModel<BackstageRoute> getObjectById(@RequestParam("id") Integer id) throws Exception {
+//        BackstageRoute result = routesService.getById(id + "");
+//        ObjectResponseModel<BackstageRoute> model = new ObjectResponseModel<BackstageRoute>();
+//        model.setSingle(result);
+//        return model;
+//    }
+//
+//    @RequestMapping(value = "/getObjectByList", method = RequestMethod.POST)
+//    @ResponseBody
+//    public ListResponseModel<BackstageRoute> getObjectByList(@RequestBody BackstageRoute request) throws Exception {
+//        QueryWrapper queryWrapper = new QueryWrapper(request);
+//        List<BackstageRoute> result = routesService.listObjs(queryWrapper);
+//        ListResponseModel<BackstageRoute> model = new ListResponseModel<BackstageRoute>();
+//        model.setList(result);
+//        return model;
+//    }
+//
+//    @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+//    @ResponseBody
+//    public ResponseCommonModel updateBackstageRouteInfo(@RequestBody BackstageRoute request) throws Exception {
+//        request.setUpdated(new Date());
+//        boolean b = routesService.updateById(request);
+//        ResponseCommonModel response = new ResponseCommonModel();
+//        if (b) {
+//            response.setSuccess(false);
+//        }
+//        return response;
+//    }
+}

+ 3 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/costs/MdConstants.java

@@ -10,4 +10,7 @@ public class MdConstants {
 
     public final static String newLine = "\r\n";
 
+    public final static Integer initSortCount = 1000;
+
+
 }

+ 2 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/daos/PartitionOperation.java

@@ -16,4 +16,6 @@ public interface PartitionOperation<T> {
 
     public T selectPartitionById(@Param("date") String date, @Param("id") Integer id);
 
+    public List<T> selectPartitionByList(@Param("date") String date, @Param("pageSize") Integer pageSize, @Param("record") T record);
+
 }

+ 1 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/job/ScheduledJob.java

@@ -36,7 +36,7 @@ public class ScheduledJob implements Runnable, InitializingBean {
          * 天的任务启动的时候就需要启动一次,因为每天就执行一次,避免因为宕机错过这一次时间而难以补救。
          * 所以幂等这部分需要很好的做处理
          */
-       // dayJob();
+        // dayJob();
     }
 
 
@@ -52,7 +52,6 @@ public class ScheduledJob implements Runnable, InitializingBean {
 //    public void dayJob() {
 //        processJob(ScheduleJobService.DAY_TYPE);
 //    }
-
     @Scheduled(cron = "0 0 8 * * ?")
     public void fixedDayJob() {
         processJob(ScheduleJobService.DAY_TYPE);

+ 34 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/request/trace/MQRequest.java

@@ -0,0 +1,34 @@
+package com.jay.monitor.data.server.models.request.trace;
+
+import com.jay.monitor.data.server.models.entity.JayMonitorMq;
+
+import java.util.Date;
+
+/**
+ * @Module mq请求参数
+ * @Description mq请求参数
+ * @Author liukaixiong
+ * @Date 2021/1/12 16:46
+ */
+public class MQRequest extends JayMonitorMq {
+
+    private Date date;
+
+    private Integer pageSize = 10;
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+}

+ 34 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/request/trace/URLRequest.java

@@ -0,0 +1,34 @@
+package com.jay.monitor.data.server.models.request.trace;
+
+import com.jay.monitor.data.server.models.entity.JayMonitorUrl;
+
+import java.util.Date;
+
+/**
+ * @Module 请求参数
+ * @Description url请求的参数
+ * @Author liukaixiong
+ * @Date 2021/1/12 18:29
+ */
+public class URLRequest extends JayMonitorUrl {
+
+    private Date date;
+
+    private Integer pageSize = 10;
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+}

+ 2 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/CountReport.java

@@ -10,10 +10,11 @@ import com.jay.monitor.data.server.costs.MdConstants;
  */
 public interface CountReport extends NameReport {
 
+    public static final Integer initCount = 1000;
 
     @Override
     default int getOrder() {
-        return HIGHEST_PRECEDENCE;
+        return MdConstants.initSortCount;
     }
 
     public Long count(String date);

+ 9 - 7
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/DayAlertProcess.java

@@ -1,6 +1,6 @@
 package com.jay.monitor.data.server.report;
 
-import com.jay.monitor.data.server.componts.OOSInvoke;
+import com.jay.monitor.data.server.config.props.AlertProperties;
 import com.jay.monitor.data.server.costs.MdConstants;
 import com.jay.monitor.data.server.ext.ClazzEqualsProcess;
 import com.jay.monitor.data.server.report.alert.AlertMsgProcess;
@@ -9,7 +9,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -24,20 +23,23 @@ public class DayAlertProcess implements ClazzEqualsProcess {
     private Logger logger = LoggerFactory.getLogger(getClass());
     private String defaultDbType = ".mysql.";
 
-    @Autowired(required = false)
-    private OOSInvoke oosInvoke;
-
-    List<Class> subscribed = Arrays.asList(TopSlowTimeListReport.class);
-
     @Autowired
     private List<AlertMsgProcess> alertMsgList;
 
     @Autowired
     private List<NameReport> listReportInvokes;
 
+    @Autowired
+    private AlertProperties alertProperties;
+
     public void alert(String date) {
         StringBuilder allMdAlertContent = new StringBuilder();
 
+        if (!alertProperties.isEnable()) {
+            logger.debug("未开启告警发送");
+            return;
+        }
+
         // 构建消息
         for (int i = 0; i < listReportInvokes.size(); i++) {
             NameReport invoke = listReportInvokes.get(i);

+ 2 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/TopSlowTimeListReport.java

@@ -23,7 +23,7 @@ public interface TopSlowTimeListReport<T> extends NameReport {
 
     @Override
     default int getOrder() {
-        return LOWEST_PRECEDENCE;
+        return MdConstants.initSortCount * 2;
     }
 
     /**
@@ -34,7 +34,7 @@ public interface TopSlowTimeListReport<T> extends NameReport {
      */
     @Override
     default String formatReport(String reportDate) {
-        StringBuffer sb = new StringBuffer("## " + reportName());
+        StringBuffer sb = new StringBuffer("#### " + reportName());
         sb.append(MdConstants.newLine);
 
         List listData = getListData(reportDate);

+ 5 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/DingDingAlertMsgProcess.java

@@ -1,6 +1,7 @@
 package com.jay.monitor.data.server.report.alert;
 
 import com.jay.monitor.data.server.componts.OOSInvoke;
+import com.jay.monitor.data.server.config.props.AlertProperties;
 import com.jay.monitor.data.server.costs.MdConstants;
 import com.jay.monitor.data.server.enums.AlertMsgEnums;
 import com.jay.monitor.data.server.models.request.dingding.MdModel;
@@ -23,7 +24,8 @@ import java.io.InputStream;
 public class DingDingAlertMsgProcess implements AlertMsgProcess {
     private Logger logger = LoggerFactory.getLogger(getClass());
 
-    String dingDingUrl = "https://oapi.dingtalk.com/robot/send?access_token=c2d694e28fd5de8c0b4f42be2e253bb3e4ef1fbb7d589ac377015e738713b995";
+    @Autowired
+    private AlertProperties alertProperties;
 
     @Autowired(required = false)
     private OOSInvoke oosInvoke;
@@ -36,6 +38,7 @@ public class DingDingAlertMsgProcess implements AlertMsgProcess {
 
     @Override
     public boolean send(String date, String msg) {
+        String dingDingUrl = alertProperties.getUrl();
 
         String filename = System.currentTimeMillis() + ".jpg";
 
@@ -53,7 +56,7 @@ public class DingDingAlertMsgProcess implements AlertMsgProcess {
         mdText.append(MdConstants.newLine);
         mdText.append(">  ![screenshot](" + url + ")");
         mdText.append(MdConstants.newLine);
-        mdText.append("> [点击查看](http://www.baidu.com)");
+        // mdText.append("> [点击查看](http://www.baidu.com)");
         mdText.append(MdConstants.newLine);
         mdText.append("------ ");
         mdText.append(MdConstants.newLine);

+ 5 - 3
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/mysql/AvgSlowUrlTopReportInvoke.java

@@ -17,13 +17,15 @@ import java.util.List;
 @Component
 public class AvgSlowUrlTopReportInvoke implements TopSlowTimeListReport<SlowGroupModel> {
 
-    private String reportName = "URL平均耗时排行  TOP 10 ";
-
+    private Integer minRequestTime = 1000;
     /**
      * 默认的基数值
      */
     private Integer defaultBaseCount = 10;
 
+    private String reportName = "URL平均耗时排行  TOP 10 [超过" + minRequestTime + "毫秒,请求数量达到" + defaultBaseCount + "则纳入统计]";
+
+
     @Autowired
     private JayMonitorUrlMapperExt urlMapperExt;
 
@@ -34,7 +36,7 @@ public class AvgSlowUrlTopReportInvoke implements TopSlowTimeListReport<SlowGrou
 
     @Override
     public List<SlowGroupModel> getListData(String reportDate) {
-        List<SlowGroupModel> slowGroupModels = urlMapperExt.selectByUrlAvgGroupList(reportDate, 1000, defaultBaseCount);
+        List<SlowGroupModel> slowGroupModels = urlMapperExt.selectByUrlAvgGroupList(reportDate, minRequestTime, defaultBaseCount);
         return slowGroupModels;
     }
 }

+ 3 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/mysql/MaxSlowUrlTopReportInvoke.java

@@ -16,8 +16,10 @@ import java.util.List;
  */
 @Component
 public class MaxSlowUrlTopReportInvoke implements TopSlowTimeListReport<SlowGroupModel> {
+    int minRequestTime = 3000;
+    int defaultBaseCount = 10;
 
-    private String reportName = "URL请求慢排行 - TOP 10 ";
+    private String reportName = "URL请求慢排行 - TOP 10 [超过" + minRequestTime + "毫秒,请求数量达到" + defaultBaseCount + "则纳入统计]";
 
     @Autowired
     private JayMonitorUrlMapperExt urlMapperExt;

+ 4 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/AbstractStoreProcess.java

@@ -26,7 +26,7 @@ import java.util.concurrent.atomic.LongAdder;
  * @Author liukaixiong
  * @Date 2020/10/29 13:33
  */
-public abstract class AbstractStoreProcess<T> implements TaskRunnable, InitializingBean {
+public abstract class AbstractStoreProcess<T, E> implements TaskRunnable, InitializingBean {
     private Logger logger = LoggerFactory.getLogger(getClass());
 
     private LongAdder counter = new LongAdder();
@@ -120,6 +120,9 @@ public abstract class AbstractStoreProcess<T> implements TaskRunnable, Initializ
 
     public abstract String searchContentById(String date, String id) throws Exception;
 
+
+    public abstract List<E> searchDataByList(String date, Integer pageSize, E entity) throws Exception;
+
     public abstract void speedUpConsumerList(List<T> request);
 
     public void speedUpConsumer(BlockingQueue<T> queue, int rate) {

+ 7 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlMQStoreProcess.java

@@ -29,7 +29,7 @@ import java.util.concurrent.atomic.LongAdder;
  */
 @Component
 @Lazy
-public class MysqlMQStoreProcess extends AbstractStoreProcess<MQDataDTO> {
+public class MysqlMQStoreProcess extends AbstractStoreProcess<MQDataDTO, JayMonitorMq> {
 
     private Logger logger = LoggerFactory.getLogger(getClass());
 
@@ -96,6 +96,12 @@ public class MysqlMQStoreProcess extends AbstractStoreProcess<MQDataDTO> {
         return this.messageManagerProcess.getMessage(messageId);
     }
 
+    @Override
+    public List<JayMonitorMq> searchDataByList(String date, Integer pageSize, JayMonitorMq entity) throws Exception {
+        List<JayMonitorMq> resultList = mqMapper.selectPartitionByList(date,pageSize, entity);
+        return resultList;
+    }
+
     private JayMonitorMq builderJayMonitorMq(MQDataDTO request) {
         JayMonitorMq mqData = new JayMonitorMq();
         try {

+ 6 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlUrlStoreProcess.java

@@ -29,7 +29,7 @@ import java.util.List;
  */
 @Component
 @Lazy
-public class MysqlUrlStoreProcess extends AbstractStoreProcess<URLDataDTO> {
+public class MysqlUrlStoreProcess extends AbstractStoreProcess<URLDataDTO, JayMonitorUrl> {
 
     private Logger logger = LoggerFactory.getLogger(getClass());
     @Autowired
@@ -100,4 +100,9 @@ public class MysqlUrlStoreProcess extends AbstractStoreProcess<URLDataDTO> {
             logger.debug("添加成功:" + messageTree.getMessageId());
         }
     }
+
+    @Override
+    public List<JayMonitorUrl> searchDataByList(String date, Integer pageSize, JayMonitorUrl entity) throws Exception {
+        return urlMapper.selectPartitionByList(date, pageSize, entity);
+    }
 }

+ 18 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/utils/DataUtils.java

@@ -2,6 +2,9 @@ package com.jay.monitor.data.server.utils;
 
 import org.apache.commons.lang3.StringUtils;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 /**
  * @Module 工具类
  * @Description 数据处理
@@ -9,6 +12,7 @@ import org.apache.commons.lang3.StringUtils;
  * @Date 2020/10/23 16:28
  */
 public class DataUtils {
+    private static SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
 
     /**
      * 获取String的值,没有则获取默认值
@@ -23,4 +27,18 @@ public class DataUtils {
         }
         return value;
     }
+
+    /**
+     * 格式化成特定的日期字符串
+     *
+     * @param date
+     * @return
+     */
+    public static String parseDayString(Date date) {
+        if (date == null) {
+            return sdf.format(new Date());
+        }
+        return sdf.format(date);
+    }
+
 }

+ 11 - 0
jay-monitor-data-server/src/main/resources/application-com.yml

@@ -18,5 +18,16 @@ spring:
     url: jdbc:mysql://172.19.189.118/jay_monitor_prod?characterEncoding=UTF-8&connectTimeout=60000&socketTimeout=60000
     username: jay_monitor
     password: jayzhou
+  oss:
+    access-key-id: LTAImNZed054h0YV
+    access-key-secret: 8hmhlhiQ2ikmVeLKujwMNWsktFpSzm
+    endpoint: https://oss-cn-shanghai.aliyuncs.com
+    default-bucket-name: linux-data
+    default-bucket-path: alert/image  # 注意不要/开头
+  alert:
+    alert-type: dingding
+    url: https://oapi.dingtalk.com/robot/send?access_token=1dd1309908d8d77afe87e9d205f4bdd4751685f7fc00ee26ddf8023d4b2f3601
+  cat:
+    url: http://106.14.4.198:2281/cat/r/m/
 logging:
   config: logback/logback.xml

+ 12 - 3
jay-monitor-data-server/src/main/resources/application-dev.yml

@@ -8,20 +8,29 @@ spring:
     min-idle: 10
     max-active: 20
     min-evictable-idle-time-millis: 600000
-#    max-evictable-idle-time-millis: 900000
+    #    max-evictable-idle-time-millis: 900000
     test-on-borrow: false
     test-on-return: false
     test-while-idle: true
     keep-alive: true
-    url: jdbc:mysql://192.168.0.13:3306/elab_db?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior
+#    url: jdbc:mysql://192.168.0.13:3306/elab_db?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior
+#    username: root
+#    password: elab@123
+    url: jdbc:mysql://106.14.4.198:3306/jay_monitor?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior
     username: root
-    password: elab@123
+    password: 666666
   oss:
     access-key-id: LTAImNZed054h0YV
     access-key-secret: 8hmhlhiQ2ikmVeLKujwMNWsktFpSzm
     endpoint: https://oss-cn-shanghai.aliyuncs.com
     default-bucket-name: linux-data
     default-bucket-path: alert/image  # 注意不要/开头
+  alert:
+    enable: true
+    alert-type: dingding
+    url: https://oapi.dingtalk.com/robot/send?access_token=c2d694e28fd5de8c0b4f42be2e253bb3e4ef1fbb7d589ac377015e738713b995
+  cat:
+    url: http://192.168.0.90:2281/cat/r/m/
 logging:
   level:
     com.jay.monitor.data.server: DEBUG

+ 20 - 5
jay-monitor-data-server/src/main/resources/application-test.yml

@@ -4,19 +4,34 @@ spring:
     driver-class-name: com.mysql.jdbc.Driver
     max-wait: 60000
     time-between-eviction-runs-millis: 60000
-    initial-size: 10
+    initial-size: 50
     min-idle: 10
-    max-active: 20
+    max-active: 50
     min-evictable-idle-time-millis: 600000
-#    max-evictable-idle-time-millis: 900000
+    #    max-evictable-idle-time-millis: 900000
     test-on-borrow: false
     test-on-return: false
     test-while-idle: true
+    remove-abandoned: true
+    remove-abandoned-timeout: 180
     keep-alive: true
     url: jdbc:mysql://172.19.189.118/jay_monitor?characterEncoding=UTF-8&connectTimeout=60000&socketTimeout=60000
     username: jay_monitor
     password: jayzhou
-
+  oss:
+    access-key-id: LTAImNZed054h0YV
+    access-key-secret: 8hmhlhiQ2ikmVeLKujwMNWsktFpSzm
+    endpoint: https://oss-cn-shanghai.aliyuncs.com
+    default-bucket-name: linux-data
+    default-bucket-path: alert/image  # 注意不要/开头
+  alert:
+    alert-type: dingding
+    url: https://oapi.dingtalk.com/robot/send?access_token=e60c210c07708843b8e991e47daee84bfe43af6d91d660d613104d910e1c4e1f
+  cat:
+    url: http://192.168.0.90:2281/cat/r/m/
 #logging:
 #  level:
-#    com.jay.monitor.data.server: debug
+#    com.jay.monitor.data.server: debug
+
+logging:
+  config: classpath:logback/logback.xml

+ 9 - 0
jay-monitor-data-server/src/main/resources/application-uat.yml

@@ -16,3 +16,12 @@ spring:
     url: jdbc:mysql://172.19.189.118/jay_monitor?characterEncoding=UTF-8&connectTimeout=60000&socketTimeout=60000
     username: jay_monitor
     password: jayzhou
+  oss:
+    access-key-id: LTAImNZed054h0YV
+    access-key-secret: 8hmhlhiQ2ikmVeLKujwMNWsktFpSzm
+    endpoint: https://oss-cn-shanghai.aliyuncs.com
+    default-bucket-name: linux-data
+    default-bucket-path: alert/image  # 注意不要/开头
+  alert:
+    alert-type: dingding
+    url: https://oapi.dingtalk.com/robot/send?access_token=e60c210c07708843b8e991e47daee84bfe43af6d91d660d613104d910e1c4e1f

+ 61 - 0
jay-monitor-data-server/src/main/resources/mybatis/mapper/JayMonitorMqMapperExt.xml

@@ -38,4 +38,65 @@
     </select>
 
 
+    <select id="selectPartitionByList" resultType="com.jay.monitor.data.server.models.entity.JayMonitorMq">
+        select
+        <include refid="Base_Column_List"/>
+        from jay_monitor_mq_${date}
+        <include refid="whereCondition"/>
+    </select>
+
+    <sql id="whereCondition">
+        <where>
+            1=1
+            <if test="record.applicationName != null and record.applicationName != ''">
+                AND application_name = #{record.applicationName,jdbcType=VARCHAR}
+            </if>
+            <if test="record.applicationIp != null and record.applicationIp != ''">
+                AND application_ip = #{record.applicationIp,jdbcType=VARCHAR}
+            </if>
+            <if test="record.mqType != null and record.mqType != ''">
+                AND mq_type = #{record.mqType,jdbcType=VARCHAR}
+            </if>
+            <if test="record.invokeType != null and record.invokeType != ''">
+                AND invoke_type = #{record.invokeType,jdbcType=VARCHAR}
+            </if>
+            <if test="record.topic != null and record.topic != ''">
+                AND topic = #{record.topic,jdbcType=VARCHAR}
+            </if>
+            <if test="record.partitionName != null and record.partitionName != ''">
+                AND partition_name = #{record.partitionName,jdbcType=VARCHAR}
+            </if>
+            <if test="record.msgId != null and record.msgId != ''">
+                AND msg_id = #{record.msgId,jdbcType=VARCHAR}
+            </if>
+            <if test="record.dataGroupName != null and record.dataGroupName != ''">
+                AND data_group_name = #{record.dataGroupName,jdbcType=VARCHAR}
+            </if>
+            <if test="record.dataGroupKey != null and record.dataGroupKey != ''">
+                AND data_group_key = #{record.dataGroupKey,jdbcType=VARCHAR}
+            </if>
+            <if test="record.dataId != null and record.dataId != ''">
+                AND data_id = #{record.dataId,jdbcType=VARCHAR}
+            </if>
+            <if test="record.rootLogId != null and record.rootLogId != ''">
+                AND root_log_id = #{record.rootLogId,jdbcType=VARCHAR}
+            </if>
+            <if test="record.parentLogId != null and record.parentLogId != ''">
+                AND parent_log_id = #{record.parentLogId,jdbcType=VARCHAR}
+            </if>
+            <if test="record.logId != null and record.logId != ''">
+                AND log_id = #{record.logId,jdbcType=VARCHAR}
+            </if>
+            <if test="record.status != null and record.status != ''">
+                AND `status` = #{record.status,jdbcType=INTEGER}
+            </if>
+            <if test="record.sourceTime != null and record.sourceTime != ''">
+                AND source_time = #{record.sourceTime,jdbcType=TIMESTAMP}
+            </if>
+            <if test="record.createdTime != null and record.createdTime != ''">
+                AND created_time = #{record.createdTime,jdbcType=TIMESTAMP}
+            </if>
+        </where>
+        order by id desc limit ${pageSize}
+    </sql>
 </mapper>

+ 54 - 1
jay-monitor-data-server/src/main/resources/mybatis/mapper/JayMonitorUrlMapperExt.xml

@@ -50,7 +50,60 @@
     </select>
 
     <select id="selectAllCount" resultType="java.lang.Long">
-         select max(id) from jay_monitor_mq_${date}
+         select max(id) from jay_monitor_url_${date}
     </select>
 
+
+    <select id="selectPartitionByList" resultType="com.jay.monitor.data.server.models.entity.JayMonitorUrl">
+        select
+        <include refid="Base_Column_List"/>
+        from jay_monitor_url_${date}
+        <include refid="whereCondition"/>
+    </select>
+
+    <sql id="whereCondition">
+        <where>
+            1=1
+            <if test="record.id != null and record.id != ''">
+                AND id = #{record.id,jdbcType=INTEGER}
+            </if>
+            <if test="record.applicationName != null and record.applicationName != '' ">
+                AND application_name = #{record.applicationName,jdbcType=VARCHAR}
+            </if>
+            <if test="record.applicationIp != null and record.applicationIp != '' ">
+                AND application_ip = #{record.applicationIp,jdbcType=VARCHAR}
+            </if>
+            <if test="record.url != null and record.url != ''">
+                AND url = #{record.url,jdbcType=VARCHAR}
+            </if>
+            <if test="record.userId != null and record.userId != ''">
+                AND user_id = #{record.userId,jdbcType=VARCHAR}
+            </if>
+            <if test="record.clientIp != null and record.clientIp != ''">
+                AND client_ip = #{record.clientIp,jdbcType=VARCHAR}
+            </if>
+            <if test="record.dataGroupName != null and record.dataGroupName != ''">
+                AND data_group_name = #{record.dataGroupName,jdbcType=VARCHAR}
+            </if>
+            <if test="record.dataGroupKey != null and record.dataGroupKey != ''">
+                AND data_group_key = #{record.dataGroupKey,jdbcType=VARCHAR}
+            </if>
+            <if test="record.dataId != null and record.dataId != ''">
+                AND data_id = #{record.dataId,jdbcType=VARCHAR}
+            </if>
+            <if test="record.status != null and record.status != ''">
+                AND `status` = #{record.status,jdbcType=INTEGER}
+            </if>
+            <if test="record.logId != null and record.logId != ''">
+                AND log_id = #{record.logId,jdbcType=VARCHAR}
+            </if>
+            <if test="record.requestTime != null and record.requestTime != ''">
+                AND request_time >= #{record.requestTime,jdbcType=INTEGER}
+            </if>
+            <if test="record.createdTime != null and record.createdTime != ''">
+                AND created_time = #{record.createdTime,jdbcType=TIMESTAMP}
+            </if>
+        </where>
+        order by id desc limit ${pageSize}
+    </sql>
 </mapper>

二进制
jay-monitor-data-server/src/main/resources/static/fonts/iconfont.eot


文件差异内容过多而无法显示
+ 231 - 154
jay-monitor-data-server/src/main/resources/static/fonts/iconfont.svg


二进制
jay-monitor-data-server/src/main/resources/static/fonts/iconfont.ttf


二进制
jay-monitor-data-server/src/main/resources/static/fonts/iconfont.woff


二进制
jay-monitor-data-server/src/main/resources/static/fonts/iconfont.woff2


+ 3 - 2
jay-monitor-data-server/src/main/resources/static/js/elab-common.js

@@ -256,11 +256,12 @@ var elab_common = function () {
                 , curr: 1 //设定初始在第 5 页
                 , groups: 5 //只显示 1 个连续页码
             }, parseData: function (res) { //res 即为原始返回的数据
+                debugger;
                 return {
                     "code": res.success == true ? 0 : 500, //解析接口状态
                     "msg": res.message, //解析提示文本
-                    "count": res.single.total, //解析数据长度
-                    "data": res.single.records //解析数据列表
+                    "count": res.pageModel.count, //解析数据长度
+                    "data": res.pageModel.resultSet //解析数据列表
                 };
             }, request: {
                 pageName: 'pageNo' //页码的参数名称,默认:page

+ 8 - 0
jay-monitor-data-server/src/main/resources/static/js/elab-config.js

@@ -14,5 +14,13 @@ var elabConfig = {
         "permissions": "权限校验",
         "role": "角色校验",
         "tokenAuth":"token验证"
+    },
+    "common_status":{
+        "1":"成功",
+        "-1":"失败"
+    },
+    "mq_type":{
+        "kafka":"kafka",
+        "rocketMQ":"rocketMQ"
     }
 };

+ 4 - 0
jay-monitor-data-server/src/main/resources/static/js/elab-service-config.js

@@ -5,5 +5,9 @@ var urlConfig = {
         "refreshService": "/backstageRoute/refresh",
         "listService": "/backstageRoute/list/",
         "updateService":"/backstageRoute/update"
+    },
+    "trace":{
+        "mqListService": "/trace/mqList/",
+        "urlListService": "/trace/urlList/"
     }
 }

+ 57 - 0
jay-monitor-data-server/src/main/resources/static/lib/json-viewer/jquery.json-viewer.css

@@ -0,0 +1,57 @@
+/* Root element */
+.json-document {
+  padding: 1em 2em;
+}
+
+/* Syntax highlighting for JSON objects */
+ul.json-dict, ol.json-array {
+  list-style-type: none;
+  margin: 0 0 0 1px;
+  border-left: 1px dotted #ccc;
+  padding-left: 2em;
+}
+.json-string {
+  color: #0B7500;
+}
+.json-literal {
+  color: #1A01CC;
+  font-weight: bold;
+}
+
+/* Toggle button */
+a.json-toggle {
+  position: relative;
+  color: inherit;
+  text-decoration: none;
+}
+a.json-toggle:focus {
+  outline: none;
+}
+a.json-toggle:before {
+  font-size: 1.1em;
+  color: #c0c0c0;
+  content: "\25BC"; /* down arrow */
+  position: absolute;
+  display: inline-block;
+  width: 1em;
+  text-align: center;
+  line-height: 1em;
+  left: -1.2em;
+}
+a.json-toggle:hover:before {
+  color: #aaa;
+}
+a.json-toggle.collapsed:before {
+  /* Use rotated down arrow, prevents right arrow appearing smaller than down arrow in some browsers */
+  transform: rotate(-90deg);
+}
+
+/* Collapsable placeholder links */
+a.json-placeholder {
+  color: #aaa;
+  padding: 0 1em;
+  text-decoration: none;
+}
+a.json-placeholder:hover {
+  text-decoration: underline;
+}

+ 158 - 0
jay-monitor-data-server/src/main/resources/static/lib/json-viewer/jquery.json-viewer.js

@@ -0,0 +1,158 @@
+/**
+ * jQuery json-viewer
+ * @author: Alexandre Bodelot <alexandre.bodelot@gmail.com>
+ * @link: https://github.com/abodelot/jquery.json-viewer
+ */
+(function($) {
+
+  /**
+   * Check if arg is either an array with at least 1 element, or a dict with at least 1 key
+   * @return boolean
+   */
+  function isCollapsable(arg) {
+    return arg instanceof Object && Object.keys(arg).length > 0;
+  }
+
+  /**
+   * Check if a string represents a valid url
+   * @return boolean
+   */
+  function isUrl(string) {
+    var urlRegexp = /^(https?:\/\/|ftps?:\/\/)?([a-z0-9%-]+\.){1,}([a-z0-9-]+)?(:(\d{1,5}))?(\/([a-z0-9\-._~:/?#[\]@!$&'()*+,;=%]+)?)?$/i;
+    return urlRegexp.test(string);
+  }
+
+  /**
+   * Transform a json object into html representation
+   * @return string
+   */
+  function json2html(json, options) {
+    var html = '';
+    if (typeof json === 'string') {
+      // Escape tags and quotes
+      json = json
+        .replace(/&/g, '&amp;')
+        .replace(/</g, '&lt;')
+        .replace(/>/g, '&gt;')
+        .replace(/'/g, '&apos;')
+        .replace(/"/g, '&quot;');
+
+      if (options.withLinks && isUrl(json)) {
+        html += '<a href="' + json + '" class="json-string" target="_blank">' + json + '</a>';
+      } else {
+        // Escape double quotes in the rendered non-URL string.
+        json = json.replace(/&quot;/g, '\\&quot;');
+        html += '<span class="json-string">"' + json + '"</span>';
+      }
+    } else if (typeof json === 'number') {
+      html += '<span class="json-literal">' + json + '</span>';
+    } else if (typeof json === 'boolean') {
+      html += '<span class="json-literal">' + json + '</span>';
+    } else if (json === null) {
+      html += '<span class="json-literal">null</span>';
+    } else if (json instanceof Array) {
+      if (json.length > 0) {
+        html += '[<ol class="json-array">';
+        for (var i = 0; i < json.length; ++i) {
+          html += '<li>';
+          // Add toggle button if item is collapsable
+          if (isCollapsable(json[i])) {
+            html += '<a href class="json-toggle"></a>';
+          }
+          html += json2html(json[i], options);
+          // Add comma if item is not last
+          if (i < json.length - 1) {
+            html += ',';
+          }
+          html += '</li>';
+        }
+        html += '</ol>]';
+      } else {
+        html += '[]';
+      }
+    } else if (typeof json === 'object') {
+      var keyCount = Object.keys(json).length;
+      if (keyCount > 0) {
+        html += '{<ul class="json-dict">';
+        for (var key in json) {
+          if (Object.prototype.hasOwnProperty.call(json, key)) {
+            html += '<li>';
+            var keyRepr = options.withQuotes ?
+              '<span class="json-string">"' + key + '"</span>' : key;
+            // Add toggle button if item is collapsable
+            if (isCollapsable(json[key])) {
+              html += '<a href class="json-toggle">' + keyRepr + '</a>';
+            } else {
+              html += keyRepr;
+            }
+            html += ': ' + json2html(json[key], options);
+            // Add comma if item is not last
+            if (--keyCount > 0) {
+              html += ',';
+            }
+            html += '</li>';
+          }
+        }
+        html += '</ul>}';
+      } else {
+        html += '{}';
+      }
+    }
+    return html;
+  }
+
+  /**
+   * jQuery plugin method
+   * @param json: a javascript object
+   * @param options: an optional options hash
+   */
+  $.fn.jsonViewer = function(json, options) {
+    // Merge user options with default options
+    options = Object.assign({}, {
+      collapsed: false,
+      rootCollapsable: true,
+      withQuotes: false,
+      withLinks: true
+    }, options);
+
+    // jQuery chaining
+    return this.each(function() {
+
+      // Transform to HTML
+      var html = json2html(json, options);
+      if (options.rootCollapsable && isCollapsable(json)) {
+        html = '<a href class="json-toggle"></a>' + html;
+      }
+
+      // Insert HTML in target DOM element
+      $(this).html(html);
+      $(this).addClass('json-document');
+
+      // Bind click on toggle buttons
+      $(this).off('click');
+      $(this).on('click', 'a.json-toggle', function() {
+        var target = $(this).toggleClass('collapsed').siblings('ul.json-dict, ol.json-array');
+        target.toggle();
+        if (target.is(':visible')) {
+          target.siblings('.json-placeholder').remove();
+        } else {
+          var count = target.children('li').length;
+          var placeholder = count + (count > 1 ? ' items' : ' item');
+          target.after('<a href class="json-placeholder">' + placeholder + '</a>');
+        }
+        return false;
+      });
+
+      // Simulate click on toggle button when placeholder is clicked
+      $(this).on('click', 'a.json-placeholder', function() {
+        $(this).siblings('a.json-toggle').click();
+        return false;
+      });
+
+      if (options.collapsed == true) {
+        // Trigger click to collapse all nodes
+        $(this).find('a.json-toggle').click();
+      }
+    });
+  };
+})(jQuery);

二进制
jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.eot


文件差异内容过多而无法显示
+ 82 - 1
jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.svg


二进制
jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.ttf


二进制
jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.woff


二进制
jay-monitor-data-server/src/main/resources/static/lib/layui/font/iconfont.woff2


文件差异内容过多而无法显示
+ 615 - 1
jay-monitor-data-server/src/main/resources/static/lib/layui/lay/modules/laydate.js


+ 200 - 194
jay-monitor-data-server/src/main/resources/templates/index.html

@@ -66,223 +66,229 @@
                             <cite>路由列表</cite>
                         </a>
                     </li>
-                    <li>
-                        <a _href="member-list1.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>会员列表(动态表格)</cite>
-                        </a>
-                    </li>
-                    <li date-refresh="1">
-                        <a _href="member-del.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>会员删除</cite>
+<!--                    <li>-->
+<!--                        <a _href="member-list1.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>会员列表(动态表格)</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li date-refresh="1">-->
+<!--                        <a _href="member-del.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>会员删除</cite>-->
 
-                        </a>
-                    </li>
-                    <li>
-                        <a href="javascript:;">
-                            <i class="iconfont">&#xe70b;</i>
-                            <cite>会员管理</cite>
-                            <i class="iconfont nav_right">&#xe697;</i>
-                        </a>
-                        <ul class="sub-menu">
-                            <li>
-                                <a _href="xxx.html">
-                                    <i class="iconfont">&#xe6a7;</i>
-                                    <cite>会员列表</cite>
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a href="javascript:;">-->
+<!--                            <i class="iconfont">&#xe70b;</i>-->
+<!--                            <cite>会员管理</cite>-->
+<!--                            <i class="iconfont nav_right">&#xe697;</i>-->
+<!--                        </a>-->
+<!--                        <ul class="sub-menu">-->
+<!--                            <li>-->
+<!--                                <a _href="xxx.html">-->
+<!--                                    <i class="iconfont">&#xe6a7;</i>-->
+<!--                                    <cite>会员列表</cite>-->
 
-                                </a>
-                            </li>
-                            <li>
-                                <a _href="xx.html">
-                                    <i class="iconfont">&#xe6a7;</i>
-                                    <cite>会员删除</cite>
+<!--                                </a>-->
+<!--                            </li>-->
+<!--                            <li>-->
+<!--                                <a _href="xx.html">-->
+<!--                                    <i class="iconfont">&#xe6a7;</i>-->
+<!--                                    <cite>会员删除</cite>-->
 
-                                </a>
-                            </li>
-                            <li>
-                                <a _href="xx.html">
-                                    <i class="iconfont">&#xe6a7;</i>
-                                    <cite>等级管理</cite>
+<!--                                </a>-->
+<!--                            </li>-->
+<!--                            <li>-->
+<!--                                <a _href="xx.html">-->
+<!--                                    <i class="iconfont">&#xe6a7;</i>-->
+<!--                                    <cite>等级管理</cite>-->
 
-                                </a>
-                            </li>
+<!--                                </a>-->
+<!--                            </li>-->
 
-                        </ul>
-                    </li>
-                </ul>
-            </li>
-            <li>
-                <a href="javascript:;">
-                    <i class="iconfont">&#xe723;</i>
-                    <cite>订单管理</cite>
-                    <i class="iconfont nav_right">&#xe697;</i>
-                </a>
-                <ul class="sub-menu">
-                    <li>
-                        <a _href="order-list.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>订单列表</cite>
-                        </a>
-                    </li>
-                </ul>
-            </li>
-            <li>
-                <a href="javascript:;">
-                    <i class="iconfont">&#xe723;</i>
-                    <cite>分类管理</cite>
-                    <i class="iconfont nav_right">&#xe697;</i>
-                </a>
-                <ul class="sub-menu">
-                    <li>
-                        <a _href="cate.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>多级分类</cite>
-                        </a>
-                    </li>
+<!--                        </ul>-->
+<!--                    </li>-->
                 </ul>
             </li>
             <li>
                 <a href="javascript:;">
                     <i class="iconfont">&#xe723;</i>
-                    <cite>城市联动</cite>
-                    <i class="iconfont nav_right">&#xe697;</i>
-                </a>
-                <ul class="sub-menu">
-                    <li>
-                        <a _href="city.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>三级地区联动</cite>
-                        </a>
-                    </li>
-                </ul>
-            </li>
-            <li>
-                <a href="javascript:;">
-                    <i class="iconfont">&#xe726;</i>
-                    <cite>管理员管理</cite>
-                    <i class="iconfont nav_right">&#xe697;</i>
-                </a>
-                <ul class="sub-menu">
-                    <li>
-                        <a _href="admin-list.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>管理员列表</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="admin-role.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>角色管理</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="admin-cate.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>权限分类</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="admin-rule.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>权限管理</cite>
-                        </a>
-                    </li>
-                </ul>
-            </li>
-            <li>
-                <a href="javascript:;">
-                    <i class="iconfont">&#xe6ce;</i>
-                    <cite>系统统计</cite>
-                    <i class="iconfont nav_right">&#xe697;</i>
-                </a>
-                <ul class="sub-menu">
-                    <li>
-                        <a _href="echarts1.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>拆线图</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="echarts2.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>柱状图</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="echarts3.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>地图</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="echarts4.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>饼图</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="echarts5.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>雷达图</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="echarts6.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>k线图</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="echarts7.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>热力图</cite>
-                        </a>
-                    </li>
-                    <li>
-                        <a _href="echarts8.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>仪表图</cite>
-                        </a>
-                    </li>
-                </ul>
-            </li>
-            <li>
-                <a href="javascript:;">
-                    <i class="iconfont">&#xe6b4;</i>
-                    <cite>图标字体</cite>
-                    <i class="iconfont nav_right">&#xe697;</i>
-                </a>
-                <ul class="sub-menu">
-                    <li>
-                        <a _href="unicode.html">
-                            <i class="iconfont">&#xe6a7;</i>
-                            <cite>图标对应字体</cite>
-                        </a>
-                    </li>
-                </ul>
-            </li>
-            <li>
-                <a href="javascript:;">
-                    <i class="iconfont">&#xe6b4;</i>
-                    <cite>其它页面</cite>
+                    <cite>数据收集器</cite>
                     <i class="iconfont nav_right">&#xe697;</i>
                 </a>
                 <ul class="sub-menu">
                     <li>
-                        <a href="login.html" target="_blank">
+                        <a _href="/trace/mqList.html">
                             <i class="iconfont">&#xe6a7;</i>
-                            <cite>登录页面</cite>
+                            <cite>消息队列查询</cite>
                         </a>
                     </li>
                     <li>
-                        <a _href="error.html">
+                        <a _href="/trace/urlList.html">
                             <i class="iconfont">&#xe6a7;</i>
-                            <cite>错误页面</cite>
+                            <cite>网关路由查询</cite>
                         </a>
                     </li>
                 </ul>
             </li>
+<!--            <li>-->
+<!--                <a href="javascript:;">-->
+<!--                    <i class="iconfont">&#xe723;</i>-->
+<!--                    <cite>分类管理</cite>-->
+<!--                    <i class="iconfont nav_right">&#xe697;</i>-->
+<!--                </a>-->
+<!--                <ul class="sub-menu">-->
+<!--                    <li>-->
+<!--                        <a _href="cate.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>多级分类</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                </ul>-->
+<!--            </li>-->
+<!--            <li>-->
+<!--                <a href="javascript:;">-->
+<!--                    <i class="iconfont">&#xe723;</i>-->
+<!--                    <cite>城市联动</cite>-->
+<!--                    <i class="iconfont nav_right">&#xe697;</i>-->
+<!--                </a>-->
+<!--                <ul class="sub-menu">-->
+<!--                    <li>-->
+<!--                        <a _href="city.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>三级地区联动</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                </ul>-->
+<!--            </li>-->
+<!--            <li>-->
+<!--                <a href="javascript:;">-->
+<!--                    <i class="iconfont">&#xe726;</i>-->
+<!--                    <cite>管理员管理</cite>-->
+<!--                    <i class="iconfont nav_right">&#xe697;</i>-->
+<!--                </a>-->
+<!--                <ul class="sub-menu">-->
+<!--                    <li>-->
+<!--                        <a _href="admin-list.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>管理员列表</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="admin-role.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>角色管理</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="admin-cate.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>权限分类</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="admin-rule.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>权限管理</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                </ul>-->
+<!--            </li>-->
+<!--            <li>-->
+<!--                <a href="javascript:;">-->
+<!--                    <i class="iconfont">&#xe6ce;</i>-->
+<!--                    <cite>系统统计</cite>-->
+<!--                    <i class="iconfont nav_right">&#xe697;</i>-->
+<!--                </a>-->
+<!--                <ul class="sub-menu">-->
+<!--                    <li>-->
+<!--                        <a _href="echarts1.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>拆线图</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="echarts2.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>柱状图</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="echarts3.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>地图</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="echarts4.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>饼图</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="echarts5.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>雷达图</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="echarts6.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>k线图</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="echarts7.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>热力图</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="echarts8.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>仪表图</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                </ul>-->
+<!--            </li>-->
+<!--            <li>-->
+<!--                <a href="javascript:;">-->
+<!--                    <i class="iconfont">&#xe6b4;</i>-->
+<!--                    <cite>图标字体</cite>-->
+<!--                    <i class="iconfont nav_right">&#xe697;</i>-->
+<!--                </a>-->
+<!--                <ul class="sub-menu">-->
+<!--                    <li>-->
+<!--                        <a _href="unicode.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>图标对应字体</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                </ul>-->
+<!--            </li>-->
+<!--            <li>-->
+<!--                <a href="javascript:;">-->
+<!--                    <i class="iconfont">&#xe6b4;</i>-->
+<!--                    <cite>其它页面</cite>-->
+<!--                    <i class="iconfont nav_right">&#xe697;</i>-->
+<!--                </a>-->
+<!--                <ul class="sub-menu">-->
+<!--                    <li>-->
+<!--                        <a href="login.html" target="_blank">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>登录页面</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                    <li>-->
+<!--                        <a _href="error.html">-->
+<!--                            <i class="iconfont">&#xe6a7;</i>-->
+<!--                            <cite>错误页面</cite>-->
+<!--                        </a>-->
+<!--                    </li>-->
+<!--                </ul>-->
+<!--            </li>-->
         </ul>
     </div>
 </div>

+ 246 - 0
jay-monitor-data-server/src/main/resources/templates/trace/mqList.html

@@ -0,0 +1,246 @@
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout" layout:decorator="~{/base/main}">
+<head>
+    <meta charset="UTF-8"/>
+    <title>链路查找管理</title>
+    <script src="/lib/json-viewer/jquery.json-viewer.js"></script>
+    <link href="/lib/json-viewer/jquery.json-viewer.css" type="text/css" rel="stylesheet">
+</head>
+
+<body>
+<div layout:fragment="content">
+</div>
+<div class="x-nav">
+      <span class="layui-breadcrumb">
+        <a href="">链路查找管理</a>
+        <a>
+          <cite>查询列表</cite></a>
+      </span>
+    <a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right"
+       href="javascript:location.replace(location.href);" title="刷新">
+        <i class="layui-icon" style="line-height:30px">ဂ</i></a>
+</div>
+<div class="x-body">
+    <div class="layui-row">
+        <form class="layui-form layui-col-md12 x-so layui-form-pane">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">日期</label>
+                    <div class="layui-input-block">
+                        <input type="text" required="true" class="layui-input" name="date" id="d_date"
+                               placeholder="yyMMdd">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">项目名称</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="project" id="project" value="">
+                    </div>
+                </div>
+            </div>
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">索引组</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="dataGroupName" id="data_group_name" value="">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">索引键</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="dataGroupKey" id="data_group_key" value="">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">索引编号</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="dataId" id="data_id" >
+                    </div>
+                </div>
+            </div>
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">消息类型</label>
+                    <div class="layui-input-block">
+                        <select name="mqType" id="mq_type">
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">是否有效</label>
+                    <div class="layui-input-block">
+                        <select name="status" id="valid_status">
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-form-item">
+                <div class="layui-col-xs6 layui-col-md12 " style="text-align: center">
+                    <a class="layui-btn" id="q_submit" lay-submit="" lay-filter="submit_from">查询</a>
+                    <button id="q_reset" code="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+            <!--<button class="layui-btn" lay-submit="" lay-filter="submit_from"><i class="layui-icon"></i>增加</button>-->
+        </form>
+    </div>
+    <table class="layui-table" id="list_table" lay-filter="list_table"></table>
+
+    <pre id="json-renderer"></pre>
+
+</div>
+
+<script code="text/html" id="toolbarDemo">
+    // <!-- <div class="layui-btn-container" style="float:right"> <button class="layui-btn layui-btn-sm" lay-event="addData"> 刷新路由</button> </div> -->
+</script>
+<script>
+    layui.use(['laydate', 'layer', 'table', 'form', 'element'], function () {
+        var laydate = layui.laydate, layer = layui.layer, table = layui.table, form = layui.form;
+        var catUrl = '[(${catUrl})]';
+        var listUrl = urlConfig.trace.mqListService;
+        var updateUrl = urlConfig.route.updateHtml;
+        var delUrl = "";
+        var addUrl = urlConfig.route.refreshHtml;
+        var method = "post";
+        var title = "路由列表"
+
+        // 构建数据
+        var dataColumn = [
+            {field: 'id', title: '主键', hide: true, sort: false}
+            ,
+            {
+                field: 'applicationName', title: '应用名称', width: 170
+            }
+            , {
+                field: 'applicationIp', title: '应用服务器地址', width: 80
+            }
+            , {
+                field: 'mqType', title: '消息类型', width: 80, hide: true
+            }
+            , {
+                field: 'invokeType', title: '执行类型', hide: true
+            }
+            , {
+                field: 'topic', title: '主题'
+            }, {
+                field: 'partitionName', title: '分区名称'
+            }, {
+                field: 'msgId', title: '消息编号'
+            }, {
+                field: 'dataGroupName', title: '索引组'
+            }, {
+                field: 'dataGroupKey', title: '索引键'
+            }, {
+                field: 'dataId', title: '索引编号', width: 100
+            }, {
+                field: 'rootLogId', title: '链路顶层编号', hide: true, templet: function (res) {
+                    return '<em><a href="'+catUrl+ res.rootLogId + '"  target="_blank">顶层日志</a></em>'
+                }
+            }, {
+                field: 'parentLogId', title: '链路上级编号', templet: function (res) {
+                    return '<em><a href="'+catUrl + res.parentLogId + '"  target="_blank">上层日志</a></em>'
+                }
+            }, {
+                field: 'logId', title: '链路编号', rowspan: 2, width: 100, templet: function (res) {
+                    return '<em><a href="'+catUrl + res.logId + '" target="_blank">当前日志</a></em>'
+                }
+            }, {
+                field: 'status', title: '是否有效', rowspan: 1, width: 80, templet: function (res) {
+                    return '<em>' + elab_common.getConfigTypeText("common_status", res.status) + '</em>'
+                }
+            }
+            ,
+            {
+                field: 'sourceTime', title: '来源时间', width: 160, templet: function (res) {
+                    return '<em>' + elab_common.longConvertDateTime(res.sourceTime) + '</em>'
+                }
+            }
+            , {
+                field: 'createdTime', title: '创建时间', width: 160, templet: function (res) {
+                    return '<em>' + elab_common.longConvertDateTime(res.createdTime) + '</em>'
+                }
+            }
+            , {fixed: 'right', title: '操作', toolbar: '#barDemo', width: 100}
+        ];
+
+
+        elab_common.layUITableDML(layer, table, title, listUrl, method, dataColumn, updateUrl, delUrl);
+        table.on('tool(list_table)', function (obj) {
+            var event = obj.event;
+            debugger;
+            if ("findDetail" == event) {
+                elab_common.getReq("/api/log/mq?id=" + obj.data.id, null, function (data) {
+                    debugger;
+                    $('#json-renderer').jsonViewer(data, {collapsed: false, withQuotes: true, withLinks: false});
+                    layer.open({
+                        type: 1
+                        , title: false //不显示标题栏
+                        , closeBtn: false
+                        , area: '500px;'
+                        , shade: 0.8
+                        , id: 'LAY_layuipro' //设定一个id,防止重复弹出
+                        , btnAlign: 'c'
+                        , shadeClose: true
+                        , moveType: 1 //拖拽模式,0或者1
+                        , content: $('#json-renderer').show()
+                    });
+                })
+
+            }
+        });
+
+        table.on('rowDouble(list_table)', function (obj) {
+            $('#json-renderer').jsonViewer(obj.data, {collapsed: false, withQuotes: true, withLinks: false});
+            layer.open({
+                type: 1
+                , title: false //不显示标题栏
+                , closeBtn: false
+                , area: '500px;'
+                , shade: 0.8
+                , id: 'LAY_layuipro' //设定一个id,防止重复弹出
+                , btnAlign: 'c'
+                , shadeClose: true
+                , moveType: 1 //拖拽模式,0或者1
+                , content: $('#json-renderer').show()
+            });
+        });
+
+        form.on('submit(submit_from)', function (data) {
+            debugger;
+            //执行重载
+            table.reload('tableList', {
+                page: {
+                    curr: 1 //重新从第 1 页开始
+                }
+                , where: data.field
+
+            });
+            return false;
+        });
+
+        laydate.render({
+            elem: '#d_date'
+            , format: 'yyyy-MM-dd'
+            , isInitValue: true
+            , min: -7
+            , max: 0
+            , value: new Date()
+        });
+
+        init();
+
+        function init() {
+            elab_common.getConfigTypeBySelect("#mq_type", "mq_type", "");
+            elab_common.getConfigTypeBySelect("#valid_status", "common_status", "");
+            form.render('select');
+        }
+
+    });
+
+
+</script>
+<script code="text/html" id="barDemo">
+    <a className="layui-btn layui-btn-xs" lay-event="findDetail"> 消息内容 </a>
+</script>
+</body>
+
+</html>

+ 241 - 0
jay-monitor-data-server/src/main/resources/templates/trace/urlList.html

@@ -0,0 +1,241 @@
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout" layout:decorator="~{/base/main}">
+<head>
+    <meta charset="UTF-8"/>
+    <title>链路查找管理</title>
+    <script src="/lib/json-viewer/jquery.json-viewer.js"></script>
+    <link href="/lib/json-viewer/jquery.json-viewer.css" type="text/css" rel="stylesheet">
+</head>
+
+<body>
+<div layout:fragment="content">
+</div>
+<div class="x-nav">
+      <span class="layui-breadcrumb">
+        <a href="">链路查找管理</a>
+        <a>
+          <cite>查询列表</cite></a>
+      </span>
+    <a class="layui-btn layui-btn-small" style="line-height:1.6em;margin-top:3px;float:right"
+       href="javascript:location.replace(location.href);" title="刷新">
+        <i class="layui-icon" style="line-height:30px">ဂ</i></a>
+</div>
+<div class="x-body">
+    <div class="layui-row">
+        <form class="layui-form layui-col-md12 x-so layui-form-pane">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">日期</label>
+                    <div class="layui-input-block">
+                        <input type="text" required="true" class="layui-input" name="date" id="d_date"
+                               placeholder="yyMMdd">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">项目名称</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="applicationName" id="q_application_name" value="">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">请求路径</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="url" id="q_url" value="">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">用户编号</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="userId" id="q_user_id" value="">
+                    </div>
+                </div>
+            </div>
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">集团编号</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="dataGroupName" id="data_group_name" value="">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">手机号</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="dataGroupKey" id="data_group_key" value="">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">token</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="dataId" id="data_id" value="">
+                    </div>
+                </div>
+            </div>
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">请求时长</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="requestTime" id="request_time" value="">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态码</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="requestTime" id="status" value="">
+                    </div>
+                </div>
+            </div>
+            <div class="layui-form-item">
+                <div class="layui-col-xs6 layui-col-md12 " style="text-align: center">
+                    <a class="layui-btn" id="q_submit" lay-submit="" lay-filter="submit_from">查询</a>
+                    <button id="q_reset" code="reset" class="layui-btn layui-btn-primary">重置</button>
+                </div>
+            </div>
+            <!--<button class="layui-btn" lay-submit="" lay-filter="submit_from"><i class="layui-icon"></i>增加</button>-->
+        </form>
+    </div>
+    <table class="layui-table" id="list_table" lay-filter="list_table"></table>
+
+    <pre id="json-renderer"></pre>
+
+</div>
+
+<script code="text/html" id="toolbarDemo">
+    // <!-- <div class="layui-btn-container" style="float:right"> <button class="layui-btn layui-btn-sm" lay-event="addData"> 刷新路由</button> </div> -->
+</script>
+<script>
+    layui.use(['laydate', 'layer', 'table', 'form', 'element'], function () {
+        var laydate = layui.laydate, layer = layui.layer, table = layui.table, form = layui.form;
+        var catUrl = '[(${catUrl})]';
+        var listUrl = urlConfig.trace.urlListService;
+        var updateUrl = urlConfig.route.updateHtml;
+        var delUrl = "";
+        var addUrl = urlConfig.route.refreshHtml;
+        var method = "post";
+        var title = "路由列表"
+
+        // 构建数据
+        var dataColumn = [
+            {field: 'id', title: '主键', hide: true, sort: false}
+            ,
+            {
+                field: 'applicationName', title: '应用名称'
+            }
+            , {
+                field: 'applicationIp', title: '应用ip'
+            }
+            , {
+                field: 'url', title: '请求路径'
+            }
+            , {
+                field: 'userId', title: '用户编号'
+            }
+            , {
+                field: 'clientIp', title: '客户端ip'
+            }, {
+                field: 'dataGroupName', title: '集团编号'
+            }, {
+                field: 'dataGroupKey', title: '手机号'
+            }, {
+                field: 'dataId', title: 'token'
+            }, {
+                field: 'logId', title: '链路编号', rowspan: 2, width: 100, templet: function (res) {
+                    return '<em><a href="' + catUrl + res.logId + '" target="_blank">当前日志</a></em>'
+                }
+            },
+            {
+                field: 'status', title: '是否有效', rowspan: 1
+            }
+            ,
+            {
+                field: 'requestTime', title: '请求时长',sort: true
+            }
+            , {
+                field: 'createdTime', title: '创建时间', width: 160, templet: function (res) {
+                    return '<em>' + elab_common.longConvertDateTime(res.createdTime) + '</em>'
+                }
+            }
+            , {fixed: 'right', title: '操作', toolbar: '#barDemo', width: 100}
+        ];
+
+
+        elab_common.layUITableDML(layer, table, title, listUrl, method, dataColumn, updateUrl, delUrl);
+        table.on('tool(list_table)', function (obj) {
+            var event = obj.event;
+            debugger;
+            if ("findDetail" == event) {
+                elab_common.getReq("/api/log/url?id=" + obj.data.id, null, function (data) {
+                    debugger;
+                    $('#json-renderer').jsonViewer(data, {collapsed: false, withQuotes: true, withLinks: false});
+                    layer.open({
+                        type: 1
+                        , title: false //不显示标题栏
+                        , closeBtn: false
+                        , area: '500px;'
+                        , shade: 0.8
+                        , id: 'LAY_layuipro' //设定一个id,防止重复弹出
+                        , btnAlign: 'c'
+                        , shadeClose: true
+                        , moveType: 1 //拖拽模式,0或者1
+                        , content: $('#json-renderer').show()
+                    });
+                })
+
+            }
+        });
+
+        table.on('rowDouble(list_table)', function (obj) {
+            $('#json-renderer').jsonViewer(obj.data, {collapsed: false, withQuotes: true, withLinks: false});
+            layer.open({
+                type: 1
+                , title: false //不显示标题栏
+                , closeBtn: false
+                , area: '500px;'
+                , shade: 0.8
+                , id: 'LAY_layuipro' //设定一个id,防止重复弹出
+                , btnAlign: 'c'
+                , shadeClose: true
+                , moveType: 1 //拖拽模式,0或者1
+                , content: $('#json-renderer').show()
+            });
+        });
+
+        form.on('submit(submit_from)', function (data) {
+            debugger;
+            //执行重载
+            table.reload('tableList', {
+                page: {
+                    curr: 1 //重新从第 1 页开始
+                }
+                , where: data.field
+
+            });
+            return false;
+        });
+
+        laydate.render({
+            elem: '#d_date'
+            , format: 'yyyy-MM-dd'
+            , isInitValue: true
+            , min: -7
+            , max: 0
+            , value: new Date()
+        });
+
+        init();
+
+        function init() {
+            // elab_common.getConfigTypeBySelect("#mq_type", "mq_type", "");
+            // elab_common.getConfigTypeBySelect("#valid_status", "common_status", "");
+            form.render('select');
+        }
+
+    });
+
+
+</script>
+<script code="text/html" id="barDemo">
+    <a className="layui-btn layui-btn-xs" lay-event="findDetail"> 消息内容 </a>
+</script>
+</body>
+
+</html>

+ 1 - 1
pom.xml

@@ -7,7 +7,7 @@
     <groupId>com.jay.monitor.data</groupId>
     <artifactId>jay-monitor-data-web</artifactId>
     <packaging>pom</packaging>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.1-SNAPSHOT</version>
 
     <parent>
         <groupId>org.springframework.boot</groupId>