使用Prometheus搞定微服務監控

最近對服務進行監控,而當前監控最流行的數據庫就是 Prometheus,同時 go-zero 默認接入也是這款數據庫。今天就對 go-zero 是如何接入 Prometheus ,以及開發者如何本身定義本身監控指標。html

監控接入

go-zero 框架中集成了基於 prometheus 的服務指標監控。可是沒有顯式打開,須要開發者在 config.yaml 中配置:git

Prometheus:
  Host: 127.0.0.1
  Port: 9091
  Path: /metrics

若是開發者是在本地搭建 Prometheus,須要在 Prometheus 的配置文件 prometheus.yaml 中寫入須要收集服務監控信息的配置:github

- job_name: 'file_ds'
    static_configs:
      - targets: ['your-local-ip:9091']
        labels:
          job: activeuser
          app: activeuser-api
          env: dev
          instance: your-local-ip:service-port

由於本地是用 docker 運行的。將 prometheus.yaml 放置在 docker-prometheus 目錄下:docker

docker run \
    -p 9090:9090 \
    -v dockeryml/docker-prometheus:/etc/prometheus \
    prom/prometheus

打開 localhost:9090 就能夠看到:數據庫

點擊 http://service-ip:9091/metrics 就能夠看到該服務的監控信息:api

上圖咱們能夠看出有兩種 bucket,以及 count/sum 指標。app

go-zero 是如何集成監控指標?監控的又是什麼指標?咱們如何定義咱們本身的指標?下面就來解釋這些問題框架

以上的基本接入,能夠參看咱們的另一篇:zeromicro.github.io/go-zero/ser…ide

如何集成

上面例子中的請求方式是 HTTP,也就是在請求服務端時,監控指標數據不斷被蒐集。很容易想到是 中間件 的功能,具體代碼:github.com/tal-tech/go…rest

var (
	metricServerReqDur = metric.NewHistogramVec(&metric.HistogramVecOpts{
		...
    // 監控指標
		Labels:    []string{"path"},
    // 直方圖分佈中,統計的桶
		Buckets:   []float64{5, 10, 25, 50, 100, 250, 500, 1000},
	})

	metricServerReqCodeTotal = metric.NewCounterVec(&metric.CounterVecOpts{
		...
    // 監控指標:直接在記錄指標 incr() 便可
		Labels:    []string{"path", "code"},
	})
)

func PromethousHandler(path string) func(http.Handler) http.Handler {
	return func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
      // 請求進入的時間
			startTime := timex.Now()
			cw := &security.WithCodeResponseWriter{Writer: w}
			defer func() {
        // 請求返回的時間
				metricServerReqDur.Observe(int64(timex.Since(startTime)/time.Millisecond), path)
				metricServerReqCodeTotal.Inc(path, strconv.Itoa(cw.Code))
			}()
			// 中間件放行,執行完後續中間件和業務邏輯。從新回到這,作一個完整請求的指標上報
      // [
相關文章
相關標籤/搜索