Spring Boot 微服務(wù)應(yīng)用集成Prometheus + Grafana 實(shí)現(xiàn)監(jiān)控告警

前言

關(guān)鍵詞:Prometheus; Grafana; Alertmanager; SpringBoot; SpringBoot Actuator; 監(jiān)控; 告警;

在前一篇Spring Boot Actuator 模塊 詳解:健康檢查滞谢,度量母截,指標(biāo)收集和監(jiān)控中,我們學(xué)習(xí)了 Spring Boot Actuator 模塊的作用、配置和重要端點(diǎn)的介紹盔夜。

我也提到了,我主要目的是想要給我們項(xiàng)目的微服務(wù)應(yīng)用都加上監(jiān)控告警椭微。Spring Boot Actuator的引入只是第一步,在本章中瓢剿,我會(huì)介紹:

  • 如何集成監(jiān)控告警系統(tǒng)Prometheus 和圖形化界面Grafana
  • 如何自定義監(jiān)控指標(biāo),做應(yīng)用監(jiān)控埋點(diǎn)
  • Prometheus 如何集成 Alertmanager 進(jìn)行告警
image.png

理論部分

Prometheus

Prometheus 中文名稱為普羅米修斯,受啟發(fā)于Google 的Brogmon 監(jiān)控系統(tǒng)纺弊,從2012年開始由前Google工程師在Soundcloud 以開源軟件的形式進(jìn)行研發(fā),2016年6月發(fā)布1.0版本犹菱。Prometheus 可以看作是 Google 內(nèi)部監(jiān)控系統(tǒng)Borgmon 的一個(gè)實(shí)現(xiàn)访得。

下圖說明了Prometheus 的體系結(jié)構(gòu)及其部分生態(tài)系統(tǒng)組件。其中 Alertmanager 用于告警搜骡,Grafana 用于監(jiān)控?cái)?shù)據(jù)可視化,會(huì)在文章后面繼續(xù)提到。

undefined

在這里我們了解到Prometheus 這幾個(gè)特征即可:

  • 數(shù)據(jù)收集器店茶,它以配置的時(shí)間間隔定期通過HTTP提取指標(biāo)數(shù)據(jù)。
  • 一個(gè)時(shí)間序列數(shù)據(jù)庫丛楚,用于存儲(chǔ)所有指標(biāo)數(shù)據(jù)。
  • 一個(gè)簡單的用戶界面,您可以在其中可視化锦亦,查詢和監(jiān)視所有指標(biāo)。

詳細(xì)了解請閱讀Prometheus 官方文檔

Grafana

Grafana 是一款采用 go 語言編寫的開源應(yīng)用陈醒,允許您從Elasticsearch吕漂,Prometheus,Graphite苍鲜,InfluxDB等各種數(shù)據(jù)源中獲取數(shù)據(jù),并通過精美的圖形將其可視化坯屿。

undefined

除了Prometheus的AlertManager 可以發(fā)送報(bào)警撤奸,Grafana 同時(shí)也支持告警胧瓜。Grafana 可以無縫定義告警在數(shù)據(jù)中的位置蒲肋,可視化的定義閾值,并可以通過釘釘妹沙、email等平臺獲取告警通知玄窝。最重要的是可直觀的定義告警規(guī)則,不斷的評估并發(fā)送通知。

由于Grafana alert告警比較弱玉凯,大部分告警都是通過Prometheus Alertmanager進(jìn)行告警.

請注意Prometheus儀表板也具有簡單的圖形。 但是Grafana的圖形化要好得多。

延伸閱讀:

Alertmananger

Prometheus 監(jiān)控平臺中除了負(fù)責(zé)采集數(shù)據(jù)和存儲(chǔ)吗浩,還能定制事件規(guī)則,但是這些事件規(guī)則要實(shí)現(xiàn)告警通知的話需要配合Alertmanager 組件來完成屡限。

AlertManager 支持告警分組(將多個(gè)告警合并一起發(fā)送)翰撑、告警抑制以及告警靜默(同一個(gè)時(shí)間段內(nèi)不發(fā)出重復(fù)的告警)功能。

undefined

延伸閱讀:官網(wǎng)對Alertmanager的介紹

監(jiān)控Java 應(yīng)用

監(jiān)控模式

