監控 PROMETHEUS
Prometheus是由SoundCloud開發的開源監控報警系統和時序列資料庫(TSDB),使用Go語言開發,是Google BorgMon監控系統的開源版本,prometheus存盤的是時序資料,即按相同時序(相同名稱和標簽),以時間維度存盤連續的資料的集合,
專案中應用
完整代碼:
https://github.com/Justin02180218/micro-kit
組態檔
prometheus:
namespace: "library"
subsystem: "user_service"
config.go
type PrometheusConfig struct {
Namespace string `json:"namespace" yaml:"namespace"`
Subsystem string `json:"subsystem" yaml:"subsystem"`
}
pkg/monitors
在 pkg 下新建目錄 monitors,創建 prometheus.go 檔案:

代碼如下:
type PrometheusParams struct {
Counter *kitprometheus.Counter
Summary *kitprometheus.Summary
Gauge *kitprometheus.Gauge
Histogram *kitprometheus.Histogram
}
func MakePrometheusParams(conf *configs.PrometheusConfig) *PrometheusParams {
fieldKeys := []string{"method"}
requestCounter := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: conf.Namespace,
Subsystem: conf.Subsystem,
Name: "request_count",
Help: "Number of requests received.",
}, fieldKeys)
requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
Namespace: conf.Namespace,
Subsystem: conf.Subsystem,
Name: "request_latency_microseconds",
Help: "Total duration of requests in microseconds.",
}, fieldKeys)
return &PrometheusParams{requestCounter, requestLatency, nil, nil}
}
service層
在 service 層創建 user_service_metrics.go,以 library-user-service 為例,其他微服務相同,
func MetricsMiddleware(prometheusParams *monitors.PrometheusParams) ServiceMiddleware {
return func(next UserService) UserService {
return metricsMiddleware{next, prometheusParams.Counter, prometheusParams.Summary}
}
}
type metricsMiddleware struct {
UserService
requestCount metrics.Counter
requestLatency metrics.Histogram
}
func (mw metricsMiddleware) Register(ctx context.Context, vo *dto.RegisterUser) (*dto.UserInfo, error) {
defer func(begin time.Time) {
lvs := []string{"method", "Register"}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
}(time.Now())
return mw.UserService.Register(ctx, vo)
}
func (mw metricsMiddleware) FindByID(ctx context.Context, id uint64) (*dto.UserInfo, error) {
defer func(begin time.Time) {
lvs := []string{"method", "FindByID"}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
}(time.Now())
return mw.UserService.FindByID(ctx, id)
}
func (mw metricsMiddleware) FindByEmail(ctx context.Context, email string) (*dto.UserInfo, error) {
defer func(begin time.Time) {
lvs := []string{"method", "FindByEmail"}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
}(time.Now())
return mw.UserService.FindByEmail(ctx, email)
}
func (mw metricsMiddleware) FindBooksByUserID(ctx context.Context, id uint64) (interface{}, error) {
defer func(begin time.Time) {
lvs := []string{"method", "FindBooksByUserID"}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
}(time.Now())
return mw.UserService.FindBooksByUserID(ctx, id)
}
func (mw metricsMiddleware) HealthCheck() bool {
defer func(begin time.Time) {
lvs := []string{"method", "HealthCheck"}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
}(time.Now())
return mw.UserService.HealthCheck()
}
transport層
修改 user_transport.go,以 library-user-service 為例,其他微服務相同,
r.GET("/metrics", func(c *gin.Context) {
promhttp.Handler().ServeHTTP(c.Writer, c.Request)
})
修改 main.go
以 library-user-service 為例,其他微服務相同,
prometheusParams := monitors.MakePrometheusParams(configs.Conf.PrometheusConfig)
userService = service.MetricsMiddleware(prometheusParams)(userService)
啟動 Prometheus
在工程目錄下建立 deploy/prometheus 目錄,創建 prometheus.yaml 組態檔:
global:
scrape_interval: 15s
external_labels:
monitor: 'library-monitor'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['IP:9090']
labels:
group: 'local'
- job_name: 'library'
scrape_interval: 5s
static_configs:
# 配置微服務的IP和Port
- targets: ['IP:10086', 'IP:10087', 'IP:10089']
labels:
group: 'library'
創建 docker-compose 檔案 prometheus-grafana.yaml:
version: '3'
services:
prometheus:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- /micro-kit/deploy/prometheus/prometheus.yaml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- 3000:3000
environment:
- GF_SECURITY_ADMIN_PASSWORD=123456
volumes:
- /grafana_db:/var/lib/grafana grafana/grafana
執行命令:
docker-compose -f deploy/prometheus/prometheus-grafana.yaml up -d
依次啟動 consul、zipkin、三個微服務和網關,然后在地址欄輸入 http://localhost:9090/targets,可以看到 prometheus 成功收集到服務資訊:


下一篇文章,我們將三個微服務和一個網關構建成Docker鏡像,在容器中啟動整個應用,
完整代碼:
https://github.com/Justin02180218/micro-kit
更多【分布式專輯】【架構實戰專輯】系列文章,請關注公眾號

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308711.html
標籤:其他
