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