怎么用網(wǎng)站模板廈門關(guān)鍵詞排名seo
目錄
前言
服務(wù)介紹
Grafana:數(shù)據(jù)可視化和展示
Prometheus:時序數(shù)據(jù)監(jiān)控
Loki:日志管理
工具使用
安裝
配置 Grafana 數(shù)據(jù)源?編輯
Go Web 項(xiàng)目上報(bào)數(shù)據(jù)
Prometheus 指標(biāo)上報(bào)
Loki 日志上報(bào)
數(shù)據(jù)查看
前言
隨著微服務(wù)的盛行,微服務(wù)的監(jiān)控也變得更加困難,這里介紹一個微服務(wù)常用的監(jiān)控工具Grafana,Grafana?(官網(wǎng):Grafana: The open and composable observability platform | Grafana Labs)是一個開源的數(shù)據(jù)可視化和監(jiān)控工具,能夠通過美觀的儀表盤展示來自多種數(shù)據(jù)源(如 Prometheus、InfluxDB、Elasticsearch 等)的數(shù)據(jù)。?
Grafana是一個開源的數(shù)據(jù)可視化和監(jiān)控工具,可以集成多種數(shù)據(jù)源的數(shù)據(jù),對數(shù)據(jù)源進(jìn)行整合并且做可視化展示,Grafana提供了很多美觀的儀表盤和友好的用戶使用界面。Grafana必須配合數(shù)據(jù)源進(jìn)行使用,而數(shù)據(jù)源就是我們業(yè)務(wù)項(xiàng)目所要監(jiān)控的數(shù)據(jù),項(xiàng)目監(jiān)控主要有兩種方向:業(yè)務(wù)日志和業(yè)務(wù)指標(biāo),這里主要介紹下Grafana這兩種數(shù)據(jù)源Prometheus和Loki。
服務(wù)介紹
不管是Grafana還是它提供的數(shù)據(jù)源,都是一個監(jiān)控服務(wù),業(yè)務(wù)項(xiàng)目往數(shù)據(jù)源服務(wù)發(fā)送告警,Grafana集成數(shù)據(jù)源進(jìn)行界面的展示。
Grafana:數(shù)據(jù)可視化和展示
Grafana 是一個開源的數(shù)據(jù)可視化和監(jiān)控工具,能夠通過美觀的儀表盤展示來自多種數(shù)據(jù)源(如 Prometheus、InfluxDB、Elasticsearch 等)的數(shù)據(jù)。其主要特點(diǎn)包括:
- 數(shù)據(jù)可視化
Grafana 提供了強(qiáng)大的可視化功能,支持多種圖表類型(如折線圖、柱狀圖、餅圖、熱圖等),可以將 Prometheus 中的時序數(shù)據(jù)以多種形式展示,幫助用戶快速了解系統(tǒng)的健康狀態(tài)、性能指標(biāo)等。 - 數(shù)據(jù)源整合
Grafana 支持多種數(shù)據(jù)源,最常用的就是 Prometheus,此外還支持如 InfluxDB、Elasticsearch、MySQL 等其他存儲系統(tǒng)。
- 儀表盤和報(bào)警
Grafana 提供了靈活的儀表盤功能,用戶可以根據(jù)自己的需求創(chuàng)建和定制不同的監(jiān)控視圖。此外,Grafana 還可以設(shè)置報(bào)警規(guī)則,在某些條件下發(fā)送通知。 - 用戶友好的界面
Grafana 提供一個用戶友好的 Web 界面,方便用戶查看監(jiān)控?cái)?shù)據(jù)、調(diào)整圖表和儀表盤,進(jìn)行數(shù)據(jù)分析。
Prometheus:時序數(shù)據(jù)監(jiān)控
Prometheus 是一個開源的監(jiān)控和報(bào)警工具,主要用于收集、存儲和查詢時間序列數(shù)據(jù)(即帶時間戳的度量數(shù)據(jù))。它的工作方式通常是 拉取式(pull),通過周期性地向配置的目標(biāo)(例如服務(wù)、容器、主機(jī)等)發(fā)送 HTTP 請求,獲取指標(biāo)數(shù)據(jù),Prometheus有以下特點(diǎn):
-
時序數(shù)據(jù)存儲
Prometheus 內(nèi)置了時序數(shù)據(jù)庫(TSDB),專門用于存儲和查詢時間序列數(shù)據(jù)。它將每個數(shù)據(jù)點(diǎn)視為一個時間戳和一組標(biāo)簽(label)的組合。 -
PromQL
Prometheus 提供了強(qiáng)大的查詢語言 PromQL(Prometheus Query Language),使得用戶能夠高效地從存儲的指標(biāo)數(shù)據(jù)中進(jìn)行聚合、查詢和分析。 -
拉取式收集
Prometheus 通過定期向服務(wù)端點(diǎn)發(fā)起 HTTP 請求拉取數(shù)據(jù)。它也支持向外部發(fā)送指標(biāo)數(shù)據(jù)(推送)。 -
報(bào)警規(guī)則
Prometheus 支持自定義報(bào)警規(guī)則,能夠根據(jù)查詢結(jié)果觸發(fā)報(bào)警,例如系統(tǒng)負(fù)載過高或某個服務(wù)宕機(jī)。
使用場景:
- 系統(tǒng)性能監(jiān)控(如 CPU 使用率、內(nèi)存使用、請求數(shù)、響應(yīng)時間等)。
- 容器和服務(wù)監(jiān)控(如 Kubernetes、Docker 等環(huán)境)。
- 集成應(yīng)用程序的指標(biāo)(例如,數(shù)據(jù)庫查詢時間、API 請求量等)。
Loki:日志管理
Loki 是一個開源的日志聚合系統(tǒng),專門用于收集、存儲和查詢?nèi)罩緮?shù)據(jù)。它的設(shè)計(jì)理念是與 Prometheus 緊密集成,并且盡量降低資源消耗,使日志查詢與時間序列數(shù)據(jù)監(jiān)控的體驗(yàn)一致。Loki有哦以下特點(diǎn):
- 日志聚合和存儲
Loki 專注于從分布式系統(tǒng)收集日志數(shù)據(jù)。與傳統(tǒng)的日志管理工具不同,Loki 設(shè)計(jì)簡化了存儲和查詢結(jié)構(gòu),通常將日志數(shù)據(jù)存儲在簡單的對象存儲系統(tǒng)(如 S3、GCS)中。 - 標(biāo)簽化日志
類似于 Prometheus,Loki 使用標(biāo)簽(labels)來對日志進(jìn)行標(biāo)識和分類。每條日志都有與其相關(guān)的標(biāo)簽,而不是全文索引,這使得 Loki 在存儲上更加高效。 - 與Prometheus集成
Loki 的查詢語言(LogQL)與 PromQL 類似,允許用戶基于時間和標(biāo)簽來查詢?nèi)罩緮?shù)據(jù)。Loki 本身不存儲日志的全文,而是將日志條目與時間和標(biāo)簽一起存儲,因此可以高效地進(jìn)行聚合和查詢。 - 易于擴(kuò)展
Loki 可以與現(xiàn)有的日志代理(如 Fluentd、Promtail 等)配合使用,方便地收集來自各個源的日志數(shù)據(jù),并將其發(fā)送到 Loki。
使用場景:
- 日志聚合:收集和存儲來自多個應(yīng)用程序和服務(wù)的日志數(shù)據(jù)。
- 故障排查:結(jié)合 Prometheus 的監(jiān)控?cái)?shù)據(jù),Loki 可以幫助開發(fā)和運(yùn)維人員通過日志追蹤問題和異常。
- 集群日志管理:適用于云原生環(huán)境(如 Kubernetes),集中式地收集和管理所有服務(wù)的日志。
工具使用
安裝
微服務(wù)和監(jiān)控工具現(xiàn)在都是部署在Kubernetest環(huán)境中,這里我們就用Helm來完成監(jiān)控工具的部署,有關(guān)Helm的使用可以參考:Kubernetes# Helm工具使用-CSDN博客
- 添加Helm倉庫
首先,添加 Loki 和 Prometheus 的官方 Helm 倉庫:helm repo add grafana https://grafana.github.io/helm-charts helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update
- 部署Prometheus
執(zhí)行以下命令部署 Prometheus:
這會在helm install prometheus prometheus-community/prometheus \--namespace monitoring \--create-namespace \--set server.service.type=NodePort \--set server.service.nodePort=30900
monitoring
命名空間下部署 Prometheus,并將服務(wù)暴露在NodePort: 30900
。
? - 部署Loki
執(zhí)行以下命令部署 Loki:helm install loki grafana/loki-stack \--namespace logging \--create-namespace \--set grafana.enabled=false \--set prometheus.enabled=false
此命令會部署 Loki 及其相關(guān)組件,默認(rèn)情況下 Loki 使用
3100
端口。 -
部署Grafana
執(zhí)行以下命令部署 Grafana:helm install grafana grafana/grafana \--namespace grafana \--create-namespace \--set service.type=NodePort \--set service.nodePort=30000 \--set adminUser=admin \--set adminPassword=admin
這會將 Grafana 暴露在
NodePort: 30000
。
配置 Grafana 數(shù)據(jù)源

