成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

告警平臺2.0——仿出強大

數(shù)據(jù)庫
為了提升告警事件的管理效率,避免頻繁查詢、更新數(shù)據(jù)庫,當產(chǎn)生告警事件后,會將其存入Redis,告警事件更新會同步更新Redis中的數(shù)據(jù)。同時,后端會有一個常駐的攜程,獲取Redis中的告警事件,評估是否需要發(fā)送到協(xié)作空間。

在《告警平臺1.0》中,我們實現(xiàn)了告警平臺,可以實現(xiàn)納管通過AlertManager推送的告警信息,然后進行靈活的告警通知發(fā)送。

在這個基礎(chǔ)上,我們可以實現(xiàn)對告警進行認領(lǐng)、屏蔽、關(guān)閉等操作,也能在移動端進行操作。

但是,這個方案現(xiàn)在只能被動的接受告警,對于告警規(guī)則還是需要到Prometheus中去配置,當告警規(guī)則較多的情況下,配置分類比較麻煩,所以在想:能不能在現(xiàn)有平臺上增加規(guī)則配置監(jiān)控功能?

所以,我又到老朋友《快貓Flashcat》上進行學習,它們除了有故障管理,也有告警管理,可以實現(xiàn)監(jiān)控告警一體化。

而且,它支持的數(shù)據(jù)源還比較多,如下:

當然,我不需要實現(xiàn)這么多,只要把常用的Prometheus和Elasticsearch實現(xiàn)即可。

邏輯梳理

相對來說,監(jiān)控規(guī)則的實現(xiàn)邏輯還是比較清晰,如下:

本質(zhì)上就是后臺系統(tǒng)周期性的在數(shù)據(jù)庫(Prometheus、Elasticsearch)中通過規(guī)則進行查詢,當異常條件滿足后,就生成對應(yīng)的告警事件,然后將告警事件分發(fā)到協(xié)作空間。

另外,為了提升告警事件的管理效率,避免頻繁查詢、更新數(shù)據(jù)庫,當產(chǎn)生告警事件后,會將其存入Redis,告警事件更新會同步更新Redis中的數(shù)據(jù)。同時,后端會有一個常駐的攜程,獲取Redis中的告警事件,評估是否需要發(fā)送到協(xié)作空間。

實現(xiàn)效果

為了便于規(guī)則的管理,我們建立了分組,這里的分組沒有和協(xié)作空間建立必然的聯(lián)系,只是為了便于管理告警規(guī)則。

告警規(guī)則就會按組進行分類展示

創(chuàng)建規(guī)則,目前支持創(chuàng)建Prometheus和Elasticsearch規(guī)則。

創(chuàng)建Prometheus規(guī)則。

我們可以:

  • 為規(guī)則添加附加標簽,比如為了按標簽進行告警發(fā)送的時候添加biz=a的標簽。
  • 定義具體的PromQL。
  • 指定告警評估表達式,目前支持嚴重、警告、通知三個表達式。
  • 可以配置告警持續(xù)時間,只有當告警事件超過持續(xù)時間,才會產(chǎn)生真正的告警事件。
  • 可以配置通知詳情,便于人員閱讀。
  • 可以配置通知渠道,將事件推送到某個協(xié)作空間。

當告警產(chǎn)生后就會發(fā)送到對應(yīng)的渠道,比如發(fā)送到企微的消息如下:

創(chuàng)建Elasticsearch規(guī)則。

主要配置的地方:

  • 指定數(shù)據(jù)源:需要配置告警的數(shù)據(jù)源地址
  • 指定索引:針對哪個索引做規(guī)則
  • 指定篩選字段:通過這些字段進行過濾日志
  • 指定標注字段:在發(fā)送告警通知的時候會將該部分發(fā)送到群里,便于運維開發(fā)提取關(guān)鍵信息

其中,添加標注是為了在展示需要的告警信息,比如:

另外,分組評估用戶將告警信息進行分組發(fā)送,觸發(fā)條件用于判斷是不是發(fā)送告警通知。

當告警事件產(chǎn)生,就會發(fā)送一條告警通知,如下:

日志監(jiān)控的告警邏輯也比較簡單,如下:

代碼實現(xiàn)

對于Prometheus監(jiān)控規(guī)則,定時從Prometheus時序數(shù)據(jù)庫中查詢值,然后和配置的策略進行比較,如果滿足要求則產(chǎn)生告警事件。

// 從時序數(shù)據(jù)庫中查詢數(shù)據(jù)
resQuery, err = cli.(global.PrometheusProvider).Query(rule.PrometheusConfig.PromQL)

// 然后將值進行比較
for _, v: = range resQuery {
    for _, ruleExpr: = range rule.PrometheusConfig.Rules {
        // 去除空格
        cleanedExpr: = strings.ReplaceAll(ruleExpr.Expr, " ", "")
        re: = regexp.MustCompile(`([^\d]+)(\d+)`)
        matches: = re.FindStringSubmatch(cleanedExpr)
        if len(matches) < 2 {
            continue
        }
        t,
        _: = strconv.ParseFloat(matches[2], 64)

        option: = alarmCenter.EvalCondition {
            Operator: matches[1],
            QueryValue: v.Value,
            ExpectedValue: t,
        }

        // 進行比較,當滿足條件后生成事件
        if ok := alarmCenter.EvalCondition(option);ok{
         event := alarmCenter.BuildAlertEvent(rule)
         alarmCenter.SaveAlertEvent(event)
        }
    }
}

