亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Prometheus開(kāi)發(fā)中間件Exporter過(guò)程詳解

 更新時(shí)間:2020年11月30日 09:19:05   作者:-零  
這篇文章主要介紹了Prometheus開(kāi)發(fā)中間件Exporter過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

Prometheus 為開(kāi)發(fā)這提供了客戶端工具,用于為自己的中間件開(kāi)發(fā)Exporter,對(duì)接Prometheus 。

目前支持的客戶端

以go為例開(kāi)發(fā)自己的Exporter

依賴包的引入

工程結(jié)構(gòu)

[root@node1 data]# tree exporter/
exporter/
├── collector
│ └── node.go
├── go.mod
└── main.go

引入依賴包

require (
  github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
  github.com/modern-go/reflect2 v1.0.1 // indirect
  github.com/prometheus/client_golang v1.1.0
    //借助gopsutil 采集主機(jī)指標(biāo)
  github.com/shirou/gopsutil v0.0.0-20190731134726-d80c43f9c984
)

main.go

package main

import (
  "cloud.io/exporter/collector"
  "fmt"
  "github.com/prometheus/client_golang/prometheus"
  "github.com/prometheus/client_golang/prometheus/promhttp"
  "net/http"
)

func init() {
   //注冊(cè)自身采集器
  prometheus.MustRegister(collector.NewNodeCollector())
}
func main() {
  http.Handle("/metrics", promhttp.Handler())
  if err := http.ListenAndServe(":8080", nil); err != nil {
    fmt.Printf("Error occur when start server %v", err)
  }
}

為了能看清結(jié)果我將默認(rèn)采集器注釋,位置registry.go

func init() {
  //MustRegister(NewProcessCollector(ProcessCollectorOpts{}))
  //MustRegister(NewGoCollector())
}

/collector/node.go

代碼中涵蓋了Counter、Gauge、Histogram、Summary四種情況,一起混合使用的情況,具體的說(shuō)明見(jiàn)一下代碼中。

package collector

import (
  "github.com/prometheus/client_golang/prometheus"
  "github.com/shirou/gopsutil/host"
  "github.com/shirou/gopsutil/mem"
  "runtime"
  "sync"
)

var reqCount int32
var hostname string
type NodeCollector struct {
  requestDesc  *prometheus.Desc  //Counter
  nodeMetrics   nodeStatsMetrics //混合方式 
  goroutinesDesc *prometheus.Desc  //Gauge
  threadsDesc  *prometheus.Desc //Gauge
  summaryDesc  *prometheus.Desc //summary
  histogramDesc *prometheus.Desc  //histogram
  mutex     sync.Mutex
}
//混合方式數(shù)據(jù)結(jié)構(gòu)
type nodeStatsMetrics []struct {
  desc  *prometheus.Desc
  eval  func(*mem.VirtualMemoryStat) float64
  valType prometheus.ValueType
}

//初始化采集器
func NewNodeCollector() prometheus.Collector {
  host,_:= host.Info()
  hostname = host.Hostname
  return &NodeCollector{
    requestDesc: prometheus.NewDesc(
      "total_request_count",
      "請(qǐng)求數(shù)",
      []string{"DYNAMIC_HOST_NAME"}, //動(dòng)態(tài)標(biāo)簽名稱
      prometheus.Labels{"STATIC_LABEL1":"靜態(tài)值可以放在這里","HOST_NAME":hostname}),
    nodeMetrics: nodeStatsMetrics{
      {
        desc: prometheus.NewDesc(
          "total_mem",
          "內(nèi)存總量",
          nil, nil),
        valType: prometheus.GaugeValue,
        eval: func(ms *mem.VirtualMemoryStat) float64 { return float64(ms.Total) / 1e9 },
      },
      {
        desc: prometheus.NewDesc(
          "free_mem",
          "內(nèi)存空閑",
          nil, nil),
        valType: prometheus.GaugeValue,
        eval: func(ms *mem.VirtualMemoryStat) float64 { return float64(ms.Free) / 1e9 },
      },

    },
    goroutinesDesc:prometheus.NewDesc(
      "goroutines_num",
      "協(xié)程數(shù).",
      nil, nil),
    threadsDesc: prometheus.NewDesc(
      "threads_num",
      "線程數(shù)",
      nil, nil),
    summaryDesc: prometheus.NewDesc(
      "summary_http_request_duration_seconds",
      "summary類型",
      []string{"code", "method"},
      prometheus.Labels{"owner": "example"},
    ),
    histogramDesc: prometheus.NewDesc(
      "histogram_http_request_duration_seconds",
      "histogram類型",
      []string{"code", "method"},
      prometheus.Labels{"owner": "example"},
    ),
  }
}