目前,監(jiān)控系統(tǒng)采集指標(biāo)有兩種方式溯警,一種是『推』,另一種就是『拉』:

推的代表有 ElasticSearch,InfluxDB伊诵,OpenTSDB 等孙乖,需要你從程序中將指標(biāo)使用 TCP弯屈,UDP 等方式推送至相關(guān)監(jiān)控應(yīng)用宴偿,只是使用 TCP 的話,一旦監(jiān)控應(yīng)用掛掉或存在瓶頸娩践,容易對應(yīng)用本身產(chǎn)生影響沮焕,而使用 UDP 的話簿废,雖然不用擔(dān)心監(jiān)控應(yīng)用化戳,但是容易丟數(shù)據(jù)点楼。

拉的代表扫尖,主要代表就是 Prometheus,讓我們不用擔(dān)心監(jiān)控應(yīng)用本身的狀態(tài)掠廓。而且可以利用 DNS-SRV 或者 Consul 等服務(wù)發(fā)現(xiàn)功能就可以自動(dòng)添加監(jiān)控换怖。

如何監(jiān)控

Prometheus 監(jiān)控應(yīng)用的方式非常簡單,只需要進(jìn)程暴露了一個(gè)用于獲取當(dāng)前監(jiān)控樣本數(shù)據(jù)的 HTTP 訪問地址蟀瞧。這樣的一個(gè)程序稱為Exporter悦污,Exporter 的實(shí)例稱為一個(gè) Target 。Prometheus 通過輪訓(xùn)的方式定時(shí)從這些 Target 中獲取監(jiān)控?cái)?shù)據(jù)樣本蜻牢,對于應(yīng)用來講饥脑,只需要暴露一個(gè)包含監(jiān)控?cái)?shù)據(jù)的 HTTP 訪問地址即可赋除,當(dāng)然提供的數(shù)據(jù)需要滿足一定的格式滚停,這個(gè)格式就是 Metrics 格式.

metric name>{<label name>=<label value>, ...}

主要分為三個(gè)部分
各個(gè)部分需符合相關(guān)的正則表達(dá)式

  • metric name:指標(biāo)的名稱,主要反映被監(jiān)控樣本的含義 a-zA-Z_:*_
  • label name: 標(biāo)簽 反映了當(dāng)前樣本的特征維度 [a-zA-Z0-9_]*
  • label value: 各個(gè)標(biāo)簽的值,不限制格式

需要注意的是,label value 最好使用枚舉值,而不要使用無限制的值瞻赶,比如用戶 ID皿伺,Email 等杰赛,不然會(huì)消耗大量內(nèi)存蝉娜,也不符合指標(biāo)采集的意義。

MicroMeter

前面簡述了Prometheus 監(jiān)控的原理。那么我們的Spring Boot 應(yīng)用怎么提供這樣一個(gè) HTTP 訪問地址,提供的數(shù)據(jù)還得符合上述的 Metrics 格式 罗晕?

還記得嗎谜悟,在Spring Boot Actuator 模塊 詳解:健康檢查,度量庶骄,指標(biāo)收集和監(jiān)控中逻淌,我有提到過Actuator 模塊也可以和一些外部的應(yīng)用監(jiān)控系統(tǒng)整合邻遏,其中就包括Prometheus 赏殃。那么Spring Boot Actuator 怎么讓 Spring Boot 應(yīng)用和Prometheus 這種監(jiān)控系統(tǒng)結(jié)合起來呢?

這個(gè)橋梁就是MicroMeter间涵。Micrometer 為 Java 平臺上的性能數(shù)據(jù)收集提供了一個(gè)通用的 API仁热,應(yīng)用程序只需要使用 Micrometer 的通用 API 來收集性能指標(biāo)即可。Micrometer 會(huì)負(fù)責(zé)完成與不同監(jiān)控系統(tǒng)的適配工作勾哩。

image.png

實(shí)操部分一

接下去我們一邊結(jié)合實(shí)際的Demo股耽,一邊講解說明。

初始的Demo項(xiàng)目創(chuàng)建請參照Spring Boot Actuator 模塊 詳解:健康檢查钳幅,度量物蝙,指標(biāo)收集和監(jiān)控

