Docker 部署 Prometheus 實現一個極簡的 QPS 監控

背景 : Prometheus 是近年來最流行的開源監控框架, 其功能強大且易于使用, 擁有各種主流后端語言(Java/Go/Python/Node.js等)與各種場景(如web handler/ k8s/Nginx/MySQL等)的客戶端, 并自帶圖形化顯示頁面。分享一個快速入門Prometheus 的教程, 實現一個極簡的, 后端開發需要特別關注的 QPS 監控。

Docker 部署 Prometheus

命令行輸入

 

css

復制代碼

docker run -d --name prometheus-node1 -p 9090:9090 bitnami/prometheus:latest

這條命令會創建一個名為 prometheus-node1 的容器, 使用 bitnami/prometheus:latest 的鏡像, 宿主機的 9090 端口與容器內的9090端口相通。

修改 prometheus 配置文件

 

bash

復制代碼

docker cp prometheus-node1:/opt/bitnami/prometheus/conf/prometheus.yml prometheus.yml

這將 prometheus-node1 容器內的 prometheus.yml 配置文件拷貝出來, 大概長這樣:

 

yaml

復制代碼

# 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: # - "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']

簡單看看這個配置文件里面最重要的兩個配置。先看 global 下面的兩個配置項, scrape_interval: 15 s 表示 每15秒獲取一次監控指標(prometheus 中叫 target), evaluation_interval: 15s 表示 每15秒執行一次 rules。 scrape_configs 直接定義了監控的 target. job_name 為 這個 target的名字, static_configs 下面的 tartgets 直接指出了監控的 IP:端口。剩下的配置留給大家自己去學習,出于快速上手 Prometheus的目的,我就不細講了。

我們下面修改一下 targets 配置, 變成這樣:

 

yaml

復制代碼

# 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: # - "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: ['172.17.0.2:20001'] # 需要監控的 IP:端口

我們修改了 targets 配置, 將他修改成需要監控的 IP:端口, 這里的 172.17.0.2 為另外一個 docker 容器的 IP地址(待會會將), 20001 為要監控的端口(待會會將)

然后將修改后的 配置文件放回 docker 容器

 

bash

復制代碼

docker cp prometheus.yml prometheus-node1:/opt/bitnami/prometheus/conf/prometheus.yml

再重啟 容器

 

復制代碼

docker restart prometheus-node1

寫一個 Web Handler 和 Web Client

創建一個 prometheus_demo 目錄, 命令行輸入

 

go

復制代碼

go mod init prometheus_demo go mod tidy

文件目錄如下:

 

lua

復制代碼

-- prometheus_demo -- go.mod -- main.go -- client --- client.go

其中main.go 為 server 端, client.go 為客戶端

其中 main.go 如下:

 

go

復制代碼

package main import ( "fmt" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "net/http" "time" ) // 只可增加的一個計數器 var req_counter_vec = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "req_counter_vec", Help: "request counter vector", }, []string{"endpoint"}, ) func main() { prometheus.MustRegister(req_counter_vec) http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/hello", HelloHandler) errChan := make(chan error) go func() { errChan <- http.ListenAndServe(":20001", nil) }() err := <-errChan if err != nil { fmt.Println("Hello server stop running.") } } func HelloHandler(w http.ResponseWriter, r *http.Request) { path := r.URL.Path req_counter_vec.WithLabelValues(path).Inc() time.Sleep(100 * time.Millisecond) }

服務端比較簡單, 定義了 一個 counter vector, 里面裝的是prometheus 四種數據類型的 Counter。Name 為 vector 的 名字, help 為詳細的解釋, 都可以自取。[]string{"endpoint"} 表示以 endpoint 進行區分 vector 內不同的 counter。這就好比一個數組, 用 索引0,1,2 區分數組內的不同元素。

Counter 正如我注釋里面寫的, 就是一個計數器, 一次只能增加1, 比如每次來一個請求, 那么就增加1。與 Counter 相對的是 Prometheus 的四種數據類型中的 Gauge。 Gauge 可加可減。數據類型 name 為變量名字, help 為變量詳細 解釋, 隨后將這個變量注冊一下, 以便被 prometheus 監控到。當然還有另外兩種用于直方圖的 數據類型 Histogram 和 Summary, 我就不細說了。

