Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DiDi
nightingale
提交
9aeeaa19
N
nightingale
项目概览
DiDi
/
nightingale
10 个月 前同步成功
通知
46
Star
7053
Fork
1161
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
nightingale
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
9aeeaa19
编写于
1月 18, 2023
作者:
X
xiaoziv
提交者:
GitHub
1月 18, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor: engine code refactor (#1361)
* engine code refactor Co-authored-by:
N
Yening Qin
<
710leo@gmail.com
>
上级
e6911295
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
40 addition
and
36 deletion
+40
-36
src/server/engine/rule.go
src/server/engine/rule.go
+39
-35
src/server/engine/rule_alert.go
src/server/engine/rule_alert.go
+1
-1
未找到文件。
src/server/engine/rule.go
浏览文件 @
9aeeaa19
...
...
@@ -3,7 +3,6 @@ package engine
import
(
"context"
"fmt"
"strings"
"sync"
"time"
...
...
@@ -12,6 +11,7 @@ import (
"github.com/didi/nightingale/v5/src/server/naming"
)
// RuleContext is the interface for alert rule and record rule
type
RuleContext
interface
{
Key
()
string
Hash
()
string
...
...
@@ -27,15 +27,14 @@ var ruleHolder = &RuleHolder{
externalAlertRules
:
make
(
map
[
string
]
*
AlertRuleContext
),
}
// RuleHolder is the global rule holder
type
RuleHolder
struct
{
externalLock
sync
.
RWMutex
// key: hash
alertRules
map
[
string
]
RuleContext
// key: hash
alertRules
map
[
string
]
RuleContext
recordRules
map
[
string
]
RuleContext
// key: key
// key: key of rule
externalLock
sync
.
RWMutex
externalAlertRules
map
[
string
]
*
AlertRuleContext
}
...
...
@@ -62,31 +61,30 @@ func (rh *RuleHolder) SyncAlertRules() {
if
rule
==
nil
{
continue
}
// 如果 rule 不是通过 prometheus engine 来告警的,则创建为 externalRule
ruleClusters
:=
config
.
ReaderClients
.
Hit
(
rule
.
Cluster
)
if
!
rule
.
IsPrometheusRule
()
{
ruleClusters
:=
strings
.
Fields
(
rule
.
Cluster
)
for
_
,
cluster
:=
range
ruleClusters
{
// hash ring not hit
if
!
naming
.
ClusterHashRing
.
IsHit
(
cluster
,
fmt
.
Sprintf
(
"%d"
,
rule
.
Id
),
config
.
C
.
Heartbeat
.
Endpoint
)
{
continue
}
externalRule
:=
NewAlertRuleContext
(
rule
,
cluster
)
externalAllRules
[
externalRule
.
Key
()]
=
externalRule
}
continue
// 非 Prometheus 的规则, 不支持 $all, 直接从 rule.Cluster 解析
ruleClusters
=
strings
.
Fields
(
rule
.
Cluster
)
}
ruleClusters
:=
config
.
ReaderClients
.
Hit
(
rule
.
Cluster
)
for
_
,
cluster
:=
range
ruleClusters
{
// hash ring not hit
if
!
naming
.
ClusterHashRing
.
IsHit
(
cluster
,
fmt
.
Sprintf
(
"%d"
,
rule
.
Id
),
config
.
C
.
Heartbeat
.
Endpoint
)
{
continue
}
alertRule
:=
NewAlertRuleContext
(
rule
,
cluster
)
alertRules
[
alertRule
.
Hash
()]
=
alertRule
if
rule
.
IsPrometheusRule
()
{
// 正常的告警规则
alertRule
:=
NewAlertRuleContext
(
rule
,
cluster
)
alertRules
[
alertRule
.
Hash
()]
=
alertRule
}
else
{
// 如果 rule 不是通过 prometheus engine 来告警的,则创建为 externalRule
externalRule
:=
NewAlertRuleContext
(
rule
,
cluster
)
externalAllRules
[
externalRule
.
Key
()]
=
externalRule
}
}
}
...
...
@@ -105,19 +103,22 @@ func (rh *RuleHolder) SyncAlertRules() {
}
}
for
hash
,
rule
:=
range
externalAllRules
{
rh
.
externalLock
.
Lock
()
if
_
,
has
:=
rh
.
externalAlertRules
[
hash
];
!
has
{
rule
.
Prepare
()
rh
.
externalAlertRules
[
hash
]
=
rule
rh
.
externalLock
.
Lock
()
for
key
,
rule
:=
range
externalAllRules
{
if
curRule
,
has
:=
rh
.
externalAlertRules
[
key
];
has
{
// rule存在,且hash一致,认为没有变更,这里可以根据需求单独实现一个关联数据更多的hash函数
if
rule
.
Hash
()
==
curRule
.
Hash
()
{
continue
}
}
rh
.
externalLock
.
Unlock
()
// 现有规则中没有rule以及有rule但hash不一致的场景,需要触发rule的update
rule
.
Prepare
()
rh
.
externalAlertRules
[
key
]
=
rule
}
rh
.
externalLock
.
Lock
()
for
hash
:=
range
rh
.
externalAlertRules
{
if
_
,
has
:=
externalAllRules
[
hash
];
!
has
{
delete
(
rh
.
externalAlertRules
,
hash
)
for
key
:=
range
rh
.
externalAlertRules
{
if
_
,
has
:=
externalAllRules
[
key
];
!
has
{
delete
(
rh
.
externalAlertRules
,
key
)
}
}
rh
.
externalLock
.
Unlock
()
...
...
@@ -158,9 +159,12 @@ func (rh *RuleHolder) SyncRecordRules() {
}
func
GetExternalAlertRule
(
cluster
string
,
id
int64
)
(
*
AlertRuleContext
,
bool
)
{
key
:=
fmt
.
Sprintf
(
"alert-%s-%d"
,
cluster
,
id
)
ruleHolder
.
externalLock
.
RLock
()
defer
ruleHolder
.
externalLock
.
RUnlock
()
rule
,
has
:=
ruleHolder
.
externalAlertRules
[
key
]
rule
,
has
:=
ruleHolder
.
externalAlertRules
[
ruleKey
(
cluster
,
id
)
]
return
rule
,
has
}
func
ruleKey
(
cluster
string
,
id
int64
)
string
{
return
fmt
.
Sprintf
(
"alert-%s-%d"
,
cluster
,
id
)
}
src/server/engine/rule_alert.go
浏览文件 @
9aeeaa19
...
...
@@ -40,7 +40,7 @@ func (arc *AlertRuleContext) RuleFromCache() *models.AlertRule {
}
func
(
arc
*
AlertRuleContext
)
Key
()
string
{
return
fmt
.
Sprintf
(
"alert-%s-%d"
,
arc
.
cluster
,
arc
.
rule
.
Id
)
return
ruleKey
(
arc
.
cluster
,
arc
.
rule
.
Id
)
}
func
(
arc
*
AlertRuleContext
)
Hash
()
string
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录