From fb038039e717be55be5ce8963bdd6431a95b745d Mon Sep 17 00:00:00 2001 From: like Date: Fri, 30 Jun 2023 16:25:00 +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=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bean/vo/request/prometheus.go | 5 +++ src/bean/vo/response/prometheus.go | 25 +++++++++++++++ src/common/conf/options.go | 1 + src/controller/prometheus.go | 25 +++++++++++++++ src/main.go | 23 +++++++------- src/router/prometheusrouter.go | 16 ++++++++++ src/router/router.go | 2 ++ src/service/prometheus.go | 50 ++++++++++++++++++++++++++++++ 8 files changed, 136 insertions(+), 11 deletions(-) create mode 100644 src/bean/vo/request/prometheus.go create mode 100644 src/bean/vo/response/prometheus.go create mode 100644 src/controller/prometheus.go create mode 100644 src/router/prometheusrouter.go create mode 100644 src/service/prometheus.go diff --git a/src/bean/vo/request/prometheus.go b/src/bean/vo/request/prometheus.go new file mode 100644 index 0000000..b1b4bce --- /dev/null +++ b/src/bean/vo/request/prometheus.go @@ -0,0 +1,5 @@ +package request + +type PrometheusLabel struct { + LabelName string `json:"label_name" form:"label_name"` +} diff --git a/src/bean/vo/response/prometheus.go b/src/bean/vo/response/prometheus.go new file mode 100644 index 0000000..fadd63e --- /dev/null +++ b/src/bean/vo/response/prometheus.go @@ -0,0 +1,25 @@ +package response + +type PrometheusItem struct { + Serial +} +type PrometheusList struct { + TotalCount int64 `json:"total_count"` + List []string `json:"list"` +} + +type PrometheusLabel struct { + Status string `json:"status"` + Data []string `json:"data"` +} + +type PrometheusSeries struct { + Status string `json:"status"` + Data []map[string]string `json:"data"` +} + +type Serial struct { + Name string `json:"name"` + Value string `json:"value,omitempty"` + Children []Serial `json:"children,omitempty"` +} diff --git a/src/common/conf/options.go b/src/common/conf/options.go index 726daa0..36e0d11 100644 --- a/src/common/conf/options.go +++ b/src/common/conf/options.go @@ -31,6 +31,7 @@ type Config struct { MinioSecretKey string MinioBucket string TempDirPrefix string + PrometheusHost string } const ( diff --git a/src/controller/prometheus.go b/src/controller/prometheus.go new file mode 100644 index 0000000..0d4ecd0 --- /dev/null +++ b/src/controller/prometheus.go @@ -0,0 +1,25 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/router/middleware/header" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/service" +) + +func PrometheusLabel(c *gin.Context) { + var req request.PrometheusLabel + 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.Label(req) + if err != nil { + SendJsonResponse(c, resp.FAIL.WithError(err), nil) + return + } + SendJsonResponse(c, resp.OK, data) +} diff --git a/src/main.go b/src/main.go index 3abb23e..6e4f861 100644 --- a/src/main.go +++ b/src/main.go @@ -54,17 +54,18 @@ func initConfig() { RedisURL: util.SetEnvStr("REDIS_URL", "localhost:7001"), RedisDB: 0, RedisTag: "bg", - LogDirPrefix: util.SetEnvStr("LOG_DIR_PREFIX", "/app/log"), // 日志目录 - LogDirName: util.SetEnvStr("LOG_NAME", "syslog"), // 日志名称 - LogSaveDays: util.SetEnvInt("LOG_SAVE_DAYS", 7), // 日志最大存储天数 - LogMode: util.SetEnvInt("LOG_MODE", 1), // 1.标准打印 2.输出文件 - ArgBool: util.SetEnvBool("ARG_BOOL", false), // 示例参数 - ArgInt: util.SetEnvInt("ARG_INT", 10), // 示例参数 - MinioServer: util.SetEnvStr("MINIO_SERVER", "cache.wodcloud.com"), // Minio 服务地址 - MinioAccessKey: util.SetEnvStr("MINIO_ACCESS_KEY", "beagleadmin"), // Minio Access Key - MinioSecretKey: util.SetEnvStr("MINIO_SECRET_KEY", "H76cPmwvH7vJ"), // Minio Secret - MinioBucket: util.SetEnvStr("MINIO_BUCKET", "so-operation"), // Minio Bucket - TempDirPrefix: util.SetEnvStr("TEMP_DIR_PREFIX", "/app/xlsx/"), //模板目录前缀 + LogDirPrefix: util.SetEnvStr("LOG_DIR_PREFIX", "/app/log"), // 日志目录 + LogDirName: util.SetEnvStr("LOG_NAME", "syslog"), // 日志名称 + LogSaveDays: util.SetEnvInt("LOG_SAVE_DAYS", 7), // 日志最大存储天数 + LogMode: util.SetEnvInt("LOG_MODE", 1), // 1.标准打印 2.输出文件 + ArgBool: util.SetEnvBool("ARG_BOOL", false), // 示例参数 + ArgInt: util.SetEnvInt("ARG_INT", 10), // 示例参数 + MinioServer: util.SetEnvStr("MINIO_SERVER", "cache.wodcloud.com"), // Minio 服务地址 + MinioAccessKey: util.SetEnvStr("MINIO_ACCESS_KEY", "beagleadmin"), // Minio Access Key + MinioSecretKey: util.SetEnvStr("MINIO_SECRET_KEY", "H76cPmwvH7vJ"), // Minio Secret + MinioBucket: util.SetEnvStr("MINIO_BUCKET", "so-operation"), // Minio Bucket + TempDirPrefix: util.SetEnvStr("TEMP_DIR_PREFIX", "/app/xlsx/"), //模板目录前缀 + PrometheusHost: util.SetEnvStr("PROMETHEUS_HOST", "https://prometheus.wodcloud.com"), // Prometheus Host } } diff --git a/src/router/prometheusrouter.go b/src/router/prometheusrouter.go new file mode 100644 index 0000000..3295f1d --- /dev/null +++ b/src/router/prometheusrouter.go @@ -0,0 +1,16 @@ +package router + +import ( + "fmt" + "github.com/gin-gonic/gin" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/controller" +) + +// InitPrometheusRouter 初始化prometheus路由 +func InitPrometheusRouter(e *gin.Engine) { + group := e.Group(fmt.Sprintf("%s/prometheus", conf.Options.Prefix)) + { + group.GET("", controller.PrometheusLabel) + } +} diff --git a/src/router/router.go b/src/router/router.go index 918243f..254ef71 100644 --- a/src/router/router.go +++ b/src/router/router.go @@ -38,4 +38,6 @@ func Load(r *gin.Engine, middleware ...gin.HandlerFunc) { InitOrganizationRouter(r) // 初始化指标配置路由 InitMetricConfigRouter(r) + // 初始化prometheus路由 + InitPrometheusRouter(r) } diff --git a/src/service/prometheus.go b/src/service/prometheus.go new file mode 100644 index 0000000..74f3ad2 --- /dev/null +++ b/src/service/prometheus.go @@ -0,0 +1,50 @@ +package service + +import ( + "fmt" + json "github.com/json-iterator/go" + "github.com/thoas/go-funk" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/util" + "net/http" + "sort" +) + +type PrometheusSvc struct { + User entity.SystemUserInfo +} + +func (m *PrometheusSvc) Label(req request.PrometheusLabel) (resp response.PrometheusList, err error) { + var ( + prometheusLabel response.PrometheusLabel + prometheusSeries response.PrometheusSeries + ) + + if req.LabelName != "" { + url := fmt.Sprintf("%s%s", conf.Options.PrometheusHost, "/api/v1/series") + bytes, _ := util.Request(url, http.MethodPost, + []byte(fmt.Sprintf("match[]=%s", req.LabelName)), + map[string]string{"Content-Type": util.MediaTypeForm}) + _ = json.Unmarshal(bytes, &prometheusSeries) + for _, v := range prometheusSeries.Data { + for k, _ := range v { + resp.List = append(resp.List, k) + } + } + resp.List = funk.UniqString(resp.List) + sort.Strings(resp.List) + resp.TotalCount = int64(len(resp.List)) + + } else { + url := fmt.Sprintf("%s%s", conf.Options.PrometheusHost, "/api/v1/label/__name__/values") + bytes, _ := util.Request(url, http.MethodGet, nil, nil) + _ = json.Unmarshal(bytes, &prometheusLabel) + resp.TotalCount = int64(len(prometheusLabel.Data)) + resp.List = prometheusLabel.Data + } + + return +} -- 2.26.0