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

在SpringBoot中自定義指標并使用Prometheus監控報警

開發 前端
在/data/prometheus/alertmanager目錄下,新增告警模板notify-template.tmpl,此目錄映射到altermanager 的/etc/alertmanager目錄,模板包含告警和自愈兩部分,2006-01-02 15:04:05是go語言的日志格式,固定值,加28800e9表示轉換為東八區時間,即北京時間。

在10 分鐘教你使用Prometheus監控Spring Boot工程中介紹了如何使用Prometheus監控Spring Boot提供的默認指標,這篇介紹如何自定義業務指標,并使用Prometheus進行監控并報警,同時在 Grafana 進行展現

示例介紹

我們模擬一個賬務系統,主要功能有:充值與提現,其中會定義5 個業務指標,如下

  • 充值次數
  • 充值金額
  • 提現次數
  • 提現金額
  • 余額

針對以上5 業務指標,會使用prometheus的三種Metrics類型,如下

  1. Counter:只增不減的計數器,用作定義充值次數、提現次數
  2. Gauge:可增可減的儀表盤,側重于反應系統的當前狀態,用作定義余額
  3. Summary:用于記錄某些東西的平均大小,也可以計算總和,用作定義充值金額、提現金額

最終我們對以上指標進行 grafana 進行展現,同時對余額小于500 進行告警通知,效果如下

圖片圖片

圖片圖片

監控與驗證

Spring Boot 工程配置

  1. 添加 maven 依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
  1. 在application.properties,開啟監控的端點
#監控的端點
management.endpoints.web.exposure.include=*
#應用程序名稱,在prometheus 上會顯示
management.metrics.tags.applicatinotallow=${spring.application.name}
#tomcat 指標需要開啟
server.tomcat.mbeanregistry.enabled=true
  1. 編寫業務代碼,提供體現和充值方法,并在init方法中定義五個業務指標,使用了三種Metrics類型
@Service
@Slf4j
public class AccountServiceImpl implements IAccountService {
    @Autowired
    private MeterRegistry registry;
    //入金筆數
    private Counter depositCounter; 
    // 出金筆數
    private Counter withdrawCounter; 
   //入金金額
    private DistributionSummary depositAmountSummary;
   // 出金金額
    private DistributionSummary withdrawAmountSummary; 
   //余額
    private BigDecimal balance = new BigDecimal(1000);

    @PostConstruct
    private void init() {
        depositCounter = registry.counter("deposit_counter", "currency", "btc");
        withdrawCounter = registry.counter("withdraw_counter", "currency", "btc");
        depositAmountSummary = registry.summary("deposit_amount", "currency", "btc");
        withdrawAmountSummary = registry.summary("withdraw_amount", "currency", "btc");
        Gauge.builder("balanceGauge", () -> balance)
                .tags("currency", "btc")
                .description("余額")
                .register(registry);
    }


    @Override
    // 充值操作
    public void depositOrder(BigDecimal amount) {
        log.info("depositOrder amount:{}", amount);
        try {
            //余額增加
            balance = balance.add(amount);
            //充值筆數埋點
            depositCounter.increment();
            //充值金額埋點
            depositAmountSummary.record(amount.doubleValue());

        } catch (Exception e) {
            log.info("depositOrder error", e);
        } finally {
            log.info("depositOrder result:{}", amount);
        }
    }

    @Override
    //提現操作
    public void withdrawOrder(BigDecimal amount) {
        log.info(" withdrawOrder amount:{}", amount);
        try {
            if (balance.subtract(amount).compareTo(BigDecimal.ZERO) < 0) {
                throw new Exception("提現金額不足,提現失敗");
            }
            //余額減少
            balance = balance.subtract(amount);
            // 提現筆數埋點數據
            withdrawCounter.increment();
            // 提現金額埋點
            withdrawAmountSummary.record(amount.doubleValue());
        } catch (Exception e) {
            log.info("withdrawOrder error", e);
        } finally {
            log.info("withdrawOrder result:{}", amount);
        }
    }

}
  1. Controller 方法,定義了充值和提現接口
@RestController
@RequestMapping(ControllerConstants.PATH_PREFIX + "/account")
public class AccountController {

    @Autowired
    IAccountService accountService;

    /**
     * 充值
     */
    @RequestMapping(value = "/deposit", method = RequestMethod.GET)
    public void deposit(@RequestParam("amount") BigDecimal amount) {
        accountService.depositOrder(amount);
    }

