一、prometheus基本原理介紹
prometheus是基于metric采樣的監控,可以自定義監控指標,如:服務每秒請求數、請求失敗數、請求執行時間等,每經過一個時間間隔,數據都會從運行的服務中流出,存儲到一個時間序列數據庫中,之后可通過PromQL語法查詢。
主要特點:
多維數據模型,時間序列數據通過metric名以key、value的形式標識;
使用PromQL語法靈活地查詢數據;
不需要依賴分布式存儲,各服務器節點是獨立自治的;
時間序列的收集,通過 HTTP 調用,基于pull 模型進行拉取;
通過push gateway推送時間序列;
通過服務發現或者靜態配置,來發現目標服務對象;
多種繪圖和儀表盤的可視化支持;
二、prometheus使用docker部署
查看是否有鏡像
1
|
sudo docker search prometheus |
新建prometheus.yaml
1
2
3
4
5
6
7
8
9
10
11
12
|
global: scrape_interval: 10s evaluation_interval: 60s scrape_configs: - job_name: prometheus static_configs: - targets: [ 'localhost:9090' ] - job_name: integral static_configs: - targets: [ '10.20.xx.xx:8001' ] |
執行:
1
|
docker run --name prometheus -p 9090:9090 - v ~ /prometheus .yaml: /etc/prometheus/prometheus .yml prom /prometheus |
進入容器中可以看到配置文件已映射到容器指定目錄:
踩坑: prometheus官方鏡像指定的配置文件是prometheus.yml 所以映射到容器內的文件名一定要保持一致 否則會出現指定的配置文件不生效
三、prometheus整體架構及各組件
Prometheus Server :主程序,負責抓取和存儲時序數據;
Client Libraries:客戶端庫,負責檢測應用程序代碼;
Push Gateway:Push 網關,接收短生命周期的 Job 主動推送的時序數據;
Exporters:為不同服務定制的Exporter(如:HAProxy、StatsD、Graphite等) ,從而抓取它們的Metris指標數據;
Alert Manage:告警管理器,處理不同的告警;
四、prometheus客戶端調用示例
自定義prometheus的gin中間件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
package ginprometheus import ( "strconv" "sync" "time" "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus" ) const ( metricsPath = "/metrics" faviconPath = "/favicon.ico" ) var ( // httpHistogram prometheus 模型 httpHistogram = prometheus.NewHistogramVec(prometheus.HistogramOpts{ Namespace: "http_server" , Subsystem: "" , Name: "requests_seconds" , Help: "Histogram of response latency (seconds) of http handlers." , ConstLabels: nil, Buckets: nil, }, []string{ "method" , "code" , "uri" }) ) // init 初始化prometheus模型 func init() { prometheus.MustRegister(httpHistogram) } // handlerPath 定義采樣路由struct type handlerPath struct { sync .Map } // get 獲取path func (hp *handlerPath) get(handler string) string { v , ok := hp.Load(handler) if !ok { return "" } return v .(string) } // set 保存path到 sync .Map func (hp *handlerPath) set (ri gin.RouteInfo) { hp.Store(ri.Handler, ri.Path) } // GinPrometheus gin調用Prometheus的struct type GinPrometheus struct { engine *gin.Engine ignored map[string]bool pathMap *handlerPath updated bool } type Option func(*GinPrometheus) // Ignore 添加忽略的路徑 func Ignore(path ...string) Option { return func(gp *GinPrometheus) { for _, p := range path { gp.ignored[p] = true } } } // New new gin prometheus func New(e *gin.Engine, options ...Option) *GinPrometheus { if e == nil { return nil } gp := &GinPrometheus{ engine: e, ignored: map[string]bool{ metricsPath: true , faviconPath: true , }, pathMap: &handlerPath{}, } for _, o := range options { o(gp) } return gp } // updatePath 更新path func (gp *GinPrometheus) updatePath() { gp.updated = true for _, ri := range gp.engine.Routes() { gp.pathMap. set (ri) } } // Middleware set gin middleware func (gp *GinPrometheus) Middleware() gin.HandlerFunc { return func(c *gin.Context) { if !gp.updated { gp.updatePath() } // 過濾請求 if gp.ignored[c.Request.URL.String()] { c.Next() return } start := time .Now() c.Next() httpHistogram.WithLabelValues( c.Request.Method, strconv.Itoa(c.Writer.Status()), gp.pathMap.get(c.HandlerName()), ).Observe( time .Since(start).Seconds()) } } |
gin路由初始化prometheus,使用中間件采樣
1
2
3
4
|
gp := ginprometheus.New(r) r.Use(gp.Middleware()) // metrics采樣 r.GET( "/metrics" , gin.WrapH(promhttp.Handler())) |
查看target
選取指標對應的graph,這里以gc采樣的時間為例:
如果需要展示更為豐富的可視化看板,可以將prometheus與grafana結合,將prometheus數據接入到grafana中,此處不再過多闡述
到此這篇關于詳解prometheus監控golang服務實踐記錄的文章就介紹到這了,更多相關prometheus監控golang服務內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/FG123/p/13689649.html