隨后定義了一個簡單的 web handler, 里面干了兩件事, 一件是記錄將 counter 加 1, withLabelValues 就是就和剛才的 endpoint 相對應, 相當于標記一下這個 vector 中的 哪一個 counter 加一。 另一件事情就是休眠100ms, 不至于太快結束不利于觀察。

client.go 如下

 

go

復制代碼

package main import ( "log" "net/http" "sync" "time" ) func main() { for { wg := sync.WaitGroup{} for i := 0; i < 50; i++ { wg.Add(1) go func(i int) { defer wg.Done() resp, err := http.Get("http://localhost:20001/hello") if err != nil { log.Println(err) return } resp.Body.Close() }(i) } wg.Wait() time.Sleep(5 * time.Second) } }

客戶端就更簡單了, 死循環里面開50個 go routine 不斷發請求。

隨后將 prometheus_demo 文件部署到 docker 中, 如何在 docker 中搭建 go 開發環境可以參考我的另一篇 文章:?保姆級從0到1講解go遠程開發環境搭建(從Docker安裝到使用Goland遠程部署和調試)。

然后在docker容器中 prometheus_demo 目錄 和 prometheus_demo/client 目錄下 分別使用下面兩個命令運行服務端和客戶端

 

go

復制代碼

go run main.go go run client.go

打開 Prometheus Web 界面

在宿主機上用瀏覽器打開 http://localhost:9090/targets?search= 如果可以觀察到下面這樣, 說明 prometheus 部署成功。

promethus_targets.PNG

注意,上面這幅圖一定要啟動 prometheus_demo 的 main.go 才能觀察得到, 因為 prometheus 監控 20001 端口, 如果 server 端沒啟動, prometheus 當然啥都監控不到。

下面來看如何監控 QPS, 在宿主機上用瀏覽器打開, http://localhost:9090/graph

然后在放大鏡旁邊的框框內輸入下面這一串指令

 

ini

復制代碼

rate(req_counter_vec{endpoint="/hello"}[15s])

再點擊 graph 應該看到下面這樣類似的圖片

promethus_graph.PNG

解釋一下, rate(req_counter_vec{endpoint="/hello"}[15s]) 這句指令是什么意思。 req_counter_vec 就是之前定義的裝 counter 的 vector, {endpoint="/hello"} 也就是 HelloHandler 里面記錄請求次數的 那個counter, rate 接 [15s] 表示每15秒(和 配置文件里面的15秒保持一致)記錄一下 counter 的變化情況(因為 counter只能增加, 所以變化為一個 非負數), 總請求次數除以時間段, 就是一個范圍內的 QPS。我們這里并不是1秒, 而是15秒, 也就可以近似看作 QPS。

如果有同學發現沒有圖形出現, 顯示 empty query result, 可能是北京時間和標準時間不同步, 可以勾選 use local time, 或者 調整一 圖形界面的窗口時間(我圖片上的 5m 和 2022-12-27 20:14:02 那里) 。

還有點同學出現的不是直方圖而是一個個小的線段, 這是因為圖形的不同展示方式的原因, 可以 點一下 Hide Exemplars 左邊的兩個小圖標。

巨人的肩膀

yunlzheng.gitbook.io/prometheus-…

hub.docker.com/r/bitnami/p…

juejin.cn/post/707865…

cjting.me/2017/03/12/…

??

下面是配套資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!

?

軟件測試面試小程序
被百萬人刷爆的軟件測試題庫!!!誰用誰知道!!!全網最全面試刷題小程序,手機就可以刷題,地鐵上公交上,卷起來!

涵蓋以下這些面試題板塊:

1、軟件測試基礎理論 ,2、web,app,接口功能測試 ,3、網絡 ,4、數據庫 ,5、linux 6、web,app,接口自動化 ,7、性能測試 ,8、編程基礎,9、hr面試題 10、開放性測試題,11、安全測試,12、計算機基礎

?編輯資料獲取方式 :xiaobei_upup,添加時備注“csdn alex”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11591.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx-基礎-基礎配置-Location

