Rust語(yǔ)言之Prometheus系統(tǒng)監(jiān)控工具包的使用詳解
1. Prometheus 簡(jiǎn)介
Prometheus 是一個(gè)開源的系統(tǒng)監(jiān)控和警報(bào)工具包,最初是由 SoundCloud 構(gòu)建的。Prometheus 的主要優(yōu)勢(shì)在于其多維數(shù)據(jù)模型和靈活的查詢語(yǔ)言,能夠?qū)崿F(xiàn)高效的數(shù)據(jù)存儲(chǔ)和查詢。
隨著時(shí)間的發(fā)展,Prometheus已經(jīng)具有適用于各種操作系統(tǒng)、各種使用場(chǎng)景的版本。為了開發(fā)者方便開發(fā),更是有各種語(yǔ)言版本的Prometheus的開發(fā)工具包(本文主要介紹Rust版本的Prometheus開發(fā)工具包)
本文章具體介紹兩個(gè)部分的使用:
Exporter:用于產(chǎn)生和發(fā)送信息
Prometheus:用于接收和展示信息
1.1 Exporter
在整個(gè)Prometheus 的使用中,Exporter是最基礎(chǔ)和重要的部分,Prometheus只是負(fù)責(zé)接收并展示你想知道的信息,但是信息究竟從何而來(lái)呢?是的,消息由Exporter產(chǎn)生,并發(fā)送給Prometheus保存和記錄。
廣義上講所有可以向Prometheus提供監(jiān)控樣本數(shù)據(jù)的程序都可以被稱為一個(gè)Exporter。而Exporter的一個(gè)實(shí)例稱為target,Prometheus通過(guò)輪詢的方式定期從這些target中獲取樣本數(shù)據(jù)。也就是說(shuō)可以同時(shí)有多個(gè)Exporter給同一個(gè)Prometheus發(fā)送需要記錄的信息。
其實(shí)對(duì)于Prometheus工具包的使用具體也在這一部分,通過(guò)工具包創(chuàng)建一個(gè)又一個(gè)Exporter從而完整的記錄你想記錄的任何信息,那問(wèn)題來(lái)了Exporter結(jié)構(gòu)應(yīng)該是怎樣的呢?究竟是使用工具包提供的api寫在自己的程序里面,還是完全隔離開,寫一個(gè)獨(dú)立的Exporter程序呢?
從Exporter的運(yùn)行方式上來(lái)講,又可以分為:
- 獨(dú)立使用的
以Node Exporter為例,由于操作系統(tǒng)本身并不直接支持Prometheus,同時(shí)用戶也無(wú)法通過(guò)直接從操作系統(tǒng)層面上提供對(duì)Prometheus的支持。因此,用戶只能通過(guò)獨(dú)立運(yùn)行一個(gè)程序的方式,通過(guò)操作系統(tǒng)提供的相關(guān)接口,將系統(tǒng)的運(yùn)行狀態(tài)數(shù)據(jù)轉(zhuǎn)換為可供Prometheus讀取的監(jiān)控?cái)?shù)據(jù)。 除了Node Exporter以外,比如MySQL Exporter、Redis Exporter等都是通過(guò)這種方式實(shí)現(xiàn)的。 這些Exporter程序扮演了一個(gè)中間代理人的角色。
- 集成到應(yīng)用中的
為了能夠更好的監(jiān)控系統(tǒng)的內(nèi)部運(yùn)行狀態(tài),有些開源項(xiàng)目如Kubernetes,ETCD等直接在代碼中使用了Prometheus的Client Library,提供了對(duì)Prometheus的直接支持。這種方式打破的監(jiān)控的界限,讓應(yīng)用程序可以直接將內(nèi)部的運(yùn)行狀態(tài)暴露給Prometheus,適合于一些需要更多自定義監(jiān)控指標(biāo)需求的項(xiàng)目。
1.2 安裝 Prometheus
Prometheus主要用來(lái)顯示從Exporter發(fā)送的信息,并且Prometheus可以在本地運(yùn)行,只需下載對(duì)應(yīng)的版本。
https://prometheus.io/download/
按照安裝指南完成安裝與配置。
我下載的是Linux,64位系統(tǒng)的版本:prometheus-2.47.0.linux-amd64.tar.gz
輸入指令解壓文件
tar -zxvf prometheus-2.47.0.linux-amd64.tar.gz
進(jìn)入 Prometheus 目錄
cd prometheus-2.47.0.linux-amd64
運(yùn)行 Prometheus
./prometheus
現(xiàn)在 Prometheus 應(yīng)該已經(jīng)開始運(yùn)行,并在默認(rèn)的 9090 端口上監(jiān)聽(tīng)。你可以在 Web 瀏覽器中通過(guò)訪問(wèn) http://<你的服務(wù)器IP>:9090
來(lái)訪問(wèn) Prometheus 的 Web 界面。
配置 Prometheus
Prometheus 通常還需要一個(gè)配置文件,例如 prometheus.yml
,來(lái)定義如何執(zhí)行服務(wù)發(fā)現(xiàn)和數(shù)據(jù)采集。在 Prometheus 目錄中,你通常會(huì)找到一個(gè)示例配置文件,你可以根據(jù)自己的需要對(duì)其進(jìn)行修改。
2.Prometheus 庫(kù)的基本使用
2.1 創(chuàng)建新的 Rust 項(xiàng)目
使用 Cargo 創(chuàng)建一個(gè)新項(xiàng)目:
cargo new prometheus_example cd prometheus_example
配置項(xiàng)目依賴,在 Cargo.toml
文件中加入 Prometheus 庫(kù):
[dependencies] prometheus = "0.13.3"
0.13.3是寫這篇文章時(shí)的最新版本。也許現(xiàn)在版本已經(jīng)更新,建議使用最新的版本哦
https://docs.rs/prometheus/0.13.3/prometheus/
2.2 創(chuàng)建和配置 Prometheus 計(jì)數(shù)器
簡(jiǎn)單的 初始化 一個(gè) 計(jì)數(shù)器,并配置標(biāo)簽和值:
use prometheus::{Counter, Registry}; let reg = Registry::new(); let counter = Counter::new("example_counter", "An example counter").unwrap(); reg.register(Box::new(counter.clone())).unwrap();
也可以通過(guò)官方的的例子自定義Registry實(shí)例和counter實(shí)例
// 使用 `lazy_static!` 定義靜態(tài) `IntCounter`。 lazy_static! { static ref CUSTOM_COUNTER: IntCounter = IntCounter::new("custom", "dedicated counter").unwrap(); } // Register custom metrics to a custom registry. let mut labels = HashMap::new(); //這部分代碼創(chuàng)建了一個(gè)帶有自定義前綴“myprefix”的 `Registry`,并為它分配了一個(gè)標(biāo)簽,標(biāo)簽的鍵是“mykey”,值是“myvalue”。 labels.insert("mykey".to_string(), "myvalue".to_string()); let custom_registry = Registry::new_custom(Some("myprefix".to_string()),Some(labels)).unwrap(); //這一行調(diào)用了下面定義的 `custom_metrics` 函數(shù),并將先前創(chuàng)建的 `custom_registry` 作為參數(shù)傳遞給它。 custom_metrics(&custom_registry); /// Custom metrics, to be collected by a dedicated registry. fn custom_metrics(registry: &Registry) { registry.register(Box::new(CUSTOM_COUNTER.clone())).unwrap(); CUSTOM_COUNTER.inc_by(42); assert_eq!(CUSTOM_COUNTER.get(), 42); } //在這個(gè)函數(shù)中: // `CUSTOM_COUNTER` 被注冊(cè)到了傳遞進(jìn)來(lái)的 `Registry` 中。 // 然后,`CUSTOM_COUNTER` 的值增加了42。 // 最后,使用 `assert_eq!` 宏來(lái)驗(yàn)證 `CUSTOM_COUNTER` 的值是否確實(shí)為42。
通過(guò)上面的方式生成的metrics可以打印出來(lái)
// Print metrics for the custom registry. let mut buffer = Vec::<u8>::new(); let encoder = prometheus::TextEncoder::new(); encoder .encode(&custom_registry.gather(), &mut buffer) .unwrap(); println!("## Custom registry"); println!("{}", String::from_utf8(buffer.clone()).unwrap());
打印結(jié)果:
## Custom registry # HELP myprefix_custom dedicated counter # TYPE myprefix_custom counter myprefix_custom 42
3. 數(shù)據(jù)收集和展示
3.1通過(guò)web服務(wù)提供查詢數(shù)據(jù)的接口給 Prometheus
因?yàn)?Prometheus 主要是通過(guò) HTTP 協(xié)議來(lái)抓?。╯crape)應(yīng)用暴露出的指標(biāo)(metrics)的,但這并不意味著你的應(yīng)用必須是一個(gè)完整的 web 服務(wù)。你只需要為你的應(yīng)用添加一個(gè)簡(jiǎn)單的 HTTP 服務(wù)器來(lái)暴露指標(biāo)。這樣的 HTTP 服務(wù)器通常非常輕量,對(duì)你的應(yīng)用幾乎沒(méi)有什么影響。
可以使用warp的輕量級(jí)web框架,也可以使用最近剛推出的評(píng)價(jià)還不錯(cuò)的一個(gè)web框架,當(dāng)然選用什么框架都看個(gè)人習(xí)慣。
我將用warp舉例 在Cargo.toml文件中添加依賴
[dependencies] warp = "0.3" tokio = { version = "1", features = ["full"] }
接下來(lái),用warp創(chuàng)建一個(gè)簡(jiǎn)單的web服務(wù):這個(gè)服務(wù)會(huì)在 http://[127:0:0:1]:8080/test
上暴露你的 Prometheus 指標(biāo):
use prometheus::{Encoder, TextEncoder}; use warp::Filter; use std::collections::HashMap; use prometheus::{Registry, IntCounter}; use std::sync::Arc; use tokio::sync::RwLock; lazy_static! { static ref CUSTOM_COUNTER: IntCounter = IntCounter::new("custom", "dedicated counter").unwrap(); #[tokio::main] async fn main() { let mut labels = HashMap::new(); labels.insert("mykey".to_string(), "myvalue".to_string()); let custom_registry = Registry::new_custom(Some("myprefix".to_string()),Some(labels)).unwrap(); custom_metrics(&custom_registry); fn custom_metrics(registry: &Registry) { registry.register(Box::new(CUSTOM_COUNTER.clone())).unwrap(); CUSTOM_COUNTER.inc_by(42); assert_eq!(CUSTOM_COUNTER.get(), 42); } let custom_registry = Arc::new(RwLock::new(custom_registry)); // 創(chuàng)建一個(gè) warp filter,該 filter 會(huì)暴露 Prometheus 指標(biāo)。 let consensus_route = warp::path!("test").map(move || { GET_BLOCK_COUNTER.inc(); SEND_TX_COUNTER.inc(); let buffer = metrics_encode(Consensus_registry.clone()); warp::reply::with_header(buffer, "Content-Type", "text/plain") }); let routes=rpc_route.or(consensus_route); warp::serve(routes).run(([127, 0, 0, 1], 8080)).await;
在配置文件中添加剛剛寫的web服務(wù)的網(wǎng)址,使打開prometheus可以定時(shí)訪問(wèn)這個(gè)地址從而獲取信息。 文件編輯好后,保存,退出,重新運(yùn)行prometheus就會(huì)去監(jiān)控這個(gè)地址了。
3.2. 監(jiān)控信息
打開瀏覽器,訪問(wèn)localhost:9090地址,會(huì)出現(xiàn)prometheus的監(jiān)控畫面
在搜索欄中輸入想要監(jiān)控的信息:myprefix_custom,點(diǎn)擊Execute,便可以看到想要查詢的信息,數(shù)量等
以上就是Rust語(yǔ)言之Prometheus系統(tǒng)監(jiān)控工具包的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Rust Prometheus工具包使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Rust數(shù)據(jù)類型之結(jié)構(gòu)體Struct的使用
結(jié)構(gòu)體是Rust中非常強(qiáng)大和靈活的數(shù)據(jù)結(jié)構(gòu),可以用于組織和操作各種類型的數(shù)據(jù),本文就來(lái)介紹一下Rust數(shù)據(jù)類型之結(jié)構(gòu)體Struct的使用,感興趣的可以了解一下2023-12-12vscode搭建rust開發(fā)環(huán)境的圖文教程
本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08rust多樣化錯(cuò)誤處理(從零學(xué)習(xí))
一個(gè)優(yōu)秀的項(xiàng)目,錯(cuò)誤處理的優(yōu)雅性是至關(guān)重要的,而rust,anyhow creat是繞不過(guò)去的一個(gè),今天我們來(lái)研究下,怎么使用它,幫助我們寫出更優(yōu)雅的代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-11-11rust語(yǔ)言基礎(chǔ)pub關(guān)鍵字及Some語(yǔ)法示例
這篇文章主要為大家介紹了rust語(yǔ)言基礎(chǔ)pub關(guān)鍵字及Some語(yǔ)法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Rust使用csv crate構(gòu)建CSV文件讀取器的全過(guò)程
這篇文章主要學(xué)習(xí)如何基于Rust使用csv這個(gè)crate構(gòu)建一個(gè)CSV文件讀取器的過(guò)程,學(xué)習(xí)了csv相關(guān)的用法以及一些往期學(xué)過(guò)的crate的復(fù)習(xí),兼顧了實(shí)用性和Rust的學(xué)習(xí),需要的朋友可以參考下2024-05-05Rust語(yǔ)言從入門到精通系列之Iterator迭代器深入詳解
這篇文章主要為大家介紹了Rust語(yǔ)言從入門到精通系列之Iterator迭代器深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04