github.com/hellobchain/third_party@v0.0.0-20230331131523-deb0478a2e52/prometheus/procfs/nfs/parse.go (about)

     1  // Copyright 2018 The Prometheus Authors
     2  // Licensed under the Apache License, Version 2.0 (the "License");
     3  // you may not use this file except in compliance with the License.
     4  // You may obtain a copy of the License at
     5  //
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package nfs
    15  
    16  import (
    17  	"fmt"
    18  )
    19  
    20  func parseReplyCache(v []uint64) (ReplyCache, error) {
    21  	if len(v) != 3 {
    22  		return ReplyCache{}, fmt.Errorf("invalid ReplyCache line %q", v)
    23  	}
    24  
    25  	return ReplyCache{
    26  		Hits:    v[0],
    27  		Misses:  v[1],
    28  		NoCache: v[2],
    29  	}, nil
    30  }
    31  
    32  func parseFileHandles(v []uint64) (FileHandles, error) {
    33  	if len(v) != 5 {
    34  		return FileHandles{}, fmt.Errorf("invalid FileHandles, line %q", v)
    35  	}
    36  
    37  	return FileHandles{
    38  		Stale:        v[0],
    39  		TotalLookups: v[1],
    40  		AnonLookups:  v[2],
    41  		DirNoCache:   v[3],
    42  		NoDirNoCache: v[4],
    43  	}, nil
    44  }
    45  
    46  func parseInputOutput(v []uint64) (InputOutput, error) {
    47  	if len(v) != 2 {
    48  		return InputOutput{}, fmt.Errorf("invalid InputOutput line %q", v)
    49  	}
    50  
    51  	return InputOutput{
    52  		Read:  v[0],
    53  		Write: v[1],
    54  	}, nil
    55  }
    56  
    57  func parseThreads(v []uint64) (Threads, error) {
    58  	if len(v) != 2 {
    59  		return Threads{}, fmt.Errorf("invalid Threads line %q", v)
    60  	}
    61  
    62  	return Threads{
    63  		Threads: v[0],
    64  		FullCnt: v[1],
    65  	}, nil
    66  }
    67  
    68  func parseReadAheadCache(v []uint64) (ReadAheadCache, error) {
    69  	if len(v) != 12 {
    70  		return ReadAheadCache{}, fmt.Errorf("invalid ReadAheadCache line %q", v)
    71  	}
    72  
    73  	return ReadAheadCache{
    74  		CacheSize:      v[0],
    75  		CacheHistogram: v[1:11],
    76  		NotFound:       v[11],
    77  	}, nil
    78  }
    79  
    80  func parseNetwork(v []uint64) (Network, error) {
    81  	if len(v) != 4 {
    82  		return Network{}, fmt.Errorf("invalid Network line %q", v)
    83  	}
    84  
    85  	return Network{
    86  		NetCount:   v[0],
    87  		UDPCount:   v[1],
    88  		TCPCount:   v[2],
    89  		TCPConnect: v[3],
    90  	}, nil
    91  }
    92  
    93  func parseServerRPC(v []uint64) (ServerRPC, error) {
    94  	if len(v) != 5 {
    95  		return ServerRPC{}, fmt.Errorf("invalid RPC line %q", v)
    96  	}
    97  
    98  	return ServerRPC{
    99  		RPCCount: v[0],
   100  		BadCnt:   v[1],
   101  		BadFmt:   v[2],
   102  		BadAuth:  v[3],
   103  		BadcInt:  v[4],
   104  	}, nil
   105  }
   106  
   107  func parseClientRPC(v []uint64) (ClientRPC, error) {
   108  	if len(v) != 3 {
   109  		return ClientRPC{}, fmt.Errorf("invalid RPC line %q", v)
   110  	}
   111  
   112  	return ClientRPC{
   113  		RPCCount:        v[0],
   114  		Retransmissions: v[1],
   115  		AuthRefreshes:   v[2],
   116  	}, nil
   117  }
   118  
   119  func parseV2Stats(v []uint64) (V2Stats, error) {
   120  	values := int(v[0])
   121  	if len(v[1:]) != values || values != 18 {
   122  		return V2Stats{}, fmt.Errorf("invalid V2Stats line %q", v)
   123  	}
   124  
   125  	return V2Stats{
   126  		Null:     v[1],
   127  		GetAttr:  v[2],
   128  		SetAttr:  v[3],
   129  		Root:     v[4],
   130  		Lookup:   v[5],
   131  		ReadLink: v[6],
   132  		Read:     v[7],
   133  		WrCache:  v[8],
   134  		Write:    v[9],
   135  		Create:   v[10],
   136  		Remove:   v[11],
   137  		Rename:   v[12],
   138  		Link:     v[13],
   139  		SymLink:  v[14],
   140  		MkDir:    v[15],
   141  		RmDir:    v[16],
   142  		ReadDir:  v[17],
   143  		FsStat:   v[18],
   144  	}, nil
   145  }
   146  
   147  func parseV3Stats(v []uint64) (V3Stats, error) {
   148  	values := int(v[0])
   149  	if len(v[1:]) != values || values != 22 {
   150  		return V3Stats{}, fmt.Errorf("invalid V3Stats line %q", v)
   151  	}
   152  
   153  	return V3Stats{
   154  		Null:        v[1],
   155  		GetAttr:     v[2],
   156  		SetAttr:     v[3],
   157  		Lookup:      v[4],
   158  		Access:      v[5],
   159  		ReadLink:    v[6],
   160  		Read:        v[7],
   161  		Write:       v[8],
   162  		Create:      v[9],
   163  		MkDir:       v[10],
   164  		SymLink:     v[11],
   165  		MkNod:       v[12],
   166  		Remove:      v[13],
   167  		RmDir:       v[14],
   168  		Rename:      v[15],
   169  		Link:        v[16],
   170  		ReadDir:     v[17],
   171  		ReadDirPlus: v[18],
   172  		FsStat:      v[19],
   173  		FsInfo:      v[20],
   174  		PathConf:    v[21],
   175  		Commit:      v[22],
   176  	}, nil
   177  }
   178  
   179  func parseClientV4Stats(v []uint64) (ClientV4Stats, error) {
   180  	values := int(v[0])
   181  	if len(v[1:]) != values {
   182  		return ClientV4Stats{}, fmt.Errorf("invalid ClientV4Stats line %q", v)
   183  	}
   184  
   185  	// This function currently supports mapping 59 NFS v4 client stats.  Older
   186  	// kernels may emit fewer stats, so we must detect this and pad out the
   187  	// values to match the expected slice size.
   188  	if values < 59 {
   189  		newValues := make([]uint64, 60)
   190  		copy(newValues, v)
   191  		v = newValues
   192  	}
   193  
   194  	return ClientV4Stats{
   195  		Null:               v[1],
   196  		Read:               v[2],
   197  		Write:              v[3],
   198  		Commit:             v[4],
   199  		Open:               v[5],
   200  		OpenConfirm:        v[6],
   201  		OpenNoattr:         v[7],
   202  		OpenDowngrade:      v[8],
   203  		Close:              v[9],
   204  		Setattr:            v[10],
   205  		FsInfo:             v[11],
   206  		Renew:              v[12],
   207  		SetClientID:        v[13],
   208  		SetClientIDConfirm: v[14],
   209  		Lock:               v[15],
   210  		Lockt:              v[16],
   211  		Locku:              v[17],
   212  		Access:             v[18],
   213  		Getattr:            v[19],
   214  		Lookup:             v[20],
   215  		LookupRoot:         v[21],
   216  		Remove:             v[22],
   217  		Rename:             v[23],
   218  		Link:               v[24],
   219  		Symlink:            v[25],
   220  		Create:             v[26],
   221  		Pathconf:           v[27],
   222  		StatFs:             v[28],
   223  		ReadLink:           v[29],
   224  		ReadDir:            v[30],
   225  		ServerCaps:         v[31],
   226  		DelegReturn:        v[32],
   227  		GetACL:             v[33],
   228  		SetACL:             v[34],
   229  		FsLocations:        v[35],
   230  		ReleaseLockowner:   v[36],
   231  		Secinfo:            v[37],
   232  		FsidPresent:        v[38],
   233  		ExchangeID:         v[39],
   234  		CreateSession:      v[40],
   235  		DestroySession:     v[41],
   236  		Sequence:           v[42],
   237  		GetLeaseTime:       v[43],
   238  		ReclaimComplete:    v[44],
   239  		LayoutGet:          v[45],
   240  		GetDeviceInfo:      v[46],
   241  		LayoutCommit:       v[47],
   242  		LayoutReturn:       v[48],
   243  		SecinfoNoName:      v[49],
   244  		TestStateID:        v[50],
   245  		FreeStateID:        v[51],
   246  		GetDeviceList:      v[52],
   247  		BindConnToSession:  v[53],
   248  		DestroyClientID:    v[54],
   249  		Seek:               v[55],
   250  		Allocate:           v[56],
   251  		DeAllocate:         v[57],
   252  		LayoutStats:        v[58],
   253  		Clone:              v[59],
   254  	}, nil
   255  }
   256  
   257  func parseServerV4Stats(v []uint64) (ServerV4Stats, error) {
   258  	values := int(v[0])
   259  	if len(v[1:]) != values || values != 2 {
   260  		return ServerV4Stats{}, fmt.Errorf("invalid V4Stats line %q", v)
   261  	}
   262  
   263  	return ServerV4Stats{
   264  		Null:     v[1],
   265  		Compound: v[2],
   266  	}, nil
   267  }
   268  
   269  func parseV4Ops(v []uint64) (V4Ops, error) {
   270  	values := int(v[0])
   271  	if len(v[1:]) != values || values < 39 {
   272  		return V4Ops{}, fmt.Errorf("invalid V4Ops line %q", v)
   273  	}
   274  
   275  	stats := V4Ops{
   276  		Op0Unused:    v[1],
   277  		Op1Unused:    v[2],
   278  		Op2Future:    v[3],
   279  		Access:       v[4],
   280  		Close:        v[5],
   281  		Commit:       v[6],
   282  		Create:       v[7],
   283  		DelegPurge:   v[8],
   284  		DelegReturn:  v[9],
   285  		GetAttr:      v[10],
   286  		GetFH:        v[11],
   287  		Link:         v[12],
   288  		Lock:         v[13],
   289  		Lockt:        v[14],
   290  		Locku:        v[15],
   291  		Lookup:       v[16],
   292  		LookupRoot:   v[17],
   293  		Nverify:      v[18],
   294  		Open:         v[19],
   295  		OpenAttr:     v[20],
   296  		OpenConfirm:  v[21],
   297  		OpenDgrd:     v[22],
   298  		PutFH:        v[23],
   299  		PutPubFH:     v[24],
   300  		PutRootFH:    v[25],
   301  		Read:         v[26],
   302  		ReadDir:      v[27],
   303  		ReadLink:     v[28],
   304  		Remove:       v[29],
   305  		Rename:       v[30],
   306  		Renew:        v[31],
   307  		RestoreFH:    v[32],
   308  		SaveFH:       v[33],
   309  		SecInfo:      v[34],
   310  		SetAttr:      v[35],
   311  		Verify:       v[36],
   312  		Write:        v[37],
   313  		RelLockOwner: v[38],
   314  	}
   315  
   316  	return stats, nil
   317  }