Location 參數匹配模式 參數匹配方式匹配模式說明注意事項精準匹配普通字符串匹配用于標準uri前&#xff0c;要求請求字符串與uri精準匹配&#xff0c;成功則立即處理&#xff0c;nginx停止搜索其他匹配。~正則匹配正則表達式匹配用于正則uri&#xff0c;表示uri包含正則表達…

使用 Docker 輕松部署 Spring Boot 應用

當今軟件開發領域&#xff0c;Docker 和 Spring Boot 的組合已成為開發和部署應用程序的黃金標準。在這篇博客中&#xff0c;我們將詳細探討如何將 Spring Boot 應用容器化并使用 Docker 進行部署&#xff0c;確保你的部署過程既高效又可靠。 引言 Docker 提供了一個標準化的…

基于SSM的理發店會員管理系統的設計和實現(有報告)。Javaee項目。ssm項目。

演示視頻&#xff1a; 基于SSM的理發店會員管理系統的設計和實現&#xff08;有報告&#xff09;。Javaee項目。ssm項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系結構&#xff0…

Docker安裝達夢數據庫

1.確保已安裝Docker 可參考&#xff1a;Linux安裝Docker-CSDN博客 2.上傳dm鏡像并導入安裝包 可以從&#xff1a;產品下載 | 達夢數據庫下載dm鏡像&#xff0c;如下圖&#xff1a; docker load -i dm8_20230808.tar 3.導入后查看鏡像 docker images 4.啟動容器 docker run …

圖的概念、性質和存儲與簡單遍歷

前置知識&#xff1a;樹的基本概念及性質 為了保證學習效果&#xff0c;請保證已經掌握前置知識之后&#xff0c;再來學習本章節&#xff01;如果在閱讀中遇到困難&#xff0c;也可以回到前面章節查閱。 學習目標 掌握圖的基本概念掌握圖的一些性質 圖的概念 基本概念 圖 (…

Pytorch如何計算網絡參數

方法一. 利用pytorch自身 PyTorch是一個流行的深度學習框架&#xff0c;它允許研究人員和開發者快速構建和訓練神經網絡。計算一個PyTorch網絡的參數量通常涉及兩個步驟&#xff1a;確定網絡中每個層的參數數量&#xff0c;并將它們加起來得到總數。 以下是在PyTorch中計算網…

如何在 CloudFlare 里屏蔽/攔截某個 IP 或者 IP 地址段

最近除了接的 CloudFlare 代配置訂單基本很少折騰自己的 CloudFlare 配置了,今天給大家簡單的講解一下如何在 CloudFlare 里屏蔽/攔截 IP 地址和 IP 地址段,雖然明月一直都很反感針對 IP 的屏蔽攔截,但不得不說有時候還是很有必要的。并且,既然可以攔截屏蔽 IP 自然也可以但…

鴻蒙內核源碼分析(VFS篇) | 文件系統和諧共處的基礎

基本概念 | 官方定義 VFS&#xff08;Virtual File System&#xff09;是文件系統的虛擬層&#xff0c;它不是一個實際的文件系統&#xff0c;而是一個異構文件系統之上的軟件粘合層&#xff0c;為用戶提供統一的類Unix文件操作接口。由于不同類型的文件系統接口不統一&#x…

Flink HA模式下JobManager切換時發送告警

資源&版本信息 Flink版本1.14.6 運行平臺&#xff1a;K8s HA使用ZK&#xff08;使用K8s的ETC應該是一個道理&#xff09; 詳解Flink HA原理 Flink啟動時會創建HighAvailabilityServices提供HA和相關基礎服務&#xff0c;其中包括leaderRetrievalService和LeaderElecti…

搜索引擎的設計與實現(二)

目錄 3 搜索引擎的基本原理 3.1搜索引擎的基本組成及其功能 l.搜索器 (Crawler) 2.索引器(Indexer) 3.檢索器(Searcher) 4.用戶接口(UserInterface) 3.2搜索引擎的詳細工作流程 4 系統分析與設計 4.1系統分析 4.2系統概要設計 4.2系統實現目標 前面內容請移步 搜索引…

Rust 語言不支持 goto 語句