實(shí)操部分會(huì)將分為兩個(gè)部分,本部分主要是將應(yīng)用如何集成Prometheus 和 Grafana 完成指標(biāo)收集和可視化敢艰。

一诬乞、添加依賴

為了讓Spring Boot 應(yīng)用和Prometheus 集成,你需要增加micrometer-registry-prometheus依賴。

<!-- Micrometer Prometheus registry  -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

添加上述依賴項(xiàng)之后震嫉,Spring Boot 將會(huì)自動(dòng)配置 PrometheusMeterRegistryCollectorRegistry來以Prometheus 可以抓取的格式(即上文提到的 Metrics 格式)收集和導(dǎo)出指標(biāo)數(shù)據(jù)森瘪。

所有的相關(guān)數(shù)據(jù),都會(huì)在Actuator 的 /prometheus端點(diǎn)暴露出來票堵。Prometheus 可以抓取該端點(diǎn)以定期獲取度量標(biāo)準(zhǔn)數(shù)據(jù)扼睬。

Actuator 的 /prometheus端點(diǎn)

我們還是以我們之前的Demo項(xiàng)目為例子。深究一下這個(gè)端點(diǎn)的內(nèi)容悴势。添加micrometer-registry-prometheus依賴后窗宇,我們訪問http://localhost:8080/actuator/prometheus地址,可以看到一下內(nèi)容:

# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool
# TYPE jvm_buffer_total_capacity_bytes gauge
jvm_buffer_total_capacity_bytes{id="direct",} 90112.0
jvm_buffer_total_capacity_bytes{id="mapped",} 0.0
# HELP tomcat_sessions_expired_sessions_total  
# TYPE tomcat_sessions_expired_sessions_total counter
tomcat_sessions_expired_sessions_total 0.0
# HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution
# TYPE jvm_classes_unloaded_classes_total counter
jvm_classes_unloaded_classes_total 1.0
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{id="direct",} 11.0
jvm_buffer_count_buffers{id="mapped",} 0.0
# HELP system_cpu_usage The "recent cpu usage" for the whole system
# TYPE system_cpu_usage gauge
system_cpu_usage 0.0939447637893599
# HELP jvm_gc_max_data_size_bytes Max size of old generation memory pool
# TYPE jvm_gc_max_data_size_bytes gauge
jvm_gc_max_data_size_bytes 2.841116672E9

# 此處省略超多字...

可以看到特纤,這些都是按照上文提到的 Metrics 格式組織起來的程序監(jiān)控指標(biāo)數(shù)據(jù)军俊。

metric name>{<label name>=<label value>, ...}

二、Prometheus 安裝與配置

安裝請參閱官方文檔捧存。內(nèi)容不多但是很細(xì)致粪躬。你可以選擇二進(jìn)制安裝或者是docker 的方式。這里不贅述昔穴。

配置Prometheus

接下去镰官,我們需要配置Prometheus 去收集我們 Demo 項(xiàng)目/actuator/prometheus的指標(biāo)數(shù)據(jù)。

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']
  # demo job
  -  job_name: 'springboot-actuator-prometheus-test' # job name
     metrics_path: '/actuator/prometheus' # 指標(biāo)獲取路徑
     scrape_interval: 5s # 間隔
     basic_auth: # Spring Security basic auth 
       username: 'actuator'
       password: 'actuator'
     static_configs:
     - targets: ['10.60.45.113:8080'] # 實(shí)例的地址吗货,默認(rèn)的協(xié)議是http

重點(diǎn)請關(guān)注這里的配置:

  # demo job
  -  job_name: 'springboot-actuator-prometheus-test' # job name
     metrics_path: '/actuator/prometheus' # 指標(biāo)獲取路徑
     scrape_interval: 5s # 間隔
     basic_auth: # Spring Security basic auth 
       username: 'actuator'
       password: 'actuator'
     static_configs:
     - targets: ['10.60.45.113:8080'] # 實(shí)例的地址朋魔,默認(rèn)的協(xié)議是http

測試

配置完成之后,我們啟動(dòng)Prometheus 測試一下卿操,如果你是docker 方式的話警检,在prometheus.yml 文件所在目錄執(zhí)行如下命令,即可啟動(dòng)Prometheus:

docker run -d -p 9090:9090 \
    -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus --config.file=/etc/prometheus/prometheus.yml
  • 訪問http://ip:9090 害淤,可看到如下界面:
