Prometheus 개발 미들웨어 Exporter 과정 상세 설명

Prometheus 는 이 개발 에 클 라 이언 트 도 구 를 제공 하여 자신의 미들웨어 개발 Exporter 를 위해 Prometheus 를 연결 합 니 다.
현재 지원 하 는 클 라 이언 트
  • Go
  • Java
  • Python
  • Ruby
  • go 를 예 로 들 어 자신의 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
    }
    //        
    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",
          "   ",
          []string{"DYNAMIC_HOST_NAME"}, //      
          prometheus.Labels{"STATIC_LABEL1":"         ","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",
          "   .",
          nil, nil),
        threadsDesc: prometheus.NewDesc(
          "threads_num",
          "   ",
          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.
    //     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.
    //     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))
    
      //    
      ch <- prometheus.MustNewConstSummary(
        n.summaryDesc,
        4711, 403.34,
        map[float64]float64{0.5: 42.3, 0.9: 323.3},
        "200", "get",
      )
    
      //    
      ch <- prometheus.MustNewConstHistogram(
          n.histogramDesc,
          4711, 403.34,
          map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233},
          "200", "get",
        )
      n.mutex.Unlock()
    }
    집행 결과

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기