prometheus + consul 服務註冊+報警 最佳實踐

来源:https://www.cnblogs.com/simendavid/p/18094978
-Advertisement-
Play Games

一、 說明 本文主要將prometheus和consul 結合起來使用,通過conusl 註冊服務至prometheus,實現服務統一註冊,統一報警管理等。 整個架構思路consul+consul_export+prometheus+alertmanager ,consul通過check檢測服務狀態 ...


一、 說明

本文主要將prometheus和consul 結合起來使用,通過conusl 註冊服務至prometheus,實現服務統一註冊,統一報警管理等。

整個架構思路consul+consul_export+prometheus+alertmanager ,consul通過check檢測服務狀態,然後通過consul_export暴露給prometheus,prometheus通過alert規則,通知alertmanager,接著郵件通知管理人員。

在各伺服器上安裝node_expoert,然後將node配置到consul的hcl服務文件中,進行服務註冊,當然也可以http api發現。然後在prometheus主yml文件中配置consul_sd_configs對服務進行發現。

單台架構如下。

 

 

本次server伺服器有3台,組建consul集群,全部用做server端,然後在每一臺都部署node_expoerter作為prometheus node節點。

IP規劃如下:

172.19.100.212(prometheus主伺服器,理論上可以不部署node_expoerter),   

172.19.100.213

172.19.100.52

二、consul集群搭建

2.1 consul安裝

在每台伺服器上安裝consul。採用yum 安裝,這也是我最推薦的方式。配置目錄路徑在/etc/consul.d。

yum install -y yum-utils
yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
yum -y install consul

 

2.2 集群文件配置

212伺服器的配置如下。data_dir已經在預設的consul.hcl中有配置,所以註釋掉了。其他兩台伺服器根據如下配置分別配置IP。systemct    start consul啟動consul即可。

server = true

bootstrap_expect = 3

#        data_dir = "/tmp/consul"

node_name = "172.19.100.212"

bind_addr = "172.19.100.212"

client_addr = "0.0.0.0"

ui_config = {

  enabled = true

}

enable_script_checks = true

start_join = [

  "172.19.100.213",

  "172.19.100.52"

]

retry_join = [

  "172.19.100.213",

  "172.19.100.52"

]

 

搭建好的集群如下:

 

2.3 consul_exporter安裝

       consul_exporter主要用於將consul的check 報警導出到prometheus ,這樣在prometheus就不需要再次配置報警規則了。

下載地址:https://github.com/prometheus/consul_exporter/releases

當然如果需要額外的報警功能,可以通過blackbox_exporter配置,裡邊有很多報警模塊。      

        consul_export 不需要額外的配置,三台直接安裝後啟動即可,後續在prometheus中配置三台的地址即可。目前我只在212伺服器上安裝了。

[root@zht-app001 opt]# tar -xzvf consul_exporter-0.11.0.linux-amd64.tar.gz

consul_exporter-0.11.0.linux-amd64/

consul_exporter-0.11.0.linux-amd64/LICENSE

consul_exporter-0.11.0.linux-amd64/consul_exporter

consul_exporter-0.11.0.linux-amd64/NOTICE

[root@zht-app001 opt]# cd consul_exporter-0.11.0.linux-amd64

[root@zht-app001 consul_exporter-0.11.0.linux-amd64]# ls

consul_exporter  LICENSE  NOTICE

[root@zht-app001 consul_exporter-0.11.0.linux-amd64]# nohup ./consul_exporter &

[1] 11749

[root@zht-app001 consul_exporter-0.11.0.linux-amd64]# nohup: ignoring input and appending output to ‘nohup.out’

[root@zht-app001 consul_exporter-0.11.0.linux-amd64]# tail -f nohup.out

ts=2024-03-18T02:07:50.153Z caller=consul_exporter.go:82 level=info msg="Starting consul_exporter" version="(version=0.11.0, branch=HEAD, revision=3e5be6411ce11ba011b9e4fe52029daba8160ee8)"

ts=2024-03-18T02:07:50.153Z caller=consul_exporter.go:83 level=info build_context="(go=go1.21.5, platform=linux/amd64, user=root@34d50aaee2f8, date=20231225-15:29:52, tags=unknown)"

ts=2024-03-18T02:07:50.154Z caller=tls_config.go:274 level=info msg="Listening on" address=[::]:9107

ts=2024-03-18T02:07:50.154Z caller=tls_config.go:277 level=info msg="TLS is disabled." http2=false address=[::]:9107

consul_exporter的可選配置如下,如果不配置都是預設的,consul的token我將在最後配置。配置命令如下:

export CONSUL_HTTP_TOKEN=<your_token_here> 

 

2.4 consul token設置

三、prometheus 搭建

前往https://prometheus.io/download/ 下載最新的prometheus組件

