From 92354d57657db8942079def4ed637299d93fe968 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Sun, 17 Jul 2022 13:22:16 +0800 Subject: [PATCH] code refactor --- src/pkg/prom/client_option.go | 4 +- src/server/engine/worker.go | 4 +- src/server/reader/reader.go | 20 +++------ src/server/router/router_prom.go | 2 +- src/server/usage/usage.go | 2 +- src/webapi/prom/prom.go | 9 ++-- src/webapi/router/router_prometheus.go | 62 +++++++++++--------------- 7 files changed, 42 insertions(+), 61 deletions(-) diff --git a/src/pkg/prom/client_option.go b/src/pkg/prom/client_option.go index ea27b60b..1384f605 100644 --- a/src/pkg/prom/client_option.go +++ b/src/pkg/prom/client_option.go @@ -2,8 +2,6 @@ package prom type ClientOptions struct { BasicAuthUser string - BasicAuthPass string - - Headers []string + Headers []string } diff --git a/src/server/engine/worker.go b/src/server/engine/worker.go index 182b959e..352b085c 100644 --- a/src/server/engine/worker.go +++ b/src/server/engine/worker.go @@ -113,7 +113,7 @@ func (r RuleEval) Work() { var err error if r.rule.Algorithm == "" { var warnings prom.Warnings - value, warnings, err = reader.Reader.Client.Query(context.Background(), promql, time.Now()) + value, warnings, err = reader.Client.Query(context.Background(), promql, time.Now()) if err != nil { logger.Errorf("rule_eval:%d promql:%s, error:%v", r.RuleID(), promql, err) // 告警查询prometheus逻辑出错,发告警信息给管理员 @@ -558,7 +558,7 @@ func (r RecordingRuleEval) Work() { return } - value, warnings, err := reader.Reader.Client.Query(context.Background(), promql, time.Now()) + value, warnings, err := reader.Client.Query(context.Background(), promql, time.Now()) if err != nil { logger.Errorf("recording_rule_eval:%d promql:%s, error:%v", r.RuleID(), promql, err) return diff --git a/src/server/reader/reader.go b/src/server/reader/reader.go index bf857c15..43a5e907 100644 --- a/src/server/reader/reader.go +++ b/src/server/reader/reader.go @@ -10,12 +10,7 @@ import ( "github.com/prometheus/client_golang/api" ) -type ReaderType struct { - Opts config.ReaderOptions - Client prom.API -} - -var Reader ReaderType +var Client prom.API func Init(opts config.ReaderOptions) error { cli, err := api.NewClient(api.Config{ @@ -41,14 +36,11 @@ func Init(opts config.ReaderOptions) error { return err } - Reader = ReaderType{ - Opts: opts, - Client: prom.NewAPI(cli, prom.ClientOptions{ - BasicAuthUser: opts.BasicAuthUser, - BasicAuthPass: opts.BasicAuthPass, - Headers: opts.Headers, - }), - } + Client = prom.NewAPI(cli, prom.ClientOptions{ + BasicAuthUser: opts.BasicAuthUser, + BasicAuthPass: opts.BasicAuthPass, + Headers: opts.Headers, + }) return nil } diff --git a/src/server/router/router_prom.go b/src/server/router/router_prom.go index ff5ecdc6..91e4e416 100644 --- a/src/server/router/router_prom.go +++ b/src/server/router/router_prom.go @@ -38,7 +38,7 @@ func queryPromql(c *gin.Context) { var f promqlForm ginx.BindJSON(c, &f) - value, warnings, err := reader.Reader.Client.Query(c.Request.Context(), f.PromQL, time.Now()) + value, warnings, err := reader.Client.Query(c.Request.Context(), f.PromQL, time.Now()) if err != nil { c.String(500, "promql:%s error:%v", f.PromQL, err) return diff --git a/src/server/usage/usage.go b/src/server/usage/usage.go index f2b0055a..1edecaed 100644 --- a/src/server/usage/usage.go +++ b/src/server/usage/usage.go @@ -30,7 +30,7 @@ type Usage struct { } func getSamples() (float64, error) { - value, warns, err := reader.Reader.Client.Query(context.Background(), request, time.Now()) + value, warns, err := reader.Client.Query(context.Background(), request, time.Now()) if err != nil { return 0, err } diff --git a/src/webapi/prom/prom.go b/src/webapi/prom/prom.go index cb373add..10a04fc0 100644 --- a/src/webapi/prom/prom.go +++ b/src/webapi/prom/prom.go @@ -64,7 +64,7 @@ func initClustersFromConfig() error { opts := config.C.Clusters for i := 0; i < len(opts); i++ { - cluster := newClusterTypeByOption(opts[i]) + cluster := newClusterByOption(opts[i]) Clusters.Put(opts[i].Name, cluster) } @@ -165,15 +165,13 @@ func loadClustersFromAPI() { MaxIdleConnsPerHost: 32, } - cluster := newClusterTypeByOption(opt) - - Clusters.Put(item.Name, cluster) + Clusters.Put(item.Name, newClusterByOption(opt)) continue } } } -func newClusterTypeByOption(opt config.ClusterOptions) *ClusterType { +func newClusterByOption(opt config.ClusterOptions) *ClusterType { transport := &http.Transport{ // TLSClientConfig: tlsConfig, Proxy: http.ProxyFromEnvironment, @@ -202,5 +200,6 @@ func newClusterTypeByOption(opt config.ClusterOptions) *ClusterType { Headers: opt.Headers, }), } + return cluster } diff --git a/src/webapi/router/router_prometheus.go b/src/webapi/router/router_prometheus.go index 106e8eba..624ed936 100644 --- a/src/webapi/router/router_prometheus.go +++ b/src/webapi/router/router_prometheus.go @@ -2,7 +2,6 @@ package router import ( "context" - "errors" "net/http" "net/http/httputil" @@ -13,7 +12,7 @@ import ( "github.com/gin-gonic/gin" "github.com/toolkits/pkg/ginx" - . "github.com/didi/nightingale/v5/src/pkg/prom" + pkgprom "github.com/didi/nightingale/v5/src/pkg/prom" "github.com/didi/nightingale/v5/src/webapi/config" "github.com/didi/nightingale/v5/src/webapi/prom" "github.com/prometheus/common/model" @@ -30,14 +29,8 @@ type batchQueryForm struct { Queries []queryFormItem `json:"queries" binding:"required"` } -type batchQueryRes struct { - Data []model.Value `json:"data"` -} - func promBatchQueryRange(c *gin.Context) { - xcluster := c.GetHeader("X-Cluster") - if xcluster == "" { c.String(500, "X-Cluster is blank") return @@ -46,12 +39,35 @@ func promBatchQueryRange(c *gin.Context) { var f batchQueryForm err := c.BindJSON(&f) if err != nil { - c.String(500, "%s", err.Error()) + c.String(500, err.Error()) return } - res, err := batchQueryRange(xcluster, f.Queries) - ginx.NewRender(c).Data(res, err) + cluster, exist := prom.Clusters.Get(xcluster) + if !exist { + c.String(http.StatusBadRequest, "cluster(%s) not found", xcluster) + return + } + + var lst []model.Value + + for _, item := range f.Queries { + r := pkgprom.Range{ + Start: time.Unix(item.Start, 0), + End: time.Unix(item.End, 0), + Step: time.Duration(item.Step) * time.Second, + } + + resp, _, err := cluster.PromClient.QueryRange(context.Background(), item.Query, r) + if err != nil { + c.String(500, err.Error()) + return + } + + lst = append(lst, resp) + } + + c.JSON(200, lst) } func prometheusProxy(c *gin.Context) { @@ -134,27 +150,3 @@ func clustersGets(c *gin.Context) { } ginx.NewRender(c).Data(names, nil) } - -func batchQueryRange(clusterName string, data []queryFormItem) (batchQueryRes, error) { - - var res batchQueryRes - - clusterType, exist := prom.Clusters.Get(clusterName) - if !exist { - return batchQueryRes{}, errors.New("cluster client not exist") - } - for _, item := range data { - - r := Range{ - Start: time.Unix(item.Start, 0), - End: time.Unix(item.End, 0), - Step: time.Duration(item.Step) * time.Second, - } - resp, _, err := clusterType.PromClient.QueryRange(context.Background(), item.Query, r) - if err != nil { - return res, err - } - res.Data = append(res.Data, resp) - } - return res, nil -}