天天看點

golang prometheus包的使用

prometheus包提供了用于實作監控代碼的metric原型和用于注冊metric的registry。子包(promhttp)允許通過HTTP來暴露注冊的metric或将注冊的metric推送到Pushgateway。

Metrics

  • prometheus一共有5種metric類型,前四種為:Counter,Gauge,Summary 和Histogram,每種類型都有對應的vector版本:GaugeVec, CounterVec, SummaryVec, HistogramVec,vector版本細化了prometheus資料模型,增加了label次元。第5種metric為Untyped,它的運作方式類似Gauge,差別在于它隻向prometheus伺服器發送類型信号。
  • 隻有基礎metric類型實作了Metric接口,metric和它們的vector版本都實作了collector接口。collector負責一系列metrics的采集,但是為了友善,metric也可以“收集自己”。注意:Gauge, Counter, Summary, Histogram, 和Untyped自身就是接口,而GaugeVec, CounterVec, SummaryVec, HistogramVec, 和UntypedVec則不是接口。
  • 為了建立metric和它們的vector版本,需要選擇合适的opts結構體,如GaugeOpts, CounterOpts, SummaryOpts, HistogramOpts, 或UntypedOpts.

Custom Collectors and constant Metrics

  • 實作自己的metric,一般隻需要實作自己的collector即可。如果已經有了現成的metric(prometheus上下文之外建立的),則無需使用Metric類型接口,隻需要在采集期間将現有的metric映射到prometheus metric即可,此時可以使用 NewConstMetric, NewConstHistogram, and NewConstSummary (以及對應的Must… 版本)來建立metric執行個體,以上操作在collect方法中實作。describe方法用于傳回獨立的Desc執行個體,NewDesc用于建立這些metric執行個體。(NewDesc用于建立prometheus識别的metric)
  • 如果隻需要調用一個函數來收集一個float值作為metric,那麼推薦使用GaugeFunc, CounterFunc, 或UntypedFunc。

Advanced Uses of the Registry

  • MustRegister 是注冊collector最通用的方式。如果需要捕獲注冊時産生的錯誤,可以使用Register 函數,該函數會傳回錯誤。
  • 如果注冊的collector與已經注冊的metric不相容或不一緻時就會傳回錯誤。registry用于使收集的metric與prometheus資料模型保持一緻。不一緻的錯誤會在注冊時而非采集時檢測到。前者會在系統的啟動時檢測到,而後者隻會在采集時發生(可能不會在首次采集時發生),這也是為什麼collector和metric必須向Registry describe它們的原因。
  • 以上提到的registry都被稱為預設registry,可以在全局變量DefaultRegisterer中找到。使用NewRegistry可以建立custom registry,或者可以自己實作Registerer 或Gatherer接口。custom registry的Register和Unregister運作方式類似,預設registry則使用全局函數Register和Unregister。
  • custom registry的使用方式還有很多:可以使用NewPedanticRegistry來注冊特殊的屬性;可以避免由DefaultRegisterer限制的全局狀态屬性;也可以同時使用多個registry來暴露不同的metrics。
  • DefaultRegisterer注冊了Go runtime metrics (通過NewGoCollector)和用于process metrics 的collector(通過NewProcessCollector)。通過custom registry可以自己決定注冊的collector。

HTTP Exposition

  • Registry實作了Gather接口。調用Gather接口可以通過某種方式暴露采集的metric。通常metric endpoint使用http來暴露metric。通過http暴露metric的工具為promhttp子包。

函數和類型說明:

  • func Register(c Collector) error:使用DefaultRegisterer來注冊傳入的Collector
  • func Unregister(c Collector) bool:使用DefaultRegisterer來移除傳入的Collector的注冊資訊
  • type AlreadyRegisteredError:該類型實作了error接口,由Register傳回,用于判斷用于注冊的collector是否已經被注冊過
  • type Collector:用于采集prometheus metric,如果運作多個相同的執行個體,則需要使用ConstLabels來注冊這些執行個體。實作collector接口需要實作Describe和Collect方法,并注冊collector。
  • type Registerer:負責collector的注冊和去注冊,實作custom registrer時應該實作該接口

帶Must的版本函數隻是對不帶Must函數的封裝,增加了panic操作,如:

// MustRegister implements Registerer.
func (r *Registry) MustRegister(cs ...Collector) {
  for _, c := range cs {
    if err := r.Register(c); err != nil {
      panic(err)
    }
  }
}
      

  文翻譯于https://godoc.org/github.com/prometheus/client_golang/prometheus,該文中提供了prometheus client的接口使用以及對應的例子