    /**
     * 提現
     */
    @RequestMapping(value = "/withdraw", method = RequestMethod.GET)
    public void withdraw(@RequestParam("amount") BigDecimal amount) {
        accountService.withdrawOrder(amount);
    }

}
  1. 啟動服務查看,訪問actuator/prometheus接口,如果能查詢以下指標則配置成功
##充值筆數
deposit_counter_total
## 充值總金額
deposit_amount_sum
##提現筆數
withdraw_counter_total
##提現總金額
withdraw_amount_sum
## 余額
balanceGauge

Promethues 配置

在prometheus.yml文件中進行配置業務系統采集點,5s 拉取一次指標,由于prometheus server 部署在docker 中,所以訪問主機IP 用host.docker.internal

#業務系統監控          
  - job_name: 'SpringBoot'
    # Override the global default and
    scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:8080']

圖片圖片

告警規則配置,在容器啟動時用主機的/data/prometheus目錄映射到容器的/prometheus目錄,因此在主機/data/prometheus/目錄創建rules文件夾,并創建告警文件business-alert.rules,這里告警對余額小于 500 則進行告警

groups:
- name: businessAlert
  rules:
  - alert: balanceAlert
    expr: balanceGauge{applicatinotallow="backend"} < 500
    for: 20s
    labels:
      severity: page
      team: g2park
    annotations:
      summary: "{{ $labels.currency }} balance is insufficient "
      description: "{{ $labels.currency }} balance : {{ $value }}"

啟動Prometheus,進行驗證,查詢采集目標,已生效

圖片圖片

查詢充值次數,已采集點擊Alters,可以看到業務告警已經生效

AlterManager配置

在/data/prometheus/alertmanager目錄下,新增告警模板notify-template.tmpl,此目錄映射到altermanager 的/etc/alertmanager目錄,模板包含告警和自愈兩部分,2006-01-02 15:04:05是go語言的日志格式,固定值,加28800e9表示轉換為東八區時間,即北京時間

