github.com/elastic/gosigar@v0.14.3/sigar_format.go (about) 1 // Copyright (c) 2012 VMware, Inc. 2 3 package gosigar 4 5 import ( 6 "bufio" 7 "bytes" 8 "fmt" 9 "strconv" 10 "time" 11 ) 12 13 // Go version of apr_strfsize 14 func FormatSize(size uint64) string { 15 ord := []string{"K", "M", "G", "T", "P", "E"} 16 o := 0 17 buf := new(bytes.Buffer) 18 w := bufio.NewWriter(buf) 19 20 if size < 973 { 21 fmt.Fprintf(w, "%3d ", size) 22 w.Flush() 23 return buf.String() 24 } 25 26 for { 27 remain := size & 1023 28 size >>= 10 29 30 if size >= 973 { 31 o++ 32 continue 33 } 34 35 if size < 9 || (size == 9 && remain < 973) { 36 remain = ((remain * 5) + 256) / 512 37 if remain >= 10 { 38 size++ 39 remain = 0 40 } 41 42 fmt.Fprintf(w, "%d.%d%s", size, remain, ord[o]) 43 break 44 } 45 46 if remain >= 512 { 47 size++ 48 } 49 50 fmt.Fprintf(w, "%3d%s", size, ord[o]) 51 break 52 } 53 54 w.Flush() 55 return buf.String() 56 } 57 58 func FormatPercent(percent float64) string { 59 return strconv.FormatFloat(percent, 'f', -1, 64) + "%" 60 } 61 62 func (self *FileSystemUsage) UsePercent() float64 { 63 b_used := (self.Total - self.Free) / 1024 64 b_avail := self.Avail / 1024 65 utotal := b_used + b_avail 66 used := b_used 67 68 if utotal != 0 { 69 u100 := used * 100 70 pct := u100 / utotal 71 if u100%utotal != 0 { 72 pct += 1 73 } 74 return (float64(pct) / float64(100)) * 100.0 75 } 76 77 return 0.0 78 } 79 80 func (self *Uptime) Format() string { 81 buf := new(bytes.Buffer) 82 w := bufio.NewWriter(buf) 83 uptime := uint64(self.Length) 84 85 days := uptime / (60 * 60 * 24) 86 87 if days != 0 { 88 s := "" 89 if days > 1 { 90 s = "s" 91 } 92 fmt.Fprintf(w, "%d day%s, ", days, s) 93 } 94 95 minutes := uptime / 60 96 hours := minutes / 60 97 hours %= 24 98 minutes %= 60 99 100 fmt.Fprintf(w, "%2d:%02d", hours, minutes) 101 102 w.Flush() 103 return buf.String() 104 } 105 106 func (self *ProcTime) FormatStartTime() string { 107 if self.StartTime == 0 { 108 return "00:00" 109 } 110 start := time.Unix(int64(self.StartTime)/1000, 0) 111 format := "Jan02" 112 if time.Since(start).Seconds() < (60 * 60 * 24) { 113 format = "15:04" 114 } 115 return start.Format(format) 116 } 117 118 func (self *ProcTime) FormatTotal() string { 119 t := self.Total / 1000 120 ss := t % 60 121 t /= 60 122 mm := t % 60 123 t /= 60 124 hh := t % 24 125 return fmt.Sprintf("%02d:%02d:%02d", hh, mm, ss) 126 }