Grafana 啟動后,訪問 <http://<Node-IP>:30000>,登錄用戶名和密碼為 admin
/ admin
。
-
配置 Prometheus 數(shù)據(jù)源
1、在 Grafana 左側(cè)菜單中,選擇 Configuration > Data Sources。
2、添加新數(shù)據(jù)源,選擇 Prometheus。
3、填寫http://<Prometheus-Service-Cluster-IP>:9090
或http://<Node-IP>:30900
。 -
配置 Loki 數(shù)據(jù)源
1、添加新數(shù)據(jù)源,選擇 Loki。
2、填寫http://<Loki-Service-Cluster-IP>:3100
。
Go Web 項(xiàng)目上報(bào)數(shù)據(jù)
Prometheus 指標(biāo)上報(bào)
安裝 Prometheus 的 Go SDK:
在代碼中引入prometheus的客戶端sdk包,在項(xiàng)目中用這個client進(jìn)行數(shù)據(jù)上報(bào)
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp
在項(xiàng)目中添加上報(bào)示例代碼:
package mainimport ("net/http""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp"
)var (httpRequests = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "http_requests_total",Help: "Number of HTTP requests received",},[]string{"method", "endpoint"},)
)func init() {prometheus.MustRegister(httpRequests)
}func handler(w http.ResponseWriter, r *http.Request) {httpRequests.WithLabelValues(r.Method, r.URL.Path).Inc()w.Write([]byte("Hello, Prometheus!"))
}func main() {http.Handle("/metrics", promhttp.Handler())http.HandleFunc("/", handler)http.ListenAndServe(":8080", nil)
}
運(yùn)行服務(wù)后,訪問 http://<Go-Service-IP>:8080/metrics
,可查看 Prometheus 指標(biāo)。
Loki 日志上報(bào)
安裝 Loki 的 Go 客戶端:
go get github.com/grafana/loki-client-go/loki
在項(xiàng)目中添加日志上報(bào)代碼:
package mainimport ("log""time""github.com/grafana/loki-client-go/loki"
)func main() {cfg := loki.Config{URL: "http://<Loki-Service-Cluster-IP>:3100/api/prom/push",}client, err := loki.New(cfg)if err != nil {log.Fatalf("Failed to create Loki client: %v", err)}defer client.Stop()for {err := client.Handle("app_logs", map[string]string{"job": "my-go-app",}, time.Now(), "This is a test log from Go app!")if err != nil {log.Printf("Failed to send log to Loki: %v", err)}time.Sleep(5 * time.Second)}
}
運(yùn)行后,Loki 將接收到日志,Grafana 可通過 Loki 數(shù)據(jù)源查看。
數(shù)據(jù)查看
上報(bào)數(shù)據(jù)之后我們可以在Grafana上看統(tǒng)計(jì)的數(shù)據(jù),在統(tǒng)計(jì)的界面我們可以選擇查看Prometheus和Loki的數(shù)據(jù):
查看Prometheus指標(biāo):
查看Loki指標(biāo):