package procfs
import (
"bufio"
"bytes"
"fmt"
"regexp"
"strconv"
"strings"
"github.com/prometheus/procfs/internal/util"
)
var (
slabSpace = regexp .MustCompile (`\s+` )
slabVer = regexp .MustCompile (`slabinfo -` )
slabHeader = regexp .MustCompile (`# name` )
)
type Slab struct {
Name string
ObjActive int64
ObjNum int64
ObjSize int64
ObjPerSlab int64
PagesPerSlab int64
Limit int64
Batch int64
SharedFactor int64
SlabActive int64
SlabNum int64
SharedAvail int64
}
type SlabInfo struct {
Slabs []*Slab
}
func shouldParseSlab(line string ) bool {
if slabVer .MatchString (line ) {
return false
}
if slabHeader .MatchString (line ) {
return false
}
return true
}
func parseV21SlabEntry(line string ) (*Slab , error ) {
l := slabSpace .ReplaceAllString (line , " " )
s := strings .Split (l , " " )
if len (s ) != 16 {
return nil , fmt .Errorf ("%w: unable to parse: %q" , ErrFileParse , line )
}
var err error
i := &Slab {Name : s [0 ]}
i .ObjActive , err = strconv .ParseInt (s [1 ], 10 , 64 )
if err != nil {
return nil , err
}
i .ObjNum , err = strconv .ParseInt (s [2 ], 10 , 64 )
if err != nil {
return nil , err
}
i .ObjSize , err = strconv .ParseInt (s [3 ], 10 , 64 )
if err != nil {
return nil , err
}
i .ObjPerSlab , err = strconv .ParseInt (s [4 ], 10 , 64 )
if err != nil {
return nil , err
}
i .PagesPerSlab , err = strconv .ParseInt (s [5 ], 10 , 64 )
if err != nil {
return nil , err
}
i .Limit , err = strconv .ParseInt (s [8 ], 10 , 64 )
if err != nil {
return nil , err
}
i .Batch , err = strconv .ParseInt (s [9 ], 10 , 64 )
if err != nil {
return nil , err
}
i .SharedFactor , err = strconv .ParseInt (s [10 ], 10 , 64 )
if err != nil {
return nil , err
}
i .SlabActive , err = strconv .ParseInt (s [13 ], 10 , 64 )
if err != nil {
return nil , err
}
i .SlabNum , err = strconv .ParseInt (s [14 ], 10 , 64 )
if err != nil {
return nil , err
}
i .SharedAvail , err = strconv .ParseInt (s [15 ], 10 , 64 )
if err != nil {
return nil , err
}
return i , nil
}
func parseSlabInfo21(r *bytes .Reader ) (SlabInfo , error ) {
scanner := bufio .NewScanner (r )
s := SlabInfo {Slabs : []*Slab {}}
for scanner .Scan () {
line := scanner .Text ()
if !shouldParseSlab (line ) {
continue
}
slab , err := parseV21SlabEntry (line )
if err != nil {
return s , err
}
s .Slabs = append (s .Slabs , slab )
}
return s , nil
}
func (fs FS ) SlabInfo () (SlabInfo , error ) {
data , err := util .ReadFileNoStat (fs .proc .Path ("slabinfo" ))
if err != nil {
return SlabInfo {}, err
}
return parseSlabInfo21 (bytes .NewReader (data ))
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .