記-Windows環境下Prometheus+alertmanager+windows_exporter+mtail監控部署

Golang發表於2022-03-29

1、概述

最近因專案需要統計服務的負載情況及機器的負載情況,但是專案裡面卻沒有相關統計而服務所在的機器也沒有相關的監控,因為工期原因就選擇了相對輕量級的prometheus方案。其中windows_exporter用來採集機器的負載情況,如CPU、記憶體、磁碟io、網路等基礎資訊,使用mtail來採集應用日誌統計服務情況(需要業務系統有基礎的日誌,如請求發起,是否正常結束等,或者通過nginx等中介軟體的日誌來統計也行),如QPS、TPS、請求數、成功率、異常率等,使用prometheus來統計分析相應的指標及設定報警規則等,如通過請求總數來計算QPS等。

2、windows_exporter配置啟動

建議下載最新版本,最新版本下載地址
,我下載的版本為windows_exporter-0.18.1-386.exe,將其解壓到任意目錄下,進入將其在後臺啟動:

 

其中連結Metrics為採集到的指標(metrics)如下:

 3.mtail配置啟動

mtail是谷歌基於golang開發的一款日誌收集工具,用於從應用程式日誌中提取白盒監視資料以收集在時間序列資料庫中。
建議下載最新版本,最新版下載地址請戳此處,我下載的版本為mtail_3.0.0-rc48_Linux_arm64.tar.gz,此版本是可執行二進位制檔案,移動至/usr/local/sbin下即可使用。

檢視mtail版本(驗證matail命令是否可用):

mtail -version

輸出如下:

mtail version 3.0.0-rc48 git revision e19766e45ca2dedf34794fea51444c7963a7c3d6 go version go1.17.5 go arch 386 go os linux

mtail啟動命令如下:

nohup mtail -port 8080 -logtostderr -progs /etc/mtail/access.mtail -logs /xxx/xxx.log &

#8080埠可以自定義,也可同時啟動多個mtail監控多個日誌檔案。

-progs引數需要以.mtail結尾,指令碼內容為需要從日誌中提取的指標,具體格式指令碼寫法及例子請參考此連結
例子中access.mtail的內容如下:

counter apache_http_requests_total by request_method, http_version, status_code
counter apache_http_bytes_total by request_method, http_version, status_code
gauge apache_http_response_time by remote_host, request_method, request_uri, status_code
gauge apache_http_response_size by remote_host, request_method, request_uri, status_code
 
histogram apache_http_request_time_millseconds_bucket buckets 0, 1, 2, 4, 8 by status_code
 
/^/ +
/(?P<remote_host>[0-9A-Za-z\.:-]+) / + # %h
/(?P<remote_logname>[0-9A-Za-z-]+) / + # %l
/(?P<remote_username>[0-9A-Za-z-]+) / + # %u
/\[(?P<timestamp>\d{2}\/\w{3}\/\d{4}:\d{2}:\d{2}:\d{2} (\+|-)\d{4})\] / + # %u
/"(?P<request_method>[A-Z]+) (?P<request_uri>\S+) (?P<http_version>HTTP\/[0-9\.]+)" / + # \"%r\"
/(?P<status_code>\d{3}) / + # %>s
/((?P<response_size>\d+)|-) / + # %b
/(?P<response_time>\d+) / + # %D
/"(?P<referer>\S+)" / + # \"%{Referer}i\"
/"(?P<user_agent>[[:print:]]+)"/ + # \"%{User-agent}i\"
/$/ {
  strptime($timestamp, "02/Jan/2006:15:04:05 -0700")
 
  apache_http_requests_total[$request_method][$http_version][$status_code]++
  $response_size > 0 {
      apache_http_bytes_total[$request_method][$http_version][$status_code] += $response_size
      apache_http_response_size[$remote_host][$request_method][$request_uri][$status_code] += $response_size
  }
  apache_http_response_time[$remote_host][$request_method][$request_uri][$status_code] = $response_time
  apache_http_request_time_millseconds_bucket[$status_code] = $response_time
}
 
getfilename() !~ /access_log.?log/ {
  stop
}
counter media_request_total
/receive http request path is/ {
  media_request_total++
}
#第一段程式碼是監控apache日誌,第一階段測試可用此段配置。

檢視mtail資訊,訪問http://ip:3903:

這裡需要注意的是:若監控apache日誌,需配置好第一段程式碼執行後觸發apache(重啟)產生新日誌才能被監控到。

 

4.prometheus配置啟動

建議下載最新版本,最新版下載地址請戳此處,我下載的版本為prometheus-2.34.0.windows-amd64.zip,將其解壓到任意目錄下,進入目錄修改配置檔案prometheus.yml新增windows_exporter和matail 的採集路徑,prometheus.yml檔案配置如下:

# 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).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
    - "rules/*_rules.yml" 
    #告警規則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"]
      
  - job_name: "node_exporter"
    scrape_interval: 5s  
    #每五秒檢查一次應用程式
    metrics_path: "/metrics"  
    #指標路徑
    static_configs:
        - targets: ["localhost:9182"]
    
  - job_name: "alertmanager"
    scrape_interval: 5s

    static_configs:
        - targets: ["localhost:9093"]
        
  - job_name: "mtail"
    scrape_interval: 5s
 
    static_configs:
        - targets: ["xx.xx.xx.xx:8080"]      

prometheus預設埠為9090,通過網頁訪問http://ip:9090/:

 

 如需配置告警,需在目錄下新建rules資料夾,告警配置如下:

groups:
- name: node-up    
# 分組名稱
  rules:           # 規則設定
  - alert: node-up  
  #告警名稱
    expr: up{job="windows_exporter"} == 0   
    # 表示式,查詢式語句查詢up的值是否等於0,如果等於則告警
    for: 15s   
    # 告警持續時間
    labels:
      severity: 1
      team: node
    annotations:    # 註解
      summary: "{{ $labels.instance }} 已停止執行超過 15s!"

5、alertmanager配置

建議下載最新版本,最新版下載地址請戳此處Alertmanager的配置有兩個地方,一個是在Prometheus server端進行配置告警節點,指定匹配告警規則檔案路徑,以及監控alertmanager本身。另一個直接配置alertmanager自身的配置,在alertmanager.yml進行配置。

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: 'xxxxxxxxx@qq.com'
  smtp_auth_username: 'xxxxxxxxx@qq.com'
  smtp_auth_password: 'xxxxxxxxx'    # 16位qq郵箱授權碼作為密碼
  smtp_require_tls: false

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'email'    # 選用郵箱告警傳送

receivers:
- name: 'email'
  email_configs:
  - to: 'xxxxxxxxx@qq.com'

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

 

 

6.總結
此套監控的解決方案優點在於完全對業務系統解耦,並且對業務系統透明,唯一需要的就是業務系統的日誌所在路徑。
而此套系統的關鍵點在於mtail指令碼編寫和mtail採集到的資料最終使用promQL分析,mtail指令碼需要知道業務系統的日誌是否滿足監控系統的需求,如果不滿足還是需要改動業務程式碼新增相應的日誌。而promQL則需要掌握相關的語法規則及內建函式,只要掌握了這兩個關鍵點,整套系統就搞定了。

 

轉載請宣告出處哦~,本篇文章釋出於Biuget-Golang的部落格:

https://www.cnblogs.com/Biuget-Golang/

 

相關文章