image.png
  • 點(diǎn)擊 Insert metric at cursor 扇雕,即可選擇監(jiān)控指標(biāo);點(diǎn)擊 Graph 窥摄,即可讓指標(biāo)以圖表方式展示镶奉;點(diǎn)擊Execute 按鈕,即可看到類似下圖的結(jié)果:
image.png

你也可以在輸入框中輸入PromQL來進(jìn)行更高級的查詢崭放。

PromQL是Prometheus 的自定義查詢語言哨苛,通過PromQL用戶可以非常方便地對監(jiān)控樣本數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析。

  • 配置熱加載
curl -X POST http://ip:9090/-/reload

三币砂、Grafana安裝和配置

可以看到建峭,Prometheus 自帶的監(jiān)控面板非常“簡陋”决摧。所以引入Grafana 來實(shí)現(xiàn)更友好亿蒸、更貼近生產(chǎn)的監(jiān)控可視化凑兰。

1. 啟動(dòng)

$ docker run -d --name=grafana -p 3000:3000 grafana/grafana 

2. 登錄

訪問 http://ip:3000/login ,初始賬號/密碼為:admin/admin 边锁,第一次登錄會(huì)讓你修改密碼姑食。

3. 配置數(shù)據(jù)源

  • 點(diǎn)擊ConfigurationAdd Data Source,會(huì)看到如下界面:
image.png
  • 這里我們選擇Prometheus 當(dāng)做數(shù)據(jù)源茅坛,這里我們就配置一下Prometheus 的訪問地址音半,點(diǎn)擊 Save & Test
image.png

4. 創(chuàng)建監(jiān)控Dashboard

  • 點(diǎn)擊導(dǎo)航欄上的 + 按鈕,并點(diǎn)擊Dashboard贡蓖,將會(huì)看到類似如下的界面:
image.png
  • 點(diǎn)擊 Add Query 曹鸠,即可看到類似如下的界面:
image.png

Metrics處輸入要查詢的指標(biāo),指標(biāo)的取值詳見Spring Boot應(yīng)用的 /actuator/prometheus 端點(diǎn)摩梧,例如jvm_memory_used_bytes 物延、jvm_threads_states_threads 宣旱、jvm_threads_live_threads 等仅父,Grafana會(huì)給你較好的提示,并且可以用PromQL實(shí)現(xiàn)較為復(fù)雜的計(jì)算浑吟,例如聚合笙纤、求和、平均等组力。如果想要繪制多個(gè)線條省容,可點(diǎn)擊Add Query 按鈕,

  • 再點(diǎn)擊下面那個(gè)Visualization燎字,可以選擇可視化的類型和一些相關(guān)的配置腥椒。這里就不多贅述,留給讀者自己探索候衍。
image.png
  • 再點(diǎn)擊下一步General進(jìn)行基礎(chǔ)配置笼蛛,不贅述:
image.png

5. Dashboard 市場

到這里,我想聰明的讀者們應(yīng)該已經(jīng)學(xué)會(huì)如何去可視化一個(gè)指標(biāo)數(shù)據(jù)了蛉鹿。但是應(yīng)該很多人都會(huì)覺得滨砍,如果有好多指標(biāo)的話,配置起來實(shí)際上是蠻繁瑣的妖异。

是否有開箱即用惋戏、通用型的DashBoard模板呢?

前往 Grafana Lab - Dashboards 他膳,輸入關(guān)鍵詞即可搜索指定Dashboard响逢。你就可以獲得你想要的????。

另外棕孙,這些已有的dashboard也可以讓我們更快掌握一些panel的配置和dashboard的使用龄句。

image.png

6. 引入dashboard

這里直接給出兩款我覺得比較好用的dashboard:

  • JVM (Micrometer)

  • Spring Boot Statistics

    這一款我需要提一下回论,剛開始我引入的時(shí)候是無效的,不知道讀者會(huì)不會(huì)遇到和我一樣的問題分歇,如果遇到了傀蓉,請到dashboard的設(shè)置里面,修改 variables 中 $application$instance兩個(gè)變量的Definition职抡。

