diff --git a/src/bean/vo/request/prometheus.go b/src/bean/vo/request/prometheus.go new file mode 100644 index 0000000000000000000000000000000000000000..b1b4bcec2b557447575875d8bcc092db6b49c568 --- /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 0000000000000000000000000000000000000000..fadd63e2f00224438c13bcff92fc05aff3673a88 --- /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 726daa05cb7630900198032514e3065f5875a807..36e0d11ac72086b1aeb91195c602d5b3416e62a6 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 0000000000000000000000000000000000000000..0d4ecd09c405a47941b9d8f8bf4117042fa77de6 --- /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 3abb23edfaccb75d04c3c48e294520e985fa203c..6e4f8619fe2be113c9a202353c0411016d3f6530 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 0000000000000000000000000000000000000000..3295f1d4b1e19f13e74dbc533a77800c67d69c5b --- /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 918243fad6e19e180b896f768dd6e08b601708e6..254ef71b2f8e0b99ae5a698e3144df9ce294f2ce 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 0000000000000000000000000000000000000000..74f3ad2f89aa70913965643f91c7822daaa7c345 --- /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 +}