Intergate OpenPitrix metrics into metering.
Signed-off-by: Rao Yunkun <yunkunrao@yunify.com>
This commit is contained in:
@@ -4,7 +4,11 @@ import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/models/openpitrix"
|
||||
"kubesphere.io/kubesphere/pkg/server/params"
|
||||
|
||||
"github.com/emicklei/go-restful"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/klog"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/api"
|
||||
@@ -12,8 +16,8 @@ import (
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/monitoring"
|
||||
)
|
||||
|
||||
func (h handler) HandleClusterMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandleClusterMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelCluster)
|
||||
if err != nil {
|
||||
api.HandleBadRequest(resp, nil, err)
|
||||
@@ -87,7 +91,7 @@ func (h handler) handleApplicationMetersQuery(meters []string, resp *restful.Res
|
||||
}
|
||||
|
||||
if q.Operation == OperationExport {
|
||||
ExportMetrics(resp, res)
|
||||
ExportMetrics(resp, res, q.start, q.end)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -144,7 +148,7 @@ func (h handler) handleServiceMetersQuery(meters []string, resp *restful.Respons
|
||||
}
|
||||
|
||||
if q.Operation == OperationExport {
|
||||
ExportMetrics(resp, res)
|
||||
ExportMetrics(resp, res, q.start, q.end)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -180,6 +184,12 @@ func (h handler) handleNamedMetersQuery(resp *restful.Response, q queryOptions)
|
||||
return
|
||||
}
|
||||
|
||||
_, ok = q.option.(monitoring.OpenpitrixsOption)
|
||||
if ok {
|
||||
h.handleOpenpitrixMetersQuery(meters, resp, q)
|
||||
return
|
||||
}
|
||||
|
||||
_, ok = q.option.(monitoring.ServicesOption)
|
||||
if ok {
|
||||
h.handleServiceMetersQuery(meters, resp, q)
|
||||
@@ -205,15 +215,16 @@ func (h handler) handleNamedMetersQuery(resp *restful.Response, q queryOptions)
|
||||
}
|
||||
|
||||
if q.Operation == OperationExport {
|
||||
ExportMetrics(resp, res)
|
||||
ExportMetrics(resp, res, q.start, q.end)
|
||||
return
|
||||
}
|
||||
|
||||
resp.WriteAsJson(res)
|
||||
}
|
||||
|
||||
func (h handler) HandleNodeMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandleNodeMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
params.metering = true
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelNode)
|
||||
if err != nil {
|
||||
api.HandleBadRequest(resp, nil, err)
|
||||
@@ -222,8 +233,9 @@ func (h handler) HandleNodeMetersQuery(req *restful.Request, resp *restful.Respo
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) HandleWorkspaceMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandleWorkspaceMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
params.metering = true
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelWorkspace)
|
||||
if err != nil {
|
||||
api.HandleBadRequest(resp, nil, err)
|
||||
@@ -233,8 +245,9 @@ func (h handler) HandleWorkspaceMetersQuery(req *restful.Request, resp *restful.
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) HandleNamespaceMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandleNamespaceMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
params.metering = true
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelNamespace)
|
||||
if err != nil {
|
||||
if err.Error() == ErrNoHit {
|
||||
@@ -250,8 +263,8 @@ func (h handler) HandleNamespaceMetersQuery(req *restful.Request, resp *restful.
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) HandleWorkloadMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandleWorkloadMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelWorkload)
|
||||
if err != nil {
|
||||
if err.Error() == ErrNoHit {
|
||||
@@ -266,8 +279,8 @@ func (h handler) HandleWorkloadMetersQuery(req *restful.Request, resp *restful.R
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) HandleApplicationMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandleApplicationMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelApplication)
|
||||
if err != nil {
|
||||
if err.Error() == ErrNoHit {
|
||||
@@ -282,8 +295,25 @@ func (h handler) HandleApplicationMetersQuery(req *restful.Request, resp *restfu
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) HandlePodMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandleOpenpitrixMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelOpenpitrix)
|
||||
if err != nil {
|
||||
if err.Error() == ErrNoHit {
|
||||
res := handleNoHit(opt.namedMetrics)
|
||||
resp.WriteAsJson(res)
|
||||
return
|
||||
}
|
||||
|
||||
api.HandleBadRequest(resp, nil, err)
|
||||
return
|
||||
}
|
||||
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) HandlePodMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelPod)
|
||||
if err != nil {
|
||||
if err.Error() == ErrNoHit {
|
||||
@@ -295,11 +325,12 @@ func (h handler) HandlePodMetersQuery(req *restful.Request, resp *restful.Respon
|
||||
api.HandleBadRequest(resp, nil, err)
|
||||
return
|
||||
}
|
||||
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) HandleServiceMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandleServiceMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelService)
|
||||
if err != nil {
|
||||
if err.Error() == ErrNoHit {
|
||||
@@ -315,8 +346,8 @@ func (h handler) HandleServiceMetersQuery(req *restful.Request, resp *restful.Re
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) HandlePVCMetersQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseRequestParams(req)
|
||||
func (h handler) HandlePVCMeterQuery(req *restful.Request, resp *restful.Response) {
|
||||
params := parseMeteringRequestParams(req)
|
||||
opt, err := h.makeQueryOptions(params, monitoring.LevelPVC)
|
||||
if err != nil {
|
||||
if err.Error() == ErrNoHit {
|
||||
@@ -330,3 +361,110 @@ func (h handler) HandlePVCMetersQuery(req *restful.Request, resp *restful.Respon
|
||||
}
|
||||
h.handleNamedMetersQuery(resp, opt)
|
||||
}
|
||||
|
||||
func (h handler) collectOps(cluster, ns string) []string {
|
||||
|
||||
var ops []string
|
||||
|
||||
conditions := params.Conditions{
|
||||
Match: make(map[string]string),
|
||||
Fuzzy: make(map[string]string),
|
||||
}
|
||||
|
||||
resp, err := h.opRelease.ListApplications("", cluster, ns, &conditions, 10, 0, "", false)
|
||||
if err != nil {
|
||||
klog.Error("failed to list op apps")
|
||||
return nil
|
||||
}
|
||||
totalCount := resp.TotalCount
|
||||
resp, err = h.opRelease.ListApplications("", cluster, ns, &conditions, totalCount, 0, "", false)
|
||||
if err != nil {
|
||||
klog.Error("failed to list op apps")
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, item := range resp.Items {
|
||||
app := item.(*openpitrix.Application)
|
||||
ops = append(ops, app.Cluster.ClusterId)
|
||||
}
|
||||
return ops
|
||||
}
|
||||
func (h handler) getOpWorkloads(cluster, ns string, ops []string) map[string][]string {
|
||||
|
||||
componentsMap := make(map[string][]string)
|
||||
|
||||
if len(ops) == 0 {
|
||||
ops = h.collectOps(cluster, ns)
|
||||
}
|
||||
|
||||
for _, op := range ops {
|
||||
app, err := h.opRelease.DescribeApplication("", cluster, ns, op)
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
return nil
|
||||
}
|
||||
for _, object := range app.ReleaseInfo {
|
||||
unstructuredObj := object.(*unstructured.Unstructured)
|
||||
componentsMap[op] = append(componentsMap[op], unstructuredObj.GetKind()+":"+unstructuredObj.GetName())
|
||||
}
|
||||
}
|
||||
|
||||
return componentsMap
|
||||
}
|
||||
func (h handler) handleOpenpitrixMetersQuery(meters []string, resp *restful.Response, q queryOptions) {
|
||||
var metricMap = make(map[string]int)
|
||||
var res model.Metrics
|
||||
var current_res model.Metrics
|
||||
var err error
|
||||
|
||||
oso, ok := q.option.(monitoring.OpenpitrixsOption)
|
||||
if !ok {
|
||||
klog.Error("invalid openpitrix option")
|
||||
return
|
||||
}
|
||||
|
||||
opWorkloads := h.getOpWorkloads(oso.Cluster, oso.NamespaceName, oso.Openpitrixs)
|
||||
|
||||
for k, _ := range opWorkloads {
|
||||
opt := monitoring.ApplicationOption{
|
||||
NamespaceName: oso.NamespaceName,
|
||||
Application: k,
|
||||
ApplicationComponents: opWorkloads[k],
|
||||
StorageClassName: oso.StorageClassName,
|
||||
}
|
||||
|
||||
if q.isRangeQuery() {
|
||||
current_res, err = h.mo.GetNamedMetersOverTime(meters, q.start, q.end, q.step, opt)
|
||||
} else {
|
||||
current_res, err = h.mo.GetNamedMeters(meters, q.time, opt)
|
||||
}
|
||||
if err != nil {
|
||||
api.HandleBadRequest(resp, nil, err)
|
||||
return
|
||||
}
|
||||
if res.Results == nil {
|
||||
res = current_res
|
||||
metricMap = getMetricPosMap(res.Results)
|
||||
} else {
|
||||
for _, cur_res := range current_res.Results {
|
||||
pos, ok := metricMap[cur_res.MetricName]
|
||||
if ok {
|
||||
res.Results[pos].MetricValues = append(res.Results[pos].MetricValues, cur_res.MetricValues...)
|
||||
} else {
|
||||
res.Results = append(res.Results, cur_res)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !q.isRangeQuery() && q.shouldSort() {
|
||||
res = *res.Sort(q.target, q.order, q.identifier).Page(q.page, q.limit)
|
||||
}
|
||||
|
||||
if q.Operation == OperationExport {
|
||||
ExportMetrics(resp, res, q.start, q.end)
|
||||
return
|
||||
}
|
||||
|
||||
resp.WriteAsJson(res)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user