還有我個(gè)人是推薦葬燎,在這兩款dashboard上面做一些定制化操作,或者說把兩者的panel結(jié)合起來缚甩。

  • 引入的操作很簡單谱净,首選你要在 Grafana Lab - Dashboards中選好你心儀的dashboard,然后記下它的ID
image.png
  • 就是點(diǎn)擊Import按鈕:
image.png
  • 輸入ID 之后擅威,完成配置壕探,點(diǎn)擊Import按鈕:
image.png
  • 效果如下:
image.png

實(shí)操部分二

在實(shí)操部分二,主要講如何自定義監(jiān)控指標(biāo)(比如我們的一些業(yè)務(wù)數(shù)據(jù)郊丛,這也叫做埋點(diǎn))和如何使用Alertmanager完成監(jiān)控告警李请。

一、自定義(業(yè)務(wù))監(jiān)控指標(biāo)

模擬需求:有一個(gè)訂單服務(wù)厉熟,監(jiān)控 [實(shí)時(shí)訂單金額]导盅、[10分鐘內(nèi)下單失敗率]

1. 創(chuàng)建 Prometheus 監(jiān)控管理類PrometheusCustomMonitor

這里面我們自定義了三個(gè)metrics:

  • requests_error_total: 下單失敗次數(shù)
  • order_request_count:下單總次數(shù)
  • order_amount_sum:下單金額統(tǒng)計(jì)
@Component
public class PrometheusCustomMonitor {

    /**
     * 記錄請求出錯(cuò)次數(shù)
     */
    private Counter requestErrorCount;

    /**
     * 訂單發(fā)起次數(shù)
     */
    private Counter orderCount;

    /**
     * 金額統(tǒng)計(jì)
     */
    private DistributionSummary amountSum;

    private final MeterRegistry registry;

    @Autowired
    public PrometheusCustomMonitor(MeterRegistry registry) {
        this.registry = registry;
    }

    @PostConstruct
    private void init() {
        requestErrorCount = registry.counter("requests_error_total", "status", "error");
        orderCount = registry.counter("order_request_count", "order", "test-svc");
        amountSum = registry.summary("order_amount_sum", "orderAmount", "test-svc");
    }

    public Counter getRequestErrorCount() {
        return requestErrorCount;
    }

    public Counter getOrderCount() {
        return orderCount;
    }

    public DistributionSummary getAmountSum() {
        return amountSum;
    }
}

2. 新增/order接口

當(dāng) flag="1"時(shí),拋異常揍瑟,模擬下單失敗情況白翻。在接口中統(tǒng)計(jì)order_request_countorder_amount_sum

@RestController
public class TestController {

    @Resource
    private PrometheusCustomMonitor monitor;
    
    //....

    @RequestMapping("/order")
    public String order(@RequestParam(defaultValue = "0") String flag) throws Exception {
        // 統(tǒng)計(jì)下單次數(shù)
        monitor.getOrderCount().increment();
        if ("1".equals(flag)) {
            throw new Exception("出錯(cuò)啦");
        }
        Random random = new Random();
        int amount = random.nextInt(100);
        // 統(tǒng)計(jì)金額
        monitor.getAmountSum().record(amount);
        return "下單成功, 金額: " + amount;
    }
}

PS:實(shí)際項(xiàng)目中绢片,采集業(yè)務(wù)監(jiān)控?cái)?shù)據(jù)的時(shí)候滤馍,建議使用AOP的方式記錄,不要侵入業(yè)務(wù)代碼底循。不要像我Demo中這樣寫巢株。

3. 新增全局異常處理器GlobalExceptionHandler

統(tǒng)計(jì)下單失敗次數(shù)requests_error_total

@ControllerAdvice
public class GlobalExceptionHandler {

    @Resource
    private PrometheusCustomMonitor monitor;

    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public String handle(Exception e) {
        monitor.getRequestErrorCount().increment();
        return "error, message: " + e.getMessage();
    }
}

測試:

啟動(dòng)項(xiàng)目,訪問http://localhost:8080/orderhttp://localhost:8080/order?flag=1模擬下單成功和失敗的情況此叠,然后我們訪問http://localhost:8080/actuator/prometheus纯续,可以看到我們自定義指標(biāo)已經(jīng)被/prometheus端點(diǎn)暴露出來了:

