浏览代码

camel ssl 支持测试-冲突解决

huangzhiyong 7 年之前
父节点
当前提交
d8a816ee4e
共有 45 个文件被更改,包括 782 次插入1347 次删除
  1. 39 2
      README.md
  2. 18 9
      hos-broker/pom.xml
  3. 3 4
      hos-broker/src/main/java/com/yihu/hos/broker/HosBrokerApplication.java
  4. 0 40
      hos-broker/src/main/java/com/yihu/hos/broker/common/camelrouter/CrawlerMongoRouter.java
  5. 16 0
      hos-broker/src/main/java/com/yihu/hos/broker/common/camelrouter/MonitorRouterBulider.java
  6. 8 12
      hos-broker/src/main/java/com/yihu/hos/broker/common/constants/MonitorConstant.java
  7. 0 41
      hos-broker/src/main/java/com/yihu/hos/broker/common/processor/AddMongoProcessor.java
  8. 0 59
      hos-broker/src/main/java/com/yihu/hos/broker/common/scheduler/MonitorScheduler.java
  9. 0 31
      hos-broker/src/main/java/com/yihu/hos/broker/configurations/GatewayConfiguration.java
  10. 1 0
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBCamelController.java
  11. 2 2
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBMycatlController.java
  12. 1 0
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBShellController.java
  13. 0 66
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/GatewayController.java
  14. 0 37
      hos-broker/src/main/java/com/yihu/hos/broker/models/GatewayRequestResult.java
  15. 0 86
      hos-broker/src/main/java/com/yihu/hos/broker/models/GatewayResponseResult.java
  16. 0 25
      hos-broker/src/main/java/com/yihu/hos/broker/services/CenterMongoService.java
  17. 0 96
      hos-broker/src/main/java/com/yihu/hos/broker/services/GatewayService.java
  18. 3 6
      hos-broker/src/main/java/com/yihu/hos/broker/services/ServerMonitorService.java
  19. 0 397
      hos-broker/src/main/java/com/yihu/hos/broker/services/ServiceMonitorService.java
  20. 1 6
      hos-broker/src/main/resources/application.yml
  21. 3 3
      hos-broker/src/main/resources/logback-spring.xml
  22. 17 0
      hos-camel2/pom.xml
  23. 5 2
      hos-camel2/src/main/java/camel/HosCamelApplication.java
  24. 29 17
      hos-camel2/src/main/java/camel/central/gateway/processor/GatewayProcessor.java
  25. 52 0
      hos-camel2/src/main/java/camel/monitor/processor/LogOffset.java
  26. 140 0
      hos-camel2/src/main/java/camel/monitor/processor/ServiceMonitorService.java
  27. 16 0
      hos-camel2/src/main/java/camel/monitor/route/MonitorRouterBulider.java
  28. 32 0
      hos-camel2/src/main/java/camel/terminal/tenant/processor/AddMongoProcessor.java
  29. 1 1
      hos-broker/src/main/java/com/yihu/hos/broker/common/processor/CrawlerMongoProcessor.java
  30. 39 0
      hos-camel2/src/main/java/camel/terminal/tenant/route/CrawlerMongoRouter.java
  31. 5 5
      hos-camel2/src/main/resources/application.yml
  32. 0 1
      hos-logger/src/main/java/com/yihu/hos/logger/camel/processor/EHRLogProcesser.java
  33. 7 0
      hos-logger/src/main/java/com/yihu/hos/logger/configuration/LoggerConfiguration.java
  34. 13 0
      hos-logger/src/main/java/com/yihu/hos/logger/model/HosLog.java
  35. 5 3
      hos-logger/src/main/java/com/yihu/hos/logger/service/HosLogService.java
  36. 1 0
      hos-logger/src/main/resources/application.yml
  37. 0 8
      hos-parent/pom.xml
  38. 23 14
      src/main/java/com/yihu/hos/monitor/controller/ServiceMonitorController.java
  39. 1 1
      src/main/java/com/yihu/hos/monitor/dao/ServiceMonitorDao.java
  40. 27 106
      src/main/java/com/yihu/hos/monitor/service/ServiceMonitorService.java
  41. 1 2
      src/main/webapp/WEB-INF/ehr/commons/jsp/commonFoot.jsp
  42. 0 74
      src/main/webapp/WEB-INF/ehr/jsp/monitor/monitor.jsp
  43. 83 23
      src/main/webapp/WEB-INF/ehr/jsp/monitor/service/sEnvManage.jsp
  44. 164 168
      src/main/webapp/WEB-INF/ehr/jsp/monitor/service/sEnvManageJs.jsp
  45. 26 0
      src/main/webapp/develop/lib/module/dateExt.js

+ 39 - 2
README.md

@ -1,3 +1,40 @@
# eip
# 简介
信息共享交换平台(CoSharp)是一个面向医疗服务的智能化集成开发平台,定位于实现和推动医疗机构内外异构系统间的数据和服务信息共享与交换,实现网内外系统的互联互通。
信息共享交换平台通过提供标准转换和各语言开发相关SDK或语言无关的API来规范开发流程,解耦应用间的依赖,降低系统的集成的难度,缩短时间周期和减少成本。
# 项目结构
[代码位置](http://192.168.1.220:10080/Cosharp/eip)
模块| 说明
---|---
hos-parent | 依赖Jar版本管理
hos-core | 通用组件
hos-web-framework | 业务相关通用组件
hos-logger | 日志服务组件等
hos-dfs | 基于Mongo GirdFS的简易文件服务器
hos-arbiter | 服务协调组件
hos-broker | 服务运行组件
hos-admin | 控制管理 
hos-central-rest | 内置服务
hos-rest | 内置服务
hos-camel2| 服务编排实现模块
hos-docker | Docker化模块
sdk | 开发包
## 注意事项
通过dependencyManagement方式管理引入工程中类库及版本,其他模块只指定依赖,不设置版本号。以保证统一。
# 系统结构
系统 | 组成模块(只列可运行模块)
---|---
中心控制系统 | hos-admin,hos-dfs
中心交换系统 | hos-logger,hos-arbiter,hos-broker,hos-rest
前置一体机 | hos-logger,hos-arbiter,hos-broker,hos-rest
# 代码规范
具体内容参见本目录下的[Specification/Java代码规范.md](https://note.youdao.com/share/?token=48E8E5A8A08A44DA96BB8FDCB9390678&gid=35423570)
# 开发过程
开发过程中,如果工程最终是要通过tomcat容器进行部署的话;在功能模块完成后最好能够在在idea中使用集成的外置tomcat容器运行测试下,如此可以模拟生产环境的运行状态;
信息共享交换平台(CoSharp)是一个面向医疗服务的智能化集成开发平台,定位于实现和推动医疗机构内外异构系统间的数据和服务信息共享与交换,实现网内外系统的互联互通。信息共享交换平台通过提供标准转换和各语言开发相关SDK或语言无关的API来规范开发流程,解耦应用间的依赖,降低系统的集成的难度,缩短时间周期和减少成本

+ 18 - 9
hos-broker/pom.xml

@ -16,12 +16,25 @@
    <name>hos-broker</name>
    <description>ESB服务运行模块</description>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-netflix</artifactId>
                <version>1.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- spring-boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
@ -34,7 +47,6 @@
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
@ -52,10 +64,10 @@
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <!--<dependency>-->
        <!--<groupId>org.springframework.cloud</groupId>-->
        <!--<artifactId>spring-cloud-starter-eureka</artifactId>-->
        <!--</dependency>-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- sigar -->
        <dependency>
@ -122,11 +134,8 @@
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-restlet</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- camel end -->
        <dependency>
            <groupId>com.yihu.hos</groupId>
            <artifactId>hos-core</artifactId>

+ 3 - 4
hos-broker/src/main/java/com/yihu/hos/broker/HosBrokerApplication.java

@ -19,6 +19,7 @@ import java.util.concurrent.Executors;
@EnableScheduling
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableAsync
//@EnableEurekaClient
public class HosBrokerApplication extends SpringBootServletInitializer implements CommandLineRunner {
    @Autowired
    private GridFsOperations operations;
@ -27,8 +28,7 @@ public class HosBrokerApplication extends SpringBootServletInitializer implement
    private ExecutorService executorService = Executors.newSingleThreadExecutor();
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(HosBrokerApplication.class);
        app.run(args);
        SpringApplication.run(HosBrokerApplication.class, args);
    }
    @Override
@ -49,7 +49,6 @@ public class HosBrokerApplication extends SpringBootServletInitializer implement
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        builder.sources(this.getClass());
        return super.configure(builder);
        return builder.sources(HosBrokerApplication.class);
    }
}

+ 0 - 40
hos-broker/src/main/java/com/yihu/hos/broker/common/camelrouter/CrawlerMongoRouter.java

@ -1,40 +0,0 @@
package com.yihu.hos.broker.common.camelrouter;
import com.yihu.hos.broker.common.processor.CrawlerMongoProcessor;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class CrawlerMongoRouter extends RouteBuilder {
    @Override
    public void configure() throws Exception {
//        from("quartz://myGroup/myTimerName?cron=0 0/1 * * * ? ")
//            .process(new CrawlerMongoProcessor())
//                .to("stream:out");
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=runtime&collection=arbiterServer&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("runtime", "arbiterServer"))
//            .to("bean:centerMongoService?method=save")
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=runtime&collection=brokerServer&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("runtime", "brokerServer"))
//            .to("bean:centerMongoService?method=save")
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=runtime&collection=endpoint&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("runtime", "endpoint"))
//            .to("bean:centerMongoService?method=save")
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=log&collection=server&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("log", "server"))
//            .to("bean:centerMongoService?method=save")
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=log&collection=service&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("log", "service"))
//            .to("bean:centerMongoService?method=save");
    }
}

+ 16 - 0
hos-broker/src/main/java/com/yihu/hos/broker/common/camelrouter/MonitorRouterBulider.java

@ -0,0 +1,16 @@
package com.yihu.hos.broker.common.camelrouter;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
/**
 * Created by l4qiang on 2017-06-16.
 */
@Component
public class MonitorRouterBulider extends RouteBuilder {
    @Override
    public void configure() throws Exception {
//        from("quartz://monitor/monitorTimer?cron=0 0/1 * * * ?")
//                .to("bean:serverMonitorService?method=collectEnvHealth");
    }
}

+ 8 - 12
hos-broker/src/main/java/com/yihu/hos/broker/common/constants/MonitorConstant.java

@ -5,17 +5,13 @@ package com.yihu.hos.broker.common.constants;
 * @vsrsion 1.0
 * Created at 2016/11/3.
 */
