Skip to content

Commit c74c4b6

Browse files
authored
fix(bfl): add backend cluster API handler for stats report (#2381)
1 parent 8739bfc commit c74c4b6

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

framework/bfl/pkg/apis/backend/v1/handler.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@ package v1
22

33
import (
44
"fmt"
5+
"math"
56
"strconv"
67
"time"
78

89
"bytetrade.io/web3os/bfl/internal/log"
910
"bytetrade.io/web3os/bfl/pkg/api"
1011
"bytetrade.io/web3os/bfl/pkg/api/response"
1112
"bytetrade.io/web3os/bfl/pkg/apis"
13+
"bytetrade.io/web3os/bfl/pkg/apis/backend/v1/metrics"
1214
"bytetrade.io/web3os/bfl/pkg/apis/iam/v1alpha1/operator"
15+
monitov1alpha1 "bytetrade.io/web3os/bfl/pkg/apis/monitor/v1alpha1"
1316
"bytetrade.io/web3os/bfl/pkg/apiserver/runtime"
1417
"bytetrade.io/web3os/bfl/pkg/app_service/v1"
1518
"bytetrade.io/web3os/bfl/pkg/client/clientset/v1alpha1"
@@ -371,3 +374,68 @@ func (h *Handler) myapps(req *restful.Request, resp *restful.Response) {
371374
response.Success(resp, api.NewListResult(list))
372375

373376
}
377+
378+
func (h *Handler) getClusterMetric(req *restful.Request, resp *restful.Response) {
379+
prome, err := metrics.NewPrometheus(metrics.PrometheusEndpoint)
380+
if err != nil {
381+
response.HandleError(resp, err)
382+
return
383+
}
384+
385+
opts := metrics.QueryOptions{
386+
Level: metrics.LevelCluster,
387+
}
388+
389+
metricsResult := prome.GetNamedMetrics(req.Request.Context(), []string{
390+
"cluster_cpu_usage",
391+
"cluster_cpu_total",
392+
"cluster_disk_size_usage",
393+
"cluster_disk_size_capacity",
394+
"cluster_memory_total",
395+
"cluster_memory_usage_wo_cache",
396+
"cluster_net_bytes_transmitted",
397+
"cluster_net_bytes_received",
398+
}, time.Now(), opts)
399+
400+
var clusterMetrics monitov1alpha1.ClusterMetrics
401+
for _, m := range metricsResult {
402+
switch m.MetricName {
403+
case "cluster_cpu_usage":
404+
clusterMetrics.CPU.Usage = metrics.GetValue(&m)
405+
case "cluster_cpu_total":
406+
clusterMetrics.CPU.Total = metrics.GetValue(&m)
407+
408+
case "cluster_disk_size_usage":
409+
clusterMetrics.Disk.Usage = metrics.GetValue(&m)
410+
case "cluster_disk_size_capacity":
411+
clusterMetrics.Disk.Total = metrics.GetValue(&m)
412+
413+
case "cluster_memory_total":
414+
clusterMetrics.Memory.Total = metrics.GetValue(&m)
415+
case "cluster_memory_usage_wo_cache":
416+
clusterMetrics.Memory.Usage = metrics.GetValue(&m)
417+
418+
case "cluster_net_bytes_transmitted":
419+
clusterMetrics.Net.Transmitted = metrics.GetValue(&m)
420+
421+
case "cluster_net_bytes_received":
422+
clusterMetrics.Net.Received = metrics.GetValue(&m)
423+
}
424+
}
425+
426+
roundToGB := func(v float64) float64 { return math.Round((v/1000000000.00)*100.00) / 100.00 }
427+
fmtMetricsValue(&clusterMetrics.CPU, "Cores", func(v float64) float64 { return v })
428+
fmtMetricsValue(&clusterMetrics.Memory, "GB", roundToGB)
429+
fmtMetricsValue(&clusterMetrics.Disk, "GB", roundToGB)
430+
431+
response.Success(resp, clusterMetrics)
432+
433+
}
434+
435+
func fmtMetricsValue(v *monitov1alpha1.MetricV, unit string, unitFunc func(float64) float64) {
436+
v.Unit = unit
437+
438+
v.Usage = unitFunc(v.Usage)
439+
v.Total = unitFunc(v.Total)
440+
v.Ratio = math.Round((v.Usage / v.Total) * 100)
441+
}

framework/bfl/pkg/apis/backend/v1/register.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ func AddContainer(c *restful.Container) error {
5252
Metadata(restfulspec.KeyOpenAPITags, tags).
5353
Returns(http.StatusOK, "", response.Response{}))
5454

55+
ws.Route(ws.GET("/cluster").
56+
To(handler.getClusterMetric).
57+
Doc("get the cluster current metrics ( cpu, memory, disk ).").
58+
Metadata(restfulspec.KeyOpenAPITags, tags).
59+
Returns(http.StatusOK, "", response.Response{}))
60+
5561
ws.Route(ws.GET("/config-system").
5662
To(handler.HandleGetSysConfig).
5763
Doc("get user locale.").

0 commit comments

Comments
 (0)