# HELP requests_error_total  
# TYPE requests_error_total counter
requests_error_total{application="springboot-actuator-prometheus-test",status="error",} 41.0
# HELP order_request_count_total  
# TYPE order_request_count_total counter
order_request_count_total{application="springboot-actuator-prometheus-test",order="test-svc",} 94.0
# HELP order_amount_sum  
# TYPE order_amount_sum summary
order_amount_sum_count{application="springboot-actuator-prometheus-test",orderAmount="test-svc",} 53.0
order_amount_sum_sum{application="springboot-actuator-prometheus-test",orderAmount="test-svc",} 2701.0

4. 在Grafana 中添加對應(yīng)監(jiān)控面板

這里我新增一個(gè)dashboard作為演示用,一些步驟前面講過這里就直接省略:

  • 首先是創(chuàng)建10分鐘內(nèi)下單失敗率
sum(rate(requests_error_total{application="springboot-actuator-prometheus-test"}[10m])) / sum(rate(order_request_count_total{application="springboot-actuator-prometheus-test"}[10m])) * 100
image.png
  • 然后是統(tǒng)計(jì)訂單總金額:
image.png
  • 最終結(jié)果
image.png

二灭袁、添加監(jiān)控

模擬告警規(guī)則:

  1. 服務(wù)是否下線
  2. 10分鐘內(nèi)下單失敗率是否大于10%

1. 部署 Alertmanager

這里采用二進(jìn)制包的方式部署猬错。

  • Alertmanager最新版本的下載地址可以從Prometheus官方網(wǎng)站https://prometheus.io/download/獲取

  • 下載完成后,解壓后會(huì)包含一個(gè)默認(rèn)的alertmanager.yml配置文件茸歧,我們在里面添加發(fā)送郵件配置

# 全局配置
global:
  resolve_timeout: 5m
  smtp_smarthost: 'xxxxxx'
  smtp_from: 'xxxx@xx.com'
  smtp_auth_username: 'xxxx@xx.com'
  smtp_auth_password: 'XXXXXX'
# 路由配置
route:
  receiver: 'default-receiver' # 父節(jié)點(diǎn)
  group_by: ['alertname'] # 分組規(guī)則
  group_wait: 10s # 為了能夠一次性收集和發(fā)送更多的相關(guān)信息時(shí)倦炒,可以通過group_wait參數(shù)設(shè)置等待時(shí)間
  group_interval: 1m  #定義相同的Group之間發(fā)送告警通知的時(shí)間間隔
  repeat_interval: 1m
  routes: # 子路由,根據(jù)match路由
  - receiver: 'rhf-mail-receiver'
    group_wait: 10s
    match: # 匹配自定義標(biāo)簽
      team: rhf    
# 告警接收者配置
receivers:
- name: 'default-receiver'
  email_configs:
  - to: 'xxxx@xx.com'
- name: 'rhf-mail-receiver'
  email_configs:
  - to: 'xxxx@xx.com'

目前官方內(nèi)置的第三方通知集成包括:郵件软瞎、 即時(shí)通訊軟件(如Slack逢唤、Hipchat)拉讯、移動(dòng)應(yīng)用消息推送(如Pushover)和自動(dòng)化運(yùn)維工具(例如:Pagerduty、Opsgenie鳖藕、Victorops)魔慷。Alertmanager的通知方式中還可以支持Webhook,通過這種方式開發(fā)者可以實(shí)現(xiàn)更多個(gè)性化的擴(kuò)展支持(釘釘著恩、企業(yè)微信等)院尔。

相關(guān)配置延伸閱讀:

  • 啟動(dòng)

Alermanager會(huì)將數(shù)據(jù)保存到本地中,默認(rèn)的存儲(chǔ)路徑為data/喉誊。因此邀摆,在啟動(dòng)Alertmanager之前需要?jiǎng)?chuàng)建相應(yīng)的目錄:

./alertmanager

用戶也在啟動(dòng)Alertmanager時(shí)使用參數(shù)修改相關(guān)配置。--config.file用于指定alertmanager配置文件路徑伍茄,--storage.path用于指定數(shù)據(jù)存儲(chǔ)路徑栋盹。

  • 查看運(yùn)行狀態(tài),啟動(dòng)之后我們訪問9093端口:
image.png