{{ define "test.html" }} 
{{- if gt (len .Alerts.Firing) 0 -}}
{{ range .Alerts }}
<h1 align="left" style="color:red;">告警</h1>
<pre>
告警級別: {{ .Labels.severity }} 級 <br>
告警類型: {{ .Labels.alertname }} <br>
故障主機: {{ .Labels.instance }} <br>
告警主題: {{ .Annotations.summary }} <br>
告警詳情: {{ .Annotations.description }} <br>
告警時間:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>  
</pre>
{{ end }}
{{ end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{ range .Alerts }}
<h1 align="left" style="color:green;">恢復</h1>
<pre>
告警名稱:{{ .Labels.alertname }}<br>
告警級別:{{ .Labels.severity }}<br>
告警機器:{{ .Labels.instance }}<br>
告警主題:{{ .Annotations.summary }}<br>
告警主題:{{ .Annotations.description }}<br>
告警時間:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br> 
恢復時間:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br> 
</pre>
{{- end }}
{{- end }}
{{- end }}

修改alertmanager.yml為以下內容,替換對應賬號即可

global:
  smtp_smarthost: smtp.qq.com:465
  smtp_from: 9238223@qq.com
  smtp_auth_username: 9238223@qq.com
  smtp_auth_identity: 9238223@qq.com
  smtp_auth_password: 123
  smtp_require_tls: false
templates: #添加模板
  - '/etc/alertmanager/notify-template.tmpl'   #指定路徑    
route:
  group_by: ['alertname']
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
receivers:
  - name: default-receiver
    email_configs:
      - to: abc123@foxmail.com
        html: '{{ template "test.html" . }}'
        send_resolved: true
        headers: { Subject: "系統監控告警{{- if gt (len .Alerts.Resolved) 0 -}}恢復{{ end }}" }

global: 這是一個全局配置部分,用于配置全局的Alertmanager設置。

route: 用于配置警報的路由規則。

receivers: 接收者部分,用于配置接收告警通知的收件人。

  • to: abc123@foxmail.com: 這是收件人的郵件地址,即接收警報通知的郵箱地址。
  • send_resolved: true: 這是一個布爾值,指示是否發送已解決的警報通知。在這個例子中,設置為true,表示發送已解決的警報通知。
  • name: default-receiver: 這是默認接收者的名稱。
  • email_configs: 用于指定接收郵件通知的收件人和其他相關設置。
  • group_by: ['alertname']: 這是一個標簽列表,用于按照警報名稱(alertname)進行分組。
  • receiver: 'default-receiver': 這是指定默認接收者的名稱,即接收警報通知的收件人。
  • group_wait: 30s: 在發送警報通知前等待的時間,以便將相同的警報分組在一起。
  • group_interval: 5m: 這是發送同一組警報通知之間的最小時間間隔。
  • repeat_interval: 1h: 這是在重復發送未解決的警報通知之前等待的時間間隔。
  • smtp_smarthost: 這是SMTP服務器的地址和端口,用于發送郵件通知。
  • smtp_from: 這是郵件發送方的郵件地址,即發送郵件的地址。

啟動Altermanager,進行驗證

docker start alertmanager

訪問stauts,如果出現以下結果則成功

告警驗證,系統默認余額為1000,調用backend/account/withdraw提現接口,使余額降至500,進行報警

圖片

等待20s 左右,prometheus 收到報警會推送至Altermanager

圖片圖片

Altermanager則會根據我們配置時間等待 30s,進行通知告警

圖片圖片

自愈驗證,調用充值backend/account/deposit接口,使余額大于500,等待6m 左右會收到自愈告警,如果嫌時間比較長,修改alertmanager.yml中  group_wait、group_interval參數值即可

Grafana配置

啟動 Grafana,點擊新增面板,創建三種圖表,分別為余額走勢、提現與充值金額占比、提現與充值筆數走勢圖,如下

圖片圖片

余額走勢,報表類型為Stat

sum(balanceGauge{applicatinotallow="backend"})

圖片圖片

提現與充值金額占比,報表類型為Pie chart

withdraw_amount_sum{applicatinotallow="backend"}
deposit_amount_sum{applicatinotallow="backend"}

提現與充值筆數走勢圖,報表類型為Time series

increase(deposit_counter_total{applicatinotallow="backend"}[5m])
increase(withdraw_counter_total{applicatinotallow="backend"}[5m])

總結

以上介紹了如何在Spring Boot中自定義業務指標以及對指標進行監控和告警,希望對你所幫助,注意以上示例只是為了簡單便于理解才是這樣寫,真實使用中,指標可以與數據庫或者緩存進行結合,比如余額報警,調用查詢余額接口即可。

責任編輯:武曉燕 來源: 架構成長指南
相關推薦

2021-03-26 20:37:14

Prometheus監控指標

2021-10-28 08:39:22

Node Export自定義 監控

2020-12-14 10:26:48

Prometheus 監控Services

2023-09-06 08:46:47

2022-05-19 08:21:02

vmalert監控

2021-05-28 08:58:41

Golang網卡metrics

2022-07-08 08:00:31

Prometheus監控

2022-05-12 08:01:26

vmagentprometheus

2011-06-15 09:24:36

Qt Widget Model

2023-03-26 08:41:37

2011-06-20 16:54:40

Qt Widget model

2022-05-11 10:45:21

SpringMVC框架Map

2021-03-16 10:39:29

SpringBoot參數解析器

2015-06-10 10:54:24

自定義路PHP

2021-10-14 08:07:33

Go 應用Prometheus監控

2022-02-26 19:16:08

Promoter報警通知監控圖表

2023-05-28 13:11:43

Plotly指標圖表

2022-11-23 15:26:25

Ubuntu程序塢

2021-11-23 15:06:42

Kubernetes 運維開源

2021-08-09 10:31:33

自定義授權響應
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久一区二区三区 | 国产一区影院 | 夜夜精品浪潮av一区二区三区 | 超碰97人人人人人蜜桃 | 亚洲精品免费观看 | 国产精品国产a级 | 精品毛片在线观看 | 国产成人自拍一区 | 亚洲欧美日韩一区二区 | 国产91丝袜在线播放 | 欧美综合色 | 在线免费观看a级片 | 黄色片网站在线观看 | 久久久久久亚洲精品 | 日韩欧美综合在线视频 | a级在线观看 | 国产一区二区三区不卡av | 理论片午午伦夜理片影院 | 天天插天天操 | 国产日韩欧美激情 | 亚洲国产成人精品女人久久久 | 少妇性l交大片免费一 | 国产精品一区一区 | 国产精品日韩欧美一区二区 | 日韩小视频在线 | 天天夜干| 黑人精品欧美一区二区蜜桃 | 四虎最新视频 | 日本午夜免费福利视频 | 秋霞电影一区二区三区 | 女生羞羞网站 | 欧美一区二区网站 | 欧洲在线视频 | 欧美日韩理论 | 国产成人免费视频网站高清观看视频 | 欧美做暖暖视频 | 国产亚洲网站 | 国产精品成人品 | 黑人精品xxx一区一二区 | 国产精品黄色 | 成人欧美|