博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
prometheus源码阅读 - 规则管理与告警
阅读量:5860 次
发布时间:2019-06-19

本文共 2702 字,大约阅读时间需要 9 分钟。

hot3.png

初始化

rules/manager.go

ruleManager := rules.NewManager(&rules.ManagerOptions{		Appendable:  fanoutStorage,		Notifier:    notifier,		QueryEngine: queryEngine,		Context:     ctx,		ExternalURL: cfg.web.ExternalURL,		Logger:      log.With(logger, "component", "rule manager"),	})go ruleManager.Run()

配置

rules/manager.go

func (m *Manager) ApplyConfig(conf *config.Config) error {    var files []string    for _, pat := range conf.RuleFiles {        fs, err := filepath.Glob(pat)        files = append(files, fs...)    }    groups, errs := m.loadGroups(time.Duration(conf.GlobalConfig.EvaluationInterval), files...)    for _, newg := range groups {        go func(newg *Group) {            go func() {                newg.run()            }        }    }}

主要做了如下几件事情:

  1. 列出配置的所有rules文件
  2. 解析rules文件
  3. 按groupName分组
  4. group.Run(),此处会启动定时任务,按照配置的频率evaluation_interval执行告警或者汇总规则

运行规则

运行group

rules/manager.go中的group.Run()运行group

iter := func() {    start := time.Now()	g.Eval(start)}iter()tick := time.NewTicker(g.interval)for {		select {            default:			select {                case <-tick.C:    //按照频率重新运行该group                    iter()            }        }}

运行规则

rules/manager.go中的Eval方法,将循环当前group的所有rule,并执行eval

func (g *Group) Eval(ts time.Time) {     for i, rule := range g.rules {         func(i int, rule Rule) {            vector, err := rule.Eval(g.opts.Context, ts, g.opts.QueryEngine, g.opts.ExternalURL)            if ar, ok := rule.(*AlertingRule); ok {				g.sendAlerts(ar)			}         }(i, rule)     }}

调用rules/alerting.go的Eval()方法,判断是否需要进行alert:

func (r *AlertingRule) Eval(ctx context.Context, ts time.Time, engine *promql.Engine, externalURL *url.URL) (promql.Vector, error) {    res, err := query.Exec(ctx).Vector()   //查询    for _, smpl := range res {        r.active[h] = &Alert{ //缓存alert            ActiveAt:    ts,			State:       StatePending,        }    }     // 调整alert的告警状态    for fp, a := range r.active {        if _, ok := resultFPs[fp]; !ok {            if a.State == StatePending || (!a.ResolvedAt.IsZero() && ts.Sub(a.ResolvedAt) > resolvedRetention) {				delete(r.active, fp)			}			if a.State != StateInactive {				a.State = StateInactive				a.ResolvedAt = ts			}			continue        }        if a.State == StatePending && ts.Sub(a.ActiveAt) >= r.holdDuration {			a.State = StateFiring		}    }}

发送告警

rules/manager.go中的sendAlerts方法 , 最终调用Notifier.Send()方法将alert发送给alertmanager

func (g *Group) sendAlerts(rule *AlertingRule) error {    var alerts []*notifier.Alert    for _, alert := range rule.currentAlerts() {        if alert.State == StatePending {			continue		}       }    if len(alerts) > 0 {		g.opts.Notifier.Send(alerts...)	}}

转载于:https://my.oschina.net/sannychan/blog/1596807

你可能感兴趣的文章
《电路分析导论(原书第12版)》一3.4 温度对电阻的影响
查看>>
《51单片机应用开发从入门到精通》——2.1 简单点亮发光二极管实例
查看>>
苹果 watchOS 3.2 首个测试版:剧场模式、SiriKit
查看>>
《途客圈创业记:不疯魔,不成活》一一2.2 种子融资
查看>>
《 测试反模式:有效规避常见的92种测试陷阱》——1.2 测试和V模型
查看>>
QSS编辑预览工具
查看>>
C++命令模式
查看>>
《Adobe InDesign CC经典教程》—第2课2.5节使用样式
查看>>
侣信 2.1.0 版本发布,即时通讯工具
查看>>
《极客与团队》一HRT实战
查看>>
你知道 Python 这五个有趣的彩蛋吗?
查看>>
《Windows Server 2012 Hyper-V虚拟化管理实践》——1.2 Hyper-V安装前后的变化
查看>>
美国和英国等地面临 IT “人才危机”
查看>>
Duo 实验室公布 Android 设备安全报告
查看>>
《Adobe Audition CS6中文版经典教程》——1.4 用Audition(Mac或Windows)测试输入和输出...
查看>>
成为高级程序员的 10 个步骤
查看>>
Chrome 与 Firefox 警告用户不要在非 HTTPS 网站提交信息
查看>>
互联网 DBA 需要做那些事
查看>>
多仓库,多物流智能计算——拓略跨境电商商城
查看>>
《微软System Center 2012 R2私有云部署实战》——第二章 微软私有云选型2.1 服务器选型...
查看>>