return query dsl after search error
This commit is contained in:
parent
eaaf44bd7a
commit
ef3aa89a9c
|
@ -56,14 +56,6 @@ func (engine *Engine) GenerateQuery(rule *alerting.Rule, filterParam *alerting.F
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(filter) > 0 {
|
|
||||||
basicAggs = util.MapStr{
|
|
||||||
"filter_agg": util.MapStr{
|
|
||||||
"filter": filter,
|
|
||||||
"aggs": basicAggs,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
targetESVersion := elastic.GetMetadata(rule.Resource.ID).Config.Version
|
targetESVersion := elastic.GetMetadata(rule.Resource.ID).Config.Version
|
||||||
intervalField, err := elastic.GetDateHistogramIntervalField(targetESVersion)
|
intervalField, err := elastic.GetDateHistogramIntervalField(targetESVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -74,11 +66,22 @@ func (engine *Engine) GenerateQuery(rule *alerting.Rule, filterParam *alerting.F
|
||||||
periodInterval = filterParam.BucketSize
|
periodInterval = filterParam.BucketSize
|
||||||
}
|
}
|
||||||
timeAggs := util.MapStr{
|
timeAggs := util.MapStr{
|
||||||
|
"time_buckets": util.MapStr{
|
||||||
"date_histogram": util.MapStr{
|
"date_histogram": util.MapStr{
|
||||||
"field": rule.Resource.TimeField,
|
"field": rule.Resource.TimeField,
|
||||||
intervalField: periodInterval,
|
intervalField: periodInterval,
|
||||||
},
|
},
|
||||||
"aggs": basicAggs,
|
"aggs": basicAggs,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(filter) > 0 {
|
||||||
|
timeAggs = util.MapStr{
|
||||||
|
"filter_agg": util.MapStr{
|
||||||
|
"filter": filter,
|
||||||
|
"aggs": timeAggs,
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var rootAggs util.MapStr
|
var rootAggs util.MapStr
|
||||||
groups := rule.Metrics.Items[0].Group
|
groups := rule.Metrics.Items[0].Group
|
||||||
|
@ -103,9 +106,7 @@ func (engine *Engine) GenerateQuery(rule *alerting.Rule, filterParam *alerting.F
|
||||||
groupID: lastGroupAgg,
|
groupID: lastGroupAgg,
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
groupAgg["aggs"] = util.MapStr{
|
groupAgg["aggs"] = timeAggs
|
||||||
"time_buckets": timeAggs,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
lastGroupAgg = groupAgg
|
lastGroupAgg = groupAgg
|
||||||
}
|
}
|
||||||
|
@ -113,9 +114,7 @@ func (engine *Engine) GenerateQuery(rule *alerting.Rule, filterParam *alerting.F
|
||||||
util.GetUUID(): lastGroupAgg,
|
util.GetUUID(): lastGroupAgg,
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
rootAggs = util.MapStr{
|
rootAggs = timeAggs
|
||||||
"time_buckets": timeAggs,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return util.MapStr{
|
return util.MapStr{
|
||||||
|
@ -310,8 +309,8 @@ func (engine *Engine) generateTimeFilter(rule *alerting.Rule, filterParam *alert
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
timeStart = time.Now().Add(-duration).Format(time.RFC3339Nano)
|
timeStart = time.Now().Add(-duration).UnixMilli() //.Format(time.RFC3339Nano)
|
||||||
timeEnd = time.Now().Format(time.RFC3339Nano)
|
timeEnd = time.Now().UnixMilli()
|
||||||
}
|
}
|
||||||
|
|
||||||
timeQuery := util.MapStr{
|
timeQuery := util.MapStr{
|
||||||
|
@ -397,16 +396,42 @@ func (engine *Engine) ExecuteQuery(rule *alerting.Rule, filterParam *alerting.Fi
|
||||||
queryResult.Nodata = true
|
queryResult.Nodata = true
|
||||||
}
|
}
|
||||||
if searchRes.StatusCode != 200 {
|
if searchRes.StatusCode != 200 {
|
||||||
return nil, fmt.Errorf("search error: %s", string(searchRes.RawResult.Body))
|
return queryResult, fmt.Errorf("search error: %s", string(searchRes.RawResult.Body))
|
||||||
}
|
}
|
||||||
queryResult.Raw = string(searchRes.RawResult.Body)
|
queryResult.Raw = string(searchRes.RawResult.Body)
|
||||||
searchResult := map[string]interface{}{}
|
searchResult := map[string]interface{}{}
|
||||||
err = util.FromJSONBytes(searchRes.RawResult.Body, &searchResult)
|
err = util.FromJSONBytes(searchRes.RawResult.Body, &searchResult)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return queryResult, err
|
||||||
}
|
}
|
||||||
metricData := []alerting.MetricData{}
|
metricData := []alerting.MetricData{}
|
||||||
collectMetricData(searchResult["aggregations"], "", &metricData)
|
collectMetricData(searchResult["aggregations"], "", &metricData)
|
||||||
|
//将 rate 求导数据 除以 bucket size (单位 /s)
|
||||||
|
//statisticM := map[string] string{}
|
||||||
|
//for _, mi := range rule.Metrics.Items {
|
||||||
|
// statisticM[mi.Name] = mi.Statistic
|
||||||
|
//}
|
||||||
|
//var periodInterval = rule.Metrics.PeriodInterval
|
||||||
|
//if filterParam != nil && filterParam.BucketSize != "" {
|
||||||
|
// periodInterval = filterParam.BucketSize
|
||||||
|
//}
|
||||||
|
//interval, err := time.ParseDuration(periodInterval)
|
||||||
|
//if err != nil {
|
||||||
|
// log.Error(err)
|
||||||
|
//}
|
||||||
|
//for i, _ := range metricData {
|
||||||
|
// for k, d := range metricData[i].Data {
|
||||||
|
// if statisticM[k] == "rate" {
|
||||||
|
// for _, td := range d {
|
||||||
|
// if len(td) > 1 {
|
||||||
|
// if v, ok := td[1].(float64); ok {
|
||||||
|
// td[1] = v / interval.Seconds()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
queryResult.MetricData = metricData
|
queryResult.MetricData = metricData
|
||||||
return queryResult, nil
|
return queryResult, nil
|
||||||
}
|
}
|
||||||
|
@ -960,39 +985,39 @@ func collectMetricData(agg interface{}, groupValues string, metricData *[]alerti
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
//has filter
|
//has filter
|
||||||
if k == "filter_agg" {
|
//if k == "filter_agg" {
|
||||||
if filterM, ok := v.(map[string]interface{}); ok {
|
// if filterM, ok := v.(map[string]interface{}); ok {
|
||||||
for fk, fv := range filterM {
|
// for fk, fv := range filterM {
|
||||||
if fk == "doc_count" {
|
// if fk == "doc_count" {
|
||||||
continue
|
// continue
|
||||||
}
|
// }
|
||||||
if vm, ok := fv.(map[string]interface{}); ok {
|
// if vm, ok := fv.(map[string]interface{}); ok {
|
||||||
if metricVal, ok := vm["value"]; ok {
|
// if metricVal, ok := vm["value"]; ok {
|
||||||
md.Data[fk] = append(md.Data[fk], alerting.TimeMetricData{bkM["key"], metricVal})
|
// md.Data[fk] = append(md.Data[fk], alerting.TimeMetricData{bkM["key"], metricVal})
|
||||||
}else{
|
// }else{
|
||||||
//percentiles agg type
|
// //percentiles agg type
|
||||||
switch vm["values"].(type) {
|
// switch vm["values"].(type) {
|
||||||
case []interface{}:
|
// case []interface{}:
|
||||||
for _, val := range vm["values"].([]interface{}) {
|
// for _, val := range vm["values"].([]interface{}) {
|
||||||
if valM, ok := val.(map[string]interface{}); ok {
|
// if valM, ok := val.(map[string]interface{}); ok {
|
||||||
md.Data[fk] = append(md.Data[fk], alerting.TimeMetricData{bkM["key"], valM["value"]})
|
// md.Data[fk] = append(md.Data[fk], alerting.TimeMetricData{bkM["key"], valM["value"]})
|
||||||
}
|
// }
|
||||||
break
|
// break
|
||||||
}
|
// }
|
||||||
case map[string]interface{}:
|
// case map[string]interface{}:
|
||||||
for _, val := range vm["values"].(map[string]interface{}) {
|
// for _, val := range vm["values"].(map[string]interface{}) {
|
||||||
md.Data[fk] = append(md.Data[fk], alerting.TimeMetricData{bkM["key"], val})
|
// md.Data[fk] = append(md.Data[fk], alerting.TimeMetricData{bkM["key"], val})
|
||||||
break
|
// break
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
continue
|
// continue
|
||||||
}
|
//}
|
||||||
if vm, ok := v.(map[string]interface{}); ok {
|
if vm, ok := v.(map[string]interface{}); ok {
|
||||||
if metricVal, ok := vm["value"]; ok {
|
if metricVal, ok := vm["value"]; ok {
|
||||||
md.Data[k] = append(md.Data[k], alerting.TimeMetricData{bkM["key"], metricVal})
|
md.Data[k] = append(md.Data[k], alerting.TimeMetricData{bkM["key"], metricVal})
|
||||||
|
@ -1038,10 +1063,15 @@ func collectMetricData(agg interface{}, groupValues string, metricData *[]alerti
|
||||||
if groupValues != "" {
|
if groupValues != "" {
|
||||||
newGroupValues = fmt.Sprintf("%s*%s", groupValues, currentGroup)
|
newGroupValues = fmt.Sprintf("%s*%s", groupValues, currentGroup)
|
||||||
}
|
}
|
||||||
|
if filterAgg, ok := bkVal["filter_agg"].(map[string]interface{}); ok {
|
||||||
|
collectMetricData(filterAgg, newGroupValues, metricData)
|
||||||
|
}else{
|
||||||
collectMetricData(bk, newGroupValues, metricData)
|
collectMetricData(bk, newGroupValues, metricData)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
|
Loading…
Reference in New Issue