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日志,第一階段測試可用此段配置。
counter app_http_requests_total by uri, request_method,http_status #該段代碼為獲取網關(geteway)日志代碼 gauge app_http_requests_time by uri, request_method, http_status histogram app_http_request_time_millseconds_bucket buckets 0, 1, 2, 4, 8 by uri, request_method, http_status /`"(?P<request_method>[A-Z]+) (?P<uri>[\/a-zA-Z0-9-_]+)(?:\??)(?:\S*) (?P<http_version>HTTP\/[0-9\.]+)"/ + /`"(?P<http_user_agent>.+)"/ + /`(?P<http_status>\d{3})/ + /`(?P<remote_addr>/ + /\[((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}\])/ + /`(?P<http_x_log_uid>\W+)/ + /`"(?P<http_referer>\W+)"/ + /`(?P<request_time>\d{1,}\.\d{3})/ + /`(?P<body_bytes_sent>\d+)`/ + /(?P<http_x_forwarded_for>\S+)/ + /`(?P<http_host>((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3})/ + /`(?P<domain>.+)/ + /`(?P<http_cookie>.+)/ + /`(?P<upstream_addr>\[((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}:\d{4}\])/ + /`(?P<upstream_response_time>(\d{1,}\.\d{3}))/ + /`xd$/{ /\/coco-server\/v1\/users\//{ } else { app_http_requests_total[$uri][$request_method][$http_status] ++ app_http_requests_time[$uri][$request_method][$http_status] = $request_time app_http_request_time_millseconds_bucket[$uri][$request_method][$http_status] = $request_time } }
查看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/
