@@ -2,14 +2,17 @@ package v1
22
33import (
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+ }
0 commit comments