3.1 node_exporter 安裝 和註冊

       每一個conul (server/client)agent上都需要安裝node_exporter,然後分別對node進行註冊。

3.1.1 安裝

我將文件下載到了/opt目錄,然後將node_exporter配置為系統service;文件名為node_exporter.service,放置在/etc/systemd/system目錄下:

       配置如下:

[Unit]

Description=Node Exporter for Prometheus

After=network-online.target

 

[Service]

#User=<非特權用戶,例如 node_exporter>

ExecStart=/opt/node_exporter-1.7.0.linux-amd64/node_exporter

#EnvironmentFile=-/etc/default/node_exporter  # 如果有額外環境變數配置,可以在這裡引用

Restart=on-failure

RestartSec=5s

 

[Install]

WantedBy=multi-user.target

          操作命令如下

systemctl daemon-reload

systemctl start node_exporter.service

systemctl status node_exporter.service

systemctl enable node_exporter.service

 

       狀態如下

 

 

3.1.2 註冊到consul

       在consul配置文件夾下新建hcl文件即可,配置如下,其餘伺服器按照一樣的操作進行。

[root@izwz92l6wmcnfyprbcxmjkz opt]# cd /etc/consul.d/

[root@izwz92l6wmcnfyprbcxmjkz consul.d]# ls

consul.env  consul.hcl  server.hcl

[root@izwz92l6wmcnfyprbcxmjkz consul.d]# vim node_exporter.hcl

 

       Token在後續配置,配置好後,重新啟動consul

services {

  name = "node_172.19.100.52"

  address = "172.19.100.52"

  id = "node_172.19.100.52"

  port = 9100

  tags = ["prometheus","172.19.100.52"]

  #token = "d1e6d941-8577-1f27-dd7b-0d8ac9212ba5"

  checks {

    id = "node_172.19.100.52_tcp_check"

    name = "Node Exporter TCP Check"

    interval = "10s"

    timeout = "1s"

    tcp = ":9100"

  }

}

 

       可以看到node註冊成功,check檢查成功,這個結果後續我們要通過consul_exporter傳到至prometheus。

 

3.2 安裝prometheus

        將下載的tar.gz解下後,將prometheus配置成系統/etc/systemd/system/prometheus.service

[Unit]

Description=Prometheus Monitoring System

Documentation=https://prometheus.io/docs/introduction/overview/

After=network-online.target

 

[Service]

#User=prometheus

#Group=prometheus

ExecStart=/opt/prometheus-2.50.1.linux-amd64/prometheus  --config.file=/opt/prometheus-2.50.1.linux-amd64/prometheus.yml

Restart=always

RestartSec=10s

LimitNOFILE=4096

 

[Install]

WantedBy=multi-user.target

 

 

sudo systemctl daemon-reload

sudo systemctl start prometheus

sudo systemctl status prometheus # 查看服務運行狀態

sudo systemctl enable prometheus # 設置開機啟動

 

3.3 配置consul_sd_config 和consul_exporter

       在prometheus.yml配置如下,然後重啟prometheus 即可

 

- job_name: "consul_export報警"

    static_configs:

      - targets: ["172.19.100.212:9107"] # 這裡填寫 Consul Exporter 監聽的 IP 和埠

    relabel_configs: [] # 根據需要重寫標簽

 

  - job_name: "node_export服務發現"

    consul_sd_configs:

      - server: "172.16.100.212:8500"

        #token: "4489cdd3-1952-4ded-4eb9-07a823f5b2ff"

        #token: "3ce3c959-c9e5-7e2c-abe7-1fccbbfe01ae"

        tags:

          - "prometheus"

    relabel_configs:

      - source_labels: [__meta_consul_health]

        target_label: service_health_status

 

       界面如圖

 

 

       點擊consul_exporter報警的endpoint的的界面如下,可以看到服務的check狀態。我們可以根據這些狀態編寫rules進行報警。

 

 

3.4 rules 報警規則配置

需要先在prometheus.yml中加如下配置

rule_files:

  # - "first_rules.yml"

  # - "second_rules.yml"

  - "prometheus.rules.yml"

 

在prometheus.rules.yml配置如下,這是針對3.3中node的報警規則,一旦有匹配的expr,則會觸發rules中的alert規則。而alert規則會直接傳送到alertmanager裡邊查看預設的route,再決定下一步操作(比如發送郵件報警,或者發送到企業微信)。

groups:

#consu_export報警

