mirror of https://github.com/docker/cli.git
vendor: github.com/prometheus/procfs v0.9.0
full diff: https://github.com/prometheus/procfs/compare/v0.8.0...v0.9.0 Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
92906a9936
commit
bffe277c9b
|
@ -66,7 +66,7 @@ require (
|
||||||
github.com/prometheus/client_golang v1.14.0 // indirect
|
github.com/prometheus/client_golang v1.14.0 // indirect
|
||||||
github.com/prometheus/client_model v0.3.0 // indirect
|
github.com/prometheus/client_model v0.3.0 // indirect
|
||||||
github.com/prometheus/common v0.37.0 // indirect
|
github.com/prometheus/common v0.37.0 // indirect
|
||||||
github.com/prometheus/procfs v0.8.0 // indirect
|
github.com/prometheus/procfs v0.9.0 // indirect
|
||||||
github.com/rivo/uniseg v0.2.0 // indirect
|
github.com/rivo/uniseg v0.2.0 // indirect
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
|
|
|
@ -336,8 +336,8 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa
|
||||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
|
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
||||||
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
|
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
||||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
|
|
@ -55,19 +55,22 @@ ifneq ($(shell which gotestsum),)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
PROMU_VERSION ?= 0.13.0
|
PROMU_VERSION ?= 0.14.0
|
||||||
PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
|
PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz
|
||||||
|
|
||||||
|
SKIP_GOLANGCI_LINT :=
|
||||||
GOLANGCI_LINT :=
|
GOLANGCI_LINT :=
|
||||||
GOLANGCI_LINT_OPTS ?=
|
GOLANGCI_LINT_OPTS ?=
|
||||||
GOLANGCI_LINT_VERSION ?= v1.45.2
|
GOLANGCI_LINT_VERSION ?= v1.49.0
|
||||||
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64.
|
# golangci-lint only supports linux, darwin and windows platforms on i386/amd64.
|
||||||
# windows isn't included here because of the path separator being different.
|
# windows isn't included here because of the path separator being different.
|
||||||
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
|
ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin))
|
||||||
ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386))
|
ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386))
|
||||||
# If we're in CI and there is an Actions file, that means the linter
|
# If we're in CI and there is an Actions file, that means the linter
|
||||||
# is being run in Actions, so we don't need to run it here.
|
# is being run in Actions, so we don't need to run it here.
|
||||||
ifeq (,$(CIRCLE_JOB))
|
ifneq (,$(SKIP_GOLANGCI_LINT))
|
||||||
|
GOLANGCI_LINT :=
|
||||||
|
else ifeq (,$(CIRCLE_JOB))
|
||||||
GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
|
GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
|
||||||
else ifeq (,$(wildcard .github/workflows/golangci-lint.yml))
|
else ifeq (,$(wildcard .github/workflows/golangci-lint.yml))
|
||||||
GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
|
GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint
|
||||||
|
|
|
@ -380,6 +380,42 @@ func parseCPUInfoMips(info []byte) ([]CPUInfo, error) {
|
||||||
return cpuinfo, nil
|
return cpuinfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseCPUInfoLoong(info []byte) ([]CPUInfo, error) {
|
||||||
|
scanner := bufio.NewScanner(bytes.NewReader(info))
|
||||||
|
// find the first "processor" line
|
||||||
|
firstLine := firstNonEmptyLine(scanner)
|
||||||
|
if !strings.HasPrefix(firstLine, "system type") || !strings.Contains(firstLine, ":") {
|
||||||
|
return nil, errors.New("invalid cpuinfo file: " + firstLine)
|
||||||
|
}
|
||||||
|
field := strings.SplitN(firstLine, ": ", 2)
|
||||||
|
cpuinfo := []CPUInfo{}
|
||||||
|
systemType := field[1]
|
||||||
|
i := 0
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
if !strings.Contains(line, ":") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
field := strings.SplitN(line, ": ", 2)
|
||||||
|
switch strings.TrimSpace(field[0]) {
|
||||||
|
case "processor":
|
||||||
|
v, err := strconv.ParseUint(field[1], 0, 32)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
i = int(v)
|
||||||
|
cpuinfo = append(cpuinfo, CPUInfo{}) // start of the next processor
|
||||||
|
cpuinfo[i].Processor = uint(v)
|
||||||
|
cpuinfo[i].VendorID = systemType
|
||||||
|
case "CPU Family":
|
||||||
|
cpuinfo[i].CPUFamily = field[1]
|
||||||
|
case "Model Name":
|
||||||
|
cpuinfo[i].ModelName = field[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cpuinfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
func parseCPUInfoPPC(info []byte) ([]CPUInfo, error) {
|
func parseCPUInfoPPC(info []byte) ([]CPUInfo, error) {
|
||||||
scanner := bufio.NewScanner(bytes.NewReader(info))
|
scanner := bufio.NewScanner(bytes.NewReader(info))
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2022 The Prometheus Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
//go:build linux
|
||||||
|
// +build linux
|
||||||
|
|
||||||
|
package procfs
|
||||||
|
|
||||||
|
var parseCPUInfo = parseCPUInfoLoong
|
|
@ -11,8 +11,8 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
//go:build linux && !386 && !amd64 && !arm && !arm64 && !mips && !mips64 && !mips64le && !mipsle && !ppc64 && !ppc64le && !riscv64 && !s390x
|
//go:build linux && !386 && !amd64 && !arm && !arm64 && !loong64 && !mips && !mips64 && !mips64le && !mipsle && !ppc64 && !ppc64le && !riscv64 && !s390x
|
||||||
// +build linux,!386,!amd64,!arm,!arm64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x
|
// +build linux,!386,!amd64,!arm,!arm64,!loong64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x
|
||||||
|
|
||||||
package procfs
|
package procfs
|
||||||
|
|
||||||
|
|
|
@ -16,30 +16,29 @@
|
||||||
//
|
//
|
||||||
// Example:
|
// Example:
|
||||||
//
|
//
|
||||||
// package main
|
// package main
|
||||||
//
|
//
|
||||||
// import (
|
// import (
|
||||||
// "fmt"
|
// "fmt"
|
||||||
// "log"
|
// "log"
|
||||||
//
|
//
|
||||||
// "github.com/prometheus/procfs"
|
// "github.com/prometheus/procfs"
|
||||||
// )
|
// )
|
||||||
//
|
//
|
||||||
// func main() {
|
// func main() {
|
||||||
// p, err := procfs.Self()
|
// p, err := procfs.Self()
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// log.Fatalf("could not get process: %s", err)
|
// log.Fatalf("could not get process: %s", err)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// stat, err := p.Stat()
|
// stat, err := p.Stat()
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// log.Fatalf("could not get process stat: %s", err)
|
// log.Fatalf("could not get process stat: %s", err)
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// fmt.Printf("command: %s\n", stat.Comm)
|
|
||||||
// fmt.Printf("cpu time: %fs\n", stat.CPUTime())
|
|
||||||
// fmt.Printf("vsize: %dB\n", stat.VirtualMemory())
|
|
||||||
// fmt.Printf("rss: %dB\n", stat.ResidentMemory())
|
|
||||||
// }
|
|
||||||
//
|
//
|
||||||
|
// fmt.Printf("command: %s\n", stat.Comm)
|
||||||
|
// fmt.Printf("cpu time: %fs\n", stat.CPUTime())
|
||||||
|
// fmt.Printf("vsize: %dB\n", stat.VirtualMemory())
|
||||||
|
// fmt.Printf("rss: %dB\n", stat.ResidentMemory())
|
||||||
|
// }
|
||||||
package procfs
|
package procfs
|
||||||
|
|
|
@ -284,7 +284,8 @@ func parseMountStats(r io.Reader) ([]*Mount, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseMount parses an entry in /proc/[pid]/mountstats in the format:
|
// parseMount parses an entry in /proc/[pid]/mountstats in the format:
|
||||||
// device [device] mounted on [mount] with fstype [type]
|
//
|
||||||
|
// device [device] mounted on [mount] with fstype [type]
|
||||||
func parseMount(ss []string) (*Mount, error) {
|
func parseMount(ss []string) (*Mount, error) {
|
||||||
if len(ss) < deviceEntryLen {
|
if len(ss) < deviceEntryLen {
|
||||||
return nil, fmt.Errorf("invalid device entry: %v", ss)
|
return nil, fmt.Errorf("invalid device entry: %v", ss)
|
||||||
|
|
|
@ -27,8 +27,9 @@ import (
|
||||||
// For the proc file format details,
|
// For the proc file format details,
|
||||||
// See:
|
// See:
|
||||||
// * Linux 2.6.23 https://elixir.bootlin.com/linux/v2.6.23/source/net/core/dev.c#L2343
|
// * Linux 2.6.23 https://elixir.bootlin.com/linux/v2.6.23/source/net/core/dev.c#L2343
|
||||||
// * Linux 4.17 https://elixir.bootlin.com/linux/v4.17/source/net/core/net-procfs.c#L162
|
// * Linux 2.6.39 https://elixir.bootlin.com/linux/v2.6.39/source/net/core/dev.c#L4086
|
||||||
// and https://elixir.bootlin.com/linux/v4.17/source/include/linux/netdevice.h#L2810.
|
// * Linux 4.18 https://elixir.bootlin.com/linux/v4.18/source/net/core/net-procfs.c#L162
|
||||||
|
// * Linux 5.14 https://elixir.bootlin.com/linux/v5.14/source/net/core/net-procfs.c#L169
|
||||||
|
|
||||||
// SoftnetStat contains a single row of data from /proc/net/softnet_stat.
|
// SoftnetStat contains a single row of data from /proc/net/softnet_stat.
|
||||||
type SoftnetStat struct {
|
type SoftnetStat struct {
|
||||||
|
@ -38,6 +39,18 @@ type SoftnetStat struct {
|
||||||
Dropped uint32
|
Dropped uint32
|
||||||
// Number of times processing packets ran out of quota.
|
// Number of times processing packets ran out of quota.
|
||||||
TimeSqueezed uint32
|
TimeSqueezed uint32
|
||||||
|
// Number of collision occur while obtaining device lock while transmitting.
|
||||||
|
CPUCollision uint32
|
||||||
|
// Number of times cpu woken up received_rps.
|
||||||
|
ReceivedRps uint32
|
||||||
|
// number of times flow limit has been reached.
|
||||||
|
FlowLimitCount uint32
|
||||||
|
// Softnet backlog status.
|
||||||
|
SoftnetBacklogLen uint32
|
||||||
|
// CPU id owning this softnet_data.
|
||||||
|
Index uint32
|
||||||
|
// softnet_data's Width.
|
||||||
|
Width int
|
||||||
}
|
}
|
||||||
|
|
||||||
var softNetProcFile = "net/softnet_stat"
|
var softNetProcFile = "net/softnet_stat"
|
||||||
|
@ -66,22 +79,57 @@ func parseSoftnet(r io.Reader) ([]SoftnetStat, error) {
|
||||||
for s.Scan() {
|
for s.Scan() {
|
||||||
columns := strings.Fields(s.Text())
|
columns := strings.Fields(s.Text())
|
||||||
width := len(columns)
|
width := len(columns)
|
||||||
|
softnetStat := SoftnetStat{}
|
||||||
|
|
||||||
if width < minColumns {
|
if width < minColumns {
|
||||||
return nil, fmt.Errorf("%d columns were detected, but at least %d were expected", width, minColumns)
|
return nil, fmt.Errorf("%d columns were detected, but at least %d were expected", width, minColumns)
|
||||||
}
|
}
|
||||||
|
|
||||||
// We only parse the first three columns at the moment.
|
// Linux 2.6.23 https://elixir.bootlin.com/linux/v2.6.23/source/net/core/dev.c#L2347
|
||||||
us, err := parseHexUint32s(columns[0:3])
|
if width >= minColumns {
|
||||||
if err != nil {
|
us, err := parseHexUint32s(columns[0:9])
|
||||||
return nil, err
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
softnetStat.Processed = us[0]
|
||||||
|
softnetStat.Dropped = us[1]
|
||||||
|
softnetStat.TimeSqueezed = us[2]
|
||||||
|
softnetStat.CPUCollision = us[8]
|
||||||
}
|
}
|
||||||
|
|
||||||
stats = append(stats, SoftnetStat{
|
// Linux 2.6.39 https://elixir.bootlin.com/linux/v2.6.39/source/net/core/dev.c#L4086
|
||||||
Processed: us[0],
|
if width >= 10 {
|
||||||
Dropped: us[1],
|
us, err := parseHexUint32s(columns[9:10])
|
||||||
TimeSqueezed: us[2],
|
if err != nil {
|
||||||
})
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
softnetStat.ReceivedRps = us[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linux 4.18 https://elixir.bootlin.com/linux/v4.18/source/net/core/net-procfs.c#L162
|
||||||
|
if width >= 11 {
|
||||||
|
us, err := parseHexUint32s(columns[10:11])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
softnetStat.FlowLimitCount = us[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linux 5.14 https://elixir.bootlin.com/linux/v5.14/source/net/core/net-procfs.c#L169
|
||||||
|
if width >= 13 {
|
||||||
|
us, err := parseHexUint32s(columns[11:13])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
softnetStat.SoftnetBacklogLen = us[0]
|
||||||
|
softnetStat.Index = us[1]
|
||||||
|
}
|
||||||
|
softnetStat.Width = width
|
||||||
|
stats = append(stats, softnetStat)
|
||||||
}
|
}
|
||||||
|
|
||||||
return stats, nil
|
return stats, nil
|
||||||
|
|
|
@ -15,6 +15,7 @@ package procfs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -42,27 +43,43 @@ func (fs FS) NetStat() ([]NetStat, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
netStatFile := NetStat{
|
procNetstat, err := parseNetstat(file)
|
||||||
Filename: filepath.Base(filePath),
|
if err != nil {
|
||||||
Stats: make(map[string][]uint64),
|
return nil, err
|
||||||
}
|
}
|
||||||
scanner := bufio.NewScanner(file)
|
procNetstat.Filename = filepath.Base(filePath)
|
||||||
scanner.Scan()
|
|
||||||
// First string is always a header for stats
|
|
||||||
var headers []string
|
|
||||||
headers = append(headers, strings.Fields(scanner.Text())...)
|
|
||||||
|
|
||||||
// Other strings represent per-CPU counters
|
netStatsTotal = append(netStatsTotal, procNetstat)
|
||||||
for scanner.Scan() {
|
|
||||||
for num, counter := range strings.Fields(scanner.Text()) {
|
|
||||||
value, err := strconv.ParseUint(counter, 16, 64)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
netStatFile.Stats[headers[num]] = append(netStatFile.Stats[headers[num]], value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
netStatsTotal = append(netStatsTotal, netStatFile)
|
|
||||||
}
|
}
|
||||||
return netStatsTotal, nil
|
return netStatsTotal, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseNetstat parses the metrics from `/proc/net/stat/` file
|
||||||
|
// and returns a NetStat structure.
|
||||||
|
func parseNetstat(r io.Reader) (NetStat, error) {
|
||||||
|
var (
|
||||||
|
scanner = bufio.NewScanner(r)
|
||||||
|
netStat = NetStat{
|
||||||
|
Stats: make(map[string][]uint64),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
scanner.Scan()
|
||||||
|
|
||||||
|
// First string is always a header for stats
|
||||||
|
var headers []string
|
||||||
|
headers = append(headers, strings.Fields(scanner.Text())...)
|
||||||
|
|
||||||
|
// Other strings represent per-CPU counters
|
||||||
|
for scanner.Scan() {
|
||||||
|
for num, counter := range strings.Fields(scanner.Text()) {
|
||||||
|
value, err := strconv.ParseUint(counter, 16, 64)
|
||||||
|
if err != nil {
|
||||||
|
return NetStat{}, err
|
||||||
|
}
|
||||||
|
netStat.Stats[headers[num]] = append(netStat.Stats[headers[num]], value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return netStat, nil
|
||||||
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ import (
|
||||||
"github.com/prometheus/procfs/internal/util"
|
"github.com/prometheus/procfs/internal/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Cgroup models one line from /proc/[pid]/cgroup. Each Cgroup struct describes the the placement of a PID inside a
|
// Cgroup models one line from /proc/[pid]/cgroup. Each Cgroup struct describes the placement of a PID inside a
|
||||||
// specific control hierarchy. The kernel has two cgroup APIs, v1 and v2. v1 has one hierarchy per available resource
|
// specific control hierarchy. The kernel has two cgroup APIs, v1 and v2. v1 has one hierarchy per available resource
|
||||||
// controller, while v2 has one unified hierarchy shared by all controllers. Regardless of v1 or v2, all hierarchies
|
// controller, while v2 has one unified hierarchy shared by all controllers. Regardless of v1 or v2, all hierarchies
|
||||||
// contain all running processes, so the question answerable with a Cgroup struct is 'where is this process in
|
// contain all running processes, so the question answerable with a Cgroup struct is 'where is this process in
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
// Copyright 2022 The Prometheus Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package procfs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/prometheus/procfs/internal/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interrupt represents a single interrupt line.
|
||||||
|
type Interrupt struct {
|
||||||
|
// Info is the type of interrupt.
|
||||||
|
Info string
|
||||||
|
// Devices is the name of the device that is located at that IRQ
|
||||||
|
Devices string
|
||||||
|
// Values is the number of interrupts per CPU.
|
||||||
|
Values []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Interrupts models the content of /proc/interrupts. Key is the IRQ number.
|
||||||
|
// - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-interrupts
|
||||||
|
// - https://raspberrypi.stackexchange.com/questions/105802/explanation-of-proc-interrupts-output
|
||||||
|
type Interrupts map[string]Interrupt
|
||||||
|
|
||||||
|
// Interrupts creates a new instance from a given Proc instance.
|
||||||
|
func (p Proc) Interrupts() (Interrupts, error) {
|
||||||
|
data, err := util.ReadFileNoStat(p.path("interrupts"))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return parseInterrupts(bytes.NewReader(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInterrupts(r io.Reader) (Interrupts, error) {
|
||||||
|
var (
|
||||||
|
interrupts = Interrupts{}
|
||||||
|
scanner = bufio.NewScanner(r)
|
||||||
|
)
|
||||||
|
|
||||||
|
if !scanner.Scan() {
|
||||||
|
return nil, errors.New("interrupts empty")
|
||||||
|
}
|
||||||
|
cpuNum := len(strings.Fields(scanner.Text())) // one header per cpu
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
parts := strings.Fields(scanner.Text())
|
||||||
|
if len(parts) == 0 { // skip empty lines
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if len(parts) < 2 {
|
||||||
|
return nil, fmt.Errorf("not enough fields in interrupts (expected at least 2 fields but got %d): %s", len(parts), parts)
|
||||||
|
}
|
||||||
|
intName := parts[0][:len(parts[0])-1] // remove trailing :
|
||||||
|
|
||||||
|
if len(parts) == 2 {
|
||||||
|
interrupts[intName] = Interrupt{
|
||||||
|
Info: "",
|
||||||
|
Devices: "",
|
||||||
|
Values: []string{
|
||||||
|
parts[1],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
intr := Interrupt{
|
||||||
|
Values: parts[1 : cpuNum+1],
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := strconv.Atoi(intName); err == nil { // numeral interrupt
|
||||||
|
intr.Info = parts[cpuNum+1]
|
||||||
|
intr.Devices = strings.Join(parts[cpuNum+2:], " ")
|
||||||
|
} else {
|
||||||
|
intr.Info = strings.Join(parts[cpuNum+1:], " ")
|
||||||
|
}
|
||||||
|
interrupts[intName] = intr
|
||||||
|
}
|
||||||
|
|
||||||
|
return interrupts, scanner.Err()
|
||||||
|
}
|
|
@ -33,139 +33,140 @@ type ProcNetstat struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type TcpExt struct { // nolint:revive
|
type TcpExt struct { // nolint:revive
|
||||||
SyncookiesSent float64
|
SyncookiesSent *float64
|
||||||
SyncookiesRecv float64
|
SyncookiesRecv *float64
|
||||||
SyncookiesFailed float64
|
SyncookiesFailed *float64
|
||||||
EmbryonicRsts float64
|
EmbryonicRsts *float64
|
||||||
PruneCalled float64
|
PruneCalled *float64
|
||||||
RcvPruned float64
|
RcvPruned *float64
|
||||||
OfoPruned float64
|
OfoPruned *float64
|
||||||
OutOfWindowIcmps float64
|
OutOfWindowIcmps *float64
|
||||||
LockDroppedIcmps float64
|
LockDroppedIcmps *float64
|
||||||
ArpFilter float64
|
ArpFilter *float64
|
||||||
TW float64
|
TW *float64
|
||||||
TWRecycled float64
|
TWRecycled *float64
|
||||||
TWKilled float64
|
TWKilled *float64
|
||||||
PAWSActive float64
|
PAWSActive *float64
|
||||||
PAWSEstab float64
|
PAWSEstab *float64
|
||||||
DelayedACKs float64
|
DelayedACKs *float64
|
||||||
DelayedACKLocked float64
|
DelayedACKLocked *float64
|
||||||
DelayedACKLost float64
|
DelayedACKLost *float64
|
||||||
ListenOverflows float64
|
ListenOverflows *float64
|
||||||
ListenDrops float64
|
ListenDrops *float64
|
||||||
TCPHPHits float64
|
TCPHPHits *float64
|
||||||
TCPPureAcks float64
|
TCPPureAcks *float64
|
||||||
TCPHPAcks float64
|
TCPHPAcks *float64
|
||||||
TCPRenoRecovery float64
|
TCPRenoRecovery *float64
|
||||||
TCPSackRecovery float64
|
TCPSackRecovery *float64
|
||||||
TCPSACKReneging float64
|
TCPSACKReneging *float64
|
||||||
TCPSACKReorder float64
|
TCPSACKReorder *float64
|
||||||
TCPRenoReorder float64
|
TCPRenoReorder *float64
|
||||||
TCPTSReorder float64
|
TCPTSReorder *float64
|
||||||
TCPFullUndo float64
|
TCPFullUndo *float64
|
||||||
TCPPartialUndo float64
|
TCPPartialUndo *float64
|
||||||
TCPDSACKUndo float64
|
TCPDSACKUndo *float64
|
||||||
TCPLossUndo float64
|
TCPLossUndo *float64
|
||||||
TCPLostRetransmit float64
|
TCPLostRetransmit *float64
|
||||||
TCPRenoFailures float64
|
TCPRenoFailures *float64
|
||||||
TCPSackFailures float64
|
TCPSackFailures *float64
|
||||||
TCPLossFailures float64
|
TCPLossFailures *float64
|
||||||
TCPFastRetrans float64
|
TCPFastRetrans *float64
|
||||||
TCPSlowStartRetrans float64
|
TCPSlowStartRetrans *float64
|
||||||
TCPTimeouts float64
|
TCPTimeouts *float64
|
||||||
TCPLossProbes float64
|
TCPLossProbes *float64
|
||||||
TCPLossProbeRecovery float64
|
TCPLossProbeRecovery *float64
|
||||||
TCPRenoRecoveryFail float64
|
TCPRenoRecoveryFail *float64
|
||||||
TCPSackRecoveryFail float64
|
TCPSackRecoveryFail *float64
|
||||||
TCPRcvCollapsed float64
|
TCPRcvCollapsed *float64
|
||||||
TCPDSACKOldSent float64
|
TCPDSACKOldSent *float64
|
||||||
TCPDSACKOfoSent float64
|
TCPDSACKOfoSent *float64
|
||||||
TCPDSACKRecv float64
|
TCPDSACKRecv *float64
|
||||||
TCPDSACKOfoRecv float64
|
TCPDSACKOfoRecv *float64
|
||||||
TCPAbortOnData float64
|
TCPAbortOnData *float64
|
||||||
TCPAbortOnClose float64
|
TCPAbortOnClose *float64
|
||||||
TCPAbortOnMemory float64
|
TCPAbortOnMemory *float64
|
||||||
TCPAbortOnTimeout float64
|
TCPAbortOnTimeout *float64
|
||||||
TCPAbortOnLinger float64
|
TCPAbortOnLinger *float64
|
||||||
TCPAbortFailed float64
|
TCPAbortFailed *float64
|
||||||
TCPMemoryPressures float64
|
TCPMemoryPressures *float64
|
||||||
TCPMemoryPressuresChrono float64
|
TCPMemoryPressuresChrono *float64
|
||||||
TCPSACKDiscard float64
|
TCPSACKDiscard *float64
|
||||||
TCPDSACKIgnoredOld float64
|
TCPDSACKIgnoredOld *float64
|
||||||
TCPDSACKIgnoredNoUndo float64
|
TCPDSACKIgnoredNoUndo *float64
|
||||||
TCPSpuriousRTOs float64
|
TCPSpuriousRTOs *float64
|
||||||
TCPMD5NotFound float64
|
TCPMD5NotFound *float64
|
||||||
TCPMD5Unexpected float64
|
TCPMD5Unexpected *float64
|
||||||
TCPMD5Failure float64
|
TCPMD5Failure *float64
|
||||||
TCPSackShifted float64
|
TCPSackShifted *float64
|
||||||
TCPSackMerged float64
|
TCPSackMerged *float64
|
||||||
TCPSackShiftFallback float64
|
TCPSackShiftFallback *float64
|
||||||
TCPBacklogDrop float64
|
TCPBacklogDrop *float64
|
||||||
PFMemallocDrop float64
|
PFMemallocDrop *float64
|
||||||
TCPMinTTLDrop float64
|
TCPMinTTLDrop *float64
|
||||||
TCPDeferAcceptDrop float64
|
TCPDeferAcceptDrop *float64
|
||||||
IPReversePathFilter float64
|
IPReversePathFilter *float64
|
||||||
TCPTimeWaitOverflow float64
|
TCPTimeWaitOverflow *float64
|
||||||
TCPReqQFullDoCookies float64
|
TCPReqQFullDoCookies *float64
|
||||||
TCPReqQFullDrop float64
|
TCPReqQFullDrop *float64
|
||||||
TCPRetransFail float64
|
TCPRetransFail *float64
|
||||||
TCPRcvCoalesce float64
|
TCPRcvCoalesce *float64
|
||||||
TCPOFOQueue float64
|
TCPRcvQDrop *float64
|
||||||
TCPOFODrop float64
|
TCPOFOQueue *float64
|
||||||
TCPOFOMerge float64
|
TCPOFODrop *float64
|
||||||
TCPChallengeACK float64
|
TCPOFOMerge *float64
|
||||||
TCPSYNChallenge float64
|
TCPChallengeACK *float64
|
||||||
TCPFastOpenActive float64
|
TCPSYNChallenge *float64
|
||||||
TCPFastOpenActiveFail float64
|
TCPFastOpenActive *float64
|
||||||
TCPFastOpenPassive float64
|
TCPFastOpenActiveFail *float64
|
||||||
TCPFastOpenPassiveFail float64
|
TCPFastOpenPassive *float64
|
||||||
TCPFastOpenListenOverflow float64
|
TCPFastOpenPassiveFail *float64
|
||||||
TCPFastOpenCookieReqd float64
|
TCPFastOpenListenOverflow *float64
|
||||||
TCPFastOpenBlackhole float64
|
TCPFastOpenCookieReqd *float64
|
||||||
TCPSpuriousRtxHostQueues float64
|
TCPFastOpenBlackhole *float64
|
||||||
BusyPollRxPackets float64
|
TCPSpuriousRtxHostQueues *float64
|
||||||
TCPAutoCorking float64
|
BusyPollRxPackets *float64
|
||||||
TCPFromZeroWindowAdv float64
|
TCPAutoCorking *float64
|
||||||
TCPToZeroWindowAdv float64
|
TCPFromZeroWindowAdv *float64
|
||||||
TCPWantZeroWindowAdv float64
|
TCPToZeroWindowAdv *float64
|
||||||
TCPSynRetrans float64
|
TCPWantZeroWindowAdv *float64
|
||||||
TCPOrigDataSent float64
|
TCPSynRetrans *float64
|
||||||
TCPHystartTrainDetect float64
|
TCPOrigDataSent *float64
|
||||||
TCPHystartTrainCwnd float64
|
TCPHystartTrainDetect *float64
|
||||||
TCPHystartDelayDetect float64
|
TCPHystartTrainCwnd *float64
|
||||||
TCPHystartDelayCwnd float64
|
TCPHystartDelayDetect *float64
|
||||||
TCPACKSkippedSynRecv float64
|
TCPHystartDelayCwnd *float64
|
||||||
TCPACKSkippedPAWS float64
|
TCPACKSkippedSynRecv *float64
|
||||||
TCPACKSkippedSeq float64
|
TCPACKSkippedPAWS *float64
|
||||||
TCPACKSkippedFinWait2 float64
|
TCPACKSkippedSeq *float64
|
||||||
TCPACKSkippedTimeWait float64
|
TCPACKSkippedFinWait2 *float64
|
||||||
TCPACKSkippedChallenge float64
|
TCPACKSkippedTimeWait *float64
|
||||||
TCPWinProbe float64
|
TCPACKSkippedChallenge *float64
|
||||||
TCPKeepAlive float64
|
TCPWinProbe *float64
|
||||||
TCPMTUPFail float64
|
TCPKeepAlive *float64
|
||||||
TCPMTUPSuccess float64
|
TCPMTUPFail *float64
|
||||||
TCPWqueueTooBig float64
|
TCPMTUPSuccess *float64
|
||||||
|
TCPWqueueTooBig *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type IpExt struct { // nolint:revive
|
type IpExt struct { // nolint:revive
|
||||||
InNoRoutes float64
|
InNoRoutes *float64
|
||||||
InTruncatedPkts float64
|
InTruncatedPkts *float64
|
||||||
InMcastPkts float64
|
InMcastPkts *float64
|
||||||
OutMcastPkts float64
|
OutMcastPkts *float64
|
||||||
InBcastPkts float64
|
InBcastPkts *float64
|
||||||
OutBcastPkts float64
|
OutBcastPkts *float64
|
||||||
InOctets float64
|
InOctets *float64
|
||||||
OutOctets float64
|
OutOctets *float64
|
||||||
InMcastOctets float64
|
InMcastOctets *float64
|
||||||
OutMcastOctets float64
|
OutMcastOctets *float64
|
||||||
InBcastOctets float64
|
InBcastOctets *float64
|
||||||
OutBcastOctets float64
|
OutBcastOctets *float64
|
||||||
InCsumErrors float64
|
InCsumErrors *float64
|
||||||
InNoECTPkts float64
|
InNoECTPkts *float64
|
||||||
InECT1Pkts float64
|
InECT1Pkts *float64
|
||||||
InECT0Pkts float64
|
InECT0Pkts *float64
|
||||||
InCEPkts float64
|
InCEPkts *float64
|
||||||
ReasmOverlaps float64
|
ReasmOverlaps *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Proc) Netstat() (ProcNetstat, error) {
|
func (p Proc) Netstat() (ProcNetstat, error) {
|
||||||
|
@ -174,14 +175,14 @@ func (p Proc) Netstat() (ProcNetstat, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ProcNetstat{PID: p.PID}, err
|
return ProcNetstat{PID: p.PID}, err
|
||||||
}
|
}
|
||||||
procNetstat, err := parseNetstat(bytes.NewReader(data), filename)
|
procNetstat, err := parseProcNetstat(bytes.NewReader(data), filename)
|
||||||
procNetstat.PID = p.PID
|
procNetstat.PID = p.PID
|
||||||
return procNetstat, err
|
return procNetstat, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseNetstat parses the metrics from proc/<pid>/net/netstat file
|
// parseProcNetstat parses the metrics from proc/<pid>/net/netstat file
|
||||||
// and returns a ProcNetstat structure.
|
// and returns a ProcNetstat structure.
|
||||||
func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) {
|
func parseProcNetstat(r io.Reader, fileName string) (ProcNetstat, error) {
|
||||||
var (
|
var (
|
||||||
scanner = bufio.NewScanner(r)
|
scanner = bufio.NewScanner(r)
|
||||||
procNetstat = ProcNetstat{}
|
procNetstat = ProcNetstat{}
|
||||||
|
@ -208,230 +209,232 @@ func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) {
|
||||||
case "TcpExt":
|
case "TcpExt":
|
||||||
switch key {
|
switch key {
|
||||||
case "SyncookiesSent":
|
case "SyncookiesSent":
|
||||||
procNetstat.TcpExt.SyncookiesSent = value
|
procNetstat.TcpExt.SyncookiesSent = &value
|
||||||
case "SyncookiesRecv":
|
case "SyncookiesRecv":
|
||||||
procNetstat.TcpExt.SyncookiesRecv = value
|
procNetstat.TcpExt.SyncookiesRecv = &value
|
||||||
case "SyncookiesFailed":
|
case "SyncookiesFailed":
|
||||||
procNetstat.TcpExt.SyncookiesFailed = value
|
procNetstat.TcpExt.SyncookiesFailed = &value
|
||||||
case "EmbryonicRsts":
|
case "EmbryonicRsts":
|
||||||
procNetstat.TcpExt.EmbryonicRsts = value
|
procNetstat.TcpExt.EmbryonicRsts = &value
|
||||||
case "PruneCalled":
|
case "PruneCalled":
|
||||||
procNetstat.TcpExt.PruneCalled = value
|
procNetstat.TcpExt.PruneCalled = &value
|
||||||
case "RcvPruned":
|
case "RcvPruned":
|
||||||
procNetstat.TcpExt.RcvPruned = value
|
procNetstat.TcpExt.RcvPruned = &value
|
||||||
case "OfoPruned":
|
case "OfoPruned":
|
||||||
procNetstat.TcpExt.OfoPruned = value
|
procNetstat.TcpExt.OfoPruned = &value
|
||||||
case "OutOfWindowIcmps":
|
case "OutOfWindowIcmps":
|
||||||
procNetstat.TcpExt.OutOfWindowIcmps = value
|
procNetstat.TcpExt.OutOfWindowIcmps = &value
|
||||||
case "LockDroppedIcmps":
|
case "LockDroppedIcmps":
|
||||||
procNetstat.TcpExt.LockDroppedIcmps = value
|
procNetstat.TcpExt.LockDroppedIcmps = &value
|
||||||
case "ArpFilter":
|
case "ArpFilter":
|
||||||
procNetstat.TcpExt.ArpFilter = value
|
procNetstat.TcpExt.ArpFilter = &value
|
||||||
case "TW":
|
case "TW":
|
||||||
procNetstat.TcpExt.TW = value
|
procNetstat.TcpExt.TW = &value
|
||||||
case "TWRecycled":
|
case "TWRecycled":
|
||||||
procNetstat.TcpExt.TWRecycled = value
|
procNetstat.TcpExt.TWRecycled = &value
|
||||||
case "TWKilled":
|
case "TWKilled":
|
||||||
procNetstat.TcpExt.TWKilled = value
|
procNetstat.TcpExt.TWKilled = &value
|
||||||
case "PAWSActive":
|
case "PAWSActive":
|
||||||
procNetstat.TcpExt.PAWSActive = value
|
procNetstat.TcpExt.PAWSActive = &value
|
||||||
case "PAWSEstab":
|
case "PAWSEstab":
|
||||||
procNetstat.TcpExt.PAWSEstab = value
|
procNetstat.TcpExt.PAWSEstab = &value
|
||||||
case "DelayedACKs":
|
case "DelayedACKs":
|
||||||
procNetstat.TcpExt.DelayedACKs = value
|
procNetstat.TcpExt.DelayedACKs = &value
|
||||||
case "DelayedACKLocked":
|
case "DelayedACKLocked":
|
||||||
procNetstat.TcpExt.DelayedACKLocked = value
|
procNetstat.TcpExt.DelayedACKLocked = &value
|
||||||
case "DelayedACKLost":
|
case "DelayedACKLost":
|
||||||
procNetstat.TcpExt.DelayedACKLost = value
|
procNetstat.TcpExt.DelayedACKLost = &value
|
||||||
case "ListenOverflows":
|
case "ListenOverflows":
|
||||||
procNetstat.TcpExt.ListenOverflows = value
|
procNetstat.TcpExt.ListenOverflows = &value
|
||||||
case "ListenDrops":
|
case "ListenDrops":
|
||||||
procNetstat.TcpExt.ListenDrops = value
|
procNetstat.TcpExt.ListenDrops = &value
|
||||||
case "TCPHPHits":
|
case "TCPHPHits":
|
||||||
procNetstat.TcpExt.TCPHPHits = value
|
procNetstat.TcpExt.TCPHPHits = &value
|
||||||
case "TCPPureAcks":
|
case "TCPPureAcks":
|
||||||
procNetstat.TcpExt.TCPPureAcks = value
|
procNetstat.TcpExt.TCPPureAcks = &value
|
||||||
case "TCPHPAcks":
|
case "TCPHPAcks":
|
||||||
procNetstat.TcpExt.TCPHPAcks = value
|
procNetstat.TcpExt.TCPHPAcks = &value
|
||||||
case "TCPRenoRecovery":
|
case "TCPRenoRecovery":
|
||||||
procNetstat.TcpExt.TCPRenoRecovery = value
|
procNetstat.TcpExt.TCPRenoRecovery = &value
|
||||||
case "TCPSackRecovery":
|
case "TCPSackRecovery":
|
||||||
procNetstat.TcpExt.TCPSackRecovery = value
|
procNetstat.TcpExt.TCPSackRecovery = &value
|
||||||
case "TCPSACKReneging":
|
case "TCPSACKReneging":
|
||||||
procNetstat.TcpExt.TCPSACKReneging = value
|
procNetstat.TcpExt.TCPSACKReneging = &value
|
||||||
case "TCPSACKReorder":
|
case "TCPSACKReorder":
|
||||||
procNetstat.TcpExt.TCPSACKReorder = value
|
procNetstat.TcpExt.TCPSACKReorder = &value
|
||||||
case "TCPRenoReorder":
|
case "TCPRenoReorder":
|
||||||
procNetstat.TcpExt.TCPRenoReorder = value
|
procNetstat.TcpExt.TCPRenoReorder = &value
|
||||||
case "TCPTSReorder":
|
case "TCPTSReorder":
|
||||||
procNetstat.TcpExt.TCPTSReorder = value
|
procNetstat.TcpExt.TCPTSReorder = &value
|
||||||
case "TCPFullUndo":
|
case "TCPFullUndo":
|
||||||
procNetstat.TcpExt.TCPFullUndo = value
|
procNetstat.TcpExt.TCPFullUndo = &value
|
||||||
case "TCPPartialUndo":
|
case "TCPPartialUndo":
|
||||||
procNetstat.TcpExt.TCPPartialUndo = value
|
procNetstat.TcpExt.TCPPartialUndo = &value
|
||||||
case "TCPDSACKUndo":
|
case "TCPDSACKUndo":
|
||||||
procNetstat.TcpExt.TCPDSACKUndo = value
|
procNetstat.TcpExt.TCPDSACKUndo = &value
|
||||||
case "TCPLossUndo":
|
case "TCPLossUndo":
|
||||||
procNetstat.TcpExt.TCPLossUndo = value
|
procNetstat.TcpExt.TCPLossUndo = &value
|
||||||
case "TCPLostRetransmit":
|
case "TCPLostRetransmit":
|
||||||
procNetstat.TcpExt.TCPLostRetransmit = value
|
procNetstat.TcpExt.TCPLostRetransmit = &value
|
||||||
case "TCPRenoFailures":
|
case "TCPRenoFailures":
|
||||||
procNetstat.TcpExt.TCPRenoFailures = value
|
procNetstat.TcpExt.TCPRenoFailures = &value
|
||||||
case "TCPSackFailures":
|
case "TCPSackFailures":
|
||||||
procNetstat.TcpExt.TCPSackFailures = value
|
procNetstat.TcpExt.TCPSackFailures = &value
|
||||||
case "TCPLossFailures":
|
case "TCPLossFailures":
|
||||||
procNetstat.TcpExt.TCPLossFailures = value
|
procNetstat.TcpExt.TCPLossFailures = &value
|
||||||
case "TCPFastRetrans":
|
case "TCPFastRetrans":
|
||||||
procNetstat.TcpExt.TCPFastRetrans = value
|
procNetstat.TcpExt.TCPFastRetrans = &value
|
||||||
case "TCPSlowStartRetrans":
|
case "TCPSlowStartRetrans":
|
||||||
procNetstat.TcpExt.TCPSlowStartRetrans = value
|
procNetstat.TcpExt.TCPSlowStartRetrans = &value
|
||||||
case "TCPTimeouts":
|
case "TCPTimeouts":
|
||||||
procNetstat.TcpExt.TCPTimeouts = value
|
procNetstat.TcpExt.TCPTimeouts = &value
|
||||||
case "TCPLossProbes":
|
case "TCPLossProbes":
|
||||||
procNetstat.TcpExt.TCPLossProbes = value
|
procNetstat.TcpExt.TCPLossProbes = &value
|
||||||
case "TCPLossProbeRecovery":
|
case "TCPLossProbeRecovery":
|
||||||
procNetstat.TcpExt.TCPLossProbeRecovery = value
|
procNetstat.TcpExt.TCPLossProbeRecovery = &value
|
||||||
case "TCPRenoRecoveryFail":
|
case "TCPRenoRecoveryFail":
|
||||||
procNetstat.TcpExt.TCPRenoRecoveryFail = value
|
procNetstat.TcpExt.TCPRenoRecoveryFail = &value
|
||||||
case "TCPSackRecoveryFail":
|
case "TCPSackRecoveryFail":
|
||||||
procNetstat.TcpExt.TCPSackRecoveryFail = value
|
procNetstat.TcpExt.TCPSackRecoveryFail = &value
|
||||||
case "TCPRcvCollapsed":
|
case "TCPRcvCollapsed":
|
||||||
procNetstat.TcpExt.TCPRcvCollapsed = value
|
procNetstat.TcpExt.TCPRcvCollapsed = &value
|
||||||
case "TCPDSACKOldSent":
|
case "TCPDSACKOldSent":
|
||||||
procNetstat.TcpExt.TCPDSACKOldSent = value
|
procNetstat.TcpExt.TCPDSACKOldSent = &value
|
||||||
case "TCPDSACKOfoSent":
|
case "TCPDSACKOfoSent":
|
||||||
procNetstat.TcpExt.TCPDSACKOfoSent = value
|
procNetstat.TcpExt.TCPDSACKOfoSent = &value
|
||||||
case "TCPDSACKRecv":
|
case "TCPDSACKRecv":
|
||||||
procNetstat.TcpExt.TCPDSACKRecv = value
|
procNetstat.TcpExt.TCPDSACKRecv = &value
|
||||||
case "TCPDSACKOfoRecv":
|
case "TCPDSACKOfoRecv":
|
||||||
procNetstat.TcpExt.TCPDSACKOfoRecv = value
|
procNetstat.TcpExt.TCPDSACKOfoRecv = &value
|
||||||
case "TCPAbortOnData":
|
case "TCPAbortOnData":
|
||||||
procNetstat.TcpExt.TCPAbortOnData = value
|
procNetstat.TcpExt.TCPAbortOnData = &value
|
||||||
case "TCPAbortOnClose":
|
case "TCPAbortOnClose":
|
||||||
procNetstat.TcpExt.TCPAbortOnClose = value
|
procNetstat.TcpExt.TCPAbortOnClose = &value
|
||||||
case "TCPDeferAcceptDrop":
|
case "TCPDeferAcceptDrop":
|
||||||
procNetstat.TcpExt.TCPDeferAcceptDrop = value
|
procNetstat.TcpExt.TCPDeferAcceptDrop = &value
|
||||||
case "IPReversePathFilter":
|
case "IPReversePathFilter":
|
||||||
procNetstat.TcpExt.IPReversePathFilter = value
|
procNetstat.TcpExt.IPReversePathFilter = &value
|
||||||
case "TCPTimeWaitOverflow":
|
case "TCPTimeWaitOverflow":
|
||||||
procNetstat.TcpExt.TCPTimeWaitOverflow = value
|
procNetstat.TcpExt.TCPTimeWaitOverflow = &value
|
||||||
case "TCPReqQFullDoCookies":
|
case "TCPReqQFullDoCookies":
|
||||||
procNetstat.TcpExt.TCPReqQFullDoCookies = value
|
procNetstat.TcpExt.TCPReqQFullDoCookies = &value
|
||||||
case "TCPReqQFullDrop":
|
case "TCPReqQFullDrop":
|
||||||
procNetstat.TcpExt.TCPReqQFullDrop = value
|
procNetstat.TcpExt.TCPReqQFullDrop = &value
|
||||||
case "TCPRetransFail":
|
case "TCPRetransFail":
|
||||||
procNetstat.TcpExt.TCPRetransFail = value
|
procNetstat.TcpExt.TCPRetransFail = &value
|
||||||
case "TCPRcvCoalesce":
|
case "TCPRcvCoalesce":
|
||||||
procNetstat.TcpExt.TCPRcvCoalesce = value
|
procNetstat.TcpExt.TCPRcvCoalesce = &value
|
||||||
|
case "TCPRcvQDrop":
|
||||||
|
procNetstat.TcpExt.TCPRcvQDrop = &value
|
||||||
case "TCPOFOQueue":
|
case "TCPOFOQueue":
|
||||||
procNetstat.TcpExt.TCPOFOQueue = value
|
procNetstat.TcpExt.TCPOFOQueue = &value
|
||||||
case "TCPOFODrop":
|
case "TCPOFODrop":
|
||||||
procNetstat.TcpExt.TCPOFODrop = value
|
procNetstat.TcpExt.TCPOFODrop = &value
|
||||||
case "TCPOFOMerge":
|
case "TCPOFOMerge":
|
||||||
procNetstat.TcpExt.TCPOFOMerge = value
|
procNetstat.TcpExt.TCPOFOMerge = &value
|
||||||
case "TCPChallengeACK":
|
case "TCPChallengeACK":
|
||||||
procNetstat.TcpExt.TCPChallengeACK = value
|
procNetstat.TcpExt.TCPChallengeACK = &value
|
||||||
case "TCPSYNChallenge":
|
case "TCPSYNChallenge":
|
||||||
procNetstat.TcpExt.TCPSYNChallenge = value
|
procNetstat.TcpExt.TCPSYNChallenge = &value
|
||||||
case "TCPFastOpenActive":
|
case "TCPFastOpenActive":
|
||||||
procNetstat.TcpExt.TCPFastOpenActive = value
|
procNetstat.TcpExt.TCPFastOpenActive = &value
|
||||||
case "TCPFastOpenActiveFail":
|
case "TCPFastOpenActiveFail":
|
||||||
procNetstat.TcpExt.TCPFastOpenActiveFail = value
|
procNetstat.TcpExt.TCPFastOpenActiveFail = &value
|
||||||
case "TCPFastOpenPassive":
|
case "TCPFastOpenPassive":
|
||||||
procNetstat.TcpExt.TCPFastOpenPassive = value
|
procNetstat.TcpExt.TCPFastOpenPassive = &value
|
||||||
case "TCPFastOpenPassiveFail":
|
case "TCPFastOpenPassiveFail":
|
||||||
procNetstat.TcpExt.TCPFastOpenPassiveFail = value
|
procNetstat.TcpExt.TCPFastOpenPassiveFail = &value
|
||||||
case "TCPFastOpenListenOverflow":
|
case "TCPFastOpenListenOverflow":
|
||||||
procNetstat.TcpExt.TCPFastOpenListenOverflow = value
|
procNetstat.TcpExt.TCPFastOpenListenOverflow = &value
|
||||||
case "TCPFastOpenCookieReqd":
|
case "TCPFastOpenCookieReqd":
|
||||||
procNetstat.TcpExt.TCPFastOpenCookieReqd = value
|
procNetstat.TcpExt.TCPFastOpenCookieReqd = &value
|
||||||
case "TCPFastOpenBlackhole":
|
case "TCPFastOpenBlackhole":
|
||||||
procNetstat.TcpExt.TCPFastOpenBlackhole = value
|
procNetstat.TcpExt.TCPFastOpenBlackhole = &value
|
||||||
case "TCPSpuriousRtxHostQueues":
|
case "TCPSpuriousRtxHostQueues":
|
||||||
procNetstat.TcpExt.TCPSpuriousRtxHostQueues = value
|
procNetstat.TcpExt.TCPSpuriousRtxHostQueues = &value
|
||||||
case "BusyPollRxPackets":
|
case "BusyPollRxPackets":
|
||||||
procNetstat.TcpExt.BusyPollRxPackets = value
|
procNetstat.TcpExt.BusyPollRxPackets = &value
|
||||||
case "TCPAutoCorking":
|
case "TCPAutoCorking":
|
||||||
procNetstat.TcpExt.TCPAutoCorking = value
|
procNetstat.TcpExt.TCPAutoCorking = &value
|
||||||
case "TCPFromZeroWindowAdv":
|
case "TCPFromZeroWindowAdv":
|
||||||
procNetstat.TcpExt.TCPFromZeroWindowAdv = value
|
procNetstat.TcpExt.TCPFromZeroWindowAdv = &value
|
||||||
case "TCPToZeroWindowAdv":
|
case "TCPToZeroWindowAdv":
|
||||||
procNetstat.TcpExt.TCPToZeroWindowAdv = value
|
procNetstat.TcpExt.TCPToZeroWindowAdv = &value
|
||||||
case "TCPWantZeroWindowAdv":
|
case "TCPWantZeroWindowAdv":
|
||||||
procNetstat.TcpExt.TCPWantZeroWindowAdv = value
|
procNetstat.TcpExt.TCPWantZeroWindowAdv = &value
|
||||||
case "TCPSynRetrans":
|
case "TCPSynRetrans":
|
||||||
procNetstat.TcpExt.TCPSynRetrans = value
|
procNetstat.TcpExt.TCPSynRetrans = &value
|
||||||
case "TCPOrigDataSent":
|
case "TCPOrigDataSent":
|
||||||
procNetstat.TcpExt.TCPOrigDataSent = value
|
procNetstat.TcpExt.TCPOrigDataSent = &value
|
||||||
case "TCPHystartTrainDetect":
|
case "TCPHystartTrainDetect":
|
||||||
procNetstat.TcpExt.TCPHystartTrainDetect = value
|
procNetstat.TcpExt.TCPHystartTrainDetect = &value
|
||||||
case "TCPHystartTrainCwnd":
|
case "TCPHystartTrainCwnd":
|
||||||
procNetstat.TcpExt.TCPHystartTrainCwnd = value
|
procNetstat.TcpExt.TCPHystartTrainCwnd = &value
|
||||||
case "TCPHystartDelayDetect":
|
case "TCPHystartDelayDetect":
|
||||||
procNetstat.TcpExt.TCPHystartDelayDetect = value
|
procNetstat.TcpExt.TCPHystartDelayDetect = &value
|
||||||
case "TCPHystartDelayCwnd":
|
case "TCPHystartDelayCwnd":
|
||||||
procNetstat.TcpExt.TCPHystartDelayCwnd = value
|
procNetstat.TcpExt.TCPHystartDelayCwnd = &value
|
||||||
case "TCPACKSkippedSynRecv":
|
case "TCPACKSkippedSynRecv":
|
||||||
procNetstat.TcpExt.TCPACKSkippedSynRecv = value
|
procNetstat.TcpExt.TCPACKSkippedSynRecv = &value
|
||||||
case "TCPACKSkippedPAWS":
|
case "TCPACKSkippedPAWS":
|
||||||
procNetstat.TcpExt.TCPACKSkippedPAWS = value
|
procNetstat.TcpExt.TCPACKSkippedPAWS = &value
|
||||||
case "TCPACKSkippedSeq":
|
case "TCPACKSkippedSeq":
|
||||||
procNetstat.TcpExt.TCPACKSkippedSeq = value
|
procNetstat.TcpExt.TCPACKSkippedSeq = &value
|
||||||
case "TCPACKSkippedFinWait2":
|
case "TCPACKSkippedFinWait2":
|
||||||
procNetstat.TcpExt.TCPACKSkippedFinWait2 = value
|
procNetstat.TcpExt.TCPACKSkippedFinWait2 = &value
|
||||||
case "TCPACKSkippedTimeWait":
|
case "TCPACKSkippedTimeWait":
|
||||||
procNetstat.TcpExt.TCPACKSkippedTimeWait = value
|
procNetstat.TcpExt.TCPACKSkippedTimeWait = &value
|
||||||
case "TCPACKSkippedChallenge":
|
case "TCPACKSkippedChallenge":
|
||||||
procNetstat.TcpExt.TCPACKSkippedChallenge = value
|
procNetstat.TcpExt.TCPACKSkippedChallenge = &value
|
||||||
case "TCPWinProbe":
|
case "TCPWinProbe":
|
||||||
procNetstat.TcpExt.TCPWinProbe = value
|
procNetstat.TcpExt.TCPWinProbe = &value
|
||||||
case "TCPKeepAlive":
|
case "TCPKeepAlive":
|
||||||
procNetstat.TcpExt.TCPKeepAlive = value
|
procNetstat.TcpExt.TCPKeepAlive = &value
|
||||||
case "TCPMTUPFail":
|
case "TCPMTUPFail":
|
||||||
procNetstat.TcpExt.TCPMTUPFail = value
|
procNetstat.TcpExt.TCPMTUPFail = &value
|
||||||
case "TCPMTUPSuccess":
|
case "TCPMTUPSuccess":
|
||||||
procNetstat.TcpExt.TCPMTUPSuccess = value
|
procNetstat.TcpExt.TCPMTUPSuccess = &value
|
||||||
case "TCPWqueueTooBig":
|
case "TCPWqueueTooBig":
|
||||||
procNetstat.TcpExt.TCPWqueueTooBig = value
|
procNetstat.TcpExt.TCPWqueueTooBig = &value
|
||||||
}
|
}
|
||||||
case "IpExt":
|
case "IpExt":
|
||||||
switch key {
|
switch key {
|
||||||
case "InNoRoutes":
|
case "InNoRoutes":
|
||||||
procNetstat.IpExt.InNoRoutes = value
|
procNetstat.IpExt.InNoRoutes = &value
|
||||||
case "InTruncatedPkts":
|
case "InTruncatedPkts":
|
||||||
procNetstat.IpExt.InTruncatedPkts = value
|
procNetstat.IpExt.InTruncatedPkts = &value
|
||||||
case "InMcastPkts":
|
case "InMcastPkts":
|
||||||
procNetstat.IpExt.InMcastPkts = value
|
procNetstat.IpExt.InMcastPkts = &value
|
||||||
case "OutMcastPkts":
|
case "OutMcastPkts":
|
||||||
procNetstat.IpExt.OutMcastPkts = value
|
procNetstat.IpExt.OutMcastPkts = &value
|
||||||
case "InBcastPkts":
|
case "InBcastPkts":
|
||||||
procNetstat.IpExt.InBcastPkts = value
|
procNetstat.IpExt.InBcastPkts = &value
|
||||||
case "OutBcastPkts":
|
case "OutBcastPkts":
|
||||||
procNetstat.IpExt.OutBcastPkts = value
|
procNetstat.IpExt.OutBcastPkts = &value
|
||||||
case "InOctets":
|
case "InOctets":
|
||||||
procNetstat.IpExt.InOctets = value
|
procNetstat.IpExt.InOctets = &value
|
||||||
case "OutOctets":
|
case "OutOctets":
|
||||||
procNetstat.IpExt.OutOctets = value
|
procNetstat.IpExt.OutOctets = &value
|
||||||
case "InMcastOctets":
|
case "InMcastOctets":
|
||||||
procNetstat.IpExt.InMcastOctets = value
|
procNetstat.IpExt.InMcastOctets = &value
|
||||||
case "OutMcastOctets":
|
case "OutMcastOctets":
|
||||||
procNetstat.IpExt.OutMcastOctets = value
|
procNetstat.IpExt.OutMcastOctets = &value
|
||||||
case "InBcastOctets":
|
case "InBcastOctets":
|
||||||
procNetstat.IpExt.InBcastOctets = value
|
procNetstat.IpExt.InBcastOctets = &value
|
||||||
case "OutBcastOctets":
|
case "OutBcastOctets":
|
||||||
procNetstat.IpExt.OutBcastOctets = value
|
procNetstat.IpExt.OutBcastOctets = &value
|
||||||
case "InCsumErrors":
|
case "InCsumErrors":
|
||||||
procNetstat.IpExt.InCsumErrors = value
|
procNetstat.IpExt.InCsumErrors = &value
|
||||||
case "InNoECTPkts":
|
case "InNoECTPkts":
|
||||||
procNetstat.IpExt.InNoECTPkts = value
|
procNetstat.IpExt.InNoECTPkts = &value
|
||||||
case "InECT1Pkts":
|
case "InECT1Pkts":
|
||||||
procNetstat.IpExt.InECT1Pkts = value
|
procNetstat.IpExt.InECT1Pkts = &value
|
||||||
case "InECT0Pkts":
|
case "InECT0Pkts":
|
||||||
procNetstat.IpExt.InECT0Pkts = value
|
procNetstat.IpExt.InECT0Pkts = &value
|
||||||
case "InCEPkts":
|
case "InCEPkts":
|
||||||
procNetstat.IpExt.InCEPkts = value
|
procNetstat.IpExt.InCEPkts = &value
|
||||||
case "ReasmOverlaps":
|
case "ReasmOverlaps":
|
||||||
procNetstat.IpExt.ReasmOverlaps = value
|
procNetstat.IpExt.ReasmOverlaps = &value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,100 +37,100 @@ type ProcSnmp struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Ip struct { // nolint:revive
|
type Ip struct { // nolint:revive
|
||||||
Forwarding float64
|
Forwarding *float64
|
||||||
DefaultTTL float64
|
DefaultTTL *float64
|
||||||
InReceives float64
|
InReceives *float64
|
||||||
InHdrErrors float64
|
InHdrErrors *float64
|
||||||
InAddrErrors float64
|
InAddrErrors *float64
|
||||||
ForwDatagrams float64
|
ForwDatagrams *float64
|
||||||
InUnknownProtos float64
|
InUnknownProtos *float64
|
||||||
InDiscards float64
|
InDiscards *float64
|
||||||
InDelivers float64
|
InDelivers *float64
|
||||||
OutRequests float64
|
OutRequests *float64
|
||||||
OutDiscards float64
|
OutDiscards *float64
|
||||||
OutNoRoutes float64
|
OutNoRoutes *float64
|
||||||
ReasmTimeout float64
|
ReasmTimeout *float64
|
||||||
ReasmReqds float64
|
ReasmReqds *float64
|
||||||
ReasmOKs float64
|
ReasmOKs *float64
|
||||||
ReasmFails float64
|
ReasmFails *float64
|
||||||
FragOKs float64
|
FragOKs *float64
|
||||||
FragFails float64
|
FragFails *float64
|
||||||
FragCreates float64
|
FragCreates *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type Icmp struct {
|
type Icmp struct { // nolint:revive
|
||||||
InMsgs float64
|
InMsgs *float64
|
||||||
InErrors float64
|
InErrors *float64
|
||||||
InCsumErrors float64
|
InCsumErrors *float64
|
||||||
InDestUnreachs float64
|
InDestUnreachs *float64
|
||||||
InTimeExcds float64
|
InTimeExcds *float64
|
||||||
InParmProbs float64
|
InParmProbs *float64
|
||||||
InSrcQuenchs float64
|
InSrcQuenchs *float64
|
||||||
InRedirects float64
|
InRedirects *float64
|
||||||
InEchos float64
|
InEchos *float64
|
||||||
InEchoReps float64
|
InEchoReps *float64
|
||||||
InTimestamps float64
|
InTimestamps *float64
|
||||||
InTimestampReps float64
|
InTimestampReps *float64
|
||||||
InAddrMasks float64
|
InAddrMasks *float64
|
||||||
InAddrMaskReps float64
|
InAddrMaskReps *float64
|
||||||
OutMsgs float64
|
OutMsgs *float64
|
||||||
OutErrors float64
|
OutErrors *float64
|
||||||
OutDestUnreachs float64
|
OutDestUnreachs *float64
|
||||||
OutTimeExcds float64
|
OutTimeExcds *float64
|
||||||
OutParmProbs float64
|
OutParmProbs *float64
|
||||||
OutSrcQuenchs float64
|
OutSrcQuenchs *float64
|
||||||
OutRedirects float64
|
OutRedirects *float64
|
||||||
OutEchos float64
|
OutEchos *float64
|
||||||
OutEchoReps float64
|
OutEchoReps *float64
|
||||||
OutTimestamps float64
|
OutTimestamps *float64
|
||||||
OutTimestampReps float64
|
OutTimestampReps *float64
|
||||||
OutAddrMasks float64
|
OutAddrMasks *float64
|
||||||
OutAddrMaskReps float64
|
OutAddrMaskReps *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type IcmpMsg struct {
|
type IcmpMsg struct {
|
||||||
InType3 float64
|
InType3 *float64
|
||||||
OutType3 float64
|
OutType3 *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type Tcp struct { // nolint:revive
|
type Tcp struct { // nolint:revive
|
||||||
RtoAlgorithm float64
|
RtoAlgorithm *float64
|
||||||
RtoMin float64
|
RtoMin *float64
|
||||||
RtoMax float64
|
RtoMax *float64
|
||||||
MaxConn float64
|
MaxConn *float64
|
||||||
ActiveOpens float64
|
ActiveOpens *float64
|
||||||
PassiveOpens float64
|
PassiveOpens *float64
|
||||||
AttemptFails float64
|
AttemptFails *float64
|
||||||
EstabResets float64
|
EstabResets *float64
|
||||||
CurrEstab float64
|
CurrEstab *float64
|
||||||
InSegs float64
|
InSegs *float64
|
||||||
OutSegs float64
|
OutSegs *float64
|
||||||
RetransSegs float64
|
RetransSegs *float64
|
||||||
InErrs float64
|
InErrs *float64
|
||||||
OutRsts float64
|
OutRsts *float64
|
||||||
InCsumErrors float64
|
InCsumErrors *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type Udp struct { // nolint:revive
|
type Udp struct { // nolint:revive
|
||||||
InDatagrams float64
|
InDatagrams *float64
|
||||||
NoPorts float64
|
NoPorts *float64
|
||||||
InErrors float64
|
InErrors *float64
|
||||||
OutDatagrams float64
|
OutDatagrams *float64
|
||||||
RcvbufErrors float64
|
RcvbufErrors *float64
|
||||||
SndbufErrors float64
|
SndbufErrors *float64
|
||||||
InCsumErrors float64
|
InCsumErrors *float64
|
||||||
IgnoredMulti float64
|
IgnoredMulti *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type UdpLite struct { // nolint:revive
|
type UdpLite struct { // nolint:revive
|
||||||
InDatagrams float64
|
InDatagrams *float64
|
||||||
NoPorts float64
|
NoPorts *float64
|
||||||
InErrors float64
|
InErrors *float64
|
||||||
OutDatagrams float64
|
OutDatagrams *float64
|
||||||
RcvbufErrors float64
|
RcvbufErrors *float64
|
||||||
SndbufErrors float64
|
SndbufErrors *float64
|
||||||
InCsumErrors float64
|
InCsumErrors *float64
|
||||||
IgnoredMulti float64
|
IgnoredMulti *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Proc) Snmp() (ProcSnmp, error) {
|
func (p Proc) Snmp() (ProcSnmp, error) {
|
||||||
|
@ -173,178 +173,178 @@ func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) {
|
||||||
case "Ip":
|
case "Ip":
|
||||||
switch key {
|
switch key {
|
||||||
case "Forwarding":
|
case "Forwarding":
|
||||||
procSnmp.Ip.Forwarding = value
|
procSnmp.Ip.Forwarding = &value
|
||||||
case "DefaultTTL":
|
case "DefaultTTL":
|
||||||
procSnmp.Ip.DefaultTTL = value
|
procSnmp.Ip.DefaultTTL = &value
|
||||||
case "InReceives":
|
case "InReceives":
|
||||||
procSnmp.Ip.InReceives = value
|
procSnmp.Ip.InReceives = &value
|
||||||
case "InHdrErrors":
|
case "InHdrErrors":
|
||||||
procSnmp.Ip.InHdrErrors = value
|
procSnmp.Ip.InHdrErrors = &value
|
||||||
case "InAddrErrors":
|
case "InAddrErrors":
|
||||||
procSnmp.Ip.InAddrErrors = value
|
procSnmp.Ip.InAddrErrors = &value
|
||||||
case "ForwDatagrams":
|
case "ForwDatagrams":
|
||||||
procSnmp.Ip.ForwDatagrams = value
|
procSnmp.Ip.ForwDatagrams = &value
|
||||||
case "InUnknownProtos":
|
case "InUnknownProtos":
|
||||||
procSnmp.Ip.InUnknownProtos = value
|
procSnmp.Ip.InUnknownProtos = &value
|
||||||
case "InDiscards":
|
case "InDiscards":
|
||||||
procSnmp.Ip.InDiscards = value
|
procSnmp.Ip.InDiscards = &value
|
||||||
case "InDelivers":
|
case "InDelivers":
|
||||||
procSnmp.Ip.InDelivers = value
|
procSnmp.Ip.InDelivers = &value
|
||||||
case "OutRequests":
|
case "OutRequests":
|
||||||
procSnmp.Ip.OutRequests = value
|
procSnmp.Ip.OutRequests = &value
|
||||||
case "OutDiscards":
|
case "OutDiscards":
|
||||||
procSnmp.Ip.OutDiscards = value
|
procSnmp.Ip.OutDiscards = &value
|
||||||
case "OutNoRoutes":
|
case "OutNoRoutes":
|
||||||
procSnmp.Ip.OutNoRoutes = value
|
procSnmp.Ip.OutNoRoutes = &value
|
||||||
case "ReasmTimeout":
|
case "ReasmTimeout":
|
||||||
procSnmp.Ip.ReasmTimeout = value
|
procSnmp.Ip.ReasmTimeout = &value
|
||||||
case "ReasmReqds":
|
case "ReasmReqds":
|
||||||
procSnmp.Ip.ReasmReqds = value
|
procSnmp.Ip.ReasmReqds = &value
|
||||||
case "ReasmOKs":
|
case "ReasmOKs":
|
||||||
procSnmp.Ip.ReasmOKs = value
|
procSnmp.Ip.ReasmOKs = &value
|
||||||
case "ReasmFails":
|
case "ReasmFails":
|
||||||
procSnmp.Ip.ReasmFails = value
|
procSnmp.Ip.ReasmFails = &value
|
||||||
case "FragOKs":
|
case "FragOKs":
|
||||||
procSnmp.Ip.FragOKs = value
|
procSnmp.Ip.FragOKs = &value
|
||||||
case "FragFails":
|
case "FragFails":
|
||||||
procSnmp.Ip.FragFails = value
|
procSnmp.Ip.FragFails = &value
|
||||||
case "FragCreates":
|
case "FragCreates":
|
||||||
procSnmp.Ip.FragCreates = value
|
procSnmp.Ip.FragCreates = &value
|
||||||
}
|
}
|
||||||
case "Icmp":
|
case "Icmp":
|
||||||
switch key {
|
switch key {
|
||||||
case "InMsgs":
|
case "InMsgs":
|
||||||
procSnmp.Icmp.InMsgs = value
|
procSnmp.Icmp.InMsgs = &value
|
||||||
case "InErrors":
|
case "InErrors":
|
||||||
procSnmp.Icmp.InErrors = value
|
procSnmp.Icmp.InErrors = &value
|
||||||
case "InCsumErrors":
|
case "InCsumErrors":
|
||||||
procSnmp.Icmp.InCsumErrors = value
|
procSnmp.Icmp.InCsumErrors = &value
|
||||||
case "InDestUnreachs":
|
case "InDestUnreachs":
|
||||||
procSnmp.Icmp.InDestUnreachs = value
|
procSnmp.Icmp.InDestUnreachs = &value
|
||||||
case "InTimeExcds":
|
case "InTimeExcds":
|
||||||
procSnmp.Icmp.InTimeExcds = value
|
procSnmp.Icmp.InTimeExcds = &value
|
||||||
case "InParmProbs":
|
case "InParmProbs":
|
||||||
procSnmp.Icmp.InParmProbs = value
|
procSnmp.Icmp.InParmProbs = &value
|
||||||
case "InSrcQuenchs":
|
case "InSrcQuenchs":
|
||||||
procSnmp.Icmp.InSrcQuenchs = value
|
procSnmp.Icmp.InSrcQuenchs = &value
|
||||||
case "InRedirects":
|
case "InRedirects":
|
||||||
procSnmp.Icmp.InRedirects = value
|
procSnmp.Icmp.InRedirects = &value
|
||||||
case "InEchos":
|
case "InEchos":
|
||||||
procSnmp.Icmp.InEchos = value
|
procSnmp.Icmp.InEchos = &value
|
||||||
case "InEchoReps":
|
case "InEchoReps":
|
||||||
procSnmp.Icmp.InEchoReps = value
|
procSnmp.Icmp.InEchoReps = &value
|
||||||
case "InTimestamps":
|
case "InTimestamps":
|
||||||
procSnmp.Icmp.InTimestamps = value
|
procSnmp.Icmp.InTimestamps = &value
|
||||||
case "InTimestampReps":
|
case "InTimestampReps":
|
||||||
procSnmp.Icmp.InTimestampReps = value
|
procSnmp.Icmp.InTimestampReps = &value
|
||||||
case "InAddrMasks":
|
case "InAddrMasks":
|
||||||
procSnmp.Icmp.InAddrMasks = value
|
procSnmp.Icmp.InAddrMasks = &value
|
||||||
case "InAddrMaskReps":
|
case "InAddrMaskReps":
|
||||||
procSnmp.Icmp.InAddrMaskReps = value
|
procSnmp.Icmp.InAddrMaskReps = &value
|
||||||
case "OutMsgs":
|
case "OutMsgs":
|
||||||
procSnmp.Icmp.OutMsgs = value
|
procSnmp.Icmp.OutMsgs = &value
|
||||||
case "OutErrors":
|
case "OutErrors":
|
||||||
procSnmp.Icmp.OutErrors = value
|
procSnmp.Icmp.OutErrors = &value
|
||||||
case "OutDestUnreachs":
|
case "OutDestUnreachs":
|
||||||
procSnmp.Icmp.OutDestUnreachs = value
|
procSnmp.Icmp.OutDestUnreachs = &value
|
||||||
case "OutTimeExcds":
|
case "OutTimeExcds":
|
||||||
procSnmp.Icmp.OutTimeExcds = value
|
procSnmp.Icmp.OutTimeExcds = &value
|
||||||
case "OutParmProbs":
|
case "OutParmProbs":
|
||||||
procSnmp.Icmp.OutParmProbs = value
|
procSnmp.Icmp.OutParmProbs = &value
|
||||||
case "OutSrcQuenchs":
|
case "OutSrcQuenchs":
|
||||||
procSnmp.Icmp.OutSrcQuenchs = value
|
procSnmp.Icmp.OutSrcQuenchs = &value
|
||||||
case "OutRedirects":
|
case "OutRedirects":
|
||||||
procSnmp.Icmp.OutRedirects = value
|
procSnmp.Icmp.OutRedirects = &value
|
||||||
case "OutEchos":
|
case "OutEchos":
|
||||||
procSnmp.Icmp.OutEchos = value
|
procSnmp.Icmp.OutEchos = &value
|
||||||
case "OutEchoReps":
|
case "OutEchoReps":
|
||||||
procSnmp.Icmp.OutEchoReps = value
|
procSnmp.Icmp.OutEchoReps = &value
|
||||||
case "OutTimestamps":
|
case "OutTimestamps":
|
||||||
procSnmp.Icmp.OutTimestamps = value
|
procSnmp.Icmp.OutTimestamps = &value
|
||||||
case "OutTimestampReps":
|
case "OutTimestampReps":
|
||||||
procSnmp.Icmp.OutTimestampReps = value
|
procSnmp.Icmp.OutTimestampReps = &value
|
||||||
case "OutAddrMasks":
|
case "OutAddrMasks":
|
||||||
procSnmp.Icmp.OutAddrMasks = value
|
procSnmp.Icmp.OutAddrMasks = &value
|
||||||
case "OutAddrMaskReps":
|
case "OutAddrMaskReps":
|
||||||
procSnmp.Icmp.OutAddrMaskReps = value
|
procSnmp.Icmp.OutAddrMaskReps = &value
|
||||||
}
|
}
|
||||||
case "IcmpMsg":
|
case "IcmpMsg":
|
||||||
switch key {
|
switch key {
|
||||||
case "InType3":
|
case "InType3":
|
||||||
procSnmp.IcmpMsg.InType3 = value
|
procSnmp.IcmpMsg.InType3 = &value
|
||||||
case "OutType3":
|
case "OutType3":
|
||||||
procSnmp.IcmpMsg.OutType3 = value
|
procSnmp.IcmpMsg.OutType3 = &value
|
||||||
}
|
}
|
||||||
case "Tcp":
|
case "Tcp":
|
||||||
switch key {
|
switch key {
|
||||||
case "RtoAlgorithm":
|
case "RtoAlgorithm":
|
||||||
procSnmp.Tcp.RtoAlgorithm = value
|
procSnmp.Tcp.RtoAlgorithm = &value
|
||||||
case "RtoMin":
|
case "RtoMin":
|
||||||
procSnmp.Tcp.RtoMin = value
|
procSnmp.Tcp.RtoMin = &value
|
||||||
case "RtoMax":
|
case "RtoMax":
|
||||||
procSnmp.Tcp.RtoMax = value
|
procSnmp.Tcp.RtoMax = &value
|
||||||
case "MaxConn":
|
case "MaxConn":
|
||||||
procSnmp.Tcp.MaxConn = value
|
procSnmp.Tcp.MaxConn = &value
|
||||||
case "ActiveOpens":
|
case "ActiveOpens":
|
||||||
procSnmp.Tcp.ActiveOpens = value
|
procSnmp.Tcp.ActiveOpens = &value
|
||||||
case "PassiveOpens":
|
case "PassiveOpens":
|
||||||
procSnmp.Tcp.PassiveOpens = value
|
procSnmp.Tcp.PassiveOpens = &value
|
||||||
case "AttemptFails":
|
case "AttemptFails":
|
||||||
procSnmp.Tcp.AttemptFails = value
|
procSnmp.Tcp.AttemptFails = &value
|
||||||
case "EstabResets":
|
case "EstabResets":
|
||||||
procSnmp.Tcp.EstabResets = value
|
procSnmp.Tcp.EstabResets = &value
|
||||||
case "CurrEstab":
|
case "CurrEstab":
|
||||||
procSnmp.Tcp.CurrEstab = value
|
procSnmp.Tcp.CurrEstab = &value
|
||||||
case "InSegs":
|
case "InSegs":
|
||||||
procSnmp.Tcp.InSegs = value
|
procSnmp.Tcp.InSegs = &value
|
||||||
case "OutSegs":
|
case "OutSegs":
|
||||||
procSnmp.Tcp.OutSegs = value
|
procSnmp.Tcp.OutSegs = &value
|
||||||
case "RetransSegs":
|
case "RetransSegs":
|
||||||
procSnmp.Tcp.RetransSegs = value
|
procSnmp.Tcp.RetransSegs = &value
|
||||||
case "InErrs":
|
case "InErrs":
|
||||||
procSnmp.Tcp.InErrs = value
|
procSnmp.Tcp.InErrs = &value
|
||||||
case "OutRsts":
|
case "OutRsts":
|
||||||
procSnmp.Tcp.OutRsts = value
|
procSnmp.Tcp.OutRsts = &value
|
||||||
case "InCsumErrors":
|
case "InCsumErrors":
|
||||||
procSnmp.Tcp.InCsumErrors = value
|
procSnmp.Tcp.InCsumErrors = &value
|
||||||
}
|
}
|
||||||
case "Udp":
|
case "Udp":
|
||||||
switch key {
|
switch key {
|
||||||
case "InDatagrams":
|
case "InDatagrams":
|
||||||
procSnmp.Udp.InDatagrams = value
|
procSnmp.Udp.InDatagrams = &value
|
||||||
case "NoPorts":
|
case "NoPorts":
|
||||||
procSnmp.Udp.NoPorts = value
|
procSnmp.Udp.NoPorts = &value
|
||||||
case "InErrors":
|
case "InErrors":
|
||||||
procSnmp.Udp.InErrors = value
|
procSnmp.Udp.InErrors = &value
|
||||||
case "OutDatagrams":
|
case "OutDatagrams":
|
||||||
procSnmp.Udp.OutDatagrams = value
|
procSnmp.Udp.OutDatagrams = &value
|
||||||
case "RcvbufErrors":
|
case "RcvbufErrors":
|
||||||
procSnmp.Udp.RcvbufErrors = value
|
procSnmp.Udp.RcvbufErrors = &value
|
||||||
case "SndbufErrors":
|
case "SndbufErrors":
|
||||||
procSnmp.Udp.SndbufErrors = value
|
procSnmp.Udp.SndbufErrors = &value
|
||||||
case "InCsumErrors":
|
case "InCsumErrors":
|
||||||
procSnmp.Udp.InCsumErrors = value
|
procSnmp.Udp.InCsumErrors = &value
|
||||||
case "IgnoredMulti":
|
case "IgnoredMulti":
|
||||||
procSnmp.Udp.IgnoredMulti = value
|
procSnmp.Udp.IgnoredMulti = &value
|
||||||
}
|
}
|
||||||
case "UdpLite":
|
case "UdpLite":
|
||||||
switch key {
|
switch key {
|
||||||
case "InDatagrams":
|
case "InDatagrams":
|
||||||
procSnmp.UdpLite.InDatagrams = value
|
procSnmp.UdpLite.InDatagrams = &value
|
||||||
case "NoPorts":
|
case "NoPorts":
|
||||||
procSnmp.UdpLite.NoPorts = value
|
procSnmp.UdpLite.NoPorts = &value
|
||||||
case "InErrors":
|
case "InErrors":
|
||||||
procSnmp.UdpLite.InErrors = value
|
procSnmp.UdpLite.InErrors = &value
|
||||||
case "OutDatagrams":
|
case "OutDatagrams":
|
||||||
procSnmp.UdpLite.OutDatagrams = value
|
procSnmp.UdpLite.OutDatagrams = &value
|
||||||
case "RcvbufErrors":
|
case "RcvbufErrors":
|
||||||
procSnmp.UdpLite.RcvbufErrors = value
|
procSnmp.UdpLite.RcvbufErrors = &value
|
||||||
case "SndbufErrors":
|
case "SndbufErrors":
|
||||||
procSnmp.UdpLite.SndbufErrors = value
|
procSnmp.UdpLite.SndbufErrors = &value
|
||||||
case "InCsumErrors":
|
case "InCsumErrors":
|
||||||
procSnmp.UdpLite.InCsumErrors = value
|
procSnmp.UdpLite.InCsumErrors = &value
|
||||||
case "IgnoredMulti":
|
case "IgnoredMulti":
|
||||||
procSnmp.UdpLite.IgnoredMulti = value
|
procSnmp.UdpLite.IgnoredMulti = &value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,106 +36,106 @@ type ProcSnmp6 struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Ip6 struct { // nolint:revive
|
type Ip6 struct { // nolint:revive
|
||||||
InReceives float64
|
InReceives *float64
|
||||||
InHdrErrors float64
|
InHdrErrors *float64
|
||||||
InTooBigErrors float64
|
InTooBigErrors *float64
|
||||||
InNoRoutes float64
|
InNoRoutes *float64
|
||||||
InAddrErrors float64
|
InAddrErrors *float64
|
||||||
InUnknownProtos float64
|
InUnknownProtos *float64
|
||||||
InTruncatedPkts float64
|
InTruncatedPkts *float64
|
||||||
InDiscards float64
|
InDiscards *float64
|
||||||
InDelivers float64
|
InDelivers *float64
|
||||||
OutForwDatagrams float64
|
OutForwDatagrams *float64
|
||||||
OutRequests float64
|
OutRequests *float64
|
||||||
OutDiscards float64
|
OutDiscards *float64
|
||||||
OutNoRoutes float64
|
OutNoRoutes *float64
|
||||||
ReasmTimeout float64
|
ReasmTimeout *float64
|
||||||
ReasmReqds float64
|
ReasmReqds *float64
|
||||||
ReasmOKs float64
|
ReasmOKs *float64
|
||||||
ReasmFails float64
|
ReasmFails *float64
|
||||||
FragOKs float64
|
FragOKs *float64
|
||||||
FragFails float64
|
FragFails *float64
|
||||||
FragCreates float64
|
FragCreates *float64
|
||||||
InMcastPkts float64
|
InMcastPkts *float64
|
||||||
OutMcastPkts float64
|
OutMcastPkts *float64
|
||||||
InOctets float64
|
InOctets *float64
|
||||||
OutOctets float64
|
OutOctets *float64
|
||||||
InMcastOctets float64
|
InMcastOctets *float64
|
||||||
OutMcastOctets float64
|
OutMcastOctets *float64
|
||||||
InBcastOctets float64
|
InBcastOctets *float64
|
||||||
OutBcastOctets float64
|
OutBcastOctets *float64
|
||||||
InNoECTPkts float64
|
InNoECTPkts *float64
|
||||||
InECT1Pkts float64
|
InECT1Pkts *float64
|
||||||
InECT0Pkts float64
|
InECT0Pkts *float64
|
||||||
InCEPkts float64
|
InCEPkts *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type Icmp6 struct {
|
type Icmp6 struct {
|
||||||
InMsgs float64
|
InMsgs *float64
|
||||||
InErrors float64
|
InErrors *float64
|
||||||
OutMsgs float64
|
OutMsgs *float64
|
||||||
OutErrors float64
|
OutErrors *float64
|
||||||
InCsumErrors float64
|
InCsumErrors *float64
|
||||||
InDestUnreachs float64
|
InDestUnreachs *float64
|
||||||
InPktTooBigs float64
|
InPktTooBigs *float64
|
||||||
InTimeExcds float64
|
InTimeExcds *float64
|
||||||
InParmProblems float64
|
InParmProblems *float64
|
||||||
InEchos float64
|
InEchos *float64
|
||||||
InEchoReplies float64
|
InEchoReplies *float64
|
||||||
InGroupMembQueries float64
|
InGroupMembQueries *float64
|
||||||
InGroupMembResponses float64
|
InGroupMembResponses *float64
|
||||||
InGroupMembReductions float64
|
InGroupMembReductions *float64
|
||||||
InRouterSolicits float64
|
InRouterSolicits *float64
|
||||||
InRouterAdvertisements float64
|
InRouterAdvertisements *float64
|
||||||
InNeighborSolicits float64
|
InNeighborSolicits *float64
|
||||||
InNeighborAdvertisements float64
|
InNeighborAdvertisements *float64
|
||||||
InRedirects float64
|
InRedirects *float64
|
||||||
InMLDv2Reports float64
|
InMLDv2Reports *float64
|
||||||
OutDestUnreachs float64
|
OutDestUnreachs *float64
|
||||||
OutPktTooBigs float64
|
OutPktTooBigs *float64
|
||||||
OutTimeExcds float64
|
OutTimeExcds *float64
|
||||||
OutParmProblems float64
|
OutParmProblems *float64
|
||||||
OutEchos float64
|
OutEchos *float64
|
||||||
OutEchoReplies float64
|
OutEchoReplies *float64
|
||||||
OutGroupMembQueries float64
|
OutGroupMembQueries *float64
|
||||||
OutGroupMembResponses float64
|
OutGroupMembResponses *float64
|
||||||
OutGroupMembReductions float64
|
OutGroupMembReductions *float64
|
||||||
OutRouterSolicits float64
|
OutRouterSolicits *float64
|
||||||
OutRouterAdvertisements float64
|
OutRouterAdvertisements *float64
|
||||||
OutNeighborSolicits float64
|
OutNeighborSolicits *float64
|
||||||
OutNeighborAdvertisements float64
|
OutNeighborAdvertisements *float64
|
||||||
OutRedirects float64
|
OutRedirects *float64
|
||||||
OutMLDv2Reports float64
|
OutMLDv2Reports *float64
|
||||||
InType1 float64
|
InType1 *float64
|
||||||
InType134 float64
|
InType134 *float64
|
||||||
InType135 float64
|
InType135 *float64
|
||||||
InType136 float64
|
InType136 *float64
|
||||||
InType143 float64
|
InType143 *float64
|
||||||
OutType133 float64
|
OutType133 *float64
|
||||||
OutType135 float64
|
OutType135 *float64
|
||||||
OutType136 float64
|
OutType136 *float64
|
||||||
OutType143 float64
|
OutType143 *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type Udp6 struct { // nolint:revive
|
type Udp6 struct { // nolint:revive
|
||||||
InDatagrams float64
|
InDatagrams *float64
|
||||||
NoPorts float64
|
NoPorts *float64
|
||||||
InErrors float64
|
InErrors *float64
|
||||||
OutDatagrams float64
|
OutDatagrams *float64
|
||||||
RcvbufErrors float64
|
RcvbufErrors *float64
|
||||||
SndbufErrors float64
|
SndbufErrors *float64
|
||||||
InCsumErrors float64
|
InCsumErrors *float64
|
||||||
IgnoredMulti float64
|
IgnoredMulti *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
type UdpLite6 struct { // nolint:revive
|
type UdpLite6 struct { // nolint:revive
|
||||||
InDatagrams float64
|
InDatagrams *float64
|
||||||
NoPorts float64
|
NoPorts *float64
|
||||||
InErrors float64
|
InErrors *float64
|
||||||
OutDatagrams float64
|
OutDatagrams *float64
|
||||||
RcvbufErrors float64
|
RcvbufErrors *float64
|
||||||
SndbufErrors float64
|
SndbufErrors *float64
|
||||||
InCsumErrors float64
|
InCsumErrors *float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Proc) Snmp6() (ProcSnmp6, error) {
|
func (p Proc) Snmp6() (ProcSnmp6, error) {
|
||||||
|
@ -182,197 +182,197 @@ func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) {
|
||||||
case "Ip6":
|
case "Ip6":
|
||||||
switch key {
|
switch key {
|
||||||
case "InReceives":
|
case "InReceives":
|
||||||
procSnmp6.Ip6.InReceives = value
|
procSnmp6.Ip6.InReceives = &value
|
||||||
case "InHdrErrors":
|
case "InHdrErrors":
|
||||||
procSnmp6.Ip6.InHdrErrors = value
|
procSnmp6.Ip6.InHdrErrors = &value
|
||||||
case "InTooBigErrors":
|
case "InTooBigErrors":
|
||||||
procSnmp6.Ip6.InTooBigErrors = value
|
procSnmp6.Ip6.InTooBigErrors = &value
|
||||||
case "InNoRoutes":
|
case "InNoRoutes":
|
||||||
procSnmp6.Ip6.InNoRoutes = value
|
procSnmp6.Ip6.InNoRoutes = &value
|
||||||
case "InAddrErrors":
|
case "InAddrErrors":
|
||||||
procSnmp6.Ip6.InAddrErrors = value
|
procSnmp6.Ip6.InAddrErrors = &value
|
||||||
case "InUnknownProtos":
|
case "InUnknownProtos":
|
||||||
procSnmp6.Ip6.InUnknownProtos = value
|
procSnmp6.Ip6.InUnknownProtos = &value
|
||||||
case "InTruncatedPkts":
|
case "InTruncatedPkts":
|
||||||
procSnmp6.Ip6.InTruncatedPkts = value
|
procSnmp6.Ip6.InTruncatedPkts = &value
|
||||||
case "InDiscards":
|
case "InDiscards":
|
||||||
procSnmp6.Ip6.InDiscards = value
|
procSnmp6.Ip6.InDiscards = &value
|
||||||
case "InDelivers":
|
case "InDelivers":
|
||||||
procSnmp6.Ip6.InDelivers = value
|
procSnmp6.Ip6.InDelivers = &value
|
||||||
case "OutForwDatagrams":
|
case "OutForwDatagrams":
|
||||||
procSnmp6.Ip6.OutForwDatagrams = value
|
procSnmp6.Ip6.OutForwDatagrams = &value
|
||||||
case "OutRequests":
|
case "OutRequests":
|
||||||
procSnmp6.Ip6.OutRequests = value
|
procSnmp6.Ip6.OutRequests = &value
|
||||||
case "OutDiscards":
|
case "OutDiscards":
|
||||||
procSnmp6.Ip6.OutDiscards = value
|
procSnmp6.Ip6.OutDiscards = &value
|
||||||
case "OutNoRoutes":
|
case "OutNoRoutes":
|
||||||
procSnmp6.Ip6.OutNoRoutes = value
|
procSnmp6.Ip6.OutNoRoutes = &value
|
||||||
case "ReasmTimeout":
|
case "ReasmTimeout":
|
||||||
procSnmp6.Ip6.ReasmTimeout = value
|
procSnmp6.Ip6.ReasmTimeout = &value
|
||||||
case "ReasmReqds":
|
case "ReasmReqds":
|
||||||
procSnmp6.Ip6.ReasmReqds = value
|
procSnmp6.Ip6.ReasmReqds = &value
|
||||||
case "ReasmOKs":
|
case "ReasmOKs":
|
||||||
procSnmp6.Ip6.ReasmOKs = value
|
procSnmp6.Ip6.ReasmOKs = &value
|
||||||
case "ReasmFails":
|
case "ReasmFails":
|
||||||
procSnmp6.Ip6.ReasmFails = value
|
procSnmp6.Ip6.ReasmFails = &value
|
||||||
case "FragOKs":
|
case "FragOKs":
|
||||||
procSnmp6.Ip6.FragOKs = value
|
procSnmp6.Ip6.FragOKs = &value
|
||||||
case "FragFails":
|
case "FragFails":
|
||||||
procSnmp6.Ip6.FragFails = value
|
procSnmp6.Ip6.FragFails = &value
|
||||||
case "FragCreates":
|
case "FragCreates":
|
||||||
procSnmp6.Ip6.FragCreates = value
|
procSnmp6.Ip6.FragCreates = &value
|
||||||
case "InMcastPkts":
|
case "InMcastPkts":
|
||||||
procSnmp6.Ip6.InMcastPkts = value
|
procSnmp6.Ip6.InMcastPkts = &value
|
||||||
case "OutMcastPkts":
|
case "OutMcastPkts":
|
||||||
procSnmp6.Ip6.OutMcastPkts = value
|
procSnmp6.Ip6.OutMcastPkts = &value
|
||||||
case "InOctets":
|
case "InOctets":
|
||||||
procSnmp6.Ip6.InOctets = value
|
procSnmp6.Ip6.InOctets = &value
|
||||||
case "OutOctets":
|
case "OutOctets":
|
||||||
procSnmp6.Ip6.OutOctets = value
|
procSnmp6.Ip6.OutOctets = &value
|
||||||
case "InMcastOctets":
|
case "InMcastOctets":
|
||||||
procSnmp6.Ip6.InMcastOctets = value
|
procSnmp6.Ip6.InMcastOctets = &value
|
||||||
case "OutMcastOctets":
|
case "OutMcastOctets":
|
||||||
procSnmp6.Ip6.OutMcastOctets = value
|
procSnmp6.Ip6.OutMcastOctets = &value
|
||||||
case "InBcastOctets":
|
case "InBcastOctets":
|
||||||
procSnmp6.Ip6.InBcastOctets = value
|
procSnmp6.Ip6.InBcastOctets = &value
|
||||||
case "OutBcastOctets":
|
case "OutBcastOctets":
|
||||||
procSnmp6.Ip6.OutBcastOctets = value
|
procSnmp6.Ip6.OutBcastOctets = &value
|
||||||
case "InNoECTPkts":
|
case "InNoECTPkts":
|
||||||
procSnmp6.Ip6.InNoECTPkts = value
|
procSnmp6.Ip6.InNoECTPkts = &value
|
||||||
case "InECT1Pkts":
|
case "InECT1Pkts":
|
||||||
procSnmp6.Ip6.InECT1Pkts = value
|
procSnmp6.Ip6.InECT1Pkts = &value
|
||||||
case "InECT0Pkts":
|
case "InECT0Pkts":
|
||||||
procSnmp6.Ip6.InECT0Pkts = value
|
procSnmp6.Ip6.InECT0Pkts = &value
|
||||||
case "InCEPkts":
|
case "InCEPkts":
|
||||||
procSnmp6.Ip6.InCEPkts = value
|
procSnmp6.Ip6.InCEPkts = &value
|
||||||
|
|
||||||
}
|
}
|
||||||
case "Icmp6":
|
case "Icmp6":
|
||||||
switch key {
|
switch key {
|
||||||
case "InMsgs":
|
case "InMsgs":
|
||||||
procSnmp6.Icmp6.InMsgs = value
|
procSnmp6.Icmp6.InMsgs = &value
|
||||||
case "InErrors":
|
case "InErrors":
|
||||||
procSnmp6.Icmp6.InErrors = value
|
procSnmp6.Icmp6.InErrors = &value
|
||||||
case "OutMsgs":
|
case "OutMsgs":
|
||||||
procSnmp6.Icmp6.OutMsgs = value
|
procSnmp6.Icmp6.OutMsgs = &value
|
||||||
case "OutErrors":
|
case "OutErrors":
|
||||||
procSnmp6.Icmp6.OutErrors = value
|
procSnmp6.Icmp6.OutErrors = &value
|
||||||
case "InCsumErrors":
|
case "InCsumErrors":
|
||||||
procSnmp6.Icmp6.InCsumErrors = value
|
procSnmp6.Icmp6.InCsumErrors = &value
|
||||||
case "InDestUnreachs":
|
case "InDestUnreachs":
|
||||||
procSnmp6.Icmp6.InDestUnreachs = value
|
procSnmp6.Icmp6.InDestUnreachs = &value
|
||||||
case "InPktTooBigs":
|
case "InPktTooBigs":
|
||||||
procSnmp6.Icmp6.InPktTooBigs = value
|
procSnmp6.Icmp6.InPktTooBigs = &value
|
||||||
case "InTimeExcds":
|
case "InTimeExcds":
|
||||||
procSnmp6.Icmp6.InTimeExcds = value
|
procSnmp6.Icmp6.InTimeExcds = &value
|
||||||
case "InParmProblems":
|
case "InParmProblems":
|
||||||
procSnmp6.Icmp6.InParmProblems = value
|
procSnmp6.Icmp6.InParmProblems = &value
|
||||||
case "InEchos":
|
case "InEchos":
|
||||||
procSnmp6.Icmp6.InEchos = value
|
procSnmp6.Icmp6.InEchos = &value
|
||||||
case "InEchoReplies":
|
case "InEchoReplies":
|
||||||
procSnmp6.Icmp6.InEchoReplies = value
|
procSnmp6.Icmp6.InEchoReplies = &value
|
||||||
case "InGroupMembQueries":
|
case "InGroupMembQueries":
|
||||||
procSnmp6.Icmp6.InGroupMembQueries = value
|
procSnmp6.Icmp6.InGroupMembQueries = &value
|
||||||
case "InGroupMembResponses":
|
case "InGroupMembResponses":
|
||||||
procSnmp6.Icmp6.InGroupMembResponses = value
|
procSnmp6.Icmp6.InGroupMembResponses = &value
|
||||||
case "InGroupMembReductions":
|
case "InGroupMembReductions":
|
||||||
procSnmp6.Icmp6.InGroupMembReductions = value
|
procSnmp6.Icmp6.InGroupMembReductions = &value
|
||||||
case "InRouterSolicits":
|
case "InRouterSolicits":
|
||||||
procSnmp6.Icmp6.InRouterSolicits = value
|
procSnmp6.Icmp6.InRouterSolicits = &value
|
||||||
case "InRouterAdvertisements":
|
case "InRouterAdvertisements":
|
||||||
procSnmp6.Icmp6.InRouterAdvertisements = value
|
procSnmp6.Icmp6.InRouterAdvertisements = &value
|
||||||
case "InNeighborSolicits":
|
case "InNeighborSolicits":
|
||||||
procSnmp6.Icmp6.InNeighborSolicits = value
|
procSnmp6.Icmp6.InNeighborSolicits = &value
|
||||||
case "InNeighborAdvertisements":
|
case "InNeighborAdvertisements":
|
||||||
procSnmp6.Icmp6.InNeighborAdvertisements = value
|
procSnmp6.Icmp6.InNeighborAdvertisements = &value
|
||||||
case "InRedirects":
|
case "InRedirects":
|
||||||
procSnmp6.Icmp6.InRedirects = value
|
procSnmp6.Icmp6.InRedirects = &value
|
||||||
case "InMLDv2Reports":
|
case "InMLDv2Reports":
|
||||||
procSnmp6.Icmp6.InMLDv2Reports = value
|
procSnmp6.Icmp6.InMLDv2Reports = &value
|
||||||
case "OutDestUnreachs":
|
case "OutDestUnreachs":
|
||||||
procSnmp6.Icmp6.OutDestUnreachs = value
|
procSnmp6.Icmp6.OutDestUnreachs = &value
|
||||||
case "OutPktTooBigs":
|
case "OutPktTooBigs":
|
||||||
procSnmp6.Icmp6.OutPktTooBigs = value
|
procSnmp6.Icmp6.OutPktTooBigs = &value
|
||||||
case "OutTimeExcds":
|
case "OutTimeExcds":
|
||||||
procSnmp6.Icmp6.OutTimeExcds = value
|
procSnmp6.Icmp6.OutTimeExcds = &value
|
||||||
case "OutParmProblems":
|
case "OutParmProblems":
|
||||||
procSnmp6.Icmp6.OutParmProblems = value
|
procSnmp6.Icmp6.OutParmProblems = &value
|
||||||
case "OutEchos":
|
case "OutEchos":
|
||||||
procSnmp6.Icmp6.OutEchos = value
|
procSnmp6.Icmp6.OutEchos = &value
|
||||||
case "OutEchoReplies":
|
case "OutEchoReplies":
|
||||||
procSnmp6.Icmp6.OutEchoReplies = value
|
procSnmp6.Icmp6.OutEchoReplies = &value
|
||||||
case "OutGroupMembQueries":
|
case "OutGroupMembQueries":
|
||||||
procSnmp6.Icmp6.OutGroupMembQueries = value
|
procSnmp6.Icmp6.OutGroupMembQueries = &value
|
||||||
case "OutGroupMembResponses":
|
case "OutGroupMembResponses":
|
||||||
procSnmp6.Icmp6.OutGroupMembResponses = value
|
procSnmp6.Icmp6.OutGroupMembResponses = &value
|
||||||
case "OutGroupMembReductions":
|
case "OutGroupMembReductions":
|
||||||
procSnmp6.Icmp6.OutGroupMembReductions = value
|
procSnmp6.Icmp6.OutGroupMembReductions = &value
|
||||||
case "OutRouterSolicits":
|
case "OutRouterSolicits":
|
||||||
procSnmp6.Icmp6.OutRouterSolicits = value
|
procSnmp6.Icmp6.OutRouterSolicits = &value
|
||||||
case "OutRouterAdvertisements":
|
case "OutRouterAdvertisements":
|
||||||
procSnmp6.Icmp6.OutRouterAdvertisements = value
|
procSnmp6.Icmp6.OutRouterAdvertisements = &value
|
||||||
case "OutNeighborSolicits":
|
case "OutNeighborSolicits":
|
||||||
procSnmp6.Icmp6.OutNeighborSolicits = value
|
procSnmp6.Icmp6.OutNeighborSolicits = &value
|
||||||
case "OutNeighborAdvertisements":
|
case "OutNeighborAdvertisements":
|
||||||
procSnmp6.Icmp6.OutNeighborAdvertisements = value
|
procSnmp6.Icmp6.OutNeighborAdvertisements = &value
|
||||||
case "OutRedirects":
|
case "OutRedirects":
|
||||||
procSnmp6.Icmp6.OutRedirects = value
|
procSnmp6.Icmp6.OutRedirects = &value
|
||||||
case "OutMLDv2Reports":
|
case "OutMLDv2Reports":
|
||||||
procSnmp6.Icmp6.OutMLDv2Reports = value
|
procSnmp6.Icmp6.OutMLDv2Reports = &value
|
||||||
case "InType1":
|
case "InType1":
|
||||||
procSnmp6.Icmp6.InType1 = value
|
procSnmp6.Icmp6.InType1 = &value
|
||||||
case "InType134":
|
case "InType134":
|
||||||
procSnmp6.Icmp6.InType134 = value
|
procSnmp6.Icmp6.InType134 = &value
|
||||||
case "InType135":
|
case "InType135":
|
||||||
procSnmp6.Icmp6.InType135 = value
|
procSnmp6.Icmp6.InType135 = &value
|
||||||
case "InType136":
|
case "InType136":
|
||||||
procSnmp6.Icmp6.InType136 = value
|
procSnmp6.Icmp6.InType136 = &value
|
||||||
case "InType143":
|
case "InType143":
|
||||||
procSnmp6.Icmp6.InType143 = value
|
procSnmp6.Icmp6.InType143 = &value
|
||||||
case "OutType133":
|
case "OutType133":
|
||||||
procSnmp6.Icmp6.OutType133 = value
|
procSnmp6.Icmp6.OutType133 = &value
|
||||||
case "OutType135":
|
case "OutType135":
|
||||||
procSnmp6.Icmp6.OutType135 = value
|
procSnmp6.Icmp6.OutType135 = &value
|
||||||
case "OutType136":
|
case "OutType136":
|
||||||
procSnmp6.Icmp6.OutType136 = value
|
procSnmp6.Icmp6.OutType136 = &value
|
||||||
case "OutType143":
|
case "OutType143":
|
||||||
procSnmp6.Icmp6.OutType143 = value
|
procSnmp6.Icmp6.OutType143 = &value
|
||||||
}
|
}
|
||||||
case "Udp6":
|
case "Udp6":
|
||||||
switch key {
|
switch key {
|
||||||
case "InDatagrams":
|
case "InDatagrams":
|
||||||
procSnmp6.Udp6.InDatagrams = value
|
procSnmp6.Udp6.InDatagrams = &value
|
||||||
case "NoPorts":
|
case "NoPorts":
|
||||||
procSnmp6.Udp6.NoPorts = value
|
procSnmp6.Udp6.NoPorts = &value
|
||||||
case "InErrors":
|
case "InErrors":
|
||||||
procSnmp6.Udp6.InErrors = value
|
procSnmp6.Udp6.InErrors = &value
|
||||||
case "OutDatagrams":
|
case "OutDatagrams":
|
||||||
procSnmp6.Udp6.OutDatagrams = value
|
procSnmp6.Udp6.OutDatagrams = &value
|
||||||
case "RcvbufErrors":
|
case "RcvbufErrors":
|
||||||
procSnmp6.Udp6.RcvbufErrors = value
|
procSnmp6.Udp6.RcvbufErrors = &value
|
||||||
case "SndbufErrors":
|
case "SndbufErrors":
|
||||||
procSnmp6.Udp6.SndbufErrors = value
|
procSnmp6.Udp6.SndbufErrors = &value
|
||||||
case "InCsumErrors":
|
case "InCsumErrors":
|
||||||
procSnmp6.Udp6.InCsumErrors = value
|
procSnmp6.Udp6.InCsumErrors = &value
|
||||||
case "IgnoredMulti":
|
case "IgnoredMulti":
|
||||||
procSnmp6.Udp6.IgnoredMulti = value
|
procSnmp6.Udp6.IgnoredMulti = &value
|
||||||
}
|
}
|
||||||
case "UdpLite6":
|
case "UdpLite6":
|
||||||
switch key {
|
switch key {
|
||||||
case "InDatagrams":
|
case "InDatagrams":
|
||||||
procSnmp6.UdpLite6.InDatagrams = value
|
procSnmp6.UdpLite6.InDatagrams = &value
|
||||||
case "NoPorts":
|
case "NoPorts":
|
||||||
procSnmp6.UdpLite6.NoPorts = value
|
procSnmp6.UdpLite6.NoPorts = &value
|
||||||
case "InErrors":
|
case "InErrors":
|
||||||
procSnmp6.UdpLite6.InErrors = value
|
procSnmp6.UdpLite6.InErrors = &value
|
||||||
case "OutDatagrams":
|
case "OutDatagrams":
|
||||||
procSnmp6.UdpLite6.OutDatagrams = value
|
procSnmp6.UdpLite6.OutDatagrams = &value
|
||||||
case "RcvbufErrors":
|
case "RcvbufErrors":
|
||||||
procSnmp6.UdpLite6.RcvbufErrors = value
|
procSnmp6.UdpLite6.RcvbufErrors = &value
|
||||||
case "SndbufErrors":
|
case "SndbufErrors":
|
||||||
procSnmp6.UdpLite6.SndbufErrors = value
|
procSnmp6.UdpLite6.SndbufErrors = &value
|
||||||
case "InCsumErrors":
|
case "InCsumErrors":
|
||||||
procSnmp6.UdpLite6.InCsumErrors = value
|
procSnmp6.UdpLite6.InCsumErrors = &value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,8 @@ type ProcStat struct {
|
||||||
RSS int
|
RSS int
|
||||||
// Soft limit in bytes on the rss of the process.
|
// Soft limit in bytes on the rss of the process.
|
||||||
RSSLimit uint64
|
RSSLimit uint64
|
||||||
|
// CPU number last executed on.
|
||||||
|
Processor uint
|
||||||
// Real-time scheduling priority, a number in the range 1 to 99 for processes
|
// Real-time scheduling priority, a number in the range 1 to 99 for processes
|
||||||
// scheduled under a real-time policy, or 0, for non-real-time processes.
|
// scheduled under a real-time policy, or 0, for non-real-time processes.
|
||||||
RTPriority uint
|
RTPriority uint
|
||||||
|
@ -184,7 +186,7 @@ func (p Proc) Stat() (ProcStat, error) {
|
||||||
&ignoreUint64,
|
&ignoreUint64,
|
||||||
&ignoreUint64,
|
&ignoreUint64,
|
||||||
&ignoreInt64,
|
&ignoreInt64,
|
||||||
&ignoreInt64,
|
&s.Processor,
|
||||||
&s.RTPriority,
|
&s.RTPriority,
|
||||||
&s.Policy,
|
&s.Policy,
|
||||||
&s.DelayAcctBlkIOTicks,
|
&s.DelayAcctBlkIOTicks,
|
||||||
|
|
|
@ -96,10 +96,10 @@ func (p Proc) NewStatus() (ProcStatus, error) {
|
||||||
kv := strings.SplitN(line, ":", 2)
|
kv := strings.SplitN(line, ":", 2)
|
||||||
|
|
||||||
// removes spaces
|
// removes spaces
|
||||||
k := string(strings.TrimSpace(kv[0]))
|
k := strings.TrimSpace(kv[0])
|
||||||
v := string(strings.TrimSpace(kv[1]))
|
v := strings.TrimSpace(kv[1])
|
||||||
// removes "kB"
|
// removes "kB"
|
||||||
v = string(bytes.Trim([]byte(v), " kB"))
|
v = strings.TrimSuffix(v, " kB")
|
||||||
|
|
||||||
// value to int when possible
|
// value to int when possible
|
||||||
// we can skip error check here, 'cause vKBytes is not used when value is a string
|
// we can skip error check here, 'cause vKBytes is not used when value is a string
|
||||||
|
|
|
@ -62,7 +62,7 @@ type Stat struct {
|
||||||
// Summed up cpu statistics.
|
// Summed up cpu statistics.
|
||||||
CPUTotal CPUStat
|
CPUTotal CPUStat
|
||||||
// Per-CPU statistics.
|
// Per-CPU statistics.
|
||||||
CPU []CPUStat
|
CPU map[int64]CPUStat
|
||||||
// Number of times interrupts were handled, which contains numbered and unnumbered IRQs.
|
// Number of times interrupts were handled, which contains numbered and unnumbered IRQs.
|
||||||
IRQTotal uint64
|
IRQTotal uint64
|
||||||
// Number of times a numbered IRQ was triggered.
|
// Number of times a numbered IRQ was triggered.
|
||||||
|
@ -170,10 +170,23 @@ func (fs FS) Stat() (Stat, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Stat{}, err
|
return Stat{}, err
|
||||||
}
|
}
|
||||||
|
procStat, err := parseStat(bytes.NewReader(data), fileName)
|
||||||
|
if err != nil {
|
||||||
|
return Stat{}, err
|
||||||
|
}
|
||||||
|
return procStat, nil
|
||||||
|
}
|
||||||
|
|
||||||
stat := Stat{}
|
// parseStat parses the metrics from /proc/[pid]/stat.
|
||||||
|
func parseStat(r io.Reader, fileName string) (Stat, error) {
|
||||||
|
var (
|
||||||
|
scanner = bufio.NewScanner(r)
|
||||||
|
stat = Stat{
|
||||||
|
CPU: make(map[int64]CPUStat),
|
||||||
|
}
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
scanner := bufio.NewScanner(bytes.NewReader(data))
|
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := scanner.Text()
|
line := scanner.Text()
|
||||||
parts := strings.Fields(scanner.Text())
|
parts := strings.Fields(scanner.Text())
|
||||||
|
@ -228,9 +241,6 @@ func (fs FS) Stat() (Stat, error) {
|
||||||
if cpuID == -1 {
|
if cpuID == -1 {
|
||||||
stat.CPUTotal = cpuStat
|
stat.CPUTotal = cpuStat
|
||||||
} else {
|
} else {
|
||||||
for int64(len(stat.CPU)) <= cpuID {
|
|
||||||
stat.CPU = append(stat.CPU, CPUStat{})
|
|
||||||
}
|
|
||||||
stat.CPU[cpuID] = cpuStat
|
stat.CPU[cpuID] = cpuStat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
// Copyright 2022 The Prometheus Authors
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package procfs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
fsi "github.com/prometheus/procfs/internal/fs"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Provide access to /proc/PID/task/TID files, for thread specific values. Since
|
||||||
|
// such files have the same structure as /proc/PID/ ones, the data structures
|
||||||
|
// and the parsers for the latter may be reused.
|
||||||
|
|
||||||
|
// AllThreads returns a list of all currently available threads under /proc/PID.
|
||||||
|
func AllThreads(pid int) (Procs, error) {
|
||||||
|
fs, err := NewFS(DefaultMountPoint)
|
||||||
|
if err != nil {
|
||||||
|
return Procs{}, err
|
||||||
|
}
|
||||||
|
return fs.AllThreads(pid)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllThreads returns a list of all currently available threads for PID.
|
||||||
|
func (fs FS) AllThreads(pid int) (Procs, error) {
|
||||||
|
taskPath := fs.proc.Path(strconv.Itoa(pid), "task")
|
||||||
|
d, err := os.Open(taskPath)
|
||||||
|
if err != nil {
|
||||||
|
return Procs{}, err
|
||||||
|
}
|
||||||
|
defer d.Close()
|
||||||
|
|
||||||
|
names, err := d.Readdirnames(-1)
|
||||||
|
if err != nil {
|
||||||
|
return Procs{}, fmt.Errorf("could not read %q: %w", d.Name(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t := Procs{}
|
||||||
|
for _, n := range names {
|
||||||
|
tid, err := strconv.ParseInt(n, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
t = append(t, Proc{PID: int(tid), fs: fsi.FS(taskPath)})
|
||||||
|
}
|
||||||
|
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Thread returns a process for a given PID, TID.
|
||||||
|
func (fs FS) Thread(pid, tid int) (Proc, error) {
|
||||||
|
taskPath := fs.proc.Path(strconv.Itoa(pid), "task")
|
||||||
|
if _, err := os.Stat(taskPath); err != nil {
|
||||||
|
return Proc{}, err
|
||||||
|
}
|
||||||
|
return Proc{PID: tid, fs: fsi.FS(taskPath)}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Thread returns a process for a given TID of Proc.
|
||||||
|
func (proc Proc) Thread(tid int) (Proc, error) {
|
||||||
|
tfs := fsi.FS(proc.path("task"))
|
||||||
|
if _, err := os.Stat(tfs.Path(strconv.Itoa(tid))); err != nil {
|
||||||
|
return Proc{}, err
|
||||||
|
}
|
||||||
|
return Proc{PID: tid, fs: tfs}, nil
|
||||||
|
}
|
|
@ -26,7 +26,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// The VM interface is described at
|
// The VM interface is described at
|
||||||
// https://www.kernel.org/doc/Documentation/sysctl/vm.txt
|
//
|
||||||
|
// https://www.kernel.org/doc/Documentation/sysctl/vm.txt
|
||||||
|
//
|
||||||
// Each setting is exposed as a single file.
|
// Each setting is exposed as a single file.
|
||||||
// Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array
|
// Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array
|
||||||
// and numa_zonelist_order (deprecated) which is a string.
|
// and numa_zonelist_order (deprecated) which is a string.
|
||||||
|
|
|
@ -222,8 +222,8 @@ github.com/prometheus/client_model/go
|
||||||
github.com/prometheus/common/expfmt
|
github.com/prometheus/common/expfmt
|
||||||
github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
|
github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
|
||||||
github.com/prometheus/common/model
|
github.com/prometheus/common/model
|
||||||
# github.com/prometheus/procfs v0.8.0
|
# github.com/prometheus/procfs v0.9.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.18
|
||||||
github.com/prometheus/procfs
|
github.com/prometheus/procfs
|
||||||
github.com/prometheus/procfs/internal/fs
|
github.com/prometheus/procfs/internal/fs
|
||||||
github.com/prometheus/procfs/internal/util
|
github.com/prometheus/procfs/internal/util
|
||||||
|
|
Loading…
Reference in New Issue