// Describe returns all descriptions of the collector.
//實(shí)現(xiàn)采集器Describe接口
func (n *NodeCollector) Describe(ch chan<- *prometheus.Desc) {
  ch <- n.requestDesc
  for _, metric := range n.nodeMetrics {
    ch <- metric.desc
  }
  ch <- n.goroutinesDesc
  ch <- n.threadsDesc
  ch <- n.summaryDesc
  ch <- n.histogramDesc
}
// Collect returns the current state of all metrics of the collector.
//實(shí)現(xiàn)采集器Collect接口,真正采集動(dòng)作
func (n *NodeCollector) Collect(ch chan<- prometheus.Metric) {
  n.mutex.Lock()
  ch <- prometheus.MustNewConstMetric(n.requestDesc,prometheus.CounterValue,0,hostname)
  vm, _ := mem.VirtualMemory()
  for _, metric := range n.nodeMetrics {
    ch <- prometheus.MustNewConstMetric(metric.desc, metric.valType, metric.eval(vm))
  }

  ch <- prometheus.MustNewConstMetric(n.goroutinesDesc, prometheus.GaugeValue, float64(runtime.NumGoroutine()))

  num, _ := runtime.ThreadCreateProfile(nil)
  ch <- prometheus.MustNewConstMetric(n.threadsDesc, prometheus.GaugeValue, float64(num))

  //模擬數(shù)據(jù)
  ch <- prometheus.MustNewConstSummary(
    n.summaryDesc,
    4711, 403.34,
    map[float64]float64{0.5: 42.3, 0.9: 323.3},
    "200", "get",
  )

  //模擬數(shù)據(jù)
  ch <- prometheus.MustNewConstHistogram(
      n.histogramDesc,
      4711, 403.34,
      map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233},
      "200", "get",
    )
  n.mutex.Unlock()
}

執(zhí)行的結(jié)果http://127.0.0.1:8080/metrics

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python數(shù)據(jù)類型最全知識(shí)總結(jié)

    Python數(shù)據(jù)類型最全知識(shí)總結(jié)

    學(xué)習(xí)一門語(yǔ)言,往往都是從Hello World開(kāi)始. 但是筆者認(rèn)為,在一個(gè)黑框框中輸出一個(gè)“你好,世界”并沒(méi)有什么了不起,要看透事物的本質(zhì),熟悉一門語(yǔ)言,就要了解其底層,就是我們常常說(shuō)的基礎(chǔ),本篇從python中的數(shù)據(jù)類型開(kāi)始,需要的朋友可以參考下
    2021-05-05
  • python爬蟲(chóng)獲取京東手機(jī)圖片的圖文教程

    python爬蟲(chóng)獲取京東手機(jī)圖片的圖文教程

    下面小編就為大家分享一篇python爬蟲(chóng)獲取京東手機(jī)圖片的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Python引用類型和值類型的區(qū)別與使用解析

    Python引用類型和值類型的區(qū)別與使用解析

    這篇文章主要介紹了Python引用類型和值類型的區(qū)別與使用解析,需要的朋友可以參考下
    2017-10-10
  • Python實(shí)現(xiàn)FIFO緩存置換算法

    Python實(shí)現(xiàn)FIFO緩存置換算法

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)FIFO(先進(jìn)先出)緩存置換算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Python日志模塊logging的使用方法總結(jié)

    Python日志模塊logging的使用方法總結(jié)

    這篇文章主要分享的是Python日志模塊logging的使用方法總結(jié),ogging模塊默認(rèn)級(jí)別是WARNING,意味著只會(huì)追蹤該級(jí)別以上的事件,除非更改日志配置,想了解更多相關(guān)資料的小伙伴可以參考下面文章內(nèi)容
    2022-05-05
  • python 初始化一個(gè)定長(zhǎng)的數(shù)組實(shí)例

    python 初始化一個(gè)定長(zhǎng)的數(shù)組實(shí)例

    今天小編就為大家分享一篇python 初始化一個(gè)定長(zhǎng)的數(shù)組實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python?Flask?JinJa2?語(yǔ)法使用示例詳解

    Python?Flask?JinJa2?語(yǔ)法使用示例詳解

    這篇文章主要為大家介紹了Python?Flask?JinJa2?語(yǔ)法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Pandas常用的讀取和保存數(shù)據(jù)的函數(shù)使用(csv,mysql,json,excel)

    Pandas常用的讀取和保存數(shù)據(jù)的函數(shù)使用(csv,mysql,json,excel)

    本文主要介紹了Pandas常用的讀取和保存數(shù)據(jù)的函數(shù)使用,主要包括csv,mysql,json,excel這幾種方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • Python中g(shù)etservbyport和getservbyname函數(shù)的用法大全

    Python中g(shù)etservbyport和getservbyname函數(shù)的用法大全

    在Python的網(wǎng)絡(luò)編程中,getservbyport()函數(shù)和getservbyname()函數(shù)是socket模塊中的兩個(gè)函數(shù),因此在使用這兩個(gè)函數(shù)時(shí),需要導(dǎo)入socket模塊,這篇文章主要介紹了Python中g(shù)etservbyport和getservbyname函數(shù)的用法,需要的朋友可以參考下
    2023-01-01
  • python將pandas datarame保存為txt文件的實(shí)例

    python將pandas datarame保存為txt文件的實(shí)例

    今天小編就為大家分享一篇python將pandas datarame保存為txt文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02

最新評(píng)論