kis-flow/metrics/kis_metrics.go
2024-04-16 15:11:23 +08:00

123 lines
3.6 KiB
Go

package metrics
import (
"net/http"
"github.com/aceld/kis-flow/common"
"github.com/aceld/kis-flow/config"
"github.com/aceld/kis-flow/log"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// KisMetrics kisFlow's Prometheus monitoring metrics
type KisMetrics struct {
// Total data quantity
DataTotal prometheus.Counter
// Total data processed by each Flow
FlowDataTotal *prometheus.GaugeVec
// Flow scheduling counts
FlowScheduleCntsToTal *prometheus.GaugeVec
// Function scheduling counts
FuncScheduleCntsTotal *prometheus.GaugeVec
// Function execution time
FunctionDuration *prometheus.HistogramVec
// Flow execution time
FlowDuration *prometheus.HistogramVec
}
var Metrics *KisMetrics
// RunMetricsService starts the Prometheus monitoring service
func RunMetricsService(serverAddr string) error {
// Register Prometheus monitoring route path
http.Handle(common.MetricsRoute, promhttp.Handler())
// Start HttpServer
err := http.ListenAndServe(serverAddr, nil) // Multiple processes cannot listen on the same port
if err != nil {
log.Logger().ErrorF("RunMetricsService err = %s\n", err)
}
return err
}
func InitMetrics() {
Metrics = new(KisMetrics)
// Initialize DataTotal Counter
Metrics.DataTotal = prometheus.NewCounter(prometheus.CounterOpts{
Name: common.CounterKisflowDataTotalName,
Help: common.CounterKisflowDataTotalHelp,
})
// Initialize FlowDataTotal GaugeVec
Metrics.FlowDataTotal = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: common.GamgeFlowDataTotalName,
Help: common.GamgeFlowDataTotalHelp,
},
// Label names
[]string{common.LabelFlowName},
)
// Initialize FlowScheduleCntsToTal GaugeVec
Metrics.FlowScheduleCntsToTal = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: common.GangeFlowScheCntsName,
Help: common.GangeFlowScheCntsHelp,
},
// Label names
[]string{common.LabelFlowName},
)
// Initialize FuncScheduleCntsTotal GaugeVec
Metrics.FuncScheduleCntsTotal = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: common.GangeFuncScheCntsName,
Help: common.GangeFuncScheCntsHelp,
},
// Label names
[]string{common.LabelFunctionName, common.LabelFunctionMode},
)
// Initialize FunctionDuration HistogramVec
Metrics.FunctionDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
Name: common.HistogramFunctionDurationName,
Help: common.HistogramFunctionDurationHelp,
Buckets: []float64{0.005, 0.01, 0.03, 0.08, 0.1, 0.5, 1.0, 5.0, 10, 100, 1000, 5000, 30000}, // Unit: ms, maximum half a minute
},
[]string{common.LabelFunctionName, common.LabelFunctionMode},
)
// Initialize FlowDuration HistogramVec
Metrics.FlowDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: common.HistogramFlowDurationName,
Help: common.HistogramFlowDurationHelp,
Buckets: []float64{0.005, 0.01, 0.03, 0.08, 0.1, 0.5, 1.0, 5.0, 10, 100, 1000, 5000, 30000, 60000}, // Unit: ms, maximum 1 minute
},
[]string{common.LabelFlowName},
)
// Register Metrics
prometheus.MustRegister(Metrics.DataTotal)
prometheus.MustRegister(Metrics.FlowDataTotal)
prometheus.MustRegister(Metrics.FlowScheduleCntsToTal)
prometheus.MustRegister(Metrics.FuncScheduleCntsTotal)
prometheus.MustRegister(Metrics.FunctionDuration)
prometheus.MustRegister(Metrics.FlowDuration)
}
// RunMetrics starts the Prometheus metrics service
func RunMetrics() {
// Initialize Prometheus metrics
InitMetrics()
if config.GlobalConfig.EnableProm == true && config.GlobalConfig.PrometheusListen == true {
// Start Prometheus metrics service
go RunMetricsService(config.GlobalConfig.PrometheusServe)
}
}