Commit 0d158bff authored by zhengfunan's avatar zhengfunan

累计更新,加超时时间,加百分比告警

parent de2beda0
Pipeline #373 failed with stages
This diff is collapsed.
package com.yingxin.prms.api;
import com.yingxin.prms.domain.Auth_Mode_Avg;
import com.yingxin.prms.domain.Auth_Success_Rate;
import com.yingxin.prms.service.dao.AuthModeAvgImpl;
import com.yingxin.prms.service.dao.AuthSuccessRateImpl;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author by shao
* @Create 2023/3/2 11:57
*/
@RestController
@RequestMapping("/rest/logSystem")
@CrossOrigin(origins = "*")
public class logSystemApi {
@Autowired
AuthModeAvgImpl authModeAvg;
@Autowired
AuthSuccessRateImpl authSuccessRate;
@GetMapping("findAllByMode")
public List<Auth_Mode_Avg> findAllByMode(@RequestParam("mode")String mode) {
return authModeAvg.findAllByMode(mode);
}
@GetMapping("findLineChartTimeData")
public Map<String,List<Auth_Mode_Avg>> findLineChartTimeData(){
List<Auth_Mode_Avg> ytcrList = authModeAvg.findLineChartTimeData("YTCR-BASIC");
List<Auth_Mode_Avg> yrdtytcrList = authModeAvg.findLineChartTimeData("YRDTYTCR-BASIC");
List<Auth_Mode_Avg> allList = authModeAvg.findLineChartTimeData("ALL-MODE");
Map<String,List<Auth_Mode_Avg>> result = new HashMap<>();
result.put("YTCR_BASIC",ytcrList);
result.put("YRDTYTCR_BASIC",yrdtytcrList);
result.put("ALL_MODE",allList);
return result;
}
@GetMapping("findLineChartTSuccessData")
public Map<String,List<Auth_Success_Rate>> findLineChartTSuccessData(){
List<Auth_Success_Rate> ytcrList = authSuccessRate.findLineChartTSuccessData("YTCR-BASIC");
List<Auth_Success_Rate> yrdtytcrList = authSuccessRate.findLineChartTSuccessData("YRDTYTCR-BASIC");
List<Auth_Success_Rate> allList = authSuccessRate.findLineChartTSuccessData("ALL-MODE");
Map<String,List<Auth_Success_Rate>> result = new HashMap<>();
result.put("YTCR_BASIC",ytcrList);
result.put("YRDTYTCR_BASIC",yrdtytcrList);
result.put("ALL_MODE",allList);
return result;
}
}
......@@ -32,6 +32,8 @@ public class ServiceRelationConfig {
allArea.put("日志汇聚",true);
allArea.put("权限管理",true);
allArea.put("接入管理",true);
// allArea.put(".",true);
// allArea.put("..",true);
return allArea;
}
//
......@@ -139,7 +141,7 @@ public class ServiceRelationConfig {
String areaName = "";
switch (serviceNmae){
case "接入区" :
areaName = "div-total";
areaName = "";
break;
case "权限管理" :
areaName = "接入区";
......@@ -150,12 +152,18 @@ public class ServiceRelationConfig {
case "权限核验(FACL)" :
areaName = "权限管理";
break;
case "权限核验facl" :
areaName = "权限管理";
break;
case "redis组件" :
areaName = "权限管理";
break;
case "MySql组件" :
areaName = "权限管理";
break;
case "mysql组件" :
areaName = "权限管理";
break;
case "业务权限配置" :
areaName = "权限管理";
break;
......@@ -169,10 +177,10 @@ public class ServiceRelationConfig {
areaName = "权限管理";
break;
case "公安网用户" :
areaName = "接入管理";
areaName = "";
break;
case "公安网VPN用户" :
areaName = "接入管理";
areaName = "";
break;
case "签名服务器" :
areaName = "接入管理";
......@@ -183,17 +191,26 @@ public class ServiceRelationConfig {
case "Token方式接入服务" :
areaName = "接入管理";
break;
case "token方式接入服务" :
areaName = "接入管理";
break;
case "Token核验服务" :
areaName = "接入管理";
break;
case "token核验服务" :
areaName = "接入管理";
break;
case "VPN方式接入服务" :
areaName = "接入管理";
break;
// case "核心调度服务" :
// areaName = "接入区";
// break;
case "核心调度服务" :
areaName = "接入区";
areaName = "";
break;
case "核心业务区" :
areaName = "div-total";
areaName = "";
break;
case "实时身份识别" :
areaName = "核心业务区";
......@@ -205,20 +222,32 @@ public class ServiceRelationConfig {
areaName = "核心业务区";
break;
case "算法区" :
areaName = "div-total";
areaName = "";
break;
// case "算法融合调度" :
// areaName = "算法区";
// break;
case "算法融合调度" :
areaName = "算法区";
areaName = "";
break;
case "人脸识别引擎(1)" :
areaName = "算法区";
break;
case "人脸识别引擎1" :
areaName = "算法区";
break;
case "人脸识别引擎(2)" :
areaName = "算法区";
break;
case "人脸识别引擎2" :
areaName = "算法区";
break;
case "人脸识别引擎(3)" :
areaName = "算法区";
break;
case "人脸识别引擎3" :
areaName = "算法区";
break;
case "图像质量评估引擎" :
areaName = "算法区";
break;
......@@ -226,13 +255,19 @@ public class ServiceRelationConfig {
areaName = "算法区";
break;
case "日志汇聚" :
areaName = "div-total";
areaName = "";
break;
case "日志汇聚服务" :
areaName = "日志汇聚";
break;
case "." :
areaName = "日志汇聚";
break;
case ".." :
areaName = "日志汇聚";
break;
default:
areaName = "div-total";
areaName = "";
}
return areaName;
}
......
package com.yingxin.prms.config;
import net.sf.json.JSONObject;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by shao on 2021/12/13.
*/
@Configuration
public class TopologyConfig {
private JSONObject json;
@Bean
public JSONObject getJson(){
return new JSONObject();
}
}
package com.yingxin.prms.domain;
import org.springframework.data.cassandra.core.cql.PrimaryKeyType;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;
/**
* @Author by shao
* @Create 2023/3/2 9:19
*/
@Table("auth_mode_avg")
public class Auth_Mode_Avg {
@PrimaryKeyColumn(type = PrimaryKeyType.PARTITIONED)
private String mode;
@PrimaryKeyColumn
private String timestamp;
private String time_avg;
public Auth_Mode_Avg(String mode, String timestamp, String time_avg) {
this.mode = mode;
this.timestamp = timestamp;
this.time_avg = time_avg;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getTime_avg() {
return time_avg;
}
public void setTime_avg(String time_avg) {
this.time_avg = time_avg;
}
@Override
public String toString() {
return "Auth_Mode_Avg{" +
"mode='" + mode + '\'' +
", timestamp='" + timestamp + '\'' +
", time_avg='" + time_avg + '\'' +
'}';
}
}
package com.yingxin.prms.domain;
import org.springframework.data.cassandra.core.cql.PrimaryKeyType;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;
/**
* @Author by shao
* @Create 2023/3/2 9:19
*/
@Table("auth_success_rate")
public class Auth_Success_Rate {
@PrimaryKeyColumn(type = PrimaryKeyType.PARTITIONED)
private String mode;
@PrimaryKeyColumn
private String timestamp;
private String half_an_hour;
private String an_hour;
private String three_hours;
private String twelve_hours;
private String twenty_four_hours;
private String a_week;
private String half_a_year;
private String a_year;
private String history;
public Auth_Success_Rate(String mode, String timestamp, String half_an_hour, String an_hour, String three_hours,
String twelve_hours, String twenty_four_hours, String a_week, String half_a_year,
String a_year, String history) {
this.mode = mode;
this.timestamp = timestamp;
this.half_an_hour = half_an_hour;
this.an_hour = an_hour;
this.three_hours = three_hours;
this.twelve_hours = twelve_hours;
this.twenty_four_hours = twenty_four_hours;
this.a_week = a_week;
this.half_a_year = half_a_year;
this.a_year = a_year;
this.history = history;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getHalf_an_hour() {
return half_an_hour;
}
public void setHalf_an_hour(String half_an_hour) {
this.half_an_hour = half_an_hour;
}
public String getAn_hour() {
return an_hour;
}
public void setAn_hour(String an_hour) {
this.an_hour = an_hour;
}
public String getThree_hours() {
return three_hours;
}
public void setThree_hours(String three_hours) {
this.three_hours = three_hours;
}
public String getTwelve_hours() {
return twelve_hours;
}
public void setTwelve_hours(String twelve_hours) {
this.twelve_hours = twelve_hours;
}
public String getTwenty_four_hours() {
return twenty_four_hours;
}
public void setTwenty_four_hours(String twenty_four_hours) {
this.twenty_four_hours = twenty_four_hours;
}
public String getA_week() {
return a_week;
}
public void setA_week(String a_week) {
this.a_week = a_week;
}
public String getHalf_a_year() {
return half_a_year;
}
public void setHalf_a_year(String half_a_year) {
this.half_a_year = half_a_year;
}
public String getA_year() {
return a_year;
}
public void setA_year(String a_year) {
this.a_year = a_year;
}
public String getHistory() {
return history;
}
public void setHistory(String history) {
this.history = history;
}
@Override
public String toString() {
return "Auth_Success_Rate{" +
"mode='" + mode + '\'' +
", timestamp='" + timestamp + '\'' +
", half_an_hour='" + half_an_hour + '\'' +
", an_hour='" + an_hour + '\'' +
", three_hours='" + three_hours + '\'' +
", twelve_hours='" + twelve_hours + '\'' +
", twenty_four_hours='" + twenty_four_hours + '\'' +
", a_week='" + a_week + '\'' +
", half_a_year='" + half_a_year + '\'' +
", a_year='" + a_year + '\'' +
", history='" + history + '\'' +
'}';
}
}
......@@ -128,10 +128,8 @@ public class CTID_Process_Perf {
}
public void setBsn(String bsn) {
System.out.println(this.toString());
System.out.println("setBsn");
// System.out.println("setBsn");
this.bsn = bsn;
System.out.println(this.toString());
}
public Date getStamp() {
......@@ -372,7 +370,7 @@ public class CTID_Process_Perf {
public void setDur_voucher_data4(Integer dur_voucher_data4) {
System.out.println("setDur_voucher_data4");
System.out.println(this.toString());
// System.out.println(this.toString());
if (dur_voucher_data4 != null) this.dur_voucher_data4 = dur_voucher_data4;
System.out.println(this.toString());
}
......
package com.yingxin.prms.dto;
/**
* @Author by shao
* @Create 2023/3/3 10:28
*/
public enum SuccessRate {
halfAnHour,
anHour,
threeHours,
twelveHours,
twentyFourHours,
aWeek,
halfAYear,
aYear,
history;
}
......@@ -28,16 +28,16 @@ public class TcpFlowNodeDto {
private int faultCount; //错误数
private String url; //服务路径
// private Boolean isGroup;
// private String group;
private Boolean isGroup;
private String group;
public TcpFlowNodeDto() {
}
public TcpFlowNodeDto(String key, String category, String description, String descriptionCss, String pos,
String text, String serverName, String imgsrc, String caption,
int tcpTransactionTotalCount, int errorTcpTransactionTotalCount,
int faultCount, String url) {
String text, String serverName, String imgsrc, String caption,
int tcpTransactionTotalCount, int errorTcpTransactionTotalCount,
int faultCount, String url,boolean isGroup, String group) {
this.key = key;
this.category = category;
this.description = description;
......@@ -51,25 +51,25 @@ public class TcpFlowNodeDto {
this.errorTcpTransactionTotalCount = errorTcpTransactionTotalCount;
this.faultCount = faultCount;
this.url = url;
// this.isGroup = isGroup;
// this.group = group;
}
// public Boolean getIsGroup() {
// return isGroup;
// }
//
// public void setIsGroup(Boolean isGroup) {
// this.isGroup = isGroup;
// }
//
// public String getGroup() {
// return group;
// }
//
// public void setGroup(String group) {
// this.group = group;
// }
this.isGroup = isGroup;
this.group = group;
}
public Boolean getIsGroup() {
return isGroup;
}
public void setIsGroup(Boolean isGroup) {
this.isGroup = isGroup;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
public String getUrl() {
return url;
......@@ -189,6 +189,10 @@ public class TcpFlowNodeDto {
", caption='" + caption + '\'' +
", tcpTransactionTotalCount=" + tcpTransactionTotalCount +
", errorTcpTransactionTotalCount=" + errorTcpTransactionTotalCount +
", faultCount=" + faultCount +
", url='" + url + '\'' +
", isGroup=" + isGroup +
", group='" + group + '\'' +
'}';
}
}
......@@ -27,6 +27,9 @@ public class BasicTask {
Boolean insertToKairos(HttpClient client, String url, long dur, boolean isAlive) {
boolean ss=false;
if(dur>2500){
isAlive=false;
}
MetricBuilder builderHeartbeat = MetricBuilder.getInstance();
builderHeartbeat.addMetric("heartbeat")
.addTag("host", url)
......
......@@ -33,8 +33,8 @@ public class HttpTask extends BasicTask{
@Autowired
public HttpTask(HttpClient httpClient) {
SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
httpRequestFactory.setConnectTimeout(5000);
httpRequestFactory.setReadTimeout(5000);
httpRequestFactory.setConnectTimeout(2800);
httpRequestFactory.setReadTimeout(2800);
this.httpClient = httpClient;
}
......
package com.yingxin.prms.service.asyncTask;
import com.google.gson.JsonArray;
import com.sun.scenario.effect.impl.sw.java.JSWBlend_SRC_OUTPeer;
import com.yingxin.prms.config.Constant;
import com.yingxin.prms.domain.AlarmMsg;
import com.yingxin.prms.service.dao.CassandraDaoImpl;
import com.yingxin.prms.utils.TimeUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author by shao
* @Create 2023/3/1 17:05
*/
@Component
public class LogSystemAlarmTask {
private static Logger logger = LoggerFactory.getLogger(LogSystemAlarmTask.class);
@Autowired
CassandraDaoImpl cassandraDao;
@Value("${log_statistics_url}")
private String url;
@Value("${authorization}")
private String authorization;
@Value("${error_rate}")
private double errorRate;
@Async("asyncTaskPool")
public void doTask(String appid,Long begin,Long end){
System.out.println();
try {
//设置信息头
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", authorization);
HttpEntity httpEntity = new HttpEntity<>(headers);
//发送http get请求
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
ResponseEntity<String> data = restTemplate.exchange(url+"?appid="+appid+"&&gte="+begin+"&&lte="+end,
HttpMethod.GET, httpEntity, String.class);
JSONObject json = StringToJson(data.getBody());
//将返回结果插入到cassandra.auth_mode_avg
if (json != null && json.has("data") && !json.getString("data").equals("null")) {
JSONArray jsonArray = json.getJSONArray("data");
double totalCount = 0.0;
double esCount = 0.0;
for (int i = 0;i<jsonArray.size();i++){
totalCount = totalCount+(int) jsonArray.getJSONObject(i).get("doc_count");
if (jsonArray.getJSONObject(i).getString("key").length()>=2 && jsonArray.getJSONObject(i).getString("key").substring(0,2).equals("ES")){
esCount = esCount+(int) jsonArray.getJSONObject(i).get("doc_count");
}
}
System.out.println(json.toString());
System.out.println("totalCount: "+ totalCount);
System.out.println("esCount: " + esCount);
System.out.println("异常率: "+esCount/totalCount);
if (totalCount!=0 && esCount/totalCount>=errorRate){
AlarmMsg alarmMsg = new AlarmMsg();
alarmMsg.setAlarmLevel(Constant.ALARM_UNSTABLE);
alarmMsg.setState("1");
alarmMsg.setAlarmMessage("调用:"+url+" 系统异常日志统计超过"+errorRate+"%");
alarmMsg.setClusterName("");
alarmMsg.setIp("0.0.0.0");
alarmMsg.setPort("");
alarmMsg.setAlatime(TimeUtil.getDate());
alarmMsg.setSerialnum(0L);
System.out.println(alarmMsg.toString());
System.out.println("插入日志异常数据到数据库中!!!!!!!!!!!!!!!");
cassandraDao.insertAlarmMsg(alarmMsg);
}
} else {
logger.info("暂无数据或者异常未超过1%!");
}
} catch (Exception e) {
System.out.println("出现异常情况");
System.out.println(e.getMessage());
logger.error("error: logSystemAlarmTask to {}", "dotask");
e.printStackTrace();
}
}
public void insertAuthTimeAvg() {
}
/**
* 字符串转成Json格式
*
* @param data
* @return
*/
private JSONObject StringToJson(String data) {
JSONObject json;
if (data != null && !data.equals("")) {
json = JSONObject.fromObject(data);
} else {
json = null;
}
return json;
}
public static void main(String[] args) {
double a = 1;
double b = 1;
double c = 1;
a=a+c;
System.out.println(a>c);
System.out.println(a);
System.out.println(a/b);
}
}
package com.yingxin.prms.service.asyncTask;
import com.yingxin.prms.config.Constant;
import com.yingxin.prms.domain.AlarmMsg;
import com.yingxin.prms.domain.Auth_Mode_Avg;
import com.yingxin.prms.service.business.Manager;
import com.yingxin.prms.service.dao.AuthModeAvgImpl;
import com.yingxin.prms.service.dao.AuthSuccessRateImpl;
import com.yingxin.prms.service.dao.CassandraDaoImpl;
import com.yingxin.prms.utils.TimeUtil;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author by shao
* @Create 2023/3/1 17:05
*/
@Component
public class PortraitCheckTimeTask {
private static Logger logger = LoggerFactory.getLogger(PortraitCheckTimeTask.class);
@Autowired
AuthModeAvgImpl authModeAvgIml;
@Autowired
CassandraDaoImpl cassandraDao;
@Value("${auth_time_avg_url}")
private String url;
@Value("${authorization}")
private String authorization;
@Value("${avg_point}")
private double avgPoint;
private boolean status;
/**
* 获取生物识别平台 认证平均耗时
*
* @param modes 模式集合
* @param begin 开始时间(用来记录读取时间)
* @param end 结束时间
* @param type 类型 1:最近100条请求的平均耗时,此时begin和end的值无效 非1:规定时间内所有请求耗时
*/
@Async("asyncTaskPool")
public void doTask(List<String> modes, String begin, String end, String type) {
List<Auth_Mode_Avg> authModeAvgList = new ArrayList<>();
for (int i = 0; i < modes.size(); i++) {
status = false;
try {
//配置参数
Map params = new HashMap();
params.put("mode", modes.get(i));
params.put("begin", begin);
params.put("end", end);
params.put("type", type);
//设置信息头
HttpHeaders headers = new HttpHeaders();
headers.add("authorization", authorization);
HttpEntity httpEntity = new HttpEntity<>(params, headers);
//发送http post请求
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
String account = restTemplate.postForObject(url, httpEntity, String.class);
JSONObject json = StringToJson(account);
//将返回结果插入到cassandra.auth_mode_avg
if (json != null && json.has("data") && !json.getString("data").equals("null") && json.getJSONObject("data").has("busTimeAvg")) {
status = true;
Auth_Mode_Avg ama = new Auth_Mode_Avg(modes.get(i), begin + "", json.getJSONObject("data").getString("busTimeAvg"));
//测试数据存入cassandra
insertToCassandra(ama);
//将总耗时整理以备后续存入数据库
authModeAvgList.add(ama);
//判断本次是否需要插入告警数据
insertAlarmMag(ama);
} else {
logger.info("暂无数据!");
// System.out.println("暂无数据!");
}
} catch (Exception e) {
logger.error("error: portraitCheckTimeTask to {}", modes.get(i));
logger.error(e.getMessage());
AlarmMsg alarmMsg = new AlarmMsg();
alarmMsg.setAlarmLevel(Constant.ALARM_UNSTABLE);
alarmMsg.setState("1");
alarmMsg.setAlarmMessage("调用:"+url+" 返回数据异常");
alarmMsg.setClusterName("");
alarmMsg.setIp("0.0.0.0");
alarmMsg.setPort("");
alarmMsg.setAlatime(TimeUtil.getDate());
alarmMsg.setSerialnum(0L);
cassandraDao.insertAlarmMsg(alarmMsg);
}
}
//插入总平均耗时 如果日志系统有返回数据并且不为null并且不为空串则可以将返回结果添加到数据库中
if (status){
insertTotalAuthTimeAvg(authModeAvgList);
status = false;
}
}
/**
* 模式耗时数据入库
*
* @param authModeAvg
*/
private void insertToCassandra(Auth_Mode_Avg authModeAvg) {
authModeAvgIml.save(authModeAvg);
}
/**
* 字符串转成Json格式
*
* @param data
* @return
*/
private JSONObject StringToJson(String data) {
JSONObject json;
if (data != null && !data.equals("")) {
json = JSONObject.fromObject(data);
} else {
json = null;
}
return json;
}
/**
* 统计总耗时并记录到数据库(1:N M:N 总平均耗时)
* @param authModeAvgList
*/
private void insertTotalAuthTimeAvg(List<Auth_Mode_Avg> authModeAvgList) {
double timeTotal = 0.00;
for (int i = 0; i < authModeAvgList.size(); i++) {
timeTotal = timeTotal + Double.valueOf(authModeAvgList.get(i).getTime_avg());
}
if (timeTotal > 0) {
insertToCassandra(new Auth_Mode_Avg("ALL-MODE", authModeAvgList.get(0).getTimestamp(), timeTotal / authModeAvgList.size() + ""));
}
}
//判断本次告警数据是否有效并且同上次测试数据性能下降了40%。
public void insertAlarmMag(Auth_Mode_Avg authModeAvg){
List<Auth_Mode_Avg> authModeAvgList = authModeAvgIml.findLineChartTimelim1(authModeAvg.getMode());
Double avgNew = null;
Double avgOlg = null;
if (authModeAvgList != null && authModeAvgList.size() > 0 && authModeAvgList.get(0).getTime_avg().indexOf(".")>0){
avgOlg = Double.valueOf(authModeAvgList.get(0).getTime_avg());
}
if (authModeAvg != null && authModeAvg.getTime_avg().indexOf(".")>0){
avgNew = Double.valueOf(authModeAvgList.get(0).getTime_avg());
}
if (avgNew != null && avgOlg != null){
if((avgNew - avgOlg) / avgOlg > avgPoint){
AlarmMsg alarmMsg = new AlarmMsg();
alarmMsg.setAlarmLevel("unstable");
alarmMsg.setState("1");
alarmMsg.setAlarmMessage(authModeAvgList.get(0).getMode()+"模式在最近的平均耗时为:"+avgNew+" 。对比前一分钟,性能下降过快");
alarmMsg.setClusterName("");
alarmMsg.setIp("0.0.0.0");
alarmMsg.setPort("");
alarmMsg.setAlatime(authModeAvgList.get(0).getTimestamp());
alarmMsg.setSerialnum(0L);
logger.info("插入平均耗时性能下降告警!");
cassandraDao.insertAlarmMsg(alarmMsg);
}
}
}
}
......@@ -5,6 +5,7 @@ import org.kairosdb.client.HttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
......@@ -25,6 +26,9 @@ public class UdpTask extends BasicTask{
@Autowired
public UdpTask(HttpClient httpClient) {
SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
httpRequestFactory.setConnectTimeout(2800);
httpRequestFactory.setReadTimeout(2800);
this.httpClient = httpClient;
}
......
package com.yingxin.prms.service.dao;
import com.yingxin.prms.domain.Auth_Mode_Avg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author by shao
* @Create 2023/3/2 11:42
*/
@Repository
public class AuthModeAvgImpl {
private final CassandraTemplate template;
@Autowired
public AuthModeAvgImpl(CassandraTemplate template) {
this.template = template;
}
public void save(Auth_Mode_Avg authModeAvg){
template.insert(authModeAvg);
}
public List<Auth_Mode_Avg> findAllByMode(String mode){
return template.select("select * from ctid_prof.auth_mode_avg where mode = '"+mode+"';",Auth_Mode_Avg.class);
}
public List<Auth_Mode_Avg> findLineChartTimeData(String mode){
return template.select("select * from ctid_prof.auth_mode_avg where mode = '"+mode+"' order by timestamp desc limit 20;",Auth_Mode_Avg.class);
}
public List<Auth_Mode_Avg> findLineChartTimelim1(String mode){
return template.select("select * from ctid_prof.auth_mode_avg where mode = '"+mode+"' order by timestamp desc limit 1;",Auth_Mode_Avg.class);
}
}
package com.yingxin.prms.service.dao;
import com.yingxin.prms.domain.Auth_Mode_Avg;
import com.yingxin.prms.domain.Auth_Success_Rate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author by shao
* @Create 2023/3/2 11:42
*/
@Repository
public class AuthSuccessRateImpl {
private final CassandraTemplate template;
@Autowired
public AuthSuccessRateImpl(CassandraTemplate template) {
this.template = template;
}
public void save(Auth_Success_Rate authSuccessRate){
template.insert(authSuccessRate);
}
public List<Auth_Success_Rate> findAllByMode(String mode){
return template.select("select * from ctid_prof.auth_success_rate where mode = '"+mode+"';",Auth_Success_Rate.class);
}
public List<Auth_Success_Rate> findLineChartTSuccessData(String mode){
return template.select("select * from ctid_prof.auth_success_rate where mode = '"+mode+"' order by timestamp desc limit 20;",Auth_Success_Rate.class);
}
public List<Auth_Success_Rate> findLineChartTSuccessLim1(String mode){
return template.select("select * from ctid_prof.auth_success_rate where mode = '"+mode+"' order by timestamp desc limit 1;",Auth_Success_Rate.class);
}
}
......@@ -2,17 +2,15 @@ package com.yingxin.prms.service.schedule;
import com.yingxin.prms.domain.Server_Host_Info;
import com.yingxin.prms.dto.AuthModeAndHostList;
import com.yingxin.prms.service.asyncTask.AlarmTask;
import com.yingxin.prms.service.asyncTask.HttpTask;
import com.yingxin.prms.service.asyncTask.RedisTask;
import com.yingxin.prms.service.asyncTask.UdpTask;
import com.yingxin.prms.service.asyncTask.*;
import com.yingxin.prms.utils.TimeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
......@@ -29,14 +27,24 @@ public class Schedule {
private final AuthModeAndHostList list;
private final PortraitCheckTimeTask portraitCheckTimeTask;
private final AuthSuccessRateTask authSuccessRateTask;
private final LogSystemAlarmTask logSystemAlarmTask;
private static Logger logger = LoggerFactory.getLogger(Schedule.class);
@Autowired
public Schedule(AuthModeAndHostList list, HttpTask httpTask, UdpTask udpTask, RedisTask redisTask, AlarmTask alarmTask) {
public Schedule(AuthModeAndHostList list, HttpTask httpTask, UdpTask udpTask, RedisTask redisTask, AlarmTask alarmTask, PortraitCheckTimeTask portraitCheckTimeTask, AuthSuccessRateTask authSuccessRateTask, LogSystemAlarmTask logSystemAlarmTask) {
this.list = list;
this.httpTask = httpTask;
this.udpTask = udpTask;
this.redisTask = redisTask;
this.alarmTask = alarmTask;
this.portraitCheckTimeTask = portraitCheckTimeTask;
this.authSuccessRateTask = authSuccessRateTask;
this.logSystemAlarmTask = logSystemAlarmTask;
}
@Scheduled(initialDelay = 5000, fixedDelay = 10000)
......@@ -51,12 +59,47 @@ public class Schedule {
if (hostInfo.getService_method().equals("redis")) redisTask.doTask(hostInfo, alarmHost);
}
}
@Scheduled(initialDelay = 60000, fixedDelay = 20000)
public void alarm() {
logger.info("开始告警判断");
List<Server_Host_Info> server_host_infos = list.getClusterBeMonitoredList();
for (Server_Host_Info hostInfo : server_host_infos) {
alarmTask.doTask(hostInfo);
alarmTask.doTask(hostInfo);
}
}
@Scheduled(initialDelay = 10000, fixedDelay = 60000)
public void authModeConsum() {
logger.info("获取平台认证耗时");
List<String> modes = new ArrayList<>();
modes.add("YTCR-BASIC");
modes.add("YRDTYTCR-BASIC");
String begin = TimeUtil.getTimeStampString();
for (int i = 0; i < modes.size(); i++) {
portraitCheckTimeTask.doTask(modes, begin, "0", "1");
}
}
@Scheduled(initialDelay = 10000, fixedDelay = 60000)
public void authSuccessRate() {
logger.info("获取平台认证对比率");
List<String> modes = new ArrayList<>();
modes.add("YTCR-BASIC");
modes.add("YRDTYTCR-BASIC");
long end = System.currentTimeMillis();
String begin = end - 60000 + "";
authSuccessRateTask.doTask(modes, begin, "", "");
}
/**
* 日志统计中异常百分比超过%,就行告警表中添加一天告警数据
* 通知日志统计异常率超过%
*/
@Scheduled(initialDelay = 10000, fixedDelay = 60000)
public void setLogSystemAlarmTask() {
logger.info("判断日志统计中异常百分比");
System.currentTimeMillis();
logSystemAlarmTask.doTask("",System.currentTimeMillis()-120000,System.currentTimeMillis()-60000);
}
}
......@@ -55,7 +55,7 @@ public class SendHttpUtil {
// 配置信息
RequestConfig requestConfig = RequestConfig.custom()
// 设置连接超时时间(单位毫秒)
.setConnectTimeout(5000)
.setConnectTimeout(2800)
// // 设置请求超时时间(单位毫秒)
// .setConnectionRequestTimeout(5000)
// // socket读写超时时间(单位毫秒)
......@@ -105,7 +105,7 @@ public class SendHttpUtil {
// 配置信息
RequestConfig requestConfig = RequestConfig.custom()
// 设置连接超时时间(单位毫秒)
.setConnectTimeout(5000)
.setConnectTimeout(2800)
// // 设置请求超时时间(单位毫秒)
// .setConnectionRequestTimeout(3000)
// // socket读写超时时间(单位毫秒)
......
......@@ -11,6 +11,7 @@ import org.apache.http.util.EntityUtils;
import org.kairosdb.client.builder.QueryBuilder;
import org.springframework.http.ResponseEntity;
import javax.xml.crypto.Data;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
......@@ -51,6 +52,23 @@ public class TimeUtil {
return sdf.format(date);
}
public static String getDateToTimeStamp(String dataStr) {
Date date = null;
try {
date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dataStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date.getTime()+"";
}
public static String getDate2(){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);
}
public static String getMD5Result(String password){
return password.substring(12,password.length()-24);
}
......@@ -70,5 +88,13 @@ public class TimeUtil {
return calendar.getTime();
}
public static String getTimeStampString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Calendar beforeTime = Calendar.getInstance();
Date beforeD = beforeTime.getTime();
String time = sdf.format(beforeD);
return time;
}
}
server:
port: 8091
port: 8090
spring:
data:
cassandra:
keyspace-name: ctid_prof
# contact-points: 200.102.10.11
# contact-points: 121.22.111.251
contact-points: 192.168.10.11
# contact-points: 200.102.10 .11
# contact-points: 192.168.10.11
contact-points: 192.168.10.120
# port: 9042
port: 9002
# username: gzt
......@@ -29,7 +29,8 @@ jwt:
demo:
kairosdb:
# url: "http://123.183.159.199:9008"
url: "http://192.168.10.11:9008"
# url: "http://192.168.10.141:8080"
url: "http://192.168.10.11:8080"
maxConnTotal: 50
maxConnPerRoute: 30
......@@ -62,3 +63,15 @@ wxurl: 123
#企业ID
corpid: 123
#corpid: wwb8a34ddb02c87228
auth_time_avg_url: http://192.168.10.244:8866/external/getBusinessTimeAvg
auth_success_rate_url: http://192.168.10.244:8866/external/getComparisonSuccessRate
authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjQzLCJ1c2VybmFtZSI6InRlc3QifQ._g1YqE2pa8j-YUfTMV7dG_bKgsja6WPlFlh2RP3yTIg
avg_point: 0.40
success_ point: 0.50
#log path
log_statistics_url: http://192.168.10.244:8866/external/getGroupCodeByAppid
#日志系统异常半分比(直接输入数值,不需要添加%符号)
error_rate: 1
\ No newline at end of file
......@@ -28,7 +28,7 @@
</appenders>
<loggers>
<AsyncRoot level="INFO" includeLocation="true">
<AsyncRoot level="INFO" includeLocation="true" additivity = "true">
<AppenderRef ref="console"/>
<AppenderRef ref="Ctid_Log_Server_Local_File"/>
</AsyncRoot>
......
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>可靠性监控</title><link href=/css/app.54ec9eb89feda0ac8a552380cb2419f9.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/js/manifest.1766e3c7586055624ca0.js></script><script type=text/javascript src=/js/vendor.26cf44d5f3ca6bde9d6b.js></script><script type=text/javascript src=/js/app.cbfe33edaa556c80edf2.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>可靠性监控</title><link href=/css/app.9b127bad18abf2ef0937dc3c4ddb4cc7.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/js/manifest.1766e3c7586055624ca0.js></script><script type=text/javascript src=/js/vendor.6463c5f02785981de30d.js></script><script type=text/javascript src=/js/app.5e5c5aab73e147387b56.js></script></body></html>
\ No newline at end of file
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{"version":3,"sources":["webpack:///webpack/bootstrap 3a9af942d5fcef5d55a9"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,IAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"js/manifest.1766e3c7586055624ca0.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 3a9af942d5fcef5d55a9"],"sourceRoot":""}
\ No newline at end of file
{"version":3,"sources":["webpack:///webpack/bootstrap 7bb4138dd0cc5e09cb46"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,IAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"js/manifest.1766e3c7586055624ca0.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7bb4138dd0cc5e09cb46"],"sourceRoot":""}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment