Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
e393c3af3f
commit
4978089aab
4963 changed files with 677545 additions and 0 deletions
115
plugins/inputs/kernel/README.md
Normal file
115
plugins/inputs/kernel/README.md
Normal file
|
@ -0,0 +1,115 @@
|
|||
# Kernel Input Plugin
|
||||
|
||||
This plugin gathers metrics about the [Linux kernel][kernel] including, among
|
||||
others, the [available entropy][entropy], [Kernel Samepage Merging][ksm] and
|
||||
[Pressure Stall Information][psi].
|
||||
|
||||
⭐ Telegraf v0.11.0
|
||||
🏷️ system
|
||||
💻 linux
|
||||
|
||||
[kernel]: https://kernel.org/
|
||||
[entropy]: https://www.kernel.org/doc/html/latest/admin-guide/sysctl/kernel.html#random
|
||||
[ksm]: https://www.kernel.org/doc/html/latest/mm/ksm.html
|
||||
[psi]: https://www.kernel.org/doc/html/latest/accounting/psi.html
|
||||
|
||||
## Global configuration options <!-- @/docs/includes/plugin_config.md -->
|
||||
|
||||
In addition to the plugin-specific configuration settings, plugins support
|
||||
additional global and plugin configuration settings. These settings are used to
|
||||
modify metrics, tags, and field or create aliases and configure ordering, etc.
|
||||
See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||
|
||||
[CONFIGURATION.md]: ../../../docs/CONFIGURATION.md#plugins
|
||||
|
||||
## Configuration
|
||||
|
||||
```toml @sample.conf
|
||||
# Plugin to collect various Linux kernel statistics.
|
||||
# This plugin ONLY supports Linux
|
||||
[[inputs.kernel]]
|
||||
## Additional gather options
|
||||
## Possible options include:
|
||||
## * ksm - kernel same-page merging
|
||||
## * psi - pressure stall information
|
||||
# collect = []
|
||||
```
|
||||
|
||||
Please check the documentation of the underlying kernel interfaces in the
|
||||
`/proc/stat` section of the [proc man page][man_proc], as well as in the
|
||||
`/proc interfaces` section of the [random man page][man_random].
|
||||
|
||||
Kernel Samepage Merging is generally documented in the
|
||||
[kernel documentation][ksm] and the available metrics exposed via sysfs
|
||||
are documented in the [admin guide][ksm_admin].
|
||||
|
||||
Pressure Stall Information is exposed through `/proc/pressure` and is documented
|
||||
in [kernel documentation][psi]. Kernel version 4.20+ is required.
|
||||
|
||||
[ksm_admin]: https://www.kernel.org/doc/html/latest/admin-guide/mm/ksm.html#ksm-daemon-sysfs-interface
|
||||
[man_proc]: http://man7.org/linux/man-pages/man5/proc.5.html
|
||||
[man_random]: https://man7.org/linux/man-pages/man4/random.4.html
|
||||
|
||||
## Metrics
|
||||
|
||||
- kernel
|
||||
- boot_time (integer, seconds since epoch, `btime`)
|
||||
- context_switches (integer, `ctxt`)
|
||||
- disk_pages_in (integer, `page (0)`)
|
||||
- disk_pages_out (integer, `page (1)`)
|
||||
- interrupts (integer, `intr`)
|
||||
- processes_forked (integer, `processes`)
|
||||
- entropy_avail (integer, `entropy_available`)
|
||||
- ksm_full_scans (integer, how many times all mergeable areas have been scanned, `full_scans`)
|
||||
- ksm_max_page_sharing (integer, maximum sharing allowed for each KSM page, `max_page_sharing`)
|
||||
- ksm_merge_across_nodes (integer, whether pages should be merged across NUMA nodes, `merge_across_nodes`)
|
||||
- ksm_pages_shared (integer, how many shared pages are being used, `pages_shared`)
|
||||
- ksm_pages_sharing (integer,how many more sites are sharing them , `pages_sharing`)
|
||||
- ksm_pages_to_scan (integer, how many pages to scan before ksmd goes to sleep, `pages_to_scan`)
|
||||
- ksm_pages_unshared (integer, how many pages unique but repeatedly checked for merging, `pages_unshared`)
|
||||
- ksm_pages_volatile (integer, how many pages changing too fast to be placed in a tree, `pages_volatile`)
|
||||
- ksm_run (integer, whether ksm is running or not, `run`)
|
||||
- ksm_sleep_millisecs (integer, how many milliseconds ksmd should sleep between scans, `sleep_millisecs`)
|
||||
- ksm_stable_node_chains (integer, the number of KSM pages that hit the max_page_sharing limit, `stable_node_chains`)
|
||||
- ksm_stable_node_chains_prune_millisecs (integer, how frequently KSM checks the metadata of the pages that hit the deduplication limit, `stable_node_chains_prune_millisecs`)
|
||||
- ksm_stable_node_dups (integer, number of duplicated KSM pages, `stable_node_dups`)
|
||||
- ksm_use_zero_pages (integer, whether empty pages should be treated specially, `use_zero_pages`)
|
||||
|
||||
- pressure (if `psi` is included in `collect`)
|
||||
- tags:
|
||||
- resource: cpu, memory, or io
|
||||
- type: some or full
|
||||
- floating-point fields: avg10, avg60, avg300
|
||||
- integer fields: total
|
||||
|
||||
## Example Output
|
||||
|
||||
Default config:
|
||||
|
||||
```text
|
||||
kernel boot_time=1690487872i,context_switches=321398652i,entropy_avail=256i,interrupts=141868628i,processes_forked=946492i 1691339564000000000
|
||||
```
|
||||
|
||||
If `ksm` is included in `collect`:
|
||||
|
||||
```text
|
||||
kernel boot_time=1690487872i,context_switches=321252729i,entropy_avail=256i,interrupts=141783427i,ksm_full_scans=0i,ksm_max_page_sharing=256i,ksm_merge_across_nodes=1i,ksm_pages_shared=0i,ksm_pages_sharing=0i,ksm_pages_to_scan=100i,ksm_pages_unshared=0i,ksm_pages_volatile=0i,ksm_run=0i,ksm_sleep_millisecs=20i,ksm_stable_node_chains=0i,ksm_stable_node_chains_prune_millisecs=2000i,ksm_stable_node_dups=0i,ksm_use_zero_pages=0i,processes_forked=946467i 1691339522000000000
|
||||
```
|
||||
|
||||
If `psi` is included in `collect`:
|
||||
|
||||
```text
|
||||
pressure,resource=cpu,type=some avg10=1.53,avg60=1.87,avg300=1.73 1700000000000000000
|
||||
pressure,resource=memory,type=some avg10=0.00,avg60=0.00,avg300=0.00 1700000000000000000
|
||||
pressure,resource=memory,type=full avg10=0.00,avg60=0.00,avg300=0.00 1700000000000000000
|
||||
pressure,resource=io,type=some avg10=0.0,avg60=0.0,avg300=0.0 1700000000000000000
|
||||
pressure,resource=io,type=full avg10=0.0,avg60=0.0,avg300=0.0 1700000000000000000
|
||||
pressure,resource=cpu,type=some total=1088168194i 1700000000000000000
|
||||
pressure,resource=memory,type=some total=3463792i 1700000000000000000
|
||||
pressure,resource=memory,type=full total=1429641i 1700000000000000000
|
||||
pressure,resource=io,type=some total=68568296i 1700000000000000000
|
||||
pressure,resource=io,type=full total=54982338i 1700000000000000000
|
||||
```
|
||||
|
||||
Note that the combination for `resource=cpu,type=full` is omitted because it is
|
||||
always zero.
|
207
plugins/inputs/kernel/kernel.go
Normal file
207
plugins/inputs/kernel/kernel.go
Normal file
|
@ -0,0 +1,207 @@
|
|||
//go:generate ../../../tools/readme_config_includer/generator
|
||||
//go:build linux
|
||||
|
||||
package kernel
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
_ "embed"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
|
||||
"github.com/prometheus/procfs"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/plugins/inputs"
|
||||
)
|
||||
|
||||
//go:embed sample.conf
|
||||
var sampleConfig string
|
||||
|
||||
// /proc/stat file line prefixes to gather stats on:
|
||||
var (
|
||||
interrupts = []byte("intr")
|
||||
contextSwitches = []byte("ctxt")
|
||||
processesForked = []byte("processes")
|
||||
diskPages = []byte("page")
|
||||
bootTime = []byte("btime")
|
||||
)
|
||||
|
||||
type Kernel struct {
|
||||
ConfigCollect []string `toml:"collect"`
|
||||
|
||||
optCollect map[string]bool
|
||||
statFile string
|
||||
entropyStatFile string
|
||||
ksmStatsDir string
|
||||
psiDir string
|
||||
procfs procfs.FS
|
||||
}
|
||||
|
||||
func (*Kernel) SampleConfig() string {
|
||||
return sampleConfig
|
||||
}
|
||||
|
||||
func (k *Kernel) Init() error {
|
||||
k.optCollect = make(map[string]bool, len(k.ConfigCollect))
|
||||
for _, v := range k.ConfigCollect {
|
||||
k.optCollect[v] = true
|
||||
}
|
||||
|
||||
if k.optCollect["ksm"] {
|
||||
if _, err := os.Stat(k.ksmStatsDir); os.IsNotExist(err) {
|
||||
// ksm probably not enabled in the kernel, bail out early
|
||||
return fmt.Errorf("directory %q does not exist. KSM is not enabled in this kernel", k.ksmStatsDir)
|
||||
}
|
||||
}
|
||||
if k.optCollect["psi"] {
|
||||
procdir := filepath.Dir(k.psiDir)
|
||||
var err error
|
||||
if k.procfs, err = procfs.NewFS(procdir); err != nil {
|
||||
// psi probably not supported in the kernel, bail out early
|
||||
return fmt.Errorf("failed to initialize procfs on %s: %w", procdir, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k *Kernel) Gather(acc telegraf.Accumulator) error {
|
||||
data, err := getProcValueBytes(k.statFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
entropyValue, err := getProcValueInt(k.entropyStatFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fields := make(map[string]interface{})
|
||||
|
||||
fields["entropy_avail"] = entropyValue
|
||||
|
||||
dataFields := bytes.Fields(data)
|
||||
for i, field := range dataFields {
|
||||
switch {
|
||||
case bytes.Equal(field, interrupts):
|
||||
m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields["interrupts"] = m
|
||||
case bytes.Equal(field, contextSwitches):
|
||||
m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields["context_switches"] = m
|
||||
case bytes.Equal(field, processesForked):
|
||||
m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields["processes_forked"] = m
|
||||
case bytes.Equal(field, bootTime):
|
||||
m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields["boot_time"] = m
|
||||
case bytes.Equal(field, diskPages):
|
||||
in, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
out, err := strconv.ParseInt(string(dataFields[i+2]), 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields["disk_pages_in"] = in
|
||||
fields["disk_pages_out"] = out
|
||||
}
|
||||
}
|
||||
|
||||
if k.optCollect["ksm"] {
|
||||
stats := []string{
|
||||
"full_scans", "max_page_sharing",
|
||||
"merge_across_nodes", "pages_shared",
|
||||
"pages_sharing", "pages_to_scan",
|
||||
"pages_unshared", "pages_volatile",
|
||||
"run", "sleep_millisecs",
|
||||
"stable_node_chains", "stable_node_chains_prune_millisecs",
|
||||
"stable_node_dups", "use_zero_pages",
|
||||
}
|
||||
// these exist in very recent Linux versions only, but useful to include if there.
|
||||
extraStats := []string{"general_profit"}
|
||||
|
||||
for _, f := range stats {
|
||||
m, err := getProcValueInt(filepath.Join(k.ksmStatsDir, f))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fields["ksm_"+f] = m
|
||||
}
|
||||
|
||||
for _, f := range extraStats {
|
||||
m, err := getProcValueInt(filepath.Join(k.ksmStatsDir, f))
|
||||
if err != nil {
|
||||
// if an extraStats metric doesn't exist in our kernel version, ignore it.
|
||||
continue
|
||||
}
|
||||
|
||||
fields["ksm_"+f] = m
|
||||
}
|
||||
}
|
||||
acc.AddCounter("kernel", fields, make(map[string]string))
|
||||
|
||||
if k.optCollect["psi"] {
|
||||
if err := k.gatherPressure(acc); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func getProcValueBytes(path string) ([]byte, error) {
|
||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||
return nil, fmt.Errorf("path %q does not exist", path)
|
||||
} else if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to read from %q: %w", path, err)
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func getProcValueInt(path string) (int64, error) {
|
||||
data, err := getProcValueBytes(path)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
|
||||
m, err := strconv.ParseInt(string(bytes.TrimSpace(data)), 10, 64)
|
||||
if err != nil {
|
||||
return -1, fmt.Errorf("failed to parse %q as an integer: %w", data, err)
|
||||
}
|
||||
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
inputs.Add("kernel", func() telegraf.Input {
|
||||
return &Kernel{
|
||||
statFile: "/proc/stat",
|
||||
entropyStatFile: "/proc/sys/kernel/random/entropy_avail",
|
||||
ksmStatsDir: "/sys/kernel/mm/ksm",
|
||||
psiDir: "/proc/pressure",
|
||||
}
|
||||
})
|
||||
}
|
33
plugins/inputs/kernel/kernel_notlinux.go
Normal file
33
plugins/inputs/kernel/kernel_notlinux.go
Normal file
|
@ -0,0 +1,33 @@
|
|||
//go:generate ../../../tools/readme_config_includer/generator
|
||||
//go:build !linux
|
||||
|
||||
package kernel
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/plugins/inputs"
|
||||
)
|
||||
|
||||
//go:embed sample.conf
|
||||
var sampleConfig string
|
||||
|
||||
type Kernel struct {
|
||||
Log telegraf.Logger `toml:"-"`
|
||||
}
|
||||
|
||||
func (*Kernel) SampleConfig() string { return sampleConfig }
|
||||
|
||||
func (k *Kernel) Init() error {
|
||||
k.Log.Warn("Current platform is not supported")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*Kernel) Gather(_ telegraf.Accumulator) error { return nil }
|
||||
|
||||
func init() {
|
||||
inputs.Add("kernel", func() telegraf.Input {
|
||||
return &Kernel{}
|
||||
})
|
||||
}
|
208
plugins/inputs/kernel/kernel_test.go
Normal file
208
plugins/inputs/kernel/kernel_test.go
Normal file
|
@ -0,0 +1,208 @@
|
|||
//go:build linux
|
||||
|
||||
package kernel
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/metric"
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
)
|
||||
|
||||
func TestGetProcValueInt(t *testing.T) {
|
||||
d, err := getProcValueInt("testdata/entropy_stat_file_full")
|
||||
require.NoError(t, err)
|
||||
require.IsType(t, int64(1), d)
|
||||
}
|
||||
|
||||
func TestGetProcValueByte(t *testing.T) {
|
||||
d, err := getProcValueBytes("testdata/entropy_stat_file_full")
|
||||
require.NoError(t, err)
|
||||
require.IsType(t, []byte("test"), d)
|
||||
}
|
||||
|
||||
func TestFullProcFile(t *testing.T) {
|
||||
k := Kernel{
|
||||
statFile: "testdata/stat_file_full",
|
||||
entropyStatFile: "testdata/entropy_stat_file_full",
|
||||
}
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
require.NoError(t, k.Gather(&acc))
|
||||
|
||||
expected := []telegraf.Metric{
|
||||
metric.New(
|
||||
"kernel",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"boot_time": int64(1457505775),
|
||||
"context_switches": int64(2626618),
|
||||
"disk_pages_in": int64(5741),
|
||||
"disk_pages_out": int64(1808),
|
||||
"interrupts": int64(1472736),
|
||||
"processes_forked": int64(10673),
|
||||
"entropy_avail": int64(1024),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
1,
|
||||
),
|
||||
}
|
||||
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics(), testutil.IgnoreTime())
|
||||
}
|
||||
|
||||
func TestPartialProcFile(t *testing.T) {
|
||||
k := Kernel{
|
||||
statFile: "testdata/stat_file_partial",
|
||||
entropyStatFile: "testdata/entropy_stat_file_partial",
|
||||
}
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
require.NoError(t, k.Gather(&acc))
|
||||
|
||||
fields := map[string]interface{}{
|
||||
"boot_time": int64(1457505775),
|
||||
"context_switches": int64(2626618),
|
||||
"disk_pages_in": int64(5741),
|
||||
"disk_pages_out": int64(1808),
|
||||
"interrupts": int64(1472736),
|
||||
"entropy_avail": int64(1024),
|
||||
}
|
||||
acc.AssertContainsFields(t, "kernel", fields)
|
||||
}
|
||||
|
||||
func TestInvalidProcFile1(t *testing.T) {
|
||||
// missing btime measurement
|
||||
k := Kernel{
|
||||
statFile: "testdata/stat_file_invalid",
|
||||
entropyStatFile: "testdata/entropy_stat_file_invalid",
|
||||
}
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
err := k.Gather(&acc)
|
||||
require.Error(t, err)
|
||||
require.Contains(t, err.Error(), "invalid syntax")
|
||||
}
|
||||
|
||||
func TestInvalidProcFile2(t *testing.T) {
|
||||
// missing second page measurement
|
||||
k := Kernel{
|
||||
statFile: "testdata/stat_file_invalid2",
|
||||
}
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
err := k.Gather(&acc)
|
||||
require.Error(t, err)
|
||||
require.Contains(t, err.Error(), "does not exist")
|
||||
}
|
||||
|
||||
func TestNoProcFile(t *testing.T) {
|
||||
k := Kernel{
|
||||
statFile: "testdata/this_file_does_not_exist",
|
||||
}
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
err := k.Gather(&acc)
|
||||
require.Error(t, err)
|
||||
require.Contains(t, err.Error(), "does not exist")
|
||||
}
|
||||
|
||||
func TestInvalidCollectOption(t *testing.T) {
|
||||
k := Kernel{
|
||||
statFile: "testdata/stat_file_full",
|
||||
entropyStatFile: "testdata/entropy_stat_file_full",
|
||||
ConfigCollect: []string{"invalidOption"},
|
||||
}
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
|
||||
require.NoError(t, k.Init())
|
||||
require.NoError(t, k.Gather(&acc))
|
||||
}
|
||||
|
||||
func TestKsmEnabledValidKsmDirectory(t *testing.T) {
|
||||
k := Kernel{
|
||||
statFile: "testdata/stat_file_full",
|
||||
entropyStatFile: "testdata/entropy_stat_file_full",
|
||||
ksmStatsDir: "testdata/ksm/valid",
|
||||
ConfigCollect: []string{"ksm"},
|
||||
}
|
||||
|
||||
require.NoError(t, k.Init())
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
require.NoError(t, k.Gather(&acc))
|
||||
|
||||
expected := []telegraf.Metric{
|
||||
metric.New(
|
||||
"kernel",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"boot_time": int64(1457505775),
|
||||
"context_switches": int64(2626618),
|
||||
"disk_pages_in": int64(5741),
|
||||
"disk_pages_out": int64(1808),
|
||||
"interrupts": int64(1472736),
|
||||
"processes_forked": int64(10673),
|
||||
"entropy_avail": int64(1024),
|
||||
"ksm_full_scans": int64(123),
|
||||
"ksm_max_page_sharing": int64(10000),
|
||||
"ksm_merge_across_nodes": int64(1),
|
||||
"ksm_pages_shared": int64(12922),
|
||||
"ksm_pages_sharing": int64(28384),
|
||||
"ksm_pages_to_scan": int64(12928),
|
||||
"ksm_pages_unshared": int64(92847),
|
||||
"ksm_pages_volatile": int64(2824171),
|
||||
"ksm_run": int64(1),
|
||||
"ksm_sleep_millisecs": int64(1000),
|
||||
"ksm_stable_node_chains": int64(0),
|
||||
"ksm_stable_node_chains_prune_millisecs": int64(0),
|
||||
"ksm_stable_node_dups": int64(0),
|
||||
"ksm_use_zero_pages": int64(1),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
1,
|
||||
),
|
||||
}
|
||||
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics(), testutil.IgnoreTime())
|
||||
}
|
||||
|
||||
func TestKSMEnabledMissingFile(t *testing.T) {
|
||||
k := Kernel{
|
||||
statFile: "/proc/stat",
|
||||
entropyStatFile: "/proc/sys/kernel/random/entropy_avail",
|
||||
ksmStatsDir: "testdata/ksm/missing",
|
||||
ConfigCollect: []string{"ksm"},
|
||||
}
|
||||
|
||||
require.NoError(t, k.Init())
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
require.ErrorContains(t, k.Gather(&acc), "does not exist")
|
||||
}
|
||||
|
||||
func TestKSMEnabledWrongDir(t *testing.T) {
|
||||
k := Kernel{
|
||||
ksmStatsDir: "testdata/this_file_does_not_exist",
|
||||
ConfigCollect: []string{"ksm"},
|
||||
}
|
||||
|
||||
require.ErrorContains(t, k.Init(), "KSM is not enabled in this kernel")
|
||||
}
|
||||
|
||||
func TestKSMDisabledNoKSMTags(t *testing.T) {
|
||||
k := Kernel{
|
||||
statFile: "testdata/stat_file_full",
|
||||
entropyStatFile: "testdata/entropy_stat_file_full",
|
||||
ksmStatsDir: "testdata/this_file_does_not_exist",
|
||||
}
|
||||
|
||||
acc := testutil.Accumulator{}
|
||||
|
||||
require.NoError(t, k.Init())
|
||||
require.NoError(t, k.Gather(&acc))
|
||||
require.False(t, acc.HasField("kernel", "ksm_run"))
|
||||
}
|
51
plugins/inputs/kernel/psi.go
Normal file
51
plugins/inputs/kernel/psi.go
Normal file
|
@ -0,0 +1,51 @@
|
|||
//go:build linux
|
||||
|
||||
package kernel
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/procfs"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
)
|
||||
|
||||
// Gather PSI metrics
|
||||
func (k *Kernel) gatherPressure(acc telegraf.Accumulator) error {
|
||||
for _, resource := range []string{"cpu", "memory", "io"} {
|
||||
now := time.Now()
|
||||
psiStats, err := k.procfs.PSIStatsForResource(resource)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read %s pressure: %w", resource, err)
|
||||
}
|
||||
|
||||
stats := map[string]*procfs.PSILine{
|
||||
"some": psiStats.Some,
|
||||
"full": psiStats.Full,
|
||||
}
|
||||
|
||||
for _, typ := range []string{"some", "full"} {
|
||||
if resource == "cpu" && typ == "full" {
|
||||
// resource=cpu,type=full is omitted because it is always zero
|
||||
continue
|
||||
}
|
||||
|
||||
tags := map[string]string{
|
||||
"resource": resource,
|
||||
"type": typ,
|
||||
}
|
||||
stat := stats[typ]
|
||||
|
||||
acc.AddCounter("pressure", map[string]interface{}{
|
||||
"total": stat.Total,
|
||||
}, tags, now)
|
||||
acc.AddGauge("pressure", map[string]interface{}{
|
||||
"avg10": stat.Avg10,
|
||||
"avg60": stat.Avg60,
|
||||
"avg300": stat.Avg300,
|
||||
}, tags, now)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
170
plugins/inputs/kernel/psi_test.go
Normal file
170
plugins/inputs/kernel/psi_test.go
Normal file
|
@ -0,0 +1,170 @@
|
|||
//go:build linux
|
||||
|
||||
package kernel
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/metric"
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
)
|
||||
|
||||
func TestPSIEnabledWrongDir(t *testing.T) {
|
||||
k := Kernel{
|
||||
psiDir: "testdata/this_directory_does_not_exist/stub",
|
||||
ConfigCollect: []string{"psi"},
|
||||
}
|
||||
|
||||
require.ErrorContains(t, k.Init(), "failed to initialize procfs on ")
|
||||
}
|
||||
|
||||
func TestPSIStats(t *testing.T) {
|
||||
k := Kernel{
|
||||
psiDir: "testdata/pressure",
|
||||
ConfigCollect: []string{"psi"},
|
||||
}
|
||||
require.NoError(t, k.Init())
|
||||
|
||||
var acc testutil.Accumulator
|
||||
require.NoError(t, k.gatherPressure(&acc))
|
||||
|
||||
expected := []telegraf.Metric{
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "cpu",
|
||||
"type": "some",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"avg10": float64(10),
|
||||
"avg60": float64(60),
|
||||
"avg300": float64(300),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Gauge,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "cpu",
|
||||
"type": "some",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"total": uint64(114514),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Counter,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "memory",
|
||||
"type": "some",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"avg10": float64(10),
|
||||
"avg60": float64(60),
|
||||
"avg300": float64(300),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Gauge,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "memory",
|
||||
"type": "some",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"total": uint64(114514),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Counter,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "io",
|
||||
"type": "some",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"avg10": float64(10),
|
||||
"avg60": float64(60),
|
||||
"avg300": float64(300),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Gauge,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "io",
|
||||
"type": "some",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"total": uint64(114514),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Counter,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "memory",
|
||||
"type": "full",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"avg10": float64(1),
|
||||
"avg60": float64(6),
|
||||
"avg300": float64(30),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Gauge,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "memory",
|
||||
"type": "full",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"total": uint64(11451),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Counter,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "io",
|
||||
"type": "full",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"avg10": float64(1),
|
||||
"avg60": float64(6),
|
||||
"avg300": float64(30),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Gauge,
|
||||
),
|
||||
metric.New(
|
||||
"pressure",
|
||||
map[string]string{
|
||||
"resource": "io",
|
||||
"type": "full",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"total": uint64(11451),
|
||||
},
|
||||
time.Unix(0, 0),
|
||||
telegraf.Counter,
|
||||
),
|
||||
}
|
||||
|
||||
actual := acc.GetTelegrafMetrics()
|
||||
testutil.RequireMetricsEqual(t, expected, actual, testutil.IgnoreTime(), testutil.SortMetrics())
|
||||
}
|
8
plugins/inputs/kernel/sample.conf
Normal file
8
plugins/inputs/kernel/sample.conf
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Plugin to collect various Linux kernel statistics.
|
||||
# This plugin ONLY supports Linux
|
||||
[[inputs.kernel]]
|
||||
## Additional gather options
|
||||
## Possible options include:
|
||||
## * ksm - kernel same-page merging
|
||||
## * psi - pressure stall information
|
||||
# collect = []
|
1
plugins/inputs/kernel/testdata/entropy_stat_file_full
vendored
Normal file
1
plugins/inputs/kernel/testdata/entropy_stat_file_full
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1024
|
0
plugins/inputs/kernel/testdata/entropy_stat_file_invalid
vendored
Normal file
0
plugins/inputs/kernel/testdata/entropy_stat_file_invalid
vendored
Normal file
1
plugins/inputs/kernel/testdata/entropy_stat_file_partial
vendored
Normal file
1
plugins/inputs/kernel/testdata/entropy_stat_file_partial
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1024
|
1
plugins/inputs/kernel/testdata/ksm/invalid/full_scans
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/full_scans
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
123A
|
1
plugins/inputs/kernel/testdata/ksm/invalid/max_page_sharing
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/max_page_sharing
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
10000
|
1
plugins/inputs/kernel/testdata/ksm/invalid/merge_across_nodes
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/merge_across_nodes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_shared
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_shared
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
12922
|
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_sharing
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_sharing
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
28384
|
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_to_scan
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_to_scan
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
12928
|
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_unshared
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_unshared
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
92847
|
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_volatile
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/pages_volatile
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
2824171
|
1
plugins/inputs/kernel/testdata/ksm/invalid/run
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/run
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
1
plugins/inputs/kernel/testdata/ksm/invalid/sleep_millisecs
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/sleep_millisecs
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1000
|
1
plugins/inputs/kernel/testdata/ksm/invalid/stable_node_chains
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/stable_node_chains
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/invalid/stable_node_chains_prune_millisecs
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/stable_node_chains_prune_millisecs
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/invalid/stable_node_dups
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/stable_node_dups
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/invalid/use_zero_pages
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/invalid/use_zero_pages
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
1
plugins/inputs/kernel/testdata/ksm/missing/full_scans
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/full_scans
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
123
|
1
plugins/inputs/kernel/testdata/ksm/missing/max_page_sharing
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/max_page_sharing
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
10000
|
1
plugins/inputs/kernel/testdata/ksm/missing/merge_across_nodes
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/merge_across_nodes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
1
plugins/inputs/kernel/testdata/ksm/missing/pages_shared
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/pages_shared
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
12922
|
1
plugins/inputs/kernel/testdata/ksm/missing/pages_sharing
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/pages_sharing
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
28384
|
1
plugins/inputs/kernel/testdata/ksm/missing/pages_to_scan
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/pages_to_scan
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
12928
|
1
plugins/inputs/kernel/testdata/ksm/missing/pages_unshared
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/pages_unshared
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
92847
|
1
plugins/inputs/kernel/testdata/ksm/missing/pages_volatile
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/pages_volatile
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
2824171
|
1
plugins/inputs/kernel/testdata/ksm/missing/sleep_millisecs
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/sleep_millisecs
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1000
|
1
plugins/inputs/kernel/testdata/ksm/missing/stable_node_chains
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/stable_node_chains
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/missing/stable_node_chains_prune_millisecs
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/stable_node_chains_prune_millisecs
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/missing/stable_node_dups
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/stable_node_dups
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/missing/use_zero_pages
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/missing/use_zero_pages
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
1
plugins/inputs/kernel/testdata/ksm/valid/full_scans
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/full_scans
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
123
|
1
plugins/inputs/kernel/testdata/ksm/valid/max_page_sharing
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/max_page_sharing
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
10000
|
1
plugins/inputs/kernel/testdata/ksm/valid/merge_across_nodes
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/merge_across_nodes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
1
plugins/inputs/kernel/testdata/ksm/valid/pages_shared
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/pages_shared
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
12922
|
1
plugins/inputs/kernel/testdata/ksm/valid/pages_sharing
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/pages_sharing
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
28384
|
1
plugins/inputs/kernel/testdata/ksm/valid/pages_to_scan
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/pages_to_scan
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
12928
|
1
plugins/inputs/kernel/testdata/ksm/valid/pages_unshared
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/pages_unshared
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
92847
|
1
plugins/inputs/kernel/testdata/ksm/valid/pages_volatile
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/pages_volatile
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
2824171
|
1
plugins/inputs/kernel/testdata/ksm/valid/run
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/run
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
1
plugins/inputs/kernel/testdata/ksm/valid/sleep_millisecs
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/sleep_millisecs
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1000
|
1
plugins/inputs/kernel/testdata/ksm/valid/stable_node_chains
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/stable_node_chains
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/valid/stable_node_chains_prune_millisecs
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/stable_node_chains_prune_millisecs
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/valid/stable_node_dups
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/stable_node_dups
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
0
|
1
plugins/inputs/kernel/testdata/ksm/valid/use_zero_pages
vendored
Normal file
1
plugins/inputs/kernel/testdata/ksm/valid/use_zero_pages
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
2
plugins/inputs/kernel/testdata/pressure/cpu
vendored
Normal file
2
plugins/inputs/kernel/testdata/pressure/cpu
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
some avg10=10.00 avg60=60.00 avg300=300.00 total=114514
|
||||
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
|
2
plugins/inputs/kernel/testdata/pressure/io
vendored
Normal file
2
plugins/inputs/kernel/testdata/pressure/io
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
some avg10=10.00 avg60=60.00 avg300=300.00 total=114514
|
||||
full avg10=1.00 avg60=6.00 avg300=30.00 total=11451
|
2
plugins/inputs/kernel/testdata/pressure/memory
vendored
Normal file
2
plugins/inputs/kernel/testdata/pressure/memory
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
some avg10=10.00 avg60=60.00 avg300=300.00 total=114514
|
||||
full avg10=1.00 avg60=6.00 avg300=30.00 total=11451
|
12
plugins/inputs/kernel/testdata/stat_file_full
vendored
Normal file
12
plugins/inputs/kernel/testdata/stat_file_full
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
cpu 6796 252 5655 10444977 175 0 101 0 0 0
|
||||
cpu0 6796 252 5655 10444977 175 0 101 0 0 0
|
||||
intr 1472736 57 10 0 0 0 0 0 0 0 0 0 0 156 0 0 0 0 0 0 111551 42541 12356 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
ctxt 2626618
|
||||
btime 1457505775
|
||||
processes 10673
|
||||
procs_running 2
|
||||
procs_blocked 0
|
||||
softirq 1031662 0 649485 20946 111071 11620 0 1 0 994 237545
|
||||
page 5741 1808
|
||||
swap 1 0
|
||||
entropy_avail 1024
|
12
plugins/inputs/kernel/testdata/stat_file_invalid
vendored
Normal file
12
plugins/inputs/kernel/testdata/stat_file_invalid
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
cpu 6796 252 5655 10444977 175 0 101 0 0 0
|
||||
cpu0 6796 252 5655 10444977 175 0 101 0 0 0
|
||||
intr 1472736 57 10 0 0 0 0 0 0 0 0 0 0 156 0 0 0 0 0 0 111551 42541 12356 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
ctxt 2626618
|
||||
btime
|
||||
processes 10673
|
||||
procs_running 2
|
||||
procs_blocked 0
|
||||
softirq 1031662 0 649485 20946 111071 11620 0 1 0 994 237545
|
||||
page 5741 1808
|
||||
swap 1 0
|
||||
entropy_avail 1024
|
10
plugins/inputs/kernel/testdata/stat_file_invalid2
vendored
Normal file
10
plugins/inputs/kernel/testdata/stat_file_invalid2
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
cpu 6796 252 5655 10444977 175 0 101 0 0 0
|
||||
cpu0 6796 252 5655 10444977 175 0 101 0 0 0
|
||||
intr 1472736 57 10 0 0 0 0 0 0 0 0 0 0 156 0 0 0 0 0 0 111551 42541 12356 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
ctxt 2626618
|
||||
processes 10673
|
||||
procs_running 2
|
||||
page 5741
|
||||
procs_blocked 0
|
||||
softirq 1031662 0 649485 20946 111071 11620 0 1 0 994 237545
|
||||
entropy_avail 1024 2048
|
9
plugins/inputs/kernel/testdata/stat_file_partial
vendored
Normal file
9
plugins/inputs/kernel/testdata/stat_file_partial
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
cpu 6796 252 5655 10444977 175 0 101 0 0 0
|
||||
cpu0 6796 252 5655 10444977 175 0 101 0 0 0
|
||||
intr 1472736 57 10 0 0 0 0 0 0 0 0 0 0 156 0 0 0 0 0 0 111551 42541 12356 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
ctxt 2626618
|
||||
btime 1457505775
|
||||
procs_running 2
|
||||
procs_blocked 0
|
||||
softirq 1031662 0 649485 20946 111071 11620 0 1 0 994 237545
|
||||
page 5741 1808
|
Loading…
Add table
Add a link
Reference in a new issue