咸陽(yáng)市住房和城鄉(xiāng)建設(shè)規(guī)劃局網(wǎng)站武漢網(wǎng)站設(shè)計(jì)
Prometheus和Grafana都是非常流行的開(kāi)源監(jiān)控工具,可以協(xié)同使用來(lái)實(shí)現(xiàn)對(duì)各種應(yīng)用程序、系統(tǒng)、網(wǎng)絡(luò)和服務(wù)器等的監(jiān)視和分析。
下面對(duì)Prometheus和Grafana進(jìn)行簡(jiǎn)要介紹:
- Prometheus
Prometheus是一款開(kāi)源、云原生的系統(tǒng)和服務(wù)監(jiān)控工具,它采用pull模式的監(jiān)控方式,可以通過(guò)HTTP協(xié)議從各種Target中抓取metrics數(shù)據(jù),并存儲(chǔ)到本地的時(shí)間序列數(shù)據(jù)庫(kù)中。Prometheus提供了強(qiáng)大的查詢語(yǔ)言(PromQL)來(lái)支持?jǐn)?shù)據(jù)查詢、聚合和圖表繪制等操作。同時(shí),它還提供了Alertmanager組件來(lái)支持告警和通知功能,可以通過(guò)配置規(guī)則實(shí)現(xiàn)各種復(fù)雜的告警條件和觸發(fā)方式。
- Grafana
Grafana是一款開(kāi)源的監(jiān)控可視化和數(shù)據(jù)分析軟件,它支持將來(lái)自多個(gè)數(shù)據(jù)源的時(shí)間序列數(shù)據(jù)轉(zhuǎn)換為豐富的圖表和儀表板,以實(shí)時(shí)監(jiān)控和分析各種指標(biāo)和性能指標(biāo)。Grafana 的用戶可以輕松創(chuàng)建和編輯儀表板、將不同數(shù)據(jù)源的指標(biāo)數(shù)據(jù)組合到一起顯示、應(yīng)用多種過(guò)濾器和渲染選項(xiàng)來(lái)定制化儀表板的顯示方式以及定義警報(bào)功能等,從而實(shí)現(xiàn)根據(jù)需要快速了解應(yīng)用程序的狀態(tài)和性能指標(biāo)以及進(jìn)行數(shù)據(jù)分析。
通過(guò)將Prometheus和Grafana結(jié)合使用,您可以有效地監(jiān)控和管理各種應(yīng)用程序和系統(tǒng)的狀態(tài)和性能指標(biāo),從而更好地掌握系統(tǒng)的運(yùn)行狀況并快速發(fā)現(xiàn)故障。
本人使用mac電腦安裝Prometheus和Grafana,下載可自行根據(jù)自己的環(huán)境進(jìn)行,思路才是最重要的。
安裝Prometheus:
// 安裝
brew?install?prometheus// 啟動(dòng)
brew services start prometheus
復(fù)制代碼
默認(rèn)端口為9090:
重點(diǎn):
有了Prometheus后,我們要思考一個(gè)問(wèn)題就是,數(shù)據(jù)從哪里來(lái)?
要了解數(shù)據(jù)是程序push過(guò)來(lái)的,還是Prometheus去拉取的,很關(guān)鍵。
package com.example.demo.monitor;/*** @author caozhixin* @date 2023/4/8 13:10*/
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;
import io.prometheus.client.exporter.HTTPServer;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;public class BankAccountSystem {// 存儲(chǔ)每個(gè)銀行賬戶的當(dāng)前余額private static final Map<String, Double> accountBalances = new HashMap<>();// 創(chuàng)建一個(gè)Counter指標(biāo)來(lái)表示已經(jīng)從每個(gè)賬戶取款的次數(shù)private static final Counter withdrawals = Counter.build().name("bank_account_withdrawals_total").help("Total number of account withdrawals.").labelNames("account_number") // 為了方便查詢,使用名為"account_number"的標(biāo)簽分別標(biāo)識(shí)每個(gè)賬戶的指標(biāo).register();// 創(chuàng)建一個(gè)Gauge指標(biāo)來(lái)表示每個(gè)賬戶的當(dāng)前余額private static final Gauge accountBalance = Gauge.build().name("bank_account_balance").help("Current balance for each account.").labelNames("account_number") // 同樣使用名為"account_number"的標(biāo)簽來(lái)標(biāo)識(shí)每個(gè)賬戶的指標(biāo).register();public static void main(String[] args) throws IOException {// Start the HTTP server and expose metrics endpoint.// 啟動(dòng)一個(gè)HTTP服務(wù)器,并暴露/metrics端點(diǎn)以便Prometheus從中獲取指標(biāo)數(shù)據(jù)HTTPServer server = new HTTPServer(8080);Random random = new Random();// 初始化10個(gè)不同的銀行賬戶,并對(duì)每個(gè)賬戶進(jìn)行一次初始余額的設(shè)置for (int i = 1; i <= 10; i++) {String accountNumber = "ACCT" + i;double initialBalance = random.nextDouble() * 100000;accountBalances.put(accountNumber, initialBalance);// 使用set方法將每個(gè)賬戶的初始余額設(shè)置為Gauge指標(biāo)的值,同時(shí)使用"labelValues"參數(shù)傳遞與之對(duì)應(yīng)的"account_number"標(biāo)簽值accountBalance.labels(accountNumber).set(initialBalance);}// 模擬一些賬戶活動(dòng)while (true) {try {Thread.sleep(5000); // 等待5秒鐘} catch (InterruptedException e) {e.printStackTrace();}// 對(duì)于每個(gè)銀行賬戶,隨機(jī)從中扣除一些資金,并更新相應(yīng)的指標(biāo)數(shù)據(jù)for (Map.Entry<String, Double> entry : accountBalances.entrySet()) {String accountNumber = entry.getKey();double currentBalance = entry.getValue();double withdrawAmount = random.nextDouble() * 100;if (withdrawAmount > currentBalance) {withdrawAmount = currentBalance; // 不能透支,如果取款金額超過(guò)了當(dāng)前余額,那么就只能全部取出}currentBalance -= withdrawAmount;accountBalances.put(accountNumber, currentBalance);withdrawals.labels(accountNumber).inc(); // 增加該賬戶的Counter指標(biāo)值(表示已經(jīng)從這個(gè)賬戶中取過(guò)款)accountBalance.labels(accountNumber).set(currentBalance); // 更新該賬戶的Gauge指標(biāo)值(表示當(dāng)前余額)}}}
}
復(fù)制代碼
在此示例中,我們模擬了一個(gè)銀行賬戶管理系統(tǒng),有10個(gè)不同的賬戶,并使用Map<String, Double>來(lái)存儲(chǔ)每個(gè)賬戶的當(dāng)前余額。我們還創(chuàng)建了兩個(gè)指標(biāo):一個(gè)Counter bank_account_withdrawals_total表示已經(jīng)從每個(gè)賬戶取款的次數(shù),帶有一個(gè)名為account_number的標(biāo)簽;一個(gè)Gauge bank_account_balance 表示每個(gè)賬戶的當(dāng)前余額,也帶有一個(gè)account_number標(biāo)簽。
在無(wú)限循環(huán)中,我們模擬了一些賬戶活動(dòng),隨機(jī)從每個(gè)賬戶中扣除一些資金,并更新相應(yīng)的指標(biāo)數(shù)據(jù)。這樣,我們就可以通過(guò)Prometheus監(jiān)視銀行賬戶活動(dòng)并生成警報(bào)。
我們可以從Java程序啟動(dòng)的8080看到對(duì)應(yīng)的Prometheus格式數(shù)據(jù):
下一步就是我們?cè)鯓幼孭rometheus進(jìn)程把這些數(shù)據(jù)抓取過(guò)去,這一步很簡(jiǎn)單,就是在prometheus.yml配置的(安裝后的文件路徑自己找)。
global:scrape_interval: 15sscrape_configs:- job_name: "prometheus"static_configs:- targets: ["localhost:9090"]- job_name: 'java_app'metrics_path: '/my_metrics'static_configs:- targets: ['localhost:8080']復(fù)制代碼
把這個(gè)java程序的Prometheus客戶端端口配置上去即可。
這時(shí)候我們就可以到Prometheus的面板去看下是否有數(shù)據(jù)。
到目前為止,我們已經(jīng)完成了Prometheus把Java產(chǎn)生的業(yè)務(wù)數(shù)據(jù)導(dǎo)入啦。
接下來(lái)就是處理Grafana獲取Prometheus數(shù)據(jù)。
// 安裝
brew?install?grafana// 啟動(dòng)
brew?services?start?grafana
復(fù)制代碼
Grafana默認(rèn)端口為3000
這個(gè)時(shí)候,我們的思路就是怎樣去獲取Prometheus數(shù)據(jù)。
Grafana在頁(yè)面上提供了配置數(shù)據(jù)源的交互。
支持的數(shù)據(jù)源很多,按需配置。
這里我們直接把url配置上即可,生產(chǎn)環(huán)境的話,需要考慮的更多,比如安全性之類的,配置密鑰證書(shū)。
數(shù)據(jù)源配置完了,就剩下面板啦。
選擇你想處理的指標(biāo)和統(tǒng)計(jì)口徑
也可以直接使用PromQL語(yǔ)句:
round(sum by(account_number) (increase(bank_account_balance{job="java_app"}[$__rate_interval])))
復(fù)制代碼
到目前為止,一個(gè)業(yè)務(wù)數(shù)據(jù)的監(jiān)控就完成啦。大家可以照貓畫(huà)虎走一個(gè)流程!!