zoukankan      html  css  js  c++  java
  • Prometheus:Prometheus开发中间件Exporter

    Prometheus 为开发这提供了客户端工具,用于为自己的中间件开发Exporter,对接Prometheus 。

    目前支持的客户端

    以go为例开发自己的Exporter

    2.1依赖包的引入

    工程结构

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

    引入依赖包

    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()
    }
    
    

    执行的结果http://127.0.0.1:8080/metrics

     
     


    作者:doublegao
    链接:https://www.jianshu.com/p/5db23a280e1d

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/-wenli/p/13424790.html
Copyright © 2011-2022 走看看