欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Prometheus開發(fā)中間件Exporter過程詳解

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

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

目前支持的客戶端

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

依賴包的引入

工程結構

[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 采集主機指標
  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() {
   //注冊自身采集器
  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)
  }
}

為了能看清結果我將默認采集器注釋,位置registry.go

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

/collector/node.go

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

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ù)結構
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",
      "請求數(shù)",
      []string{"DYNAMIC_HOST_NAME"}, //動態(tài)標簽名稱
      prometheus.Labels{"STATIC_LABEL1":"靜態(tài)值可以放在這里","HOST_NAME":hostname}),
    nodeMetrics: nodeStatsMetrics{
      {
        desc: prometheus.NewDesc(
          "total_mem",
          "內存總量",
          nil, nil),
        valType: prometheus.GaugeValue,
        eval: func(ms *mem.VirtualMemoryStat) float64 { return float64(ms.Total) / 1e9 },
      },
      {
        desc: prometheus.NewDesc(
          "free_mem",
          "內存空閑",
          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.
//實現(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.
//實現(xiàn)采集器Collect接口,真正采集動作
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í)行的結果http://127.0.0.1:8080/metrics

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

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

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

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

    python爬蟲獲取京東手機圖片的圖文教程

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

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

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

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

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

    Python日志模塊logging的使用方法總結

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

    python 初始化一個定長的數(shù)組實例

    今天小編就為大家分享一篇python 初始化一個定長的數(shù)組實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python?Flask?JinJa2?語法使用示例詳解

    Python?Flask?JinJa2?語法使用示例詳解

    這篇文章主要為大家介紹了Python?Flask?JinJa2?語法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    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這幾種方式,具有一定的參考價值,感興趣的可以了解一下
    2022-01-01
  • Python中getservbyport和getservbyname函數(shù)的用法大全

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

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

    python將pandas datarame保存為txt文件的實例

    今天小編就為大家分享一篇python將pandas datarame保存為txt文件的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02

最新評論