diff --git a/src/bean/vo/request/prometheus.go b/src/bean/vo/request/prometheus.go index b1b4bcec2b557447575875d8bcc092db6b49c568..8de53b222c66605071f0a603e876236a56683baf 100644 --- a/src/bean/vo/request/prometheus.go +++ b/src/bean/vo/request/prometheus.go @@ -3,3 +3,9 @@ package request type PrometheusLabel struct { LabelName string `json:"label_name" form:"label_name"` } + +type PrometheusLabelValue struct { + MetricName string `json:"metric_name" form:"metric_name" binding:"required"` + MetricLabel string `json:"metric_label" form:"metric_label" binding:"required"` + Value string `json:"value" form:"value"` +} diff --git a/src/controller/prometheus.go b/src/controller/prometheus.go index 0d4ecd09c405a47941b9d8f8bf4117042fa77de6..20b90a694596f518215216dee2d10fcda77d92e4 100644 --- a/src/controller/prometheus.go +++ b/src/controller/prometheus.go @@ -23,3 +23,19 @@ func PrometheusLabel(c *gin.Context) { } SendJsonResponse(c, resp.OK, data) } + +func PrometheusLabelValue(c *gin.Context) { + var req request.PrometheusLabelValue + if err := c.ShouldBind(&req); err != nil { + SendJsonResponse(c, resp.InvalidParam.TranslateError(err), nil) + return + } + + svc := service.PrometheusSvc{User: header.GetUser(c)} + data, err := svc.LabelValue(req) + if err != nil { + SendJsonResponse(c, resp.FAIL.WithError(err), nil) + return + } + SendJsonResponse(c, resp.OK, data) +} diff --git a/src/router/prometheusrouter.go b/src/router/prometheusrouter.go index 3295f1d4b1e19f13e74dbc533a77800c67d69c5b..f8329ec72026aed42ebf6cb00530087c907da72d 100644 --- a/src/router/prometheusrouter.go +++ b/src/router/prometheusrouter.go @@ -12,5 +12,6 @@ func InitPrometheusRouter(e *gin.Engine) { group := e.Group(fmt.Sprintf("%s/prometheus", conf.Options.Prefix)) { group.GET("", controller.PrometheusLabel) + group.GET("value", controller.PrometheusLabelValue) } } diff --git a/src/service/prometheus.go b/src/service/prometheus.go index 2927be400a4c99db5f2fd4a0e3c7b614a9a76ac7..7e42291fa3b1e7109e550f306537214d0e1ca6ce 100644 --- a/src/service/prometheus.go +++ b/src/service/prometheus.go @@ -11,6 +11,7 @@ import ( "gitlab.wodcloud.com/smart-operation/so-operation-api/src/util" "net/http" "sort" + "strings" ) type PrometheusSvc struct { @@ -48,3 +49,34 @@ func (p *PrometheusSvc) Label(req request.PrometheusLabel) (resp response.Promet return } + +func (p *PrometheusSvc) LabelValue(req request.PrometheusLabelValue) (resp response.PrometheusList, err error) { + var ( + prometheusSeries response.PrometheusSeries + metricLabelMap = make(map[string][]string, 0) + ) + + url := fmt.Sprintf("%s%s", conf.Options.PrometheusHost, "/api/v1/series") + bytes, _ := util.Request(url, http.MethodPost, + []byte(fmt.Sprintf("match[]=%s", req.MetricName)), + map[string]string{"Content-Type": util.MediaTypeForm}) + _ = json.Unmarshal(bytes, &prometheusSeries) + for _, v := range prometheusSeries.Data { + for key, value := range v { + metricLabelMap[key] = append(metricLabelMap[key], value) + } + } + + if values, ok := metricLabelMap[req.MetricLabel]; ok { + values = funk.UniqString(values) + if req.Value != "" { + values = funk.FilterString(values, func(x string) bool { + return strings.Contains(x, req.Value) + }) + } + resp.List = values + } + sort.Strings(resp.List) + resp.TotalCount = int64(len(resp.List)) + return +}