go-kit 微服務 服務監控 (prometheus 實現)

hwholiday發表於2020-02-12

go-kit 微服務 服務監控(prometheus 實現)

  • 實現對登入方法的請求次數,與請求耗時進行監控

prometheus

  • 相關介紹使用請看文章《docker 安裝 prometheus(普羅米修斯)》
  • Prometheus 的四種資料型別
    • Counter(計數器) 它是一個只能遞增的數值,重啟程式後會被重置 (例如記錄:請求次數、任務完成數、錯誤發生次數)
    • Gauge(測量器) 它表示一個既可以遞增, 又可以遞減的值,重啟程式後,會被重置 (例如 溫度變化、CPU,記憶體,網路使用變化)
    • Histogram(柱狀圖)
      • 每個取樣點進行統計,打到各個分類值中 (bucket)
      • 對每個取樣點值累計和 (sum)
      • 對取樣點的次數累計和 (count)
      • 例如:請求耗時、響應大小。
    • Summary 類似 histogram 柱狀圖,summary 是取樣點分點陣圖統計
      • 有一個 quantiles 的功能,可以按% 比劃分跟蹤的結果。例如:quantile 取值 0.85,表示取取樣值裡面的 85% 資料。
      • 例如:請求耗時、響應大小。
  • 具體區別可看文件histogram 和 summaries

定義統計服務中介軟體

  • 建立 metricsMiddlewareServer 結構體
type metricsMiddlewareServer struct {
    next      Service
    counter   metrics.Counter
    histogram metrics.Histogram
}
  • 建立 NewMetricsMiddlewareServer 把統計物件嵌入中介軟體(其實就是對 Service 新增了一層裝飾)
func NewMetricsMiddlewareServer(counter metrics.Counter, histogram metrics.Histogram) NewMiddlewareServer {
    return func(service Service) Service {
        return metricsMiddlewareServer{
            next:      service,
            counter:   counter,
            histogram: histogram,
        }
    }
}
  • 讓 metricsMiddlewareServer 實現 Service 中的全部方法
func (l metricsMiddlewareServer) Login(ctx context.Context, in *pb.Login) (out *pb.LoginAck, err error) {
    defer func(start time.Time) {
        method := []string{"method","login"}
        l.counter.With(method...).Add(1)//統計請求次數
        l.histogram.With(method...).Observe(time.Since(start).Seconds())//統計請求耗時
    }(time.Now())
    out, err = l.next.Login(ctx, in)
    return
}

定義 prometheus (Counter 與 Histogram)

count := metricsprometheus.NewCounterFrom(prometheus.CounterOpts{
    Subsystem: "user_agent",
    Name:      "request_count",
    Help:      "Number of requests",
}, []string{"method"})
histogram := metricsprometheus.NewHistogramFrom(prometheus.HistogramOpts{
    Subsystem: "user_agent",
    Name:      "request_consume",
    Help:      "Request consumes time",
}, []string{"method"})

實現 prometheus http 服務

utils.GetLogger().Info("[user_agent] prometheus run " + *prometheusAddr)
m := http.NewServeMux()
m.Handle("/metrics", promhttp.Handler())
quitChan <- http.ListenAndServe(*prometheusAddr, m)

編寫 prometheus 配置檔案

  • prometheus.yml
global:
scrape_interval:     15s 
external_labels:
    monitor: 'codelab-monitor'
scrape_configs:
  - job_name: 'user_agent'
    metrics_path: "/metrics"
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.2.28:10001']

執行

  • 執行 TestNewUserAgentClient 方法 (呼叫 Login 介面 20 次)
  • 我們登入 http://127.0.0.1:9090/ prometheus 後臺查詢資訊

結語

  • prometheus 的用法還有很多,這裡只展示簡單的統計介面請求量和請求耗時,還有監控 mysql,redis 等
  • 歡迎新增 QQ 一起討論

完整程式碼地址

聯絡 QQ: 3355168235

更多原創文章乾貨分享,請關注公眾號
  • go-kit 微服務 服務監控 (prometheus 實現)
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章