From 6e4b2ca5d5b5122ac9c02543044676c370cf3e37 Mon Sep 17 00:00:00 2001 From: like Date: Wed, 5 Jul 2023 15:10:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=99=AE=E7=BD=97=E7=B1=B3=E4=BF=AE?= =?UTF-8?q?=E6=96=AF=E6=8C=87=E6=A0=87=E6=A0=87=E7=AD=BE=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bean/vo/request/prometheus.go | 6 ++++++ src/controller/prometheus.go | 16 ++++++++++++++++ src/router/prometheusrouter.go | 1 + src/service/prometheus.go | 32 +++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+) diff --git a/src/bean/vo/request/prometheus.go b/src/bean/vo/request/prometheus.go index b1b4bce..8de53b2 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 0d4ecd0..20b90a6 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 3295f1d..f8329ec 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 2927be4..7e42291 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 +} -- 2.26.0