一、Rust 不提供 goto 語句 Rust 語言并沒有提供 goto 語句。goto 語句在很多現代編程語言中已經不再被推薦使用&#xff0c;因為它可能導致代碼的流程變得難以跟蹤和理解&#xff0c;特別是在復雜的程序中。Rust 語言設計者選擇了更加結構化和可預測的控制流語句&#xff0c;…

關于C++多態的復習總結

多態 簡介: 面向對象的三大特性之一&#xff0c;多態顧名思義即具有多種形態&#xff0c;即去執行某個行為時&#xff0c;當不同的對象去執行時會產生不同的狀態 構成多態的條件 條件一 必須通過基類&#xff08;父類&#xff09;的指針或者引用調用虛函數&#xff08;函數…

寧夏銀川市起名專家的老師顏廷利:死神(死亡)并不可怕,可怕的是...

在中國優秀傳統文化之中&#xff0c;漢語‘巳’字與‘四’同音&#xff0c;在阿拉伯數字里面&#xff0c;通常用‘4’來表示&#xff1b; 湖南長沙、四川成都、重慶、寧夏銀川最靠譜最厲害的起名大師的老師顏廷利教授指出&#xff0c;作為漢語‘九’字&#xff0c;倘若是換一個…

FreeRTOS中斷管理

FreeRTOS中斷管理 基于STM32_stm32 freertos 按鍵中斷-CSDN博客 更加詳情請看以上鏈接↑ 中斷優先級 任何中斷的優先級都大于任務! 在我們的操作系統,中斷同樣是具有優先級的,并且我們也可以設置它的優先級,但是他的優先 級并不是從 0~15 ,默認情況下它是從 5~15 ,…

[ACTF新生賽2020]SoulLike

沒見過的錯誤&#xff1a; ida /ctg目錄下的hexrays.cfg文件中的MAX_FUNCSIZE64 改為 MAX_FUNCSIZE1024 然后就是一堆數據 反正就是12個字符 from pwn import * flag"actf{" k0 for n in range(12):for i in range(33,127):pprocess("./SoulLike")_flag…

94.二叉樹的中序遍歷

刷算法題&#xff1a; 第一遍&#xff1a;1.看5分鐘&#xff0c;沒思路看題解 2.通過題解改進自己的解法&#xff0c;并且要寫每行的注釋以及自己的思路。 3.思考自己做到了題解的哪一步&#xff0c;下次怎么才能做對(總結方法) 4.整理到自己的自媒體平臺。 5.再刷重復的類…

Python爬蟲入門:網絡世界的寶藏獵人

今天阿佑將帶你踏上Python的肩膀&#xff0c;成為一名網絡世界的寶藏獵人&#xff01; 文章目錄 1. 引言1.1 簡述Python在爬蟲領域的地位1.2 闡明學習網絡基礎對爬蟲的重要性 2. 背景介紹2.1 Python語言的流行與適用場景2.2 網絡通信基礎概念及其在數據抓取中的角色 3. Python基…

今日總結2024/5/13

今日學習了01背包求具體方案的方法 Acwing.12 背包問題求具體方案 由于背包是從小到大枚舉物品&#xff0c;只能從后往前判斷是從哪個狀態遞推過來的&#xff0c;而該題要求按字典序順序輸出字典序最小的最優方案 因此要將物品從大到小枚舉&#xff0c;判斷時從小到大判斷是…

在Windows上有哪些好用的網絡抓包工具?

2024年5月12日&#xff0c;周日上午 在Windows上&#xff0c;有多種好用的網絡抓包工具&#xff0c;以下是一些常見的選項&#xff1a; Wireshark&#xff1a; Wireshark 是一款功能強大的網絡協議分析工具&#xff0c;它可以捕獲并分析計算機網絡上的數據包。它支持廣泛的協議…

ssm+vue的公務用車管理智慧云服務監管平臺查詢統計(有報告)。Javaee項目,ssm vue前后端分離項目

演示視頻&#xff1a; ssmvue的公務用車管理智慧云服務監管平臺查詢統計&#xff08;有報告&#xff09;。Javaee項目&#xff0c;ssm vue前后端分離項目 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…