public class MonitorConstant {
    public static String MONITOR_DATABASE = "log";
    public static String SERVER = "server";
    public static String SERVICE = "service";
    public static String BUSSINESS_LOG = "businessLog";
    public static String HOST = "host";     //这个是否需要,可以在runtime库中使用brokerServer?
    public static String CPU = "cpu";
    public static String FILES = "files";
    public static String MEMORY = "memory";
    public static String NET = "net";
public interface MonitorConstant {
    String DATABASE = "log";
    String SERVER = "server";
    String HOST = "host";     //这个是否需要,可以在runtime库中使用brokerServer?
    String CPU = "cpu";
    String FILES = "files";
    String MEMORY = "memory";
    String NET = "net";
}

+ 0 - 41
hos-broker/src/main/java/com/yihu/hos/broker/common/processor/AddMongoProcessor.java

@ -1,41 +0,0 @@
package com.yihu.hos.broker.common.processor;
import com.mongodb.BasicDBObject;
import com.mongodb.QueryOperators;
import com.yihu.hos.core.datatype.DateUtil;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.bson.types.ObjectId;
import org.json.JSONArray;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by Zdm on 2016/7/13.
 */
public class AddMongoProcessor implements Processor {
    private String database;
    private String collection;
    public AddMongoProcessor(String database, String collection) {
        this.database = database;
        this.collection = collection;
    }
    @Override
    public void process(Exchange exchange) throws Exception {
        Map record = exchange.getIn().getBody(Map.class);
        Map info = new HashMap();
        info.put("database", database);
        info.put("collection", collection);
        ObjectId objectId = (ObjectId) record.get("_id");
        record.put("_id", objectId.toString());
        JSONArray jsonArray = new JSONArray();
        jsonArray.put(info);
        jsonArray.put(record);
        exchange.getIn().setBody(jsonArray);
    }
}

+ 0 - 59
hos-broker/src/main/java/com/yihu/hos/broker/common/scheduler/MonitorScheduler.java

@ -1,59 +0,0 @@
package com.yihu.hos.broker.common.scheduler;
import com.yihu.hos.broker.services.ServerMonitorService;
import com.yihu.hos.broker.services.ServiceMonitorService;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * 服务器性能数据采集定时器
 *
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/10/11.
 */
@Component
public class MonitorScheduler {
    static private final Logger logger = LoggerFactory.getLogger(MonitorScheduler.class);
    @Resource(name = ServiceMonitorService.BEAN_ID)
    private ServiceMonitorService serviceMonitorService;
    @Resource(name = ServerMonitorService.BEAN_ID)
    private ServerMonitorService serverMonitorService;
    @Scheduled(cron = "0 0/1 * * * ?") //每分钟执行一次
    public void statusCheck() {
        logger.debug("每分钟执行一次。开始============================================");
        //TODO 采集服务器健康监控指标数据 statusTask.healthCheck();
        collectEnvHealth();
        collectServiceHealth();
        logger.info("每分钟执行一次。结束。");
    }
    /**
     * 服务器健康指标采集
     *
     * @return
     */
    public void collectEnvHealth() {
        serverMonitorService.collectEnvHealth();
    }
    public void collectServiceHealth() {
        serviceMonitorService.collectServiceHealth();
    }
    /**
     * 服务器列表保存
     */
//    @Scheduled(cron = "0 0 12 * * ?") //每天中午12点触发
    @Scheduled(fixedDelay = 3600 * 24 * 1000, initialDelay = 3000) //每天中午12点触发
    public void checkHost() {
        serverMonitorService.checkHost();
    }
}

+ 0 - 31
hos-broker/src/main/java/com/yihu/hos/broker/configurations/GatewayConfiguration.java

@ -1,31 +0,0 @@
package com.yihu.hos.broker.configurations;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
/**
 * @created Airhead 2016/8/4.
 */
@Configuration
public class GatewayConfiguration {
    @Value("${spring.gateway.ip}")
    private String ip;
    @Value("${spring.gateway.port}")
    private String port;
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getPort() {
        return port;
    }
    public void setPort(String port) {
        this.port = port;
    }
}

+ 1 - 0
hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBCamelController.java

@ -14,6 +14,7 @@ import java.util.List;
import java.util.Map;
/**
 * 流程管理
 * Created by lingfeng on 2016/8/4.
 */
@RestController

+ 2 - 2
hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBMycatlController.java

@ -11,15 +11,15 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
 * MyCat管理
 * Created by lingfeng on 2016/8/4.
 */
@RestController
@RequestMapping("/esb")
public class ESBMycatlController {
public class ESBMycatController {
    @Autowired
    private MycatConfigService mycatService;
    @RequestMapping(value = "/serviceMycat/update", produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
    @ApiOperation(value = "修改mycat", produces = "application/json", notes = "修改mycat的配置文件,并重新加载配置")
    public Result updateMycat(

+ 1 - 0
hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBShellController.java

@ -14,6 +14,7 @@ import javax.annotation.Resource;
/**
 * @author HZY
 * @vsrsion 1.0
 * SSH命令控制
 * Created at 2017/1/6.
 */
@RestController

+ 0 - 66
hos-broker/src/main/java/com/yihu/hos/broker/controllers/GatewayController.java

@ -1,66 +0,0 @@
package com.yihu.hos.broker.controllers;
import com.yihu.hos.core.constants.ExceptionConstant;
import com.yihu.hos.core.exception.ESBException;
import com.yihu.hos.broker.models.GatewayRequestResult;
import com.yihu.hos.broker.models.GatewayResponseResult;
import com.yihu.hos.broker.services.GatewayService;
import io.swagger.annotations.ApiParam;
import net.sf.json.JSONObject;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.Writer;
@RestController
@RequestMapping("/esb")
public class GatewayController {
    private final GatewayService gatewayService;
    @Autowired
    public GatewayController(GatewayService gatewayService) {
        this.gatewayService = gatewayService;
    }
    @RequestMapping(value = "/camel.central.gateway", method = RequestMethod.POST)
    public void transfer(HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("application/json;charset=UTF-8");
        Writer writer = response.getWriter();
        response.setCharacterEncoding("UTF-8");
        String returnString;
        String resultData;
        GatewayRequestResult gatewayRequestResult = new GatewayRequestResult();
        try {
            BeanUtils.populate(gatewayRequestResult, request.getParameterMap());
            //---end
            gatewayService.paramsIsNotNull(gatewayRequestResult.getApi());
            resultData = gatewayService.getResultData(gatewayRequestResult);
            returnString = resultData;
        } catch (Exception e) {
            e.printStackTrace();
            if (e instanceof ESBException) {
                ESBException esbException = (ESBException) e;
                returnString = JSONObject.fromObject(GatewayResponseResult.getError(esbException.getExceptionCode(), esbException.getExceptionMessage())).toString();
            } else {
                returnString = JSONObject.fromObject(GatewayResponseResult.getError(ExceptionConstant.EHREXCEPTION_SYSTEMEXCEPTION, ExceptionConstant.EHREXCEPTION_SYSTEMEXCEPTION_MESSAGE)).toString();
            }
        }
        writer.write(returnString);
        writer.flush();
        writer.close();
    }
    @RequestMapping(value = "/webservice/host", method = RequestMethod.GET)
    public String wsHost(
            @ApiParam(name = "serviceName", value = "微服务名", required = true)
            @RequestParam String serviceName) throws Exception {
        String uri = gatewayService.serviceUrl(serviceName);
        return uri;
    }
}

+ 0 - 37
hos-broker/src/main/java/com/yihu/hos/broker/models/GatewayRequestResult.java

@ -1,37 +0,0 @@
package com.yihu.hos.broker.models;
import java.io.Serializable;
/**
 * Created by chenweida on 2016/1/27.
 */
public class GatewayRequestResult implements Serializable {
    private String api;
    private String param;
    //---end
    public String getApi() {
        return api;
    }
    public void setApi(String api) {
        this.api = api;
    }
    public String getParam() {
        return param;
    }
    public void setParam(String param) {
        this.param = param;
    }
    @Override
    public String toString() {
        return "{" +
                "api:'" + api + '\'' +
                ", param:'" + param + '\'' +
                '}';
    }
}

+ 0 - 86
hos-broker/src/main/java/com/yihu/hos/broker/models/GatewayResponseResult.java

@ -1,86 +0,0 @@
package com.yihu.hos.broker.models;
import com.yihu.hos.core.constants.ExceptionConstant;
import java.io.Serializable;
/**
 * Created by chenweida on 2016/1/27.
 */
public class GatewayResponseResult implements Serializable {
    private String responseCode = ExceptionConstant.EHREXCEPTION_SUCCESS;
    private String responseMessage = "";
    private String responseParams;
    private String requestId;
    private Object responseResult;
    public String getResponseCode() {
        return responseCode;
    }
    public void setResponseCode(String responseCode) {
        this.responseCode = responseCode;
    }
    public String getResponseMessage() {
        return responseMessage;
    }
    public void setResponseMessage(String responseMessage) {
        this.responseMessage = responseMessage;
    }
    public String getResponseParams() {
        return responseParams;
    }
    public void setResponseParams(String responseParams) {
        this.responseParams = responseParams;
    }
    public String getRequestId() {
        return requestId;
    }
    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }
    public static GatewayResponseResult getSuccess(String responseParams, String requestId) {
        GatewayResponseResult responseModel = new GatewayResponseResult();
        responseModel.setRequestId(requestId);
        responseModel.setResponseParams(responseParams);
        return responseModel;
    }
    public static GatewayResponseResult getSuccess(String responseParams) {
        GatewayResponseResult responseModel = new GatewayResponseResult();
        responseModel.setResponseParams(responseParams);
        return responseModel;
    }
    public static GatewayResponseResult getError(String respCode, String respMessage) {
        GatewayResponseResult responseModel = new GatewayResponseResult();
        responseModel.setResponseCode(respCode);
        responseModel.setResponseMessage(respMessage);
        return responseModel;
    }
    @Override
    public String toString() {
        return "{" +
                "responseCode:'" + responseCode + '\'' +
                ", responseMessage:'" + responseMessage + '\'' +
                ", responseParams:'" + responseParams + '\'' +
                ", requestId:'" + requestId + '\'' +
                '}';
    }
    public Object getResponseResult() {
        return responseResult;
    }
    public void setResponseResult(Object responseResult) {
        this.responseResult = responseResult;
    }
}

+ 0 - 25
hos-broker/src/main/java/com/yihu/hos/broker/services/CenterMongoService.java

@ -1,25 +0,0 @@
package com.yihu.hos.broker.services;
import com.yihu.hos.core.http.HttpClientKit;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component("centerMongoService")
public class CenterMongoService {
    private static final Logger logger = LoggerFactory.getLogger(CenterMongoService.class);
    @Value("${hos.rest.url}")
    private String url;
    public void save(String msg) {
        Map<String, String> params = new HashMap<>();
        params.put("msg", msg);
        String returnData = HttpClientKit.post(url + "/metric/saveToMongo", params).getBody();
        System.out.println(returnData);
    }
}

+ 0 - 96
hos-broker/src/main/java/com/yihu/hos/broker/services/GatewayService.java

@ -1,96 +0,0 @@
package com.yihu.hos.broker.services;
import com.yihu.hos.broker.configurations.GatewayConfiguration;
import com.yihu.hos.core.constants.CoreConstant;
import com.yihu.hos.core.constants.ExceptionConstant;
import com.yihu.hos.core.exception.ESBException;
import com.yihu.hos.core.http.HttpClientKit;
import com.yihu.hos.broker.models.GatewayRequestResult;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
 * @author chenweida on 2016/1/27.
 */
@Service
public class GatewayService {
    private final GatewayConfiguration gatewayConfiguration;
    @Autowired
    public GatewayService(GatewayConfiguration gatewayConfiguration) {
        this.gatewayConfiguration = gatewayConfiguration;
    }
    @Autowired
    private DiscoveryClient discoveryClient;
    /**
     * 通过服务名获取微服务地址
     *
     * @param serviceName 微服务名
     * @return
     */
    public String serviceUrl(String serviceName) {
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
        if (instances != null && !instances.isEmpty()) {
            int index = (int) (Math.random() * instances.size());//随机获取其中一个服务
            ServiceInstance serviceInstance = instances.get(index);
            return serviceInstance.getUri().toString();
        } else {
            return null;
        }
    }
    public String getResultData(GatewayRequestResult gatewayRequestResult) throws ESBException {
        String returnData;
        //拼凑出URL
        String url = getUrl(gatewayConfiguration.getIp(), gatewayConfiguration.getPort(), gatewayRequestResult.getApi());
        try {
            Map<String, String> params = getParams(gatewayRequestResult.getParam());
            returnData = HttpClientKit.post(url, params).getBody();
            System.out.print(returnData);
        } catch (Exception e) {
            throw new ESBException(ExceptionConstant.EHREXCEPTION_SYSTEM_TRANSFER, ExceptionConstant.EHREXCEPTION_SYSTEM_TRANSFER_MESSAGE);
        }
        return returnData;
    }
    public void paramsIsNotNull(Object params) throws ESBException {
        if (StringUtils.isEmpty(params)) {
            throw new ESBException(ExceptionConstant.EHREXCEPTION_BUSINESS_PARAMS_EXCEPTION, ExceptionConstant.EHREXCEPTION_BUSINESS_PARAMS_EXCEPTION_MESSAGE);
        }
    }
    private String getUrl(String ip, String port, String api) {
        String url = CoreConstant.HTTP + CoreConstant.COLON + CoreConstant.BACKSLASH +
                CoreConstant.BACKSLASH + ip + CoreConstant.COLON + port +
                CoreConstant.BACKSLASH + api;
        return url;
    }
    private Map<String, String> getParams(String jsonParam) {
        JSONObject object = JSONObject.fromObject(jsonParam);
        Map<String, String> params = new HashMap<>();
        Iterator<?> keys = object.keys();
        while (keys.hasNext()) {
            String key = (String) keys.next();
            String value = object.getString(key);
            params.put(key, value);
        }
        return params;
    }
}

+ 3 - 6
hos-broker/src/main/java/com/yihu/hos/broker/services/ServerMonitorService.java

@ -10,13 +10,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service("ServerMonitorService")
@Service("serverMonitorService")
public class ServerMonitorService {
    public static final String BEAN_ID = "ServerMonitorService";
    @Value("${hos.tenant.name}")
    private String tenant;
    private static String host = SigarUtil.getHost();
@ -31,7 +28,7 @@ public class ServerMonitorService {
    public void collectEnvHealth() {
        try {
            BasicDBObject result = new BasicDBObject();
            DBCollection terminal = mongo.getDB(MonitorConstant.MONITOR_DATABASE).getCollection(MonitorConstant.SERVER);
            DBCollection terminal = mongo.getDB(MonitorConstant.DATABASE).getCollection(MonitorConstant.SERVER);
            result.put("tenant", tenant);
            result.put("create_date", DateUtil.getCurrentString(DateUtil.DEFAULT_YMDHMSDATE_FORMAT));
            result.put("create_time", DateUtil.getSysDateTime());
@ -68,7 +65,7 @@ public class ServerMonitorService {
    }
    public void checkHost() {
        DBCollection terminal = mongo.getDB(MonitorConstant.MONITOR_DATABASE).getCollection(MonitorConstant.HOST);
        DBCollection terminal = mongo.getDB(MonitorConstant.DATABASE).getCollection(MonitorConstant.HOST);
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{

+ 0 - 397
hos-broker/src/main/java/com/yihu/hos/broker/services/ServiceMonitorService.java

@ -1,397 +0,0 @@
package com.yihu.hos.broker.services;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mongodb.*;
import com.yihu.hos.broker.common.constants.MonitorConstant;
import com.yihu.hos.broker.daos.BrokerDao;
import com.yihu.hos.core.datatype.DateUtil;
import com.yihu.hos.core.datatype.NumberUtil;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.web.framework.model.bo.Endpoint;
import com.yihu.hos.web.framework.model.bo.ServiceFlow;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
/**
 * Created by chenweida on 2016/1/27.
 */
@Service("ServiceMonitorService")
public class ServiceMonitorService {
    public static final String BEAN_ID = "ServiceMonitorService";
    @Value("${hos.tenant.name}")
    private String tenant;
    @Autowired
    private Mongo mongo;
    @Autowired
    private BrokerDao brokerDao;
    private DBCollection businessLog;
    public DBCollection getBusinessLog() {
        if (businessLog == null) {
            businessLog = mongo.getDB(MonitorConstant.MONITOR_DATABASE).getCollection(MonitorConstant.BUSSINESS_LOG);
        }
        return businessLog;
    }
    public void collectServiceHealth() {
        try {
            Date now = new Date();
            Date beforeDate = new Date(now.getTime() - 60000);
            String beginTime = DateUtil.toString(beforeDate, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
            String endTime = DateUtil.toString(now, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
            List<ServiceFlow> flowList = brokerDao.getServiceFlowList();
            List<Endpoint> endpointList = brokerDao.getEndPointList();
            List<String> codeList = new ArrayList<>();
            for (ServiceFlow systemServiceFlow : flowList) {
                codeList.add(systemServiceFlow.getRouteCode());
            }
            for (Endpoint systemServiceEndpoint : endpointList) {
                codeList.add(systemServiceEndpoint.getCode());
            }
            bandwidth(beginTime, endTime, codeList);
            qps(beginTime, endTime, codeList);
            delay(beginTime, endTime, codeList);
            usage(beginTime, endTime, codeList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void bandwidth(String beginTime, String endTime, List<String> codeList) {
        DBObject match = getMatchFields(beginTime, endTime);
        DBObject flowGroup = getFlowGroupFields();
        DBObject sort = getSortFields();
        DBObject serviceGroup = getServiceGroupFields();
        // run aggregation
        AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
        //流程带宽
        Map<String, Integer> bandwidthMapF = new HashMap<>();
        for (DBObject dbObject : flowOutput.results()) {
            Integer count = Integer.parseInt(StringUtil.toString(dbObject.get("count")));
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("routeId"));
            Integer bodyLength = Integer.parseInt(StringUtil.toString(dbObject.get("bodyLength")));
            if (bandwidthMapF.containsKey(code)) {
                bodyLength = bodyLength + bandwidthMapF.get(code);
                bandwidthMapF.put(code, bodyLength);
            } else {
                bandwidthMapF.put(code, bodyLength);
            }
        }
        //服务带宽
        // run aggregation
        AggregationOutput serviceOutput = getBusinessLog().aggregate(match, serviceGroup, sort);
        Map<String, Integer> bandwidthMapS = new HashMap<>();
        for (DBObject dbObject : serviceOutput.results()) {
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("code"));
            Integer bodyLength = Integer.parseInt(StringUtil.toString(dbObject.get("bodyLength")));
            if (bandwidthMapS.containsKey(code)) {
                bodyLength = bodyLength + bandwidthMapS.get(code);
                bandwidthMapS.put(code, bodyLength);
            } else {
                bandwidthMapS.put(code, bodyLength);
            }
        }
        for (String code : codeList) {
            BigDecimal bandwidth = BigDecimal.ZERO;
            long interval = getInterval(beginTime, endTime);
            if (!StringUtil.isEmpty(bandwidthMapF.get(code))) {
                Integer flowCalls = bandwidthMapF.get(code);
                bandwidth = NumberUtil.divideBigDecimal(BigDecimal.valueOf(flowCalls), BigDecimal.valueOf(interval));
            } else if (!StringUtil.isEmpty(bandwidthMapS.get(code))) {
                Integer serviceCalls = bandwidthMapS.get(code) / 2;
                bandwidth = NumberUtil.divideBigDecimal(BigDecimal.valueOf(serviceCalls), BigDecimal.valueOf(interval));
            }
            saveServiceMetrics(code, "bandwidth", bandwidth.toString(), endTime);
        }
    }
    public void qps(String beginTime, String endTime, List<String> codeList) {
        DBObject match = getMatchFields(beginTime, endTime);
        DBObject flowGroup = getFlowGroupFields();
        DBObject sort = getSortFields();
        DBObject serviceGroup = getServiceGroupFields();
        // run aggregation
        AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
        //流程qps
        Map<String, Integer> qpsMapF = new HashMap<>();
        for (DBObject dbObject : flowOutput.results()) {
            Integer count = Integer.parseInt(StringUtil.toString(dbObject.get("count")));
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("routeId"));
            Integer total = Integer.parseInt(StringUtil.toString(dbObject.get("total")));
            if (total == count / 2) {
                if (qpsMapF.containsKey(code)) {
                    Integer flowCalls = qpsMapF.get(code);
                    qpsMapF.put(code, ++flowCalls);
                } else {
                    qpsMapF.put(code, 1);
                }
            }
        }
        //服务带宽
        // run aggregation
        AggregationOutput serviceOutput = getBusinessLog().aggregate(match, serviceGroup, sort);
        Map<String, Integer> qpsMapS = new HashMap<>();
        for (DBObject dbObject : serviceOutput.results()) {
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("code"));
            if (qpsMapS.containsKey(code)) {
                Integer serviceCalls = qpsMapS.get(code);
                qpsMapS.put(code, ++serviceCalls);
            } else {
                qpsMapS.put(code, 1);
            }
        }
        for (String code : codeList) {
            BigDecimal qps = BigDecimal.ZERO;
            long interval = getInterval(beginTime, endTime);
            if (!StringUtil.isEmpty(qpsMapF.get(code))) {
                Integer flowCalls = qpsMapF.get(code);
                qps = NumberUtil.divideBigDecimal(BigDecimal.valueOf(flowCalls), BigDecimal.valueOf(interval));
            } else if (!StringUtil.isEmpty(qpsMapS.get(code))) {
                Integer serviceCalls = qpsMapS.get(code) / 2;
                qps = NumberUtil.divideBigDecimal(BigDecimal.valueOf(serviceCalls), BigDecimal.valueOf(interval));
            }
            saveServiceMetrics(code, "qps", qps.toString(), endTime);
        }
    }
    public void usage(String beginTime, String endTime, List<String> codeList) throws JsonProcessingException {
        DBObject match = getMatchFields(beginTime, endTime);
        DBObject flowGroup = getFlowGroupFields();
        DBObject sort = getSortFields();
        // run aggregation
        AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
        Map<String, Integer> usageMapSuccessF = new HashMap<>();
        Map<String, Integer> usageMapFailF = new HashMap<>();
        for (DBObject dbObject : flowOutput.results()) {
            Integer total = Integer.parseInt(StringUtil.toString(dbObject.get("total")));
            Integer count = Integer.parseInt(StringUtil.toString(dbObject.get("count")));
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("routeId"));
            if (total == count / 2) {
                if (usageMapSuccessF.containsKey(code)) {
                    Integer countTemp = usageMapSuccessF.get(code);
                    usageMapSuccessF.put(code, ++countTemp);
                } else {
                    usageMapSuccessF.put(code, 1);
                }
            } else {
                if (usageMapFailF.containsKey(code)) {
                    Integer countTemp = usageMapFailF.get(code);
                    usageMapFailF.put(code, ++countTemp);
                } else {
                    usageMapFailF.put(code, 1);
                }
            }
        }
        DBCursor serviceOutput = getBusinessLog().find(getQueryObject(beginTime, endTime));
        Map<String, Integer> usageMapSuccessS = new HashMap<>();
        Map<String, Integer> usageMapFailS = new HashMap<>();
        Map<String, String> serviceMap = new HashMap<>();
        for (DBObject dbObject : serviceOutput.toArray()) {
            String code = StringUtil.toString(dbObject.get("code"));
            String order = StringUtil.toString(dbObject.get("order"));
            String breadcrumbId = StringUtil.toString(dbObject.get("breadcrumbId"));
            if (serviceMap.containsKey(code + breadcrumbId + order)) {
                serviceMap.remove(code + breadcrumbId + order);
                if (usageMapSuccessS.containsKey(code)) {
                    Integer countTemp = usageMapSuccessS.get(code);
                    usageMapSuccessS.put(code, ++countTemp);
                } else {
                    usageMapSuccessS.put(code, 1);
                }
            } else {
                serviceMap.put(code + breadcrumbId + order, code);
            }
        }
        for (String key : serviceMap.keySet()) {
            String code = serviceMap.get(key);
            if (usageMapFailS.containsKey(code)) {
                Integer count = usageMapFailF.get(code);
                usageMapFailF.put(code, ++count);
            } else {
                usageMapFailF.put(code, 1);
            }
        }
        for (String code : codeList) {
            JSONObject result = new JSONObject();
            Integer successCountF = isNull(usageMapSuccessF.get(code));
            Integer failureCountF = isNull(usageMapFailF.get(code));
            Integer successCountS = isNull(usageMapSuccessS.get(code));
            Integer failureCountS = isNull(usageMapFailS.get(code));
            if (successCountF > 0 || failureCountF > 0) {
                result.put("totalCount", successCountF + failureCountF);
                result.put("successCount", successCountF);
                result.put("failureCount", failureCountF);
            } else if (successCountS > 0 || failureCountS > 0) {
                result.put("totalCount", successCountS + failureCountS);
                result.put("successCount", successCountS);
                result.put("failureCount", failureCountS);
            } else {
                result.put("totalCount", 0);
                result.put("successCount", 0);
                result.put("failureCount", 0);
            }
            ObjectMapper objectMapper = new ObjectMapper();
            saveServiceMetrics(code, "usage", objectMapper.writeValueAsString(result.toString()), endTime);
        }
    }
    public void delay(String beginTime, String endTime, List<String> codeList) {
        DBObject match = getMatchFields(beginTime, endTime);
        DBObject flowGroup = getFlowGroupFields();
        DBObject sort = getSortFields();
        // run aggregation
        AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
        Map<String, BigDecimal> delayMapF = new HashMap<>();
        for (DBObject dbObject : flowOutput.results()) {
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("routeId"));
            String begin = StringUtil.toString(dbObject.get("beginTime"));
            String end = StringUtil.toString(dbObject.get("endTime"));
            long interval = getIntervalExact(begin, end);
            if (delayMapF.containsKey(code)) {
                BigDecimal flowDelay = delayMapF.get(code);
                delayMapF.put(code, BigDecimal.valueOf(interval).add(flowDelay));
            } else {
                delayMapF.put(code, BigDecimal.valueOf(interval));
            }
        }
        DBCursor serviceOutput = getBusinessLog().find(getQueryObject(beginTime, endTime));
        Map<String, BigDecimal> delayMapS = new HashMap<>();
        Map<String, DBObject> serviceMap = new HashMap<>();
        for (DBObject dbObject : serviceOutput.toArray()) {
            String code = StringUtil.toString(dbObject.get("code"));
            if (serviceMap.containsKey(code)) {
                DBObject dbObjectTemp = serviceMap.remove(code);
                String begin = StringUtil.toString(dbObjectTemp.get("fireTimeSource"));
                String end = StringUtil.toString(dbObject.get("fireTimeSource"));
                long interval = getIntervalExact(begin, end);
                if (delayMapS.containsKey(code)) {
                    BigDecimal delayTemp = delayMapS.get(code);
                    delayMapS.put(code, delayTemp.add(BigDecimal.valueOf(interval)));
                } else {
                    delayMapS.put(code, BigDecimal.valueOf(interval));
                }
            } else {
                serviceMap.put(code, dbObject);
            }
        }
        for (String code : codeList) {
            BigDecimal delay = BigDecimal.ZERO;
            if (delayMapF.containsKey(code)) {
                delay = delayMapF.get(code);
            } else if (delayMapS.containsKey(code)) {
                delay = delayMapS.get(code);
            }
            saveServiceMetrics(code, "delay", delay.toString(), endTime);
        }
    }
    public DBObject getMatchFields(String beginTime, String endTime) {
        return new BasicDBObject("$match", getQueryObject(beginTime, endTime));
    }
    public DBObject getQueryObject(String beginTime, String endTime) {
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{
                        new BasicDBObject().append("fireTime",
                                new BasicDBObject().append(QueryOperators.GTE, DateUtil.toTimestamp(beginTime))),
                        new BasicDBObject().append("fireTime",
                                new BasicDBObject().append(QueryOperators.LT, DateUtil.toTimestamp(endTime)))});
        return queryObject;
    }
    public DBObject getServiceGroupFields() {
        // Now the $group operation
        DBObject groupFields = new BasicDBObject("_id",
                new BasicDBObject("id", "$_id")
                        .append("code", "$code"));
        groupFields.put("count", new BasicDBObject("$sum", 1));
        groupFields.put("bodyLength", new BasicDBObject("$sum", "$bodyLength"));
        groupFields.put("total", new BasicDBObject("$first", "$totalServers"));
        return new BasicDBObject("$group", groupFields);
    }
    public DBObject getFlowGroupFields() {
        // Now the $group operation
        DBObject groupFields = new BasicDBObject("_id",
                new BasicDBObject("breadcrumbId", "$breadcrumbId")
                        .append("routeId", "$routeId"));
        groupFields.put("count", new BasicDBObject("$sum", 1));
        groupFields.put("bodyLength", new BasicDBObject("$sum", "$bodyLength"));
        groupFields.put("total", new BasicDBObject("$first", "$totalServers"));
        groupFields.put("beginTime", new BasicDBObject("$first", "$fireTimeSource"));
        groupFields.put("endTime", new BasicDBObject("$last", "$fireTimeSource"));
        return new BasicDBObject("$group", groupFields);
    }
    public DBObject getSortFields() {
        DBObject sortFields = new BasicDBObject("_id", 1);
        return new BasicDBObject("$sort", sortFields);
    }
    public long getInterval(String beginTime, String endTime) {
        Date from = DateUtil.toTimestamp(beginTime, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
        Date to = DateUtil.toTimestamp(endTime, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
        long interval = (to.getTime() - from.getTime()) / 1000;
        return interval;
    }
    public long getIntervalExact(String beginTime, String endTime) {
        Date from = DateUtil.toTimestamp(beginTime, DateUtil.DEFAULT_TIMESTAMP_FORMAT);
        Date to = DateUtil.toTimestamp(endTime, DateUtil.DEFAULT_TIMESTAMP_FORMAT);
        long interval = (to.getTime() - from.getTime()) / 1000;
        return interval;
    }
    public void saveServiceMetrics(String name, String type, String value, String createTime) {
        BasicDBObject document = new BasicDBObject();
        document.put("tenant", tenant);
        document.put("name", name);
        document.put("type", type);
        document.put("value", value);
        document.put("create_time", createTime);
        DBCollection terminal = mongo.getDB(MonitorConstant.MONITOR_DATABASE).getCollection(MonitorConstant.SERVICE);
        terminal.save(document);
    }
    public Integer isNull(Integer count) {
        if (count == null) {
            count = 0;
        }
        return count;
    }
}

+ 1 - 6
hos-broker/src/main/resources/application.yml

@ -30,13 +30,11 @@ spring:
      authenticationDatabase: admin
      database: log
      gridFsDatabase: dfs
  camel.gateway:
    ip: localhost
    port: 8066
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.1.221:8761/eureka/
log:
  path: D://logs/logback/dev
  level: info
@ -77,9 +75,6 @@ spring:
      authenticationDatabase: admin
      database: log
      gridFsDatabase: dfs
  camel.gateway:
    ip: localhost
    port: 8066
eureka:
  client:
    serviceUrl:

+ 3 - 3
hos-broker/src/main/resources/logback-spring.xml

@ -18,9 +18,9 @@
    </appender>
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">    
        <file>${LOG_HOME}/output.log</file>        
        <file>output.log</file>        
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>{LOG_HOME}/output.%d{yyyy-MM-dd_HH_mm}.%i.log.zip</fileNamePattern>
            <fileNamePattern>output.%d{yyyy-MM-dd_HH_mm}.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>
@ -55,7 +55,7 @@
            <appender-ref ref="queue"/>
        </logger>
        <logger name="org.hibernate" level="WARN"/>
        <logger name="org.springframework" level="WARN"/>
        <!--<logger name="org.springframework" level="INFO"/>-->
        <logger name="springfox.documentation" level="WARN"/>
        <root level="INFO">

+ 17 - 0
hos-camel2/pom.xml

@ -32,6 +32,14 @@
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-netflix</artifactId>
                <version>1.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
@ -76,6 +84,15 @@
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>

+ 5 - 2
hos-camel2/src/main/java/camel/HosCamelApplication.java

@ -8,12 +8,15 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
 * Basic Spring Boot application.
 */
@SpringBootApplication
//@EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class HosCamelApplication implements CommandLineRunner {
    @Autowired
    private CamelContext context;

+ 29 - 17
hos-camel2/src/main/java/camel/central/gateway/processor/GatewayProcessor.java

@ -8,6 +8,7 @@ import com.yihu.hos.core.http.HttpClientKit;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
@ -18,6 +19,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -180,13 +182,12 @@ public class GatewayProcessor implements Processor {
            methodMap.put("3", "put");
            JsonNode jsonNode = objectMapper.readValue(param, JsonNode.class);
//            String url = serviceUrl(appApi.getMicroServiceName());
            String url = brokerUrl;
            String url = serviceUrl(appApi.getMicroServiceName());
            if (StringUtil.isEmpty(url)) {
                return "";
                url = appApi.getMicroServiceUri();
            }
            final String[] endPoint = {"restlet:" + appApi.getMicroServiceUri() + appApi.getMsMethodName() + "?socketTimeout=60000&connectionTimeout=60000&restletMethod=" + methodMap.get(appApi.getMethod())};
            final String[] endPoint = {"restlet:" + url + appApi.getMsMethodName() + "?socketTimeout=60000&connectionTimeout=60000&restletMethod=" + methodMap.get(appApi.getMethod())};
            final String[] body = {""};
            appApi.getParameters().forEach(p -> {
                JsonNode paramNode = jsonNode.get(p.getName());
@ -274,24 +275,35 @@ public class GatewayProcessor implements Processor {
     * @return
     */
    public String serviceUrl(String serviceName) {
        HTTPResponse response = HttpClientKit.get(brokerUrl + "/esb/webservice/host?serviceName=" + serviceName);
        if (response.getStatusCode() != 200) {
            System.out.println("获取服务地址请求失败!");
            return "";
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
        if (instances != null && !instances.isEmpty()) {
            int index = (int) (Math.random() * instances.size());   //随机获取其中一个服务
            ServiceInstance serviceInstance = instances.get(index);
            return serviceInstance.getUri().toString();
        } else {
            return null;
        }
        return response.getBody();
    }
    public String nodeValue(JsonNode node){
    public String nodeValue(JsonNode node) {
        Object value = null;
        try {
            switch (node.getNodeType().name()){
                case "NUMBER" : value = node.asInt();break;
                case "STRING" : value = node.asText();break;
                case "BOOLEAN" : value = node.asBoolean();break;
                case "OBJECT" : value = node.toString();break;
                default:value = "";break;
            switch (node.getNodeType().name()) {
                case "NUMBER":
                    value = node.asInt();
                    break;
                case "STRING":
                    value = node.asText();
                    break;
                case "BOOLEAN":
                    value = node.asBoolean();
                    break;
                case "OBJECT":
                    value = node.toString();
                    break;
                default:
                    value = "";
                    break;
            }
            return URLEncoder.encode(value.toString(), "UTF-8");
        } catch (UnsupportedEncodingException e) {

+ 52 - 0
hos-camel2/src/main/java/camel/monitor/processor/LogOffset.java

@ -0,0 +1,52 @@
package camel.monitor.processor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
/**
 * Created by l4qiang on 2017-06-16.
 */
@Document
public class LogOffset {
    @Id
    private String id;
    @Indexed(unique = true)
    private String name;    //需要采集的目标
    private long offset;
    private Date createTime;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public long getOffset() {
        return offset;
    }
    public void setOffset(long offset) {
        this.offset = offset;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

+ 140 - 0
hos-camel2/src/main/java/camel/monitor/processor/ServiceMonitorService.java

@ -0,0 +1,140 @@
package camel.monitor.processor;
import com.mongodb.MongoClient;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.yihu.hos.core.datatype.DateUtil;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
 * 统计流程信息
 * <p>
 * Created by chenweida on 2016/1/27.
 */
@Service("serviceMonitorService")
public class ServiceMonitorService {
    private static final String DATABASE = "log";
    private static final String SERVICE = "service";
    private static final String SERVICE_METRICS = "serviceMetrics";
    private static final String BUSINESS = "business";
    @Autowired
    private MongoClient mongoClient;
    @Autowired
    private MongoOperations mongoOperations;
    public void monitor() {
        try {
            MongoDatabase database = mongoClient.getDatabase(DATABASE);
            Query query = new Query();
            query.addCriteria(Criteria.where("name").is(SERVICE));  //Service表中已有的数据时间。
            LogOffset offset = mongoOperations.findOne(query, LogOffset.class);
            Date begin = new Date();
            Date end = new Date();
            if (offset != null) {
                long lngOffset = offset.getOffset();
                begin = DateUtil.toDateFromTime(lngOffset);
            }
            DateFormat df = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss z", Locale.ENGLISH);
            begin = DateUtil.formatCharDateYMDHMS("2017-06-12 00:00:00");
            end = DateUtil.formatCharDateYMDHMS("2017-06-20 00:00:00");
            String beginTime = df.format(begin);
            String endTime = df.format(end);
            mapReduce(database, beginTime, endTime);
            AggregateIterable<Document> documents = aggregate(database, beginTime, endTime);
            outPut(database, documents);
            if (offset == null) {
                offset = new LogOffset();
                offset.setName(SERVICE);
            }
            offset.setOffset(end.getTime());
            mongoOperations.save(offset);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void mapReduce(MongoDatabase database, String beginTime, String endTime) {
        Document document = new Document("mapReduce", BUSINESS);
        String mapFunc = "function(){emit(this.breadcrumbId, {fireTime:this.fireTime, createTime:this.createTime, bodyLength:this.bodyLength, tenant:this.tenant, routeId:this.routeId});}";
        document = document.append("map", mapFunc);
        String reduceFunc = "function(key, values){" +
                "var len=values.length;" +
                "var delay=values[len-1].fireTime-values[0].fireTime;" +
                "if(len == 1){delay=values[0].createTime-values[0].fireTime;}" +
                "return {fireTime: values[0].fireTime, in:values[0].bodyLength, out:values[len-1].bodyLength, delay:delay, tenant:values[0].tenant, routeId:values[0].routeId}}";
        document = document.append("reduce", reduceFunc);
        String query = "{fireTime:{$gte:new Date(\"" + beginTime + "\"), $lt:new Date(\"" + endTime + "\")}}";
        document = document.append("query", Document.parse(query));
        document = document.append("out", SERVICE);
        database.runCommand(document);
    }
    private AggregateIterable<Document> aggregate(MongoDatabase database, String beginTime, String endTime) {
        MongoCollection<Document> serviceCollection = database.getCollection(SERVICE);
        List<Document> pipeline = new ArrayList<>();
        Document match = new Document();
        String query = "{\"value.fireTime\":{$gte:new Date(\"" + beginTime + "\"), $lt:new Date(\"" + endTime + "\")}}";
        match.put("$match", Document.parse(query));
        pipeline.add(match);
        Document group = new Document();
        group.append("_id", Document.parse("{" +
                "year:{\"$year\":\"$value.fireTime\"}," +
                "month:{\"$month\":\"$value.fireTime\"}," +
                "day:{\"$dayOfMonth\":\"$value.fireTime\"}," +
                "hour:{\"$hour\":\"$value.fireTime\"}," +
                "minute:{\"$minute\": \"$value.fireTime\"}" +
                "routeId:\"$value.routeId\"" +
                "tenant:\"$value.tenantId\"" +
                "}"));
        group.append("pv", Document.parse("{$sum:1}"));
        group.append("successful", Document.parse("{$sum:1}"));
        group.append("failure", Document.parse("{$sum:0}"));    //TODO:暂时为空
        group.append("delay", Document.parse("{$sum:\"$value.delay\"}"));
        group.append("avgDelay", Document.parse("{$avg:\"$value.delay\"}"));
        group.append("in", Document.parse("{$sum:\"$value.in\"}"));
        group.append("out", Document.parse("{$sum:\"$value.out\"}"));
        pipeline.add(new Document("$group", group));
        pipeline.add(new Document("$sort", Document.parse("{\"_id\":1}")));
        return serviceCollection.aggregate(pipeline);
    }
    private void outPut(MongoDatabase database, AggregateIterable<Document> documents) {
        MongoCollection<Document> serviceMetrics = database.getCollection(SERVICE_METRICS);
        for (Document document : documents) {
            Document id = (Document) document.get("_id");
            String time = String.format("%04d", (int) id.get("year")) + String.format("%02d", (int) id.get("month")) + String.format("%02d", (int) id.get("day")) +
                    String.format("%02d", (int) id.get("hour")) + String.format("%02d", (int) id.get("minute"));
            document.put("time", time);
            document.put("routeId", id.get("routeId"));
            document.put("tenant", id.get("tenant"));
            document.putIfAbsent("avgDelay", 0);
            Document query = new Document("_id", id);
            Document update = new Document("$set", document);
            serviceMetrics.updateOne(query, update, new UpdateOptions().upsert(true));
        }
    }
}

+ 16 - 0
hos-camel2/src/main/java/camel/monitor/route/MonitorRouterBulider.java

@ -0,0 +1,16 @@
package camel.monitor.route;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
/**
 * Created by l4qiang on 2017-06-16.
 */
@Component
public class MonitorRouterBulider extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("quartz://monitor/monitorTimer?cron=0 0/1 * * * ?")
                .to("bean:serviceMonitorService?method=monitor");
    }
}

+ 32 - 0
hos-camel2/src/main/java/camel/terminal/tenant/processor/AddMongoProcessor.java

@ -0,0 +1,32 @@
package camel.terminal.tenant.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
/**
 * 
 * Created by Zdm on 2016/7/13.
 */
public class AddMongoProcessor implements Processor {
    private String database;
    private String collection;
    public AddMongoProcessor(String database, String collection) {
        this.database = database;
        this.collection = collection;
    }
    @Override
    public void process(Exchange exchange) throws Exception {
//        Map record = exchange.getIn().getBody(Map.class);
//        Map info = new HashMap();
//        info.put("database", database);
//        info.put("collection", collection);
//        ObjectId objectId = (ObjectId) record.get("_id");
//        record.put("_id", objectId.toString());
//        JSONArray jsonArray = new JSONArray();
//        jsonArray.put(info);
//        jsonArray.put(record);
//        exchange.getIn().setBody(jsonArray);
    }
}

+ 1 - 1
hos-broker/src/main/java/com/yihu/hos/broker/common/processor/CrawlerMongoProcessor.java

@ -1,4 +1,4 @@
package com.yihu.hos.broker.common.processor;
package camel.terminal.tenant.processor;
import com.mongodb.BasicDBObject;
import com.mongodb.QueryOperators;

+ 39 - 0
hos-camel2/src/main/java/camel/terminal/tenant/route/CrawlerMongoRouter.java

@ -0,0 +1,39 @@
package camel.terminal.tenant.route;
import camel.terminal.tenant.processor.AddMongoProcessor;
import camel.terminal.tenant.processor.CrawlerMongoProcessor;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class CrawlerMongoRouter extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("quartz://myGroup/myTimerName?cron=0 0/1 * * * ? ")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=runtime&collection=arbiterServer&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("runtime", "arbiterServer"))
            .to("bean:centerMongoService?method=save")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=runtime&collection=brokerServer&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("runtime", "brokerServer"))
            .to("bean:centerMongoService?method=save")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=runtime&collection=endpoint&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("runtime", "endpoint"))
            .to("bean:centerMongoService?method=save")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=log&collection=server&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("log", "server"))
            .to("bean:centerMongoService?method=save")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=log&collection=service&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("log", "service"))
            .to("bean:centerMongoService?method=save");
    }
}

+ 5 - 5
hos-camel2/src/main/resources/application.yml

@ -8,10 +8,6 @@ server:
---
spring:
  profiles: dev
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.1.221:8761/eureka/
  data:
    mongodb:
      host: 172.19.103.57
@ -20,4 +16,8 @@ eureka:
      password: esb
      authenticationDatabase: admin
      database: log
      gridFsDatabase: dfs
      gridFsDatabase: dfs
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.1.221:8761/eureka/

+ 0 - 1
hos-logger/src/main/java/com/yihu/hos/logger/camel/processor/EHRLogProcesser.java

@ -1,7 +1,6 @@
package com.yihu.hos.logger.camel.processor;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

+ 7 - 0
hos-logger/src/main/java/com/yihu/hos/logger/configuration/LoggerConfiguration.java

@ -20,6 +20,9 @@ public class LoggerConfiguration {
    @Value("${logger.ehr}")
    private String ehrLogDir;
    @Value("${logger.tenant}")
    private String tenant;
    public String getBrokerURL() {
        return brokerURL;
    }
@ -35,4 +38,8 @@ public class LoggerConfiguration {
    public String getEhrLogDir() {
        return ehrLogDir;
    }
    public String getTenant() {
        return tenant;
    }
}

+ 13 - 0
hos-logger/src/main/java/com/yihu/hos/logger/model/HosLog.java

@ -32,6 +32,7 @@ public class HosLog {
    private String fireTimeSource;
    private Date updateTime;
    private Date createTime;
    private String tenant;
    public HosLog() {
        this.createTime = DateUtil.getSysDateTime();
@ -176,4 +177,16 @@ public class HosLog {
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public String getMessageId() {
        return messageId;
    }
    public String getTenant() {
        return tenant;
    }
    public void setTenant(String tenant) {
        this.tenant = tenant;
    }
}

+ 5 - 3
hos-logger/src/main/java/com/yihu/hos/logger/service/HosLogService.java

@ -1,8 +1,7 @@
package com.yihu.hos.logger.service;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.logger.configuration.LoggerConfiguration;
import com.yihu.hos.logger.model.HosLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
@ -16,10 +15,12 @@ import java.util.Map;
 */
@Component("businessLogService")
public class HosLogService {
    private static final Logger logger = LoggerFactory.getLogger(HosLogService.class);
    @Autowired
    private MongoOperations mongoOperations;
    @Autowired
    private LoggerConfiguration loggerConfiguration;
    /**
     * camel.exchangeId The exchange id
     * camel.messageId The message id
@ -47,6 +48,7 @@ public class HosLogService {
        hosLog.setCamelContextId(mdcPropertyMap.get("camel.contextId"));
        hosLog.setBody(event.getMessage());
        hosLog.setBodyLength(event.getMessage().length());
        hosLog.setTenant(loggerConfiguration.getTenant());
        mongoOperations.save(hosLog);
    }

+ 1 - 0
hos-logger/src/main/resources/application.yml

@ -30,4 +30,5 @@ spring:
      gridFsDatabase: dfs
logger:
  tenant: jkzl
  ehr: e:/file

+ 0 - 8
hos-parent/pom.xml

@ -248,14 +248,6 @@
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Camel -->
            <dependency>
                <groupId>org.apache.camel</groupId>

+ 23 - 14
src/main/java/com/yihu/hos/monitor/controller/ServiceMonitorController.java

@ -1,10 +1,15 @@
package com.yihu.hos.monitor.controller;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.monitor.service.ServiceMonitorService;
import com.yihu.hos.system.service.FlowManager;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.web.framework.model.Result;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@ -24,8 +29,9 @@ import javax.servlet.http.HttpSession;
@Controller("ServiceMonitorController")
@RequestMapping("/monitor/service")
public class ServiceMonitorController {
    private static Logger logger = LoggerFactory.getLogger(ServiceMonitorController.class);
    @Resource(name = ServiceMonitorService.BEAN_ID)
    @Autowired
    private ServiceMonitorService monitorService;
    @Resource(name = FlowManager.BEAN_ID)
@ -52,8 +58,10 @@ public class ServiceMonitorController {
            @RequestParam(value = "endTime") String endTime) {
        try {
            HttpSession session = request.getSession();
            return monitorService.metrics(session,id, beginTime, endTime);
            TenantSession tenantSession = (TenantSession) session.getAttribute(ContextAttributes.TENANT_SESSION);
            return monitorService.serviceMetrics(tenantSession.getTenant(), id, beginTime, endTime);
        } catch (Exception e) {
            logger.error(e.getMessage());
            return Result.error("获取服务指标失败");
        }
    }
@ -65,6 +73,7 @@ public class ServiceMonitorController {
        try {
            return monitorService.getServiceTreeList();
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("获取服务树列表失败");
        }
    }
@ -76,12 +85,12 @@ public class ServiceMonitorController {
    public Result serviceStatus(
            HttpServletRequest request,
            @ApiParam(name = "routeCode", value = "流程Code", required = true)
            @RequestParam(value = "routeCode") Integer routeCode ) {
            @RequestParam(value = "routeCode") Integer routeCode) {
        try {
            boolean succ = flowManager.serviceOpenOrPause(routeCode,0);
            if (succ){
            boolean succ = flowManager.serviceOpenOrPause(routeCode, 0);
            if (succ) {
                return Result.success("获取服务状态成功");
            }else {
            } else {
                return Result.error("获取服务状态失败");
            }
        } catch (Exception e) {
@ -96,12 +105,12 @@ public class ServiceMonitorController {
    public Result startService(
            HttpServletRequest request,
            @ApiParam(name = "flowId", value = "流程ID", required = true)
            @RequestParam(value = "flowId") Integer flowId ) {
            @RequestParam(value = "flowId") Integer flowId) {
        try {
            boolean succ = flowManager.serviceOpenOrPause(flowId,1);
            if (succ){
            boolean succ = flowManager.serviceOpenOrPause(flowId, 1);
            if (succ) {
                return Result.success("开启服务成功");
            }else {
            } else {
                return Result.error("开启服务失败");
            }
        } catch (Exception e) {
@ -115,12 +124,12 @@ public class ServiceMonitorController {
    public Result stopService(
            HttpServletRequest request,
            @ApiParam(name = "flowId", value = "流程ID", required = true)
            @RequestParam(value = "flowId") Integer flowId ) {
            @RequestParam(value = "flowId") Integer flowId) {
        try {
            boolean succ = flowManager.serviceOpenOrPause(flowId,0);
            if (succ){
            boolean succ = flowManager.serviceOpenOrPause(flowId, 0);
            if (succ) {
                return Result.success("暂停服务成功");
            }else {
            } else {
                return Result.error("暂停服务失败");
            }
        } catch (Exception e) {

+ 1 - 1
src/main/java/com/yihu/hos/monitor/dao/ServiceMonitorDao.java

@ -36,7 +36,7 @@ public class ServiceMonitorDao extends SQLGeneralDAO {
    }
    public List<SystemServiceFlow> getFlowsByType(String type) throws Exception {
        return (List<SystemServiceFlow>) super.hibernateTemplate.find("from SystemServiceFlow s where s.type=?",type);
        return (List<SystemServiceFlow>) super.hibernateTemplate.find("from SystemServiceFlow s where s.fileType=?",type);
    }
}

+ 27 - 106
src/main/java/com/yihu/hos/monitor/service/ServiceMonitorService.java

@ -1,110 +1,62 @@
package com.yihu.hos.monitor.service;
import com.mongodb.*;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.core.datatype.CollectionUtil;
import com.yihu.hos.monitor.dao.ServiceMonitorDao;
import com.yihu.hos.system.model.SystemServiceEndpoint;
import com.yihu.hos.system.model.SystemServiceFlow;
import com.yihu.hos.system.model.SystemServiceFlowConfig;
import com.yihu.hos.system.service.FlowManager;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.web.framework.constant.ServiceFlowConstant;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.model.TreeView;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2016/1/27.
 */
@Service("ServiceMonitorService")
@Service
public class ServiceMonitorService {
    public static final String BEAN_ID = "ServiceMonitorService";
    public static final String dbName = "log";
    public static final String tableName = "service";
    public static final String serviceFlow = "serviceFlow";
    public static final String tableName = "serviceMetrics";
    public static final String configuration = "configuration";
    @Autowired
    private MongoOperations mongoOperations;
    @Autowired
    private Mongo mongo;
    private MongoClient mongoClient;
    @Autowired
    private ServiceMonitorDao serviceMonitorDao;
    @Resource(name = FlowManager.BEAN_ID)
    private FlowManager flowManager;
    public Result metrics(HttpSession session,String id, String beginTime, String endTime) throws Exception {
        String name;
        String code;
        String description;
        TenantSession tenantSession = (TenantSession)session.getAttribute(ContextAttributes.TENANT_SESSION);
        if (id.contains("flow")) {
            Integer flowId = Integer.parseInt(id.replace("flow", ""));
            SystemServiceFlow systemServiceFlow = serviceMonitorDao.getFlowById(flowId);
            name = systemServiceFlow.getName();
            code = systemServiceFlow.getCode();
            description = systemServiceFlow.getDescription();
        } else {
            String endpointId =id.replace("endpoint", "");
            SystemServiceEndpoint systemServiceEndpoint = serviceMonitorDao.getEndpointById(endpointId);
            name = systemServiceEndpoint.getName();
            code = systemServiceEndpoint.getCode();
            description = systemServiceEndpoint.getDescription();
        }
        JSONObject serviceInfo = new JSONObject();
        serviceInfo.put("name", name);
        serviceInfo.put("description", description);
        mongoOperations = new MongoTemplate(mongo, dbName);
    public Result serviceMetrics(String tenant, String routeId, String beginTime, String endTime) throws Exception {
        MongoTemplate mongoOperations = new MongoTemplate(mongoClient, dbName);
        DBCollection metrics = mongoOperations.getCollection(tableName);
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{
                        new BasicDBObject().append("create_time",
                                new BasicDBObject().append(QueryOperators.GTE, beginTime)),
                        new BasicDBObject().append("create_time",
                                new BasicDBObject().append(QueryOperators.LT, endTime)),
                        new BasicDBObject("name", code),
                        new BasicDBObject("tenant", tenantSession.getTenant())});
                        new BasicDBObject().append("time", new BasicDBObject().append(QueryOperators.GTE, beginTime)),
                        new BasicDBObject().append("time", new BasicDBObject().append(QueryOperators.LT, endTime))
//                        new BasicDBObject().append("time", new BasicDBObject().append(QueryOperators.GTE, "201706120000")),
//                        new BasicDBObject().append("time", new BasicDBObject().append(QueryOperators.LT, "201706200000"))
                        , new BasicDBObject("routeId", routeId)
                        , new BasicDBObject("tenant", tenant)
                });
        JSONObject result = new JSONObject();
        DBCursor cursor = metrics.find(queryObject);
        JSONArray bandwidth = new JSONArray();
        JSONArray qps = new JSONArray();
        JSONArray usage = new JSONArray();
        JSONArray delay = new JSONArray();
        while(cursor.hasNext()) {
        JSONArray data = new JSONArray();
        while (cursor.hasNext()) {
            DBObject dbObject = cursor.next();
            dbObject.removeField("_id");
            String type = dbObject.get("type").toString();
            switch (type) {
                case "bandwidth" : bandwidth.put(dbObject);break;
                case "qps" : qps.put(dbObject);break;
                case "usage" : usage.put(dbObject);break;
                case "delay" : delay.put(dbObject);break;
            }
            data.put(dbObject);
        }
        result.put("bandwidth", bandwidth);
        result.put("qps", qps);
        result.put("usage", usage);
        result.put("delay", delay);
        result.put("serviceInfo", serviceInfo);
        result.put("data", data);
        return Result.success(result.toString());
    }
@ -112,52 +64,21 @@ public class ServiceMonitorService {
        List<TreeView> treeList = new ArrayList<>();
        List<SystemServiceFlow> flowList = serviceMonitorDao.getFlowsByType(ServiceFlowConstant.CLASS);
        List<SystemServiceFlowConfig> flowEndpointList = serviceMonitorDao.getAllFlowEndpoints();
        List<SystemServiceEndpoint> endpointList = serviceMonitorDao.getAllEndpoints();
        Map<Integer, List<String>> flowEndpointMap = new HashMap<>();
        Map<String, SystemServiceEndpoint> endpointMap = new HashMap<>();
        for (SystemServiceFlowConfig systemServiceFlowConfig : flowEndpointList) {
            List<String> endpointIdList;
            if (flowEndpointMap.containsKey(systemServiceFlowConfig.getFlowId())) {
                endpointIdList = flowEndpointMap.get(systemServiceFlowConfig.getFlowId());
            } else {
                endpointIdList = new ArrayList<>();
            }
            endpointIdList.add(systemServiceFlowConfig.getEndpointId());
            flowEndpointMap.put(systemServiceFlowConfig.getFlowId(), endpointIdList);
        }
        for (SystemServiceEndpoint endpoint : endpointList) {
            endpointMap.put(endpoint.getId(), endpoint);
        }
        for (SystemServiceFlow flow : flowList) {
                TreeView rootTree = new TreeView();
                rootTree.setIschecked(false);
                rootTree.setId("flow" + flow.getId());
                rootTree.setPid("-1");
                rootTree.setText(flow.getName());
                treeList.add(rootTree);
                List<String> endpointIdList = flowEndpointMap.get(flow.getId());
                if (!CollectionUtil.isEmpty(endpointIdList)) {
                    for (String endpointId : endpointIdList) {
                        SystemServiceEndpoint endpoint = endpointMap.get(endpointId);
                        TreeView childTree = new TreeView();
                        childTree.setIschecked(false);
                        childTree.setId("endpoint" + endpoint.getId());
                        childTree.setPid("flow" + flow.getId());
                        childTree.setText(endpoint.getName());
                        treeList.add(childTree);
                    }
            }
            TreeView rootTree = new TreeView();
            rootTree.setIschecked(false);
            rootTree.setId("flow" + flow.getId());
            rootTree.setPid("-1");
            rootTree.setText(flow.getName());
            treeList.add(rootTree);
        }
        JSONArray jsonArray = new JSONArray(treeList);
        JSONArray jsonArray = new JSONArray(treeList);
        return Result.success(jsonArray.toString());
    }
    public boolean serviceStatus(String routeCode){
    public boolean serviceStatus(String routeCode) {
        boolean succ = false;
//        MongoDatabase db = mongoConfig.mongoClient().getDatabase(configuration);
//        MongoCollection<Document> collection = db.getCollection(serviceFlow);

+ 1 - 2
src/main/webapp/WEB-INF/ehr/commons/jsp/commonFoot.jsp

@ -7,8 +7,7 @@
<script src="${staticRoot}/lib/ligerui/custom/ligerOverwrite.js"></script>
<script src="${staticRoot}/lib/ligerui/plugins/customTree.js"></script>
<script src="${staticRoot}/lib/bootstrap/js/bootstrap.min.js"></script>
<script src="${staticRoot}/lib/module/dateExt.js"></script>
<script src="${staticRoot}/lib/module/util.js"></script>
<script src="${staticRoot}/lib/plugin/formEx/attrscan.js"></script>
<script src="${staticRoot}/lib/plugin/formEx/readonly.js"></script>

+ 0 - 74
src/main/webapp/WEB-INF/ehr/jsp/monitor/monitor.jsp

@ -1,74 +0,0 @@
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
	<meta charset="utf-8">
	<title>数据收集监控</title>
	<%@include file="/WEB-INF/ehr/commons/jsp/commonHeader.jsp" %>
    <script>
        //加载js模块组件
        seajs.use(['jquery','i18n','app/monitor/monitor'], function ($,i18n, Monitor) {
        });
    </script>
</head>
<body>
	<div class="" id="message"></div>
	<div id="conditionAreaT" class="f-mt10 f-ml10" align="left">
        <table>
            <tr>
                <td>
                    <select name="table" class="f-w200" id="hosTableList" placeholder="请选择数据集">
                    </select>
                </td>
                <td>
                    <input type="text" class="f-ml10" name="rowkey" id="rowkey" value="" style="width: 240px" class="form-control"  placeholder="请输入rowkey">
                </td>
                <td>
                    <input type="button" id="btnQuery" class="btn btn-warning f-ml10" value="查询数据">
                    <input type="button" id="btnStatic" class="btn btn-warning f-ml10" value="统计数据集入库">
                    <input type="button" id="btnVerify" class="btn btn-warning f-ml10" value="数据核对">
                    <a href="http://tool.oschina.net/codeformat/json"  class="f-ml10"  target="_blank">结果格式化</a>
                </td>
            </tr>
        </table>
	</div>
	<div id="ResultAreaT" class="f-mt10 f-ml10" align="left">
		<table>
			<tr>
				<textarea id="result" rows="10" style="width:90%"></textarea>
			</tr>
		</table>
	</div>
	<div id="conditionAreaD" class="f-mt10 f-ml10" align="left">
		<table>
			<tr>
				<td>
					<a>开始时间:</a>
				</td>
				<td>
					<input size="16" type="text" name="start" id="start" value="" placeholder="设置开始时间" class="form_datetime">
				</td>
				<td>
					<a class="f-ml10">结束时间:</a>
				</td>
				<td>
					<input size="16" type="text" name="end" id="end" value="" placeholder="设置结束时间" class="form_datetime">
				</td>
                <td>
                    <input type="button" id="btnQueryReport" class="btn btn-warning f-ml10" value="生成数据入库报告">
                </td>
			</tr>
		</table>
	</div>
	<div id="ResultAreaD" class="f-mt10 f-ml10" align="left">
		<div id="tblStaticResult">
			<!-- 结果集列表区域 -->
		</div>
	</div>
</body>
</html>

+ 83 - 23
src/main/webapp/WEB-INF/ehr/jsp/monitor/service/sEnvManage.jsp

@ -4,27 +4,84 @@
<link rel="stylesheet" href="${contextRoot}/develop/lib/plugin/switchery/switchery.css">
<style>
    .c-item{float:left;height: 30px;line-height: 30px;width: 150px;background: #fff;color:#000;text-align: center;font-size: 12px;border:1px solid #dcdcdc;}
    .c-bor-r{border-right: 0;}
    .c-item.active{background: #16B3EE;color:#fff}
    .ml50{margin-left: 50px;}
    .mt20{margin-top: 20px;}
    .mb20{margin-bottom: 20px;}
    .f-dis-inline{display: inline-block;}
    .f-fs12{font-size: 12px;}
    .f-fs14{font-size: 14px;}
    .c-fwb{font-weight: bold;}
    .div-item{width:50%;float: left;}
    .c-item{font-size: 12px;display: inline-block;width: 100px;}
    .c-content{font-size: 16px;display: inline-block;width: 100px;font-weight: bold;}
    .div-right-item{font-size: 12px;width: 150px;}
    .c-item {
        float: left;
        height: 30px;
        line-height: 30px;
        width: 150px;
        background: #fff;
        color: #000;
        text-align: center;
        font-size: 12px;
        border: 1px solid #dcdcdc;
    }
    .c-bor-r {
        border-right: 0;
    }
    .c-item.active {
        background: #16B3EE;
        color: #fff
    }
    .ml50 {
        margin-left: 50px;
    }
    .mt20 {
        margin-top: 20px;
    }
    .mb20 {
        margin-bottom: 20px;
    }
    .f-dis-inline {
        display: inline-block;
    }
    .f-fs12 {
        font-size: 12px;
    }
    .f-fs14 {
        font-size: 14px;
    }
    .c-fwb {
        font-weight: bold;
    }
    .div-item {
        width: 50%;
        float: left;
    }
    .c-item {
        font-size: 12px;
        display: inline-block;
        width: 100px;
    }
    .c-content {
        font-size: 16px;
        display: inline-block;
        width: 100px;
        font-weight: bold;
    }
    .div-right-item {
        font-size: 12px;
        width: 150px;
    }
</style>
<!-- ####### 页面部分 ####### -->
<div id="div_wrapper">
    <!--左边 区域-->
    <div position="left"  style="margin-left:10px;margin-top:10px;border-right: thin solid rgb(162, 162, 162);">
    <div position="left" style="margin-left:10px;margin-top:10px;border-right: thin solid rgb(162, 162, 162);">
        <ul id="div_wrapper_left_ul_servicetree" class="m-snav"></ul>
    </div>
    <div position="center" style="margin-left:10px;margin-top:10px;margin-right:10px;">
@ -34,9 +91,10 @@
            <div class="m-form-group">
                <div class="col-sm-3" style="text-align: center;padding-top:10px;">
                    <div style="width:255px">
                        <input type="checkbox" class="js-switch" id="jobStatusSwitch" checked />
                        <input type="checkbox" class="js-switch" id="jobStatusSwitch" checked/>
                    </div>
                    <div style="float: left;width:235px;border-left:1px solid #e1e1e1;;line-height: 32px;" id="jobStatus">
                    <div style="float: left;width:235px;border-left:1px solid #e1e1e1;;line-height: 32px;"
                         id="jobStatus">
                        -
                    </div>
                    <div style="clear: both;padding-top:20px;">任务调度</div>
@ -52,11 +110,11 @@
            <div class="m-form-group" style="margin-left: 100px;">
                <label style="width: 100px;">开始时间:</label>
                <div class="m-form-control">
                    <input id="repeatStartTime" type="text" />
                    <input id="repeatStartTime" type="text"/>
                </div>
                <label style="width: 100px;">结束时间:</label>
                <div class="m-form-control">
                    <input id="repeatEndTime" type="text" />
                    <input id="repeatEndTime" type="text"/>
                </div>
                <div class="m-form-control">
                    <div id="btnSearch" class="l-button">
@ -65,13 +123,15 @@
                </div>
            </div>
            <%-- echarts 数据--%>
            <div id="main1" style="width: 500px;margin-left:130px;height:250px;border: solid deepskyblue 1px;"></div>
            <div id="main1" style="width: 500px;margin-left:130px;height:250px;border: solid #a6a6a6 1px;"></div>
            <%-- echarts 数据--%>
            <div id="main2" style="width: 500px;margin:-250px 0px 20px 680px;height:250px;border: solid deepskyblue 1px;"></div>
            <div id="main2"
                 style="width: 500px;margin:-250px 0px 20px 680px;height:250px;border: solid #a6a6a6 1px;"></div>
            <%-- echarts 数据--%>
            <div id="main3" style="width: 500px;margin-left:130px;height:250px;border: solid deepskyblue 1px;"></div>
            <div id="main3" style="width: 500px;margin-left:130px;height:250px;border: solid #a6a6a6 1px;"></div>
            <%-- echarts 数据--%>
            <div id="main4" style="width: 500px;margin:-250px 0px 20px 680px;height:250px;border: solid deepskyblue 1px;"></div>
            <div id="main4"
                 style="width: 500px;margin:-250px 0px 20px 680px;height:250px;border: solid #a6a6a6 1px;"></div>
        </div>
    </div>
</div>

+ 164 - 168
src/main/webapp/WEB-INF/ehr/jsp/monitor/service/sEnvManageJs.jsp

@ -25,59 +25,56 @@
            width: 240,
            showTime: true
        });
        $("#repeatStartTime").ligerDateEditor("setValue",prevDate());
        $("#repeatEndTime").ligerDateEditor("setValue",nowDate());
        $("#repeatStartTime").ligerDateEditor("setValue", prevDate());
        $("#repeatEndTime").ligerDateEditor("setValue", nowDate());
        /*初始化时间控件-end*/
        //搜索按钮事件
        $(".m-form-control").on("click","#btnSearch",function(){
        $(".m-form-control").on("click", "#btnSearch", function () {
            var beginTime = $("#repeatStartTime").ligerDateEditor("getValue");
            var endTime = $("#repeatEndTime").ligerDateEditor("getValue");
            if(beginTime=="" && $endTime=="")
            {
            if (beginTime == "" && $endTime == "") {
                $.ligerDialog.error("请选择起始结束时间!");
                return false;
            }
            if(beginTime > endTime)
            {
            if (beginTime > endTime) {
                $.ligerDialog.error("开始时间不能大于结束时间!");
                return false;
            }
            var id = $("#selectId").val();
            //获取服务器监控数据
            getServiceInfo(id,beginTime,endTime);
            getServiceInfo(id, beginTime, endTime);
        });
        //初始化树
        getServiceTree();
    });
    function initSwitcher(){
    function initSwitcher() {
        var me = this;
        //开关控件
        var changeCheckbox = document.querySelector('#jobStatusSwitch');
        var switchery = new Switchery(changeCheckbox, { disabled: true,size: 'large' });
        changeCheckbox.onchange = function() {
            //debugger
        var switchery = new Switchery(changeCheckbox, {disabled: true, size: 'large'});
        changeCheckbox.onchange = function () {
            var a = me.switchery;
            var jobId = $("#selJob").ligerComboBox("getValue");
            if(!changeCheckbox.checked)
            {
                me.valid(jobId,"0");
            if (!changeCheckbox.checked) {
                me.valid(jobId, "0");
            }
            else{
                me.valid(jobId,"1");
            else {
                me.valid(jobId, "1");
            }
        };
    }
    function getServiceTree(){
    function getServiceTree() {
        var serviceTree = $("#div_wrapper_left_ul_servicetree");
        //初始化树
        $.ajax({
            type: "GET",
            dataType: "json",
            url: "${contextRoot}/monitor/service/trees",
            success: function (msg) {
                if (msg.successFlg) {
@ -109,128 +106,134 @@
        });
    }
    function getServiceInfo(id, beginTime, endTime){
    function getServiceInfo(id, beginTime, endTime) {
        beginTime = new Date(beginTime).format("yyyyMMddhhmm");
        endTime = new Date(endTime).format("yyyyMMddhhmm");
        debugger
        $.ajax({
            type: "GET",
            url : "${contextRoot}/monitor/service/metrics",
            dataType : "json",
            data:{id:id,beginTime:beginTime, endTime:endTime},
            cache:false,
            success :function(re){
                if(re.successFlg) {
            url: "${contextRoot}/monitor/service/metrics",
            dataType: "json",
            data: {id: id, beginTime: beginTime, endTime: endTime},
            cache: false,
            success: function (re) {
                if (re.successFlg) {
                    //TODO 设置图表
                    var message = JSON.parse(re.message);
                    var serviceInfo = message.serviceInfo;
                    $("#serviceName").text(serviceInfo.name);
                    $("#serviceDescription").text(serviceInfo.description);
//                    var serviceInfo = message.serviceInfo;
//                    $("#serviceName").text(serviceInfo.name);
//                    $("#serviceDescription").text(serviceInfo.description);
                    service.bandwidth(message.bandwidth);
                    service.qps(message.qps);
                    service.delay(message.delay);
                    service.usage(message.usage);
                    service.setJobStatus();
                    service.bandwidth(message.data);
                    service.qps(message.data);
                    service.delay(message.data);
                    service.usage(message.data);
//                    service.setJobStatus();
                } else {
                    $.ligerDialog.error(re.message);
                }
            },
            error :function(data){
                $.ligerDialog.error("Status:"+data.status +"(" +data.statusText+")");
            error: function (data) {
                $.ligerDialog.error("Status:" + data.status + "(" + data.statusText + ")");
            }
        });
    }
    var service = {
        switchery:null,
        bandwidth:function(data){
        switchery: null,
        bandwidth: function (data) {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main1'));
             if(data!=null && data.length>0)
             {
                 var x = [];
                 var y = [];
                 for(var i=0;i<data.length;i++)
                 {
                     var createTime = data[i].createTime.substring(11,16);
                     x.push(createTime);
                     y.push(data[i].value);
                 }
                 // 指定图表的配置项和数据
                 var option = {
                     title: {
                         text: ' 带宽',
                         left: 'center'
                     },
                     tooltip: {
                         trigger: 'axis'
                     },
                     dataZoom : {
                         show : true,
                         start : 50,
                         end : 100
                     },
                     legend: {
                         left: 'left',
                         data: ['带宽']
                     },
                     xAxis: {
                         type: 'category',
                         name: '时间',
                         splitLine: {show: false},
                         data: x
                     },
                     grid: {
                         left: '3%',
                         right: '4%',
                         bottom: '3%',
                         containLabel: true
                     },
                     yAxis: {
                         type: 'log',
                     },
                     series: [
                         {
                             name: '带宽',
                             type: 'line',
                             data: y
                         },
                     ]
                 };
             myChart.setOption(option);
             //设置图例下方的信息
             } else{
                 myChart.clear();
             }
            if (data != null && data.length > 0) {
                var x = [];
                var inPut = [];
                var outPut = [];
                for (var i = 0; i < data.length; i++) {
                    var createTime = data[i].time.substring(8, 12);
                    x.push(createTime);
                    inPut.push(data[i].in);
                    outPut.push(data[i].out);
                }
                // 指定图表的配置项和数据
                var option = {
                    title: {
                        text: ' 带宽',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    dataZoom: {
                        show: true,
                        start: 50,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['输入', "输出"]
                    },
                    xAxis: {
                        type: 'category',
                        name: '时间',
                        splitLine: {show: false},
                        data: x
                    },
                    grid: {
                        left: '3%',
                        right: '4%',
                        bottom: '3%',
                        containLabel: true
                    },
                    yAxis: {
                        type: 'log',
                    },
                    series: [
                        {
                            name: '输入',
                            type: 'line',
                            data: inPut
                        },
                        {
                            name: '输出',
                            type: 'line',
                            data: outPut
                        },
                    ]
                };
                myChart.setOption(option);
                //设置图例下方的信息
            } else {
                myChart.clear();
            }
        },
        qps:function(data){
        qps: function (data) {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main2'));
            if(data!=null && data.length>0)
            {
            if (data != null && data.length > 0) {
                var x = [];
                var y = [];
                for(var i=0;i<data.length;i++)
                {
                    var createTime = data[i].createTime.substring(11,16);
                for (var i = 0; i < data.length; i++) {
                    var createTime = data[i].time.substring(8, 12);
                    x.push(createTime);
                    y.push(data[i].value);
                    y.push(data[i].pv);
                }
                // 指定图表的配置项和数据
                var option = {
                    title: {
                        text: ' 吞吐量',
                        text: ' TPS',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    dataZoom : {
                        show : true,
                        start : 50,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 50,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['吞吐量']
                        data: ['TPS']
                    },
                    xAxis: {
                        type: 'category',
@ -249,7 +252,7 @@
                    },
                    series: [
                        {
                            name: '吞吐量',
                            name: 'TPS',
                            type: 'line',
                            data: y
                        },
@ -257,22 +260,22 @@
                };
                myChart.setOption(option);
            }
            else{
            else {
                myChart.clear();
            }
        },
        delay:function(data){
        delay: function (data) {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main3'));
            if(data!=null && data.length>0)
            {
            if (data != null && data.length > 0) {
                var x = [];
                var y = [];
                for(var i=0;i<data.length;i++)
                {
                    var createTime = data[i].createTime.substring(11,16);
                var delay = [];
                var avgDelay = [];
                for (var i = 0; i < data.length; i++) {
                    var createTime = data[i].time.substring(8, 12);
                    x.push(createTime);
                    y.push(data[i].value);
                    delay.push(data[i].delay);
                    avgDelay.push(data[i].avgDelay);
                }
                // 指定图表的配置项和数据
                var option = {
@ -283,14 +286,14 @@
                    tooltip: {
                        trigger: 'axis'
                    },
                    dataZoom : {
                        show : true,
                        start : 50,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 50,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['延时']
                        data: ['延时', '平均延时']
                    },
                    xAxis: {
                        type: 'category',
@ -311,54 +314,59 @@
                        {
                            name: '延时',
                            type: 'line',
                            data: y
                            data: delay
                        },
                        {
                            name: '平均延时',
                            type: 'line',
                            data: avgDelay
                        }
                    ]
                };
                myChart.setOption(option);
            }
            else{
            else {
                myChart.clear();
            }
        },
        usage:function(data){
        usage: function (data) {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main4'));
            if(data!=null && data.length>0)
            {
            if (data != null && data.length > 0) {
                var x = [];
                var y1 = [];
                var y2 = [];
                var y3 = [];
                for(var i=0;i<data.length;i++)
                {
                    var createTime = data[i].createTime.substring(11,16);
                for (var i = 0; i < data.length; i++) {
                    var createTime = data[i].time.substring(8, 12);
                    x.push(createTime);
                    var count = JSON.parse(JSON.parse(data[i].value));
                    y1.push(count.totalCount);
                    y2.push(count.successCount);
                    y3.push(count.failureCount);
                    var count = data[i].pv;
                    var successful = data[i].successful;
                    y1.push(successful / count * 100);
                }
                // 指定图表的配置项和数据
                // 指定图表的配置项和数据
                var option = {
                    title: {
                        text: ' 使用率',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'axis'
                        trigger: 'axis',
                        formatter: function (params) {
                            var index = params[0].dataIndex;
                            return params[0].seriesName + "<br/>" +
                                params[0].name + ' : ' + params[0].value + '% (' + data[index].successful + '/' + data[index].pv + ')';
                        }
                    },
                    dataZoom : {
                        show : true,
                        start : 50,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 50,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['总使用数', '成功数', '失败数']
                        data: ['使用率']
                    },
                        xAxis: {
                    xAxis: {
                        type: 'category',
                        name: '时间',
                        splitLine: {show: false},
@ -375,43 +383,31 @@
                    },
                    series: [
                        {
                            name: '总使用数',
                            name: '使用率',
                            type: 'line',
                            data: y1
                        },
                        {
                            name: '成功数',
                            type: 'line',
                            data: y2
                        },
                        {
                            name: '失败数',
                            type: 'line',
                            data: y3
                        }
                    ]
                };
                myChart.setOption(option);
            }
            else{
            else {
                myChart.clear();
            }
        },
        //任务状态
        setJobStatus:function(status)
        {
        setJobStatus: function (status) {
            var me = this;
            if(status=="1")
            {
                $('#jobStatusSwitch').attr("checked",true);
                me.switchery.element.checked=true;
            if (status == "1") {
                $('#jobStatusSwitch').attr("checked", true);
                me.switchery.element.checked = true;
                me.switchery.setPosition();
                $("#jobStatus").html('<span class="green job_run">正在运行中...</span>');
            }
            else{
            else {
                $('#jobStatusSwitch').removeAttr("checked");
                me.switchery.element.checked=false;
                me.switchery.element.checked = false;
                me.switchery.setPosition();
                $("#jobStatus").html('<span class="red job_stop">运行暂停</span>');
            }
@ -420,7 +416,7 @@
    /*当前时间*/
    function nowDate(){
    function nowDate() {
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
@ -428,16 +424,16 @@
        var hour = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        return year + '-' + month + '-' + day  + ' ' + hour + ':' + minute + ':' + second;
        return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
    }
    /*前一天时间*/
    function prevDate(){
    function prevDate() {
        var now = new Date();
        var date = new Date(now.getTime() -  24 * 3600 * 1000);
        var date = new Date(now.getTime() - 1 * 3600 * 1000);
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var day = date.getDate();
        return year + '-' + month + '-' + day  + ' 00:00:00';
        return year + '-' + month + '-' + day + ' 00:00:00';
    }
</script>

+ 26 - 0
src/main/webapp/develop/lib/module/dateExt.js

@ -0,0 +1,26 @@
/**
 * Created by l4qiang on 2017-06-20.
 */
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
Date.prototype.format = function(fmt) { //author: meizz
    var o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "h+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}