對于Elasticsearch監(jiān)控規(guī)則,定時從Elasticsearch數(shù)據(jù)庫中查詢滿足日志條數(shù),當滿足告警條件后生成告警事件。

// 從ES中查詢值
curAt: = time.Now()
startsAt: = utils.ParserDuration(curAt, int(rule.ElasticsearchConfig.Scope), "m")
queryOptions: = provider.LogQueryOptions {
    ElasticSearch: provider.Elasticsearch {
        Index: rule.ElasticsearchConfig.Index,
        QueryFilter: rule.ElasticsearchConfig.Filter,
        Annotations: rule.ElasticsearchConfig.Annotations,
        GroupEval: rule.ElasticsearchConfig.GroupEval,
    },
    StartAt: utils.FormatTimeToUTC(startsAt.Unix()),
    EndAt: utils.FormatTimeToUTC(curAt.Unix()),
}
queryRes, count, err = cli.(global.ElasticsearchProvider).Query(queryOptions)

option := alarmCenter.EvalCondition {
    Operator: rule.ElasticsearchConfig.TriggerCondition.Operator,
    QueryValue: float64(count),
    ExpectedValue: rule.ElasticsearchConfig.TriggerCondition.ExpectedValue,
}
// 進行比較,當滿足條件后生成事件
if ok := alarmCenter.EvalCondition(option);ok{
    event := alarmCenter.BuildAlertEvent(rule)
    alarmCenter.SaveAlertEvent(event)
}

條件評估的代碼如下:

func EvalCondition(ec alarmCenter.EvalCondition) bool {
    // 使用 map 存儲操作符對應(yīng)的比較函數(shù)
    operatorMap := map[string]func(float64, float64) bool{
        ">":  func(a, b float64) bool { return a > b },
        ">=": func(a, b float64) bool { return a >= b },
        "<":  func(a, b float64) bool { return a < b },
        "<=": func(a, b float64) bool { return a <= b },
        "==": func(a, b float64) bool { return a == b },
        "=":  func(a, b float64) bool { return a == b },
        "!=": func(a, b float64) bool { return a != b },
    }

    // 查找并執(zhí)行對應(yīng)的比較函數(shù)
    if compareFunc, exists := operatorMap[ec.Operator]; exists {
        return compareFunc(ec.QueryValue, ec.ExpectedValue)
    }

    global.GVA_LOG.Error(fmt.Sprintf("無效的評估條件,%s:%s:%f", ec.Type, ec.Operator, ec.ExpectedValue))
    return false
}

告警通知的邏輯還是不變,當監(jiān)聽到告警事件后,進行對應(yīng)的告警通知。

責任編輯:姜華 來源: 運維開發(fā)故事
相關(guān)推薦

2016-04-24 21:40:53

惠普

2009-07-29 11:46:22

asp.net1.1

2010-03-02 10:26:32

Android系統(tǒng)平臺

2023-08-16 14:51:35

2021-07-08 18:10:03

2021-07-27 05:54:25

數(shù)據(jù)平臺業(yè)務(wù)決策數(shù)據(jù)

2009-04-02 12:49:15

NehalemIntel服務(wù)器

2010-03-04 11:05:10

Android手機平臺

2023-11-13 08:15:36

2020-12-30 05:34:25

監(jiān)控PrometheusGrafana

2012-10-07 15:11:48

釣魚網(wǎng)站假冒網(wǎng)站360安全中心

2019-12-02 14:30:59

服務(wù)器SNMP網(wǎng)絡(luò)協(xié)議

2010-09-15 09:48:27

WebQQ 2.0WebOS跨平臺應(yīng)用

2018-01-23 13:59:30

滴滴出行

2013-08-28 17:35:35

監(jiān)控故障告警雅虎

2021-01-19 15:46:58

SOC/安全運營/調(diào)查

2015-09-14 17:08:02

IBM大型主機LinuxONE

2014-07-24 09:08:07

大數(shù)據(jù)平臺架構(gòu)

2013-08-08 10:52:38

App平臺化超級App開放平臺

2013-03-19 10:17:55

虛擬化虛擬化平臺
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产999精品久久久久久 | 久久精品电影 | 一级免费a | 日韩精品一区二区在线观看 | 亚洲综合在线一区二区 | 一级毛片在线播放 | 欧美成年人 | 亚洲成a| 久久精品一| 欧洲在线视频 | 成人精品毛片国产亚洲av十九禁 | 亚洲精品一区在线 | 拍拍无遮挡人做人爱视频免费观看 | 综合激情网 | 久久另类视频 | 久久黄视频 | 国产午夜精品一区二区三区四区 | 99精品亚洲国产精品久久不卡 | 黄色片视频免费 | 中文字幕国产在线 | 中文字幕在线播放第一页 | 黄色三级免费网站 | 国产亚洲成av人在线观看导航 | 国产精品区一区二区三 | 亚洲一区二区在线视频 | 中文字幕在线三区 | 欧美激情亚洲 | 国产欧美在线观看 | 久久亚| 日韩精品一区二区三区 | 天天看夜夜 | 一区二区欧美在线 | 欧美午夜精品久久久久久浪潮 | 欧美精品一区二区三区四区 在线 | 中文字幕精品视频 | 欧美精品一区二区在线观看 | 美日韩免费视频 | 91香蕉| 国产乱码精品一品二品 | 国产做爰| 视频在线一区二区 |