');
+ sb.append( '
');
sb.append( '');
sb.append( '必输项不能为空');
sb.append( '
');
@@ -739,18 +851,42 @@ function typeChangeShow(type){
* 初始化时间控件
*/
function initTimeControl(){
- $('#time_start').datetimepicker({
+ $('#time_from_div').datetimepicker({
pickDate: false,
pickSeconds: false
});
- $('#time_end').datetimepicker({
+ $('#time_to_div').datetimepicker({
+ pickDate: false,
+ pickSeconds: false
+ });
+
+ $('#time_start_div').datetimepicker({
pickDate: false,
pickSeconds: false
});
+ $('#time_end_div').datetimepicker({
+ pickDate: false,
+ pickSeconds: false
+ });
+
+ $('#day_start_div').datetimepicker({
+ pickHour: false,
+ pickMin: false,
+ pickSeconds: false
+ });
+
+
+ $('#day_end_div').datetimepicker({
+ pickHour: false,
+ pickMin: false,
+ pickSeconds: false
+ });
+
+
}
function changeTimeUnit(value){
@@ -897,13 +1033,43 @@ function conditionsAppend(){
if("stream"==$("#condType").val()){
jsonObject = {"type":"stream","expr":HtmlHelper.inputXSSFilter($("#contExpr").val()),"range":HtmlHelper.inputXSSFilter($("#conRange").val()),"func":HtmlHelper.inputXSSFilter($("#conFunc").val()),"cparam":HtmlHelper.inputXSSFilter($("#conFuncParam").val())};
}else{
- jsonObject = {"type":"timer","time_from":HtmlHelper.inputXSSFilter($("#time_from").val()),"time_to":HtmlHelper.inputXSSFilter($("#time_to").val()),"metric":HtmlHelper.inputXSSFilter($("#conMetric").val()),"upperLimit":HtmlHelper.inputXSSFilter($("#conUpperLimit").val()),"lowerLimit":HtmlHelper.inputXSSFilter($("#conLowerLimit").val()),"aggr":HtmlHelper.inputXSSFilter($("#conAggr").val())};
+ jsonObject = {"type":"timer","time_from":HtmlHelper.inputXSSFilter($("#time_from").val()),"time_to":HtmlHelper.inputXSSFilter($("#time_to").val()),"metric":HtmlHelper.inputXSSFilter($("#conMetric").val()),"upperLimit":HtmlHelper.inputXSSFilter($("#conUpperLimit").val()),"lowerLimit":HtmlHelper.inputXSSFilter($("#conLowerLimit").val())};
+
+ if(HtmlHelper.inputXSSFilter($("#conAggr").val())!="0"){
+ jsonObject["aggr"]=HtmlHelper.inputXSSFilter($("#conAggr").val());
+ }else{
+ jsonObject["aggr"]="avg";
+ }
+
+ if(HtmlHelper.inputXSSFilter($("#conDownSample").val())!="0"){
+ jsonObject["downsample"]=HtmlHelper.inputXSSFilter($("#conDownSample").val());
+ }else{
+ jsonObject["downsample"]="all-avg";
+ }
+
if("link-relative"==$("#condType").val()){
jsonObject["interval"]=HtmlHelper.inputXSSFilter($("#conInterval").val());
jsonObject["unit"]=HtmlHelper.inputXSSFilter($("#unit").val());
}else{
jsonObject["unit"]=HtmlHelper.inputXSSFilter($("#unit").val());
}
+
+ if($("#time_start").val()&&$("#time_end").val()){
+ jsonObject["time_start"]=HtmlHelper.inputXSSFilter($("#time_start").val());
+ jsonObject["time_end"]=HtmlHelper.inputXSSFilter($("#time_end").val());
+ }
+
+ if($("#day_start").val()&&$("#day_end").val()){
+ jsonObject["day_start"]=HtmlHelper.inputXSSFilter($("#day_start").val());
+ jsonObject["day_end"]=HtmlHelper.inputXSSFilter($("#day_end").val());
+ }
+
+ var weekdayLimit=[];
+ for(var i=0;i<7;i++){
+ weekdayLimit[i]=($("#weekday"+i).attr("class")=="btn btn-default active")
+ }
+ jsonObject["weekdayLimit"]=weekdayLimit;
+
}
appendConditions(jsonObject);
window.winmgr.hide("condDiv");
@@ -921,7 +1087,7 @@ function checkFunc(){
result = false;
}
}else{
- if(!$("#time_from").val()||!$("#time_to").val()||!$("#conMetric").val()||!$("#conUpperLimit").val()||!$("#conLowerLimit").val()||!$("#conAggr").val()){
+ if(!$("#time_from").val()||!$("#time_to").val()||!$("#conMetric").val()||!$("#conUpperLimit").val()||!$("#conLowerLimit").val()){
result = false;
}
if("link-relative"==$("#condType").val()){
@@ -1432,7 +1598,7 @@ var StgyClass = {
result += ","+json.func;
}
}else{
- result = json.metric+","+json.time_from+"-"+json.time_to+","+json.aggr+",";
+ result = json.metric+","+json.time_from+"-"+json.time_to+","+json.downsample+","+json.aggr+",";
if(json.interval){
result+=json.interval+" ";
@@ -1456,7 +1622,13 @@ var StgyClass = {
case "4":
result+="year";
break;
- }
+ }
+ if(json.time_start!=undefined&&json.time_end!=undefined){
+ result+=","+json.time_start+"-"+json.time_end;
+ }
+ if(json.day_start!=undefined&&json.day_end!=undefined){
+ result+=","+json.day_start+"-"+json.day_end;
+ }
}
return result;
diff --git a/com.creditease.uav.elasticsearch.client/src/main/java/com/creditease/uav/elasticsearch/client/ESClient.java b/com.creditease.uav.elasticsearch.client/src/main/java/com/creditease/uav/elasticsearch/client/ESClient.java
index 40655776..fbc562a5 100644
--- a/com.creditease.uav.elasticsearch.client/src/main/java/com/creditease/uav/elasticsearch/client/ESClient.java
+++ b/com.creditease.uav.elasticsearch.client/src/main/java/com/creditease/uav/elasticsearch/client/ESClient.java
@@ -27,7 +27,7 @@
import java.util.Map;
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse;
-import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
+import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
@@ -111,11 +111,24 @@ public boolean existIndex(String index) {
*
* @param index
* @return
+ * @throws IOException
*/
- public boolean creatIndex(String index) {
+ public boolean creatIndex(String index) throws IOException {
+
+ return creatIndex(index, null, null, null);
+ }
+
+ public boolean creatIndex(String index, String type, Map
set,
+ Map> mapping) throws IOException {
- CreateIndexRequest cir = new CreateIndexRequest(index);
- CreateIndexResponse resp = client.admin().indices().create(cir).actionGet();
+ CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(index);
+ if (type != null && mapping != null) {
+ createIndexRequestBuilder.addMapping(type, createMapping(type, mapping));
+ }
+ if (set != null) {
+ createIndexRequestBuilder.setSettings(createSetting(set));
+ }
+ CreateIndexResponse resp = createIndexRequestBuilder.execute().actionGet();
if (resp.isAcknowledged()) {
return true;
@@ -124,6 +137,42 @@ public boolean creatIndex(String index) {
return false;
}
+ private Settings createSetting(Map set) {
+
+ Settings settings = Settings.builder().put(set).build();
+
+ return settings;
+ }
+
+ private XContentBuilder createMapping(String type, Map> properties) throws IOException {
+
+ XContentBuilder mapping;
+
+ mapping = jsonBuilder().startObject().startObject(type);
+
+ mapping = mapping.startObject("properties");
+
+ for (String key : properties.keySet()) {
+ mapping = mapping.startObject(key);
+
+ Map fv = properties.get(key);
+
+ for (String field : fv.keySet()) {
+ mapping = mapping.field(field, fv.get(field));
+ }
+
+ mapping = mapping.endObject();
+ }
+
+ mapping = mapping.endObject();
+
+ mapping = mapping.endObject();
+
+ mapping = mapping.endObject();
+
+ return mapping;
+ }
+
/**
* existType
*
@@ -173,29 +222,7 @@ public boolean updateIndexSetting(String index, Map set) {
public boolean setIndexTypeMapping(String index, String type, Map> properties)
throws IOException {
- XContentBuilder mapping;
-
- mapping = jsonBuilder().startObject();
-
- mapping = mapping.startObject("properties");
-
- for (String key : properties.keySet()) {
- mapping = mapping.startObject(key);
-
- Map fv = properties.get(key);
-
- for (String field : fv.keySet()) {
- mapping = mapping.field(field, fv.get(field));
- }
-
- mapping = mapping.endObject();
- }
-
- mapping = mapping.endObject();
-
- mapping = mapping.endObject();
-
- PutMappingRequest pmp = Requests.putMappingRequest(index).type(type).source(mapping);
+ PutMappingRequest pmp = Requests.putMappingRequest(index).type(type).source(createMapping(type, properties));
PutMappingResponse resp = client.admin().indices().putMapping(pmp).actionGet();
return resp.isAcknowledged();
diff --git a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/healthmanager/messaging/AbstractMessageHandler.java b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/healthmanager/messaging/AbstractMessageHandler.java
index 19fac22d..9fe54b54 100644
--- a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/healthmanager/messaging/AbstractMessageHandler.java
+++ b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/healthmanager/messaging/AbstractMessageHandler.java
@@ -79,8 +79,16 @@ public void handle(Message msg) {
// pre insert to process DataStoreMsg
preInsert(dsMsg);
- // do insert
- boolean insertR = store.doInsert(dsMsg);
+ boolean insertR = false;
+
+ try {
+ // do insert
+ insertR = store.doInsert(dsMsg);
+
+ }
+ catch (Exception e) {
+ log.err(this, "DataStore[" + msgKey + "] INSERT DATA FAIL!", e);
+ }
if (log.isDebugEnable()) {
diff --git a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/NotifyStrategy.java b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/NotifyStrategy.java
index 147218cc..b8d163ef 100644
--- a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/NotifyStrategy.java
+++ b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/NotifyStrategy.java
@@ -29,6 +29,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import com.alibaba.fastjson.JSONArray;
import com.creditease.agent.helpers.DateTimeHelper;
import com.creditease.agent.helpers.EncodeHelper;
import com.creditease.agent.helpers.JSONHelper;
@@ -282,7 +283,9 @@ protected static class Expression {
private long range = 0;
private String func;
private float sampling = 1;
-
+ private String downsample;
+ private Boolean[] weekdayLimit=new Boolean[] {true,true,true,true,true,true,true};
+
private Set matchArgExpr = new HashSet();
private long time_from;
@@ -291,7 +294,11 @@ protected static class Expression {
private int unit;
private String upperLimit;
private String lowerLimit;
-
+ private String time_end;
+ private String time_start;
+ private String day_start;
+ private String day_end;
+
public Expression(String exprStr) {
for (String op : OPERATORS) {
if (exprStr.contains(op)) {
@@ -331,6 +338,19 @@ public Expression(Map cond) {
this.time_to = DateTimeHelper
.dateFormat(DateTimeHelper.getToday("yyyy-MM-dd") + " " + cond.get("time_to"), "yyyy-MM-dd HH:mm")
.getTime();
+
+ this.time_start=(String) cond.get("time_start");
+
+ this.time_end= (String) cond.get("time_end");
+
+ this.day_start=(String) cond.get("day_start");
+
+ this.day_end= (String) cond.get("day_end");
+
+ if(cond.containsKey("weekdayLimit")) {
+ ((JSONArray)cond.get("weekdayLimit")).toArray(this.weekdayLimit);
+ }
+
if (cond.get("interval") != null) {
long interval = Long.parseLong((String) cond.get("interval"));
switch (unit) {
@@ -350,6 +370,7 @@ public Expression(Map cond) {
this.upperLimit = (String) cond.get("upperLimit");
this.lowerLimit = (String) cond.get("lowerLimit");
this.func = (String) cond.get("aggr");
+ this.downsample=(String) cond.get("downsample");
this.type = Type.TIMER;
}
@@ -469,6 +490,36 @@ public void setIdx(int idx) {
this.idx = idx;
}
+
+ public String getTime_end() {
+
+ return time_end;
+ }
+
+ public String getTime_start() {
+
+ return time_start;
+ }
+
+ public String getDownsample() {
+
+ return downsample;
+ }
+
+ public String getDay_start() {
+
+ return day_start;
+ }
+
+ public String getDay_end() {
+
+ return day_end;
+ }
+
+ public Boolean[] getWeekdayLimit() {
+
+ return weekdayLimit;
+ }
}
diff --git a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/StrategyJudgement.java b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/StrategyJudgement.java
index 78542f67..3615fb7c 100644
--- a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/StrategyJudgement.java
+++ b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/StrategyJudgement.java
@@ -57,12 +57,30 @@ public class StrategyJudgement extends AbstractComponent {
readable.put("all-max", "最大");
readable.put("all-min", "最小");
readable.put("all-sum", "总和");
+ readable.put("all-count", "计数");
+ readable.put("all-dev", "标准差");
+ readable.put("all-first", "开始");
+ readable.put("all-last", "末尾");
+ readable.put("all-p50", "50th百分位数");
+ readable.put("all-p75", "75th百分位数");
+ readable.put("all-p90", "90th百分位数");
+ readable.put("all-p95", "95th百分位数");
+ readable.put("all-p99", "99th百分位数");
+ readable.put("all-p999", "999th百分位数");
+
readable.put("avg", "平均");
readable.put("max", "最大");
readable.put("min", "最小");
readable.put("sum", "总和");
readable.put("diff", "差");
readable.put("count", "计数");
+ readable.put("dev", "标准差");
+ readable.put("p50", "50th百分位数");
+ readable.put("p75", "75th百分位数");
+ readable.put("p90", "90th百分位数");
+ readable.put("p95", "95th百分位数");
+ readable.put("p99", "99th百分位数");
+ readable.put("p999", "999th百分位数");
}
private CacheManager cm;
@@ -248,10 +266,14 @@ private void judgeTimerExpression(ConditionResult cr, NotifyStrategy.Expression
if (judgeResult == null) {
judgeResult = new HashMap();
judgeResult.put("fire", false);
+ }else {
+ log.debug(this, "judgeTimerExpression judgeResult:" + JSONHelper.toString(judgeResult));
}
+ Map args = slice.getArgs();
+
// if the judge is called by slice stream, just return the last result
- if (slice.getKey().indexOf('@') > -1) {
+ if (args == null || !"timer".equals(args.get("creater"))) {
if (judgeResult.get("time_to") != null) {
Date date = DateTimeHelper.dateFormat(String.valueOf(judgeResult.get("time_to")), "yyyy-MM-dd HH:mm");
// if the time is not the time expr's judge time,return false
@@ -275,12 +297,66 @@ && isOverdue(DateTimeHelper
}
else if (timeMap != null) {
caculateJudgeResult(timeMap, judgeResult, slice.getKey(), expr, cr);
+
+ if((Boolean) judgeResult.get("fire")) {
+ //add detail info
+ addDetail(timeMap,slice,expr);
+ }
}
- }
+ }
cr.addTimerExprResult((Boolean) judgeResult.get("fire"), expr, judgeResult);
}
+
+ private void addDetail(Map timeMap, Slice slice, Expression expr) {
+
+
+ Map args=slice.getArgs();
+
+ String metric=expr.getArg();
+
+ if(args.containsKey("currentDetailValue_"+metric)) {
+ return;
+ }
+
+ Map currentDetailValue = queryDetailValue(slice.getKey(),expr,timeMap.get("time_from"),timeMap.get("time_to"));
+
+ Map lastDetailValue = queryDetailValue(slice.getKey(),expr,timeMap.get("last_time_from"),timeMap.get("last_time_to"));
+
+ args.put("currentDetailValue_"+metric, currentDetailValue);
+
+ args.put("lastDetailValue_"+metric, lastDetailValue);
+ }
+
+ @SuppressWarnings("rawtypes")
+ private Map queryDetailValue(String instance, Expression expr, Long startTime, Long endTime) {
+
+ Map detail = new LinkedHashMap();
+
+ String data = buildQueryJSON(instance,expr,startTime,endTime,true);
+
+ List