76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package cache
|
||
|
||
import (
|
||
"sync"
|
||
|
||
"github.com/didi/nightingale/v5/models"
|
||
)
|
||
|
||
type AlertRulesByMetricCache struct {
|
||
sync.RWMutex
|
||
Data map[string][]*models.AlertRule // key是metric,便于后续检索
|
||
MaxUpdateTs int64 // 从数据库拿到的最大update_at
|
||
RuleNum int64 // 从数据库中统计到的行数
|
||
LastSync int64 // 保存上次全量同步时间
|
||
}
|
||
|
||
var (
|
||
AlertRulesByMetric = &AlertRulesByMetricCache{Data: make(map[string][]*models.AlertRule)}
|
||
)
|
||
|
||
func (a *AlertRulesByMetricCache) GetBy(instance string) []*models.AlertRule {
|
||
a.RLock()
|
||
defer a.RUnlock()
|
||
|
||
return a.Data[instance]
|
||
}
|
||
|
||
func (a *AlertRulesByMetricCache) SetAll(alertRulesMap map[string][]*models.AlertRule, lastUpdateTs, ruleNum, lastSync int64) {
|
||
a.Lock()
|
||
defer a.Unlock()
|
||
|
||
a.Data = alertRulesMap
|
||
a.MaxUpdateTs = lastUpdateTs
|
||
a.RuleNum = ruleNum
|
||
a.LastSync = lastSync
|
||
}
|
||
|
||
type AlertRulesTotalCache struct {
|
||
sync.RWMutex
|
||
Data map[int64]*models.AlertRule
|
||
}
|
||
|
||
var AlertRules = &AlertRulesTotalCache{Data: make(map[int64]*models.AlertRule)}
|
||
|
||
func (a *AlertRulesTotalCache) Get(id int64) (*models.AlertRule, bool) {
|
||
a.RLock()
|
||
defer a.RUnlock()
|
||
|
||
alertRule, exists := a.Data[id]
|
||
return alertRule, exists
|
||
}
|
||
|
||
func (a *AlertRulesTotalCache) SetAll(alertRulesMap map[int64]*models.AlertRule) {
|
||
a.Lock()
|
||
defer a.Unlock()
|
||
|
||
a.Data = alertRulesMap
|
||
}
|
||
|
||
// 获取所有PULL型规则的列表
|
||
func (a *AlertRulesTotalCache) Pulls() []*models.AlertRule {
|
||
a.RLock()
|
||
defer a.RUnlock()
|
||
|
||
cnt := len(a.Data)
|
||
ret := make([]*models.AlertRule, 0, cnt)
|
||
|
||
for _, rule := range a.Data {
|
||
if rule.Type == models.PULL {
|
||
ret = append(ret, rule)
|
||
}
|
||
}
|
||
|
||
return ret
|
||
}
|