- name: consul_health_alerts

  rules:

    - alert: "consul服務報警"

      expr: consul_health_service_status{status="critical"} == 1 # 1 表示critical狀態

      for: 1m # 可以根據實際情況調整這個時間視窗,比如持續5分鐘未恢復才報警

      labels:

        severity: critical

      annotations:

        summary: "Consul Service {{ $labels.service_name }} is critical"

        description: "Service '{{ $labels.service_name }}' has been in a critical state for more than 1 minutes."

    - alert: "consul服務報警"

      expr: consul_health_service_status{status="warning"} == 1

      for: 1m # 可以根據實際情況調整這個時間視窗,比如持續5分鐘未恢復才報警

      labels:

        severity: warning

      annotations:

        summary: "Consul Service {{ $labels.service_name }} is warning"

        description: "Service '{{ $labels.service_name }}' has been in

a warning  state for more than 1 minutes."

 

這是prometheus的alert頁面,顯示的就是我上邊配置的報警規則

 

3.5 alertmanager 配置

       需要現在prometheus.yml中加入以下配置

# Alertmanager configuration

alerting:

  alertmanagers:

    - static_configs:

        - targets:

            - localhost:9093

 

 

將tar.gz解壓到/opt/,然後配置系統服務/etc/systemd/system/ alertmanager.service

[Unit]

Description=Prometheus Alertmanager System

After=network-online.target

 

[Service]

ExecStart=/opt/alertmanager-0.27.0.linux-amd64/alertmanager  --config.file=/opt/alertmanager-0.27.0.linux-amd64/alertmanager.yml

Restart=on-failure

RestartSec=5s

 

[Install]

WantedBy=multi-user.target

 

 

systemctl daemon-reload

systemctl start alertmanager.service

systemctl status alertmanager.service

systemctl enable alertmanager.service

 

alertmanager.yml配置如下,我通過QQ郵件進行報警。

global:

  resolve_timeout: 5m

 

route:

  receiver: "email-receiver"

 

receivers:

  - name: "email-receiver"

    email_configs:

      - send_resolved: true # 是否發送解決通知

        to: "XXXXX" # 接收報警郵件的地址

        from: "XXXXX " # 發送報警郵件的地址

        smarthost: "smtp.qq.com:587" # SMTP伺服器地址及埠

        auth_username: "XXXXX" # SMTP用戶名

        auth_password: "XXXXX" # SMTP密碼(如果是明文,推薦使用加密存儲)

        require_tls: true # 如果SMTP伺服器支持TLS,則啟用

 

inhibit_rules: [] # 可選,抑制規則配置

 

這是alertmanager頁面,目前還沒有報警,所以是空白的,下邊我們來將其中一個node_export節點停掉,來觀察一下報警。

 

 

3.6 報警演示

手動關閉52伺服器上的node_exporter 服務 Systemctl stop node_exporter

1、consul最先check出報警

 

 

2、prometheus alert進入pending狀態

如果1分鐘內,狀態沒有改變,則變為firing

 

 

3、prometheus  alert進入firing狀態

 

 

4、alertmanager平臺觸發報警

將通過alertmanager.yml中route規則發送郵件。

 

 

5、接收到報警郵件

 

 

6、報警解除,收到解除郵件

Systemctl start node_exporter後報警消失,發送接觸報警郵件,至此,報警鏈條完美閉環。

 

 

每篇隨筆都來自工作經驗並親自試驗,確保每位讀者能夠接觸到正確的知識。部分隨筆多平臺發佈,謝絕轉載!!!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 PostgreSQL 中,bytea_output 參數控制在查詢結果中 bytea 類型的顯示格式。預設情況下,bytea_output 的值為 hex,這意味著在查詢結果中,bytea 類型的數據以十六進位格式顯示。但是,如果你的應用程式期望以二進位格式獲取圖像數據,則將 bytea_out... ...
  • 為了優化我們公司網站的性能,我最近引入了瀏覽器預載入技術(Preload)。 這項技術可以顯著減少級聯情況,提高資源載入的並行度,從而加速網站的載入速度。 Preload的原理 Preload的原理是在瀏覽器解析HTML文檔時,提前載入頁面所需的關鍵資源,如樣式表、腳本文件和字體等。 通過預載入這些 ...
  • 前言 文本主要講 MinimalApis 中的使用自定義IResultModel和系統自帶IResult做響應返回值。 MinimalApis支持以下類型的返回值: string - 這包括 Task<string> 和 ValueTask<string> T(任何其他類型)- 這包括 Task<T ...
  • 一:背景 1. 講故事 前幾天有位朋友找到我,說他們的API服務程式跑著跑著CPU滿了降不下去,讓我幫忙看下怎麼回事,現在貌似民間只有我一個人專註dump分析,還是申明一下我dump分析是免費的,如果想學習.NET高級調試的分析技術,可以來我的訓練營看看,話不多說,dump分析走起! 二:WinDb ...
  • 前言 好久不用Arcgis,突然發現想用時,有點不會安裝了,所以這裡記錄一下安裝過程。 下載Arcgis 首先,下載一個arcgis版本,我這裡下的是10.1。 推薦【 gis思維(公眾號)】,【麻辣GIS(網站)】。 當然了,這都是很舊很舊的版本了,基本上沒有三維功能。 一定要下載帶註冊機的。 a ...
  • 在本章節中,我們討論瞭如何使用 C# Emit 來構建動態程式集,以獲得 AssemblyBuilder 這個程式集構建器,開啟構建程式集的第一步。同時我們也討論瞭如何使用 C# Emit 來構建動態程式集以及程式集的持久化。同時還分享了自己的乾貨,如何使用 CodeDom 和 Roslyn 來構建... ...
  • 在.NET中Newtonsoft.Json(Json.NET)是我們常用來進行Json序列化與反序列化的庫。 而在使用中常會遇到反序列化Json時,遇到不規則的Json數據解構而拋出異常。 Newtonsoft.Json 支持序列化和反序列化過程中的錯誤處理。 允許您捕獲錯誤並選擇是處理它並繼續序列 ...
  • 之前從來沒有使用過Arch Linux,更沒有安裝過。今天在 ARM 和 龍芯上折騰了好幾遍,為避免以後忘記,寫寫筆記。 ...
