Skip to content

Commit 890c12f

Browse files
710leoReditiny
andauthored
feat: alert rule query add unit (#2299)
Co-authored-by: Xu Bin <[email protected]>
1 parent 643c6c9 commit 890c12f

File tree

7 files changed

+693
-9
lines changed

7 files changed

+693
-9
lines changed

alert/common/conv.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@ import (
66
"strings"
77

88
"github.com/ccfos/nightingale/v6/models"
9+
"github.com/ccfos/nightingale/v6/pkg/unit"
910
"github.com/prometheus/common/model"
1011
)
1112

1213
type AnomalyPoint struct {
13-
Key string `json:"key"`
14-
Labels model.Metric `json:"labels"`
15-
Timestamp int64 `json:"timestamp"`
16-
Value float64 `json:"value"`
17-
Severity int `json:"severity"`
18-
Triggered bool `json:"triggered"`
19-
Query string `json:"query"`
20-
Values string `json:"values"`
21-
RecoverConfig models.RecoverConfig `json:"recover_config"`
14+
Key string `json:"key"`
15+
Labels model.Metric `json:"labels"`
16+
Timestamp int64 `json:"timestamp"`
17+
Value float64 `json:"value"`
18+
Severity int `json:"severity"`
19+
Triggered bool `json:"triggered"`
20+
Query string `json:"query"`
21+
Values string `json:"values"`
22+
ValuesUnit map[string]unit.FormattedValue `json:"values_unit"`
23+
RecoverConfig models.RecoverConfig `json:"recover_config"`
2224
}
2325

2426
func NewAnomalyPoint(key string, labels map[string]string, ts int64, value float64, severity int) AnomalyPoint {

alert/eval/eval.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/ccfos/nightingale/v6/pkg/hash"
1919
"github.com/ccfos/nightingale/v6/pkg/parser"
2020
promsdk "github.com/ccfos/nightingale/v6/pkg/prom"
21+
"github.com/ccfos/nightingale/v6/pkg/unit"
2122
"github.com/ccfos/nightingale/v6/prom"
2223
"github.com/ccfos/nightingale/v6/tdengine"
2324

@@ -247,7 +248,11 @@ func (arw *AlertRuleWorker) GetPromAnomalyPoint(ruleConfig string) ([]common.Ano
247248
for i := 0; i < len(points); i++ {
248249
points[i].Severity = query.Severity
249250
points[i].Query = promql
251+
points[i].ValuesUnit = map[string]unit.FormattedValue{
252+
"v": unit.ValueFormatter(query.Unit, 2, points[i].Value),
253+
}
250254
}
255+
251256
lst = append(lst, points...)
252257
}
253258
return lst, nil
@@ -471,11 +476,22 @@ func GetAnomalyPoint(ruleId int64, ruleQuery models.RuleQuery, seriesTagIndexes
471476
return points, recoverPoints
472477
}
473478

479+
unitMap := make(map[string]string)
480+
for _, query := range ruleQuery.Queries {
481+
ref, unit, err := GetQueryRefAndUnit(query)
482+
if err != nil {
483+
continue
484+
}
485+
unitMap[ref] = unit
486+
}
487+
474488
for _, trigger := range ruleQuery.Triggers {
475489
// seriesTagIndex 的 key 仅做分组使用,value 为每组 series 的 hash
476490
seriesTagIndex := ProcessJoins(ruleId, trigger, seriesTagIndexes, seriesStore)
477491

478492
for _, seriesHash := range seriesTagIndex {
493+
valuesUnitMap := make(map[string]unit.FormattedValue)
494+
479495
sort.Slice(seriesHash, func(i, j int) bool {
480496
return seriesHash[i] < seriesHash[j]
481497
})
@@ -501,6 +517,10 @@ func GetAnomalyPoint(ruleId int64, ruleQuery models.RuleQuery, seriesTagIndexes
501517
continue
502518
}
503519

520+
if u, exists := unitMap[series.Ref]; exists {
521+
valuesUnitMap[series.Ref] = unit.ValueFormatter(u, 2, v)
522+
}
523+
504524
m["$"+series.Ref] = v
505525
m["$"+series.Ref+"."+series.MetricName()] = v
506526
ts = int64(t)
@@ -529,6 +549,7 @@ func GetAnomalyPoint(ruleId int64, ruleQuery models.RuleQuery, seriesTagIndexes
529549
Triggered: isTriggered,
530550
Query: fmt.Sprintf("query:%+v trigger:%+v", ruleQuery.Queries, trigger),
531551
RecoverConfig: trigger.RecoverConfig,
552+
ValuesUnit: valuesUnitMap,
532553
}
533554

534555
if sample.Query != "" {
@@ -815,3 +836,18 @@ func GetQueryRef(query interface{}) (string, error) {
815836

816837
return refField.String(), nil
817838
}
839+
840+
func GetQueryRefAndUnit(query interface{}) (string, string, error) {
841+
type Query struct {
842+
Ref string `json:"ref"`
843+
Unit string `json:"unit"`
844+
}
845+
846+
queryMap := Query{}
847+
queryBytes, err := json.Marshal(query)
848+
if err != nil {
849+
return "", "", err
850+
}
851+
json.Unmarshal(queryBytes, &queryMap)
852+
return queryMap.Ref, queryMap.Unit, nil
853+
}

alert/process/process.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ func (p *Processor) BuildEvent(anomalyPoint common.AnomalyPoint, from string, no
204204
event.TargetNote = p.targetNote
205205
event.TriggerValue = anomalyPoint.ReadableValue()
206206
event.TriggerValues = anomalyPoint.Values
207+
event.TriggerValuesJson = models.EventTriggerValues{ValuesWithUnit: anomalyPoint.ValuesUnit}
207208
event.TagsJSON = p.tagsArr
208209
event.Tags = strings.Join(p.tagsArr, ",,")
209210
event.IsRecovered = false

models/alert_cur_event.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/ccfos/nightingale/v6/pkg/ctx"
1313
"github.com/ccfos/nightingale/v6/pkg/poster"
1414
"github.com/ccfos/nightingale/v6/pkg/tplx"
15+
"github.com/ccfos/nightingale/v6/pkg/unit"
1516

1617
"github.com/toolkits/pkg/logger"
1718
)
@@ -49,6 +50,7 @@ type AlertCurEvent struct {
4950
TriggerTime int64 `json:"trigger_time"`
5051
TriggerValue string `json:"trigger_value"`
5152
TriggerValues string `json:"trigger_values" gorm:"-"`
53+
TriggerValuesJson EventTriggerValues `json:"trigger_values_json" gorm:"-"`
5254
Tags string `json:"-"` // for db
5355
TagsJSON []string `json:"tags" gorm:"-"` // for fe
5456
TagsMap map[string]string `json:"tags_map" gorm:"-"` // for internal usage
@@ -73,6 +75,10 @@ type AlertCurEvent struct {
7375
ExtraInfoMap []map[string]string `json:"extra_info_map" gorm:"-"`
7476
}
7577

78+
type EventTriggerValues struct {
79+
ValuesWithUnit map[string]unit.FormattedValue `json:"values_with_unit"`
80+
}
81+
7682
func (e *AlertCurEvent) TableName() string {
7783
return "alert_cur_event"
7884
}

models/alert_rule.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ type PromQuery struct {
155155
PromQl string `json:"prom_ql"`
156156
Severity int `json:"severity"`
157157
RecoverConfig RecoverConfig `json:"recover_config"`
158+
Unit string `json:"unit"`
158159
}
159160

160161
type HostTrigger struct {

0 commit comments

Comments
 (0)