Alert菜單下可以查看Alertmanager 接收到的告警內(nèi)容敷矫。Silences菜單下則可以通過UI創(chuàng)建靜默規(guī)則例获。Status菜單下面可以看到Alertmanager 的配置信息。

  • 配置熱加載
curl -X POST http://ip:9093/-/reload

2. 設(shè)置告警規(guī)則

在Prometheus 目錄下新建test-svc-alert-rule.yaml來設(shè)置告警規(guī)則沪饺,內(nèi)容如下:

groups:
- name: svc-alert-rule
  rules:
  - alert: svc-down # 服務(wù)是否下線
    expr: sum(up{job="springboot-actuator-prometheus-test"}) == 0
    for: 1m
    labels: # 自定義標(biāo)簽
      severity: critical
      team: rhf # 我們小組的名字躏敢,對應(yīng)上面match 的標(biāo)簽匹配
    annotations:
      summary: "訂單服務(wù)已下線闷愤,請檢查U稀!"
  - alert: order-error-rate-high # 10分鐘內(nèi)下單失敗率是否大于10%
    expr: sum(rate(requests_error_total{application="springboot-actuator-prometheus-test"}[10m])) / sum(rate(order_request_count_total{application="springboot-actuator-prometheus-test"}[10m])) > 0.1
    for: 1m
    labels:
      severity: major
      team: rhf
    annotations:
      summary: "訂單服務(wù)響應(yīng)異常<テ辍遭居!"
      description: "10分鐘訂單錯(cuò)誤率已經(jīng)超過10% (當(dāng)前值: {{ $value }} !Q俱萍!"

實(shí)際項(xiàng)目中,可以用一個(gè)rule目錄存放所有的告警規(guī)則告丢,然后rule/*.yaml的方式配置

3. 配置Prometheus

prometheus.yml文件下枪蘑,引用test-svc-alert-rule.yaml告警規(guī)則配置,并開啟 Alertmanager岖免。

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # alertmanage default start port 9093
      - localhost:9093  
rule_files:
  - /data/prometheus-stack/prometheus/rule/*.yml

4. 測試

現(xiàn)在我們配置完成之后岳颇,熱加載一下Prometheus 的配置。然后嘗試觸發(fā)告警條件颅湘。

  • 測試服務(wù)下線话侧,把測試服務(wù)手動(dòng)停掉
image.png
  • 測試下單異常

    image.png
  • http://ip:9093界面可以看到觸發(fā)的告警

    image.png

小結(jié)

到這里我們的Spring Boot 微服務(wù)監(jiān)控告警模塊也就算講述完畢了。希望能給你帶來一些收獲闯参。

對應(yīng)的源碼可以Github上看到瞻鹏。

如果本文有幫助到你悲立,希望能點(diǎn)個(gè)贊,這是對我的最大動(dòng)力????????新博。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薪夕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赫悄,更是在濱河造成了極大的恐慌寥殖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涩蜘,死亡現(xiàn)場離奇詭異嚼贡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)同诫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門粤策,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人误窖,你說我怎么就攤上這事叮盘。” “怎么了霹俺?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵柔吼,是天一觀的道長。 經(jīng)常有香客問我丙唧,道長愈魏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任想际,我火速辦了婚禮培漏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胡本。我一直安慰自己牌柄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布侧甫。 她就那樣靜靜地躺著珊佣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪披粟。 梳的紋絲不亂的頭發(fā)上咒锻,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音僻爽,去河邊找鬼虫碉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胸梆,可吹牛的內(nèi)容都是我干的敦捧。 我是一名探鬼主播须板,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兢卵!你這毒婦竟也來了习瑰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤秽荤,失蹤者是張志新(化名)和其女友劉穎甜奄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窃款,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡课兄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晨继。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烟阐。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖紊扬,靈堂內(nèi)的尸體忽然破棺而出蜒茄,到底是詐尸還是另有隱情,我是刑警寧澤餐屎,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布檀葛,位于F島的核電站,受9級特大地震影響腹缩,放射性物質(zhì)發(fā)生泄漏屿聋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一庆聘、第九天 我趴在偏房一處隱蔽的房頂上張望胜臊。 院中可真熱鬧勺卢,春花似錦伙判、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甫煞,卻和暖如春菇曲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抚吠。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工常潮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楷力。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓喊式,卻偏偏與公主長得像孵户,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子岔留,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容