自定义指标暴露的端点
package controllerimport ("fmt""net/http""github.com/gin-gonic/gin""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp"
)type PromController struct {metricsNames map[string]*prometheus.Descr *prometheus.Registry
}var (promHandler http.Handler
)const (net_calico_number= "net_calico_number"
)func NewPromController() *PromController {promController := &PromController{metricsNames: make(map[string]*prometheus.Desc),}promController.r = prometheus.NewRegistry()//初始化指标labels := []string{"Hostname", "instance"}promController.metricsNames[net_calico_number] = prometheus.NewDesc(net_calico_number,"calico linkup status,>25=false,<25=true (not loss card)",labels,nil,)promController.r.MustRegister(promController)promHandler = promhttp.HandlerFor(prometheus.Gatherers{promController.r,},promhttp.HandlerOpts{},)return promController
}func (pc *PromController) ExportMetrics(c *gin.Context) {promHandler.ServeHTTP(c.Writer, c.Request)
}// Describe implements the prometheus.Collector interface.
func (pc *PromController) Describe(ch chan<- *prometheus.Desc) {for _, v := range pc.metricsNames {fmt.Printf("register describe: %v", v.String())ch <- v}
}// Collect implements the prometheus.Collector interface.
func (pc *PromController) Collect(ch chan<- prometheus.Metric) {prometheusDesc, exist := pc.metricsNames[net_calico_number]if exist {//指标的数据value := float64(10.0)ch <- prometheus.MustNewConstMetric(prometheusDesc, prometheus.GaugeValue, value, convertToLabelValue()...)}
}// 需要跟标签定义的顺序一致
func convertToLabelValue() []string {//指标的标签的值return []string{"gpu001", "10.0.11.21"}
}
启动服务暴露指标
import ("prome_test/controller""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 暴露 Prometheus 指标接口promController := controller.NewPromController()r.GET("/metrics", promController.ExportMetrics)r.Run(":8080")
}