一周排行
    -Advertisement-
    Play Games
  • 通過WPF的按鈕、文本輸入框實現了一個簡單的SpinBox數字輸入用戶組件並可以通過數據綁定數值和步長。本文中介紹了通過Xaml代碼實現自定義組件的佈局,依賴屬性的定義和使用等知識點。 ...
  • 以前,我看到一個朋友在對一個系統做初始化的時候,通過一組魔幻般的按鍵,調出來一個隱藏的系統設置界面,這個界面在常規的菜單或者工具欄是看不到的,因為它是一個後臺設置的關鍵界面,不公開,同時避免常規用戶的誤操作,它是作為一個超級管理員的入口功能,這個是很不錯的思路。其實Winform做這樣的處理也是很容... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他的程式每次關閉時就會自動崩潰,一直找不到原因讓我幫忙看一下怎麼回事,這位朋友應該是第二次找我了,分析了下 dump 還是挺經典的,拿出來給大家分享一下吧。 二:WinDbg 分析 1. 為什麼會崩潰 找崩潰原因比較簡單,用 !analyze -v 命 ...
  • 在一些報表模塊中,需要我們根據用戶操作的名稱,來動態根據人員姓名,更新報表的簽名圖片,也就是電子手寫簽名效果,本篇隨筆介紹一下使用FastReport報表動態更新人員簽名圖片。 ...
  • 最新內容優先發佈於個人博客:小虎技術分享站,隨後逐步搬運到博客園。 創作不易,如果覺得有用請在Github上為博主點亮一顆小星星吧! 博主開始學習編程於11年前,年少時還只會使用cin 和cout ,給單片機點點燈。那時候,類似async/await 和future/promise 模型的認知還不是 ...
  • 之前在阿裡雲ECS 99元/年的活動實例上搭建了一個測試用的MINIO服務,以前都是直接當基礎設施來使用的,這次準備自己學一下S3相容API相關的對象存儲開發,因此有了這個小工具。目前僅包含上傳功能,後續計劃開發一個類似圖床的對象存儲應用。 ...
  • 目錄簡介快速入門安裝 NuGet 包實體類User資料庫類DbFactory增刪改查InsertSelectUpdateDelete總結 簡介 NPoco 是 PetaPoco 的一個分支,具有一些額外的功能,截至現在 github 星數 839。NPoco 中文資料沒多少,我是被博客園群友推薦的, ...
  • 前言 前面使用 Admin.Core 的代碼生成器生成了通用代碼生成器的基礎模塊 分組,模板,項目,項目模型,項目欄位的基礎功能,本篇繼續完善,實現最核心的模板生成功能,並提供生成預覽及代碼文件壓縮下載 準備 首先清楚幾個模塊的關係,如何使用,簡單畫一個流程圖 前面完成了基礎的模板組,模板管理,項目 ...
  • 假設需要實現一個圖標和文本結合的按鈕 ,普通做法是 直接重寫該按鈕的模板; 如果想作為通用的呢? 兩種做法: 附加屬性 自定義控制項 推薦使用附加屬性的形式 第一種:附加屬性 創建Button的附加屬性 ButtonExtensions 1 public static class ButtonExte ...
  • 在C#中,委托是一種引用類型的數據類型,允許我們封裝方法的引用。通過使用委托,我們可以將方法作為參數傳遞給其他方法,或者將多個方法組合在一起,從而實現更靈活的編程模式。委托類似於函數指針,但提供了類型安全和垃圾回收等現代語言特性。 基本概念 定義委托 定義委托需要指定它所代表的方法的原型,包括返回類 ...