@@ -9,10 +9,8 @@ import (
9
9
"context"
10
10
"errors"
11
11
"io"
12
- "io/ioutil"
13
12
"os"
14
13
"path/filepath"
15
- "strconv"
16
14
"strings"
17
15
"sync"
18
16
"time"
@@ -934,145 +932,5 @@ func (s *portService) RetryAutoExpose(ctx context.Context, req *api.RetryAutoExp
934
932
935
933
// ResourcesStatus provides workspace resources status information.
936
934
func (s * statusService ) ResourcesStatus (ctx context.Context , in * api.ResourcesStatuRequest ) (* api.ResourcesStatusResponse , error ) {
937
- memory , err := resolveMemoryStatus ()
938
- if err != nil {
939
- return nil , err
940
- }
941
- cpu , err := resolveCPUStatus ()
942
- if err != nil {
943
- return nil , err
944
- }
945
- return & api.ResourcesStatusResponse {
946
- Memory : memory ,
947
- Cpu : cpu ,
948
- }, nil
949
- }
950
-
951
- func resolveMemoryStatus () (* api.ResourceStatus , error ) {
952
- content , err := ioutil .ReadFile ("/sys/fs/cgroup/memory/memory.usage_in_bytes" )
953
- if err != nil {
954
- return nil , xerrors .Errorf ("failed to read memory.usage_in_bytes: %w" , err )
955
- }
956
- used , err := strconv .Atoi (strings .TrimSpace (string (content )))
957
- if err != nil {
958
- return nil , xerrors .Errorf ("failed to parse memory.usage_in_bytes: %w" , err )
959
- }
960
- content , err = ioutil .ReadFile ("/sys/fs/cgroup/memory/memory.limit_in_bytes" )
961
- if err != nil {
962
- return nil , xerrors .Errorf ("failed to read memory.limit_in_bytes: %w" , err )
963
- }
964
- limit , err := strconv .Atoi (strings .TrimSpace (string (content )))
965
- if err != nil {
966
- return nil , xerrors .Errorf ("failed to parse memory.limit_in_bytes: %w" , err )
967
- }
968
- content , err = ioutil .ReadFile ("/sys/fs/cgroup/memory/memory.stat" )
969
- if err != nil {
970
- return nil , xerrors .Errorf ("failed to read memory.stat: %w" , err )
971
- }
972
- statLines := strings .Split (strings .TrimSpace (string (content )), "\n " )
973
- stat := make (map [string ]string , len (statLines ))
974
- for _ , line := range statLines {
975
- tokens := strings .Split (line , " " )
976
- stat [tokens [0 ]] = tokens [1 ]
977
- }
978
- // substract evictable memory
979
- value , ok := stat ["total_inactive_file" ]
980
- if ok {
981
- totalInactiveFile , err := strconv .Atoi (value )
982
- if err != nil {
983
- return nil , xerrors .Errorf ("failed to parse total_inactive_file: %w" , err )
984
- }
985
- if used < totalInactiveFile {
986
- used = 0
987
- } else {
988
- used -= totalInactiveFile
989
- }
990
- }
991
- return & api.ResourceStatus {
992
- Limit : int64 (limit ),
993
- Used : int64 (used ),
994
- }, nil
995
- }
996
-
997
- func resolveCPUStatus () (* api.ResourceStatus , error ) {
998
- t , err := resolveCPUStat ()
999
- if err != nil {
1000
- return nil , err
1001
- }
1002
-
1003
- time .Sleep (time .Second )
1004
-
1005
- t2 , err := resolveCPUStat ()
1006
- if err != nil {
1007
- return nil , err
1008
- }
1009
-
1010
- cpuUsage := t2 .usage - t .usage
1011
- totalTime := t2 .uptime - t .uptime
1012
- used := cpuUsage / totalTime * 1000
1013
-
1014
- content , err := ioutil .ReadFile ("/sys/fs/cgroup/cpu/cpu.cfs_quota_us" )
1015
- if err != nil {
1016
- return nil , xerrors .Errorf ("failed to read cpu.cfs_quota_us: %w" , err )
1017
- }
1018
- quota , err := strconv .Atoi (strings .TrimSpace (string (content )))
1019
- if err != nil {
1020
- return nil , xerrors .Errorf ("failed to parse cpu.cfs_quota_us: %w" , err )
1021
- }
1022
-
1023
- var limit int
1024
- if quota > 0 {
1025
- content , err = ioutil .ReadFile ("/sys/fs/cgroup/cpu/cpu.cfs_period_us" )
1026
- if err != nil {
1027
- return nil , xerrors .Errorf ("failed to read cpu.cfs_period_us: %w" , err )
1028
- }
1029
- period , err := strconv .Atoi (strings .TrimSpace (string (content )))
1030
- if err != nil {
1031
- return nil , xerrors .Errorf ("failed to parse cpu.cfs_period_us: %w" , err )
1032
- }
1033
-
1034
- limit = quota / period * 1000
1035
- } else {
1036
- content , err = ioutil .ReadFile ("/sys/fs/cgroup/cpu/cpuacct.usage_percpu" )
1037
- if err != nil {
1038
- return nil , xerrors .Errorf ("failed to read cpuacct.usage_percpu: %w" , err )
1039
- }
1040
- limit = len (strings .Split (strings .TrimSpace (string (content )), " " )) * 1000
1041
- }
1042
-
1043
- return & api.ResourceStatus {
1044
- Limit : int64 (limit ),
1045
- Used : int64 (used ),
1046
- }, nil
1047
- }
1048
-
1049
- type cpuStat struct {
1050
- usage float64
1051
- uptime float64
1052
- }
1053
-
1054
- func resolveCPUStat () (* cpuStat , error ) {
1055
- content , err := ioutil .ReadFile ("/sys/fs/cgroup/cpu/cpuacct.usage" )
1056
- if err != nil {
1057
- return nil , xerrors .Errorf ("failed to read cpuacct.usage: %w" , err )
1058
- }
1059
- usage , err := strconv .ParseFloat (strings .TrimSpace (string (content )), 64 )
1060
- if err != nil {
1061
- return nil , xerrors .Errorf ("failed to parse cpuacct.usage: %w" , err )
1062
- }
1063
- // convert from nanoseconds to seconds
1064
- usage *= 1e-9
1065
- content , err = ioutil .ReadFile ("/proc/uptime" )
1066
- if err != nil {
1067
- return nil , xerrors .Errorf ("failed to read uptime: %w" , err )
1068
- }
1069
- values := strings .Split (strings .TrimSpace (string (content )), " " )
1070
- uptime , err := strconv .ParseFloat (values [0 ], 64 )
1071
- if err != nil {
1072
- return nil , xerrors .Errorf ("failed to parse uptime: %w" , err )
1073
- }
1074
- return & cpuStat {
1075
- usage : usage ,
1076
- uptime : uptime ,
1077
- }, nil
935
+ return Top (ctx )
1078
936
}
0 commit comments