前篇说到告警写入后被分发到dispatcher
的aggrGroupsPerRoute
中的aggrGroup
里,然后每个aggrGroup
会启动一个自己的goroutine
按照group_wait
和group_interval
两种频率来定时调用dispatcher.stage.Exec
方法来处理告警,实际上dispatcher.stage
中存储的就是由多种处理函数编排成的一个告警处理流水线,也就是架构图中的下面这部分:
pipeline
的构建是在main
函数中创建dispatcher
的时候,很容易找到,这里不赘述了,我们看看 pipeline 是怎样定义自己的 Exec 方法的,
1 | golang复制代码// pipeline 就是 RoutingStage 类型, |
到这里总结一下,Dispatcher
下的每个aggGroup
先按照自己的receiver.Name
通过调用RoutingStage.Exec
中找到对应的MultiStage
,然后顺序调用其中的每个Stage.Exec
,接下来看下Stage
的设计:
1 | golang复制代码type Stage interface { |
Stage
这里是一个只约定了Exec
函数的接口,所以任何一个对象只要定义了相同签名的Exec
函数就是Stage
类型,你会在源码中很容找到各种Stage
,然后在对应的Exec
方法中就知道告警在当前Stage
中会被怎样处理,Exec
的入参数中alerts
表示哪些告警进入这个Stage
,然后出参中的alerts
就是经过当前Stage
处理还剩哪些告警,ctx
可以很方便各个Stage
获取当前流水线上的参数,当然也可以写入参数让后面的Stage
使用。
前面RoutingStage.Exec
和MultiStage.Exec
已经看过了我这里再找几个Stage
看看里面的具体行为:
1 | golang复制代码// 负责并发的执行一些 Stage |
再看看静默和抑制的Stage
1 | golang复制代码type MuteStage struct { |
MuteStage
被用来实现SilenceStage
和InhibitStage
, 它包含了一个 muter
,MuteStage.Exec
最重要的就是调用muter.Mutes
方法,那么muter
就是一个包含Mutes
方法的接口,Silencer
和Inhibitor
实现各自的 Mutes
方法就可以作为MuteStage
,那我们再看看它们各自是怎样实现Mutes
方法的:
1 | golang复制代码// 这个就是 Inhibitor 实现的 Muter 接口 |
到这里,流水线的大致情况就介绍的差不多了,总结一下:
- 先约定
Stage
接口, - 再定义一些控制流程的
Stage
,比如RoutingStage
,MultiStage
,FanoutStage
等 - 然后根据需要定义一些对
alerts
做真正处理的的Stage
,比如InhibitStage
,SilenceStage
,TimeMuteStage
等 - 最后把这些处理
alerts
的Stage
使用流程控制的Stage
进行编排,就成了流水线
本文转载自: 掘金