Source File
mountstats.go
Belonging Package
github.com/prometheus/procfs
package procfs
import (
)
const (
deviceEntryLen = 8
fieldBytesLen = 8
fieldEventsLen = 27
statVersion10 = "1.0"
statVersion11 = "1.1"
fieldTransport10TCPLen = 10
fieldTransport10UDPLen = 7
fieldTransport11TCPLen = 13
fieldTransport11UDPLen = 10
)
type MountStats interface {
mountStats()
}
func ( MountStatsNFS) () {}
const (
= "opts:"
= "age:"
= "bytes:"
= "events:"
= "per-op"
= "xprt:"
)
:= &MountStatsNFS{
StatVersion: ,
}
for .Scan() {
:= strings.Fields(string(.Bytes()))
if len() == 0 {
break
}
if len() < 2 {
return nil, fmt.Errorf("not enough information for NFS stats: %v", )
}
switch [0] {
case :
if .Opts == nil {
.Opts = map[string]string{}
}
for , := range strings.Split([1], ",") {
:= strings.Split(, "=")
if len() == 2 {
.Opts[[0]] = [1]
} else {
.Opts[] = ""
}
}
, := time.ParseDuration([1] + "s")
if != nil {
return nil,
}
.Age =
case :
, := parseNFSBytesStats([1:])
if != nil {
return nil,
}
.Bytes = *
case :
, := parseNFSEventsStats([1:])
if != nil {
return nil,
}
.Events = *
case :
if len() < 3 {
return nil, fmt.Errorf("not enough information for NFS transport stats: %v", )
}
, := parseNFSTransportStats([1:], )
if != nil {
return nil,
}
.Transport = *
}
, := parseNFSOperationStats()
if != nil {
return nil,
}
.Operations =
return , nil
}
func ( []string) (*NFSBytesStats, error) {
if len() != fieldBytesLen {
return nil, fmt.Errorf("invalid NFS bytes stats: %v", )
}
:= make([]uint64, 0, fieldBytesLen)
for , := range {
, := strconv.ParseUint(, 10, 64)
if != nil {
return nil,
}
= append(, )
}
return &NFSBytesStats{
Read: [0],
Write: [1],
DirectRead: [2],
DirectWrite: [3],
ReadTotal: [4],
WriteTotal: [5],
ReadPages: [6],
WritePages: [7],
}, nil
}
func ( []string) (*NFSEventsStats, error) {
if len() != fieldEventsLen {
return nil, fmt.Errorf("invalid NFS events stats: %v", )
}
:= make([]uint64, 0, fieldEventsLen)
for , := range {
, := strconv.ParseUint(, 10, 64)
if != nil {
return nil,
}
= append(, )
}
return &NFSEventsStats{
InodeRevalidate: [0],
DnodeRevalidate: [1],
DataInvalidate: [2],
AttributeInvalidate: [3],
VFSOpen: [4],
VFSLookup: [5],
VFSAccess: [6],
VFSUpdatePage: [7],
VFSReadPage: [8],
VFSReadPages: [9],
VFSWritePage: [10],
VFSWritePages: [11],
VFSGetdents: [12],
VFSSetattr: [13],
VFSFlush: [14],
VFSFsync: [15],
VFSLock: [16],
VFSFileRelease: [17],
CongestionWait: [18],
Truncation: [19],
WriteExtension: [20],
SillyRename: [21],
ShortRead: [22],
ShortWrite: [23],
JukeboxDelay: [24],
PNFSRead: [25],
PNFSWrite: [26],
}, nil
}
func ( *bufio.Scanner) ([]NFSOperationStats, error) {
:= make([]uint64, 0, -1)
for , := range [1:] {
, := strconv.ParseUint(, 10, 64)
if != nil {
return nil,
}
= append(, )
}
= append(, NFSOperationStats{
Operation: strings.TrimSuffix([0], ":"),
Requests: [0],
Transmissions: [1],
MajorTimeouts: [2],
BytesSent: [3],
BytesReceived: [4],
CumulativeQueueMilliseconds: [5],
CumulativeTotalResponseMilliseconds: [6],
CumulativeTotalRequestMilliseconds: [7],
})
}
return , .Err()
}
:= [0]
= [1:]
switch {
case statVersion10:
var int
if == "tcp" {
= fieldTransport10TCPLen
} else if == "udp" {
= fieldTransport10UDPLen
} else {
return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.0 statement: %v", , )
}
if len() != {
return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", )
}
case statVersion11:
var int
if == "tcp" {
= fieldTransport11TCPLen
} else if == "udp" {
= fieldTransport11UDPLen
} else {
return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.1 statement: %v", , )
}
if len() != {
return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", )
}
default:
return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", )
}
if == "udp" {
= append([:2], append(make([]uint64, 3), [2:]...)...)
}
return &NFSTransportStats{
Protocol: ,
Port: [0],
Bind: [1],
Connect: [2],
ConnectIdleTime: [3],
IdleTimeSeconds: [4],
Sends: [5],
Receives: [6],
BadTransactionIDs: [7],
CumulativeActiveRequests: [8],
CumulativeBacklog: [9],
MaximumRPCSlotsUsed: [10],
CumulativeSendingQueue: [11],
CumulativePendingQueue: [12],
}, nil
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin 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 @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |