mirror of
https://github.com/prometheus/node_exporter.git
synced 2024-12-27 14:39:53 -08:00
Scrape CPU latency stats from /proc/schedstat (#1389)
These are useful as a direct indication of CPU contention and task scheduler latency. Handy references: - https://github.com/torvalds/linux/blob/master/Documentation/scheduler/sched-stats.txt - https://doc.opensuse.org/documentation/leap/tuning/html/book.sle.tuning/cha.tuning.taskscheduler.html procfs is updated to pull in the enabling change: https://github.com/prometheus/procfs/pull/186 Signed-off-by: Phil Frost <phil@postmates.com>
This commit is contained in:
parent
777b751f90
commit
f693a71c06
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
* [CHANGE] Add `--collector.netdev.device-whitelist`. #1279
|
* [CHANGE] Add `--collector.netdev.device-whitelist`. #1279
|
||||||
* [CHANGE] Refactor mdadm collector #1403
|
* [CHANGE] Refactor mdadm collector #1403
|
||||||
* [FEATURE]
|
* [FEATURE] Add new schedstat collector #1389
|
||||||
* [ENHANCEMENT]
|
* [ENHANCEMENT]
|
||||||
* [BUGFIX] Renamed label `state` to `name` on `node_systemd_service_restart_total`. #1393
|
* [BUGFIX] Renamed label `state` to `name` on `node_systemd_service_restart_total`. #1393
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@ netstat | Exposes network statistics from `/proc/net/netstat`. This is the same
|
||||||
nfs | Exposes NFS client statistics from `/proc/net/rpc/nfs`. This is the same information as `nfsstat -c`. | Linux
|
nfs | Exposes NFS client statistics from `/proc/net/rpc/nfs`. This is the same information as `nfsstat -c`. | Linux
|
||||||
nfsd | Exposes NFS kernel server statistics from `/proc/net/rpc/nfsd`. This is the same information as `nfsstat -s`. | Linux
|
nfsd | Exposes NFS kernel server statistics from `/proc/net/rpc/nfsd`. This is the same information as `nfsstat -s`. | Linux
|
||||||
pressure | Exposes pressure stall statistics from `/proc/pressure/`. | Linux (kernel 4.20+ and/or [CONFIG\_PSI](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/accounting/psi.txt))
|
pressure | Exposes pressure stall statistics from `/proc/pressure/`. | Linux (kernel 4.20+ and/or [CONFIG\_PSI](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/accounting/psi.txt))
|
||||||
|
schedstat | Exposes task scheduler statistics from `/proc/schedstat`. | Linux
|
||||||
sockstat | Exposes various statistics from `/proc/net/sockstat`. | Linux
|
sockstat | Exposes various statistics from `/proc/net/sockstat`. | Linux
|
||||||
stat | Exposes various statistics from `/proc/stat`. This includes boot time, forks and interrupts. | Linux
|
stat | Exposes various statistics from `/proc/stat`. This includes boot time, forks and interrupts. | Linux
|
||||||
textfile | Exposes statistics read from local disk. The `--collector.textfile.directory` flag must be set. | _any_
|
textfile | Exposes statistics read from local disk. The `--collector.textfile.directory` flag must be set. | _any_
|
||||||
|
|
|
@ -2438,6 +2438,18 @@ node_qdisc_packets_total{device="wlan0",kind="fq"} 42
|
||||||
# TYPE node_qdisc_requeues_total counter
|
# TYPE node_qdisc_requeues_total counter
|
||||||
node_qdisc_requeues_total{device="eth0",kind="pfifo_fast"} 2
|
node_qdisc_requeues_total{device="eth0",kind="pfifo_fast"} 2
|
||||||
node_qdisc_requeues_total{device="wlan0",kind="fq"} 1
|
node_qdisc_requeues_total{device="wlan0",kind="fq"} 1
|
||||||
|
# HELP node_schedstat_running_seconds_total Number of seconds CPU spent running a process.
|
||||||
|
# TYPE node_schedstat_running_seconds_total counter
|
||||||
|
node_schedstat_running_seconds_total{cpu="0"} 2.045936778163039e+13
|
||||||
|
node_schedstat_running_seconds_total{cpu="1"} 1.904686152592476e+13
|
||||||
|
# HELP node_schedstat_timeslices_total Number of timeslices executed by CPU.
|
||||||
|
# TYPE node_schedstat_timeslices_total counter
|
||||||
|
node_schedstat_timeslices_total{cpu="0"} 4.767485306e+09
|
||||||
|
node_schedstat_timeslices_total{cpu="1"} 5.145567945e+09
|
||||||
|
# HELP node_schedstat_waiting_seconds_total Number of seconds spent by processing waiting for this CPU.
|
||||||
|
# TYPE node_schedstat_waiting_seconds_total counter
|
||||||
|
node_schedstat_waiting_seconds_total{cpu="0"} 3.43796328169361e+12
|
||||||
|
node_schedstat_waiting_seconds_total{cpu="1"} 3.64107263788241e+12
|
||||||
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||||
# TYPE node_scrape_collector_duration_seconds gauge
|
# TYPE node_scrape_collector_duration_seconds gauge
|
||||||
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||||
|
@ -2472,6 +2484,7 @@ node_scrape_collector_success{collector="nfsd"} 1
|
||||||
node_scrape_collector_success{collector="pressure"} 1
|
node_scrape_collector_success{collector="pressure"} 1
|
||||||
node_scrape_collector_success{collector="processes"} 1
|
node_scrape_collector_success{collector="processes"} 1
|
||||||
node_scrape_collector_success{collector="qdisc"} 1
|
node_scrape_collector_success{collector="qdisc"} 1
|
||||||
|
node_scrape_collector_success{collector="schedstat"} 1
|
||||||
node_scrape_collector_success{collector="sockstat"} 1
|
node_scrape_collector_success{collector="sockstat"} 1
|
||||||
node_scrape_collector_success{collector="stat"} 1
|
node_scrape_collector_success{collector="stat"} 1
|
||||||
node_scrape_collector_success{collector="textfile"} 1
|
node_scrape_collector_success{collector="textfile"} 1
|
||||||
|
|
|
@ -2438,6 +2438,18 @@ node_qdisc_packets_total{device="wlan0",kind="fq"} 42
|
||||||
# TYPE node_qdisc_requeues_total counter
|
# TYPE node_qdisc_requeues_total counter
|
||||||
node_qdisc_requeues_total{device="eth0",kind="pfifo_fast"} 2
|
node_qdisc_requeues_total{device="eth0",kind="pfifo_fast"} 2
|
||||||
node_qdisc_requeues_total{device="wlan0",kind="fq"} 1
|
node_qdisc_requeues_total{device="wlan0",kind="fq"} 1
|
||||||
|
# HELP node_schedstat_running_seconds_total Number of seconds CPU spent running a process.
|
||||||
|
# TYPE node_schedstat_running_seconds_total counter
|
||||||
|
node_schedstat_running_seconds_total{cpu="0"} 2.045936778163039e+13
|
||||||
|
node_schedstat_running_seconds_total{cpu="1"} 1.904686152592476e+13
|
||||||
|
# HELP node_schedstat_timeslices_total Number of timeslices executed by CPU.
|
||||||
|
# TYPE node_schedstat_timeslices_total counter
|
||||||
|
node_schedstat_timeslices_total{cpu="0"} 4.767485306e+09
|
||||||
|
node_schedstat_timeslices_total{cpu="1"} 5.145567945e+09
|
||||||
|
# HELP node_schedstat_waiting_seconds_total Number of seconds spent by processing waiting for this CPU.
|
||||||
|
# TYPE node_schedstat_waiting_seconds_total counter
|
||||||
|
node_schedstat_waiting_seconds_total{cpu="0"} 3.43796328169361e+12
|
||||||
|
node_schedstat_waiting_seconds_total{cpu="1"} 3.64107263788241e+12
|
||||||
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
# HELP node_scrape_collector_duration_seconds node_exporter: Duration of a collector scrape.
|
||||||
# TYPE node_scrape_collector_duration_seconds gauge
|
# TYPE node_scrape_collector_duration_seconds gauge
|
||||||
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
# HELP node_scrape_collector_success node_exporter: Whether a collector succeeded.
|
||||||
|
@ -2472,6 +2484,7 @@ node_scrape_collector_success{collector="nfsd"} 1
|
||||||
node_scrape_collector_success{collector="pressure"} 1
|
node_scrape_collector_success{collector="pressure"} 1
|
||||||
node_scrape_collector_success{collector="processes"} 1
|
node_scrape_collector_success{collector="processes"} 1
|
||||||
node_scrape_collector_success{collector="qdisc"} 1
|
node_scrape_collector_success{collector="qdisc"} 1
|
||||||
|
node_scrape_collector_success{collector="schedstat"} 1
|
||||||
node_scrape_collector_success{collector="sockstat"} 1
|
node_scrape_collector_success{collector="sockstat"} 1
|
||||||
node_scrape_collector_success{collector="stat"} 1
|
node_scrape_collector_success{collector="stat"} 1
|
||||||
node_scrape_collector_success{collector="textfile"} 1
|
node_scrape_collector_success{collector="textfile"} 1
|
||||||
|
|
6
collector/fixtures/proc/schedstat
Normal file
6
collector/fixtures/proc/schedstat
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
version 15
|
||||||
|
timestamp 15819019232
|
||||||
|
cpu0 498494191 0 3533438552 2553969831 3853684107 2465731542 2045936778163039 343796328169361 4767485306
|
||||||
|
domain0 00000000,00000003 212499247 210112015 1861015 1860405436 536440 369895 32599 210079416 25368550 24241256 384652 927363878 807233 6366 1647 24239609 2122447165 1886868564 121112060 2848625533 125678146 241025 1032026 1885836538 2545 12 2533 0 0 0 0 0 0 1387952561 21076581 0
|
||||||
|
cpu1 518377256 0 4155211005 2778589869 10466382 2867629021 1904686152592476 364107263788241 5145567945
|
||||||
|
domain0 00000000,00000003 217653037 215526982 1577949 1580427380 557469 393576 28538 215498444 28721913 27662819 371153 870843407 745912 5523 1639 27661180 2331056874 2107732788 111442342 652402556 123615235 196159 1045245 2106687543 2400 3 2397 0 0 0 0 0 0 1437804657 26220076 0
|
94
collector/schedstat_linux.go
Normal file
94
collector/schedstat_linux.go
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
// Copyright 2019 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 collector
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"github.com/prometheus/procfs"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
runningSecondsTotal = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, "schedstat", "running_seconds_total"),
|
||||||
|
"Number of seconds CPU spent running a process.",
|
||||||
|
[]string{"cpu"},
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
waitingSecondsTotal = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, "schedstat", "waiting_seconds_total"),
|
||||||
|
"Number of seconds spent by processing waiting for this CPU.",
|
||||||
|
[]string{"cpu"},
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
timeslicesTotal = prometheus.NewDesc(
|
||||||
|
prometheus.BuildFQName(namespace, "schedstat", "timeslices_total"),
|
||||||
|
"Number of timeslices executed by CPU.",
|
||||||
|
[]string{"cpu"},
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewSchedstatCollector returns a new Collector exposing task scheduler statistics
|
||||||
|
func NewSchedstatCollector() (Collector, error) {
|
||||||
|
fs, err := procfs.NewFS(*procPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to open procfs: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &schedstatCollector{fs: fs}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type schedstatCollector struct {
|
||||||
|
fs procfs.FS
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registerCollector("schedstat", defaultEnabled, NewSchedstatCollector)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *schedstatCollector) Update(ch chan<- prometheus.Metric) error {
|
||||||
|
stats, err := c.fs.Schedstat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, cpu := range stats.CPUs {
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
runningSecondsTotal,
|
||||||
|
prometheus.CounterValue,
|
||||||
|
cpu.RunningSeconds(),
|
||||||
|
cpu.CPUNum,
|
||||||
|
)
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
waitingSecondsTotal,
|
||||||
|
prometheus.CounterValue,
|
||||||
|
cpu.WaitingSeconds(),
|
||||||
|
cpu.CPUNum,
|
||||||
|
)
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
timeslicesTotal,
|
||||||
|
prometheus.CounterValue,
|
||||||
|
float64(cpu.RunTimeslices),
|
||||||
|
cpu.CPUNum,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -30,6 +30,7 @@ enabled_collectors=$(cat << COLLECTORS
|
||||||
nfsd
|
nfsd
|
||||||
pressure
|
pressure
|
||||||
qdisc
|
qdisc
|
||||||
|
schedstat
|
||||||
sockstat
|
sockstat
|
||||||
stat
|
stat
|
||||||
textfile
|
textfile
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -15,7 +15,7 @@ require (
|
||||||
github.com/prometheus/client_golang v1.0.0
|
github.com/prometheus/client_golang v1.0.0
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
|
||||||
github.com/prometheus/common v0.4.1
|
github.com/prometheus/common v0.4.1
|
||||||
github.com/prometheus/procfs v0.0.4-0.20190627154503-39e1aff1547e
|
github.com/prometheus/procfs v0.0.4-0.20190702183519-8f55e607908e
|
||||||
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745
|
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745
|
||||||
github.com/sirupsen/logrus v1.4.2 // indirect
|
github.com/sirupsen/logrus v1.4.2 // indirect
|
||||||
github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a
|
github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -68,8 +68,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
|
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
|
||||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
github.com/prometheus/procfs v0.0.4-0.20190627154503-39e1aff1547e h1:wHo3spLBVUEsk0etFRCYPI6CpKUZnxq0JwqXjaQhp/g=
|
github.com/prometheus/procfs v0.0.4-0.20190702183519-8f55e607908e h1:p57e/ejwNofSHhEh+d7KoCVpHSTN3efX5Aj3z0jGWIE=
|
||||||
github.com/prometheus/procfs v0.0.4-0.20190627154503-39e1aff1547e/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
github.com/prometheus/procfs v0.0.4-0.20190702183519-8f55e607908e/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
||||||
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745 h1:IuH7WumZNax0D+rEqmy2TyhKCzrtMGqbZO0b8rO00JA=
|
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745 h1:IuH7WumZNax0D+rEqmy2TyhKCzrtMGqbZO0b8rO00JA=
|
||||||
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8=
|
github.com/siebenmann/go-kstat v0.0.0-20160321171754-d34789b79745/go.mod h1:G81aIFAMS9ECrwBYR9YxhlPjWgrItd+Kje78O6+uqm8=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
|
|
27
vendor/github.com/prometheus/procfs/fixtures.ttar
generated
vendored
27
vendor/github.com/prometheus/procfs/fixtures.ttar
generated
vendored
|
@ -168,6 +168,11 @@ SymlinkTo: net:[4026531993]
|
||||||
Path: fixtures/proc/26231/root
|
Path: fixtures/proc/26231/root
|
||||||
SymlinkTo: /
|
SymlinkTo: /
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/proc/26231/schedstat
|
||||||
|
Lines: 1
|
||||||
|
411605849 93680043 79
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Path: fixtures/proc/26231/stat
|
Path: fixtures/proc/26231/stat
|
||||||
Lines: 1
|
Lines: 1
|
||||||
26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0
|
26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0
|
||||||
|
@ -300,6 +305,18 @@ Lines: 1
|
||||||
com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF
|
com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF
|
||||||
Mode: 644
|
Mode: 644
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/proc/26233/schedstat
|
||||||
|
Lines: 8
|
||||||
|
____________________________________
|
||||||
|
< this is a malformed schedstat file >
|
||||||
|
------------------------------------
|
||||||
|
\ ^__^
|
||||||
|
\ (oo)\_______
|
||||||
|
(__)\ )\/\
|
||||||
|
||----w |
|
||||||
|
|| ||
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Directory: fixtures/proc/584
|
Directory: fixtures/proc/584
|
||||||
Mode: 755
|
Mode: 755
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -609,6 +626,16 @@ some avg10=0.10 avg60=2.00 avg300=3.85 total=15
|
||||||
full avg10=0.20 avg60=3.00 avg300=4.95 total=25
|
full avg10=0.20 avg60=3.00 avg300=4.95 total=25
|
||||||
Mode: 644
|
Mode: 644
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Path: fixtures/proc/schedstat
|
||||||
|
Lines: 6
|
||||||
|
version 15
|
||||||
|
timestamp 15819019232
|
||||||
|
cpu0 498494191 0 3533438552 2553969831 3853684107 2465731542 2045936778163039 343796328169361 4767485306
|
||||||
|
domain0 00000000,00000003 212499247 210112015 1861015 1860405436 536440 369895 32599 210079416 25368550 24241256 384652 927363878 807233 6366 1647 24239609 2122447165 1886868564 121112060 2848625533 125678146 241025 1032026 1885836538 2545 12 2533 0 0 0 0 0 0 1387952561 21076581 0
|
||||||
|
cpu1 518377256 0 4155211005 2778589869 10466382 2867629021 1904686152592476 364107263788241 5145567945
|
||||||
|
domain0 00000000,00000003 217653037 215526982 1577949 1580427380 557469 393576 28538 215498444 28721913 27662819 371153 870843407 745912 5523 1639 27661180 2331056874 2107732788 111442342 652402556 123615235 196159 1045245 2106687543 2400 3 2397 0 0 0 0 0 0 1437804657 26220076 0
|
||||||
|
Mode: 644
|
||||||
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Path: fixtures/proc/self
|
Path: fixtures/proc/self
|
||||||
SymlinkTo: 26231
|
SymlinkTo: 26231
|
||||||
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
9
vendor/github.com/prometheus/procfs/proc.go
generated
vendored
9
vendor/github.com/prometheus/procfs/proc.go
generated
vendored
|
@ -300,3 +300,12 @@ func (p Proc) FileDescriptorsInfo() (ProcFDInfos, error) {
|
||||||
|
|
||||||
return fdinfos, nil
|
return fdinfos, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Schedstat returns task scheduling information for the process.
|
||||||
|
func (p Proc) Schedstat() (ProcSchedstat, error) {
|
||||||
|
contents, err := ioutil.ReadFile(p.path("schedstat"))
|
||||||
|
if err != nil {
|
||||||
|
return ProcSchedstat{}, err
|
||||||
|
}
|
||||||
|
return parseProcSchedstat(string(contents))
|
||||||
|
}
|
||||||
|
|
128
vendor/github.com/prometheus/procfs/schedstat.go
generated
vendored
Normal file
128
vendor/github.com/prometheus/procfs/schedstat.go
generated
vendored
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
// Copyright 2019 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"
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
cpuLineRE = regexp.MustCompile(`cpu(\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)`)
|
||||||
|
procLineRE = regexp.MustCompile(`(\d+) (\d+) (\d+)`)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Schedstat contains scheduler statistics from /proc/schedstats
|
||||||
|
//
|
||||||
|
// See
|
||||||
|
// https://www.kernel.org/doc/Documentation/scheduler/sched-stats.txt
|
||||||
|
// for a detailed description of what these numbers mean.
|
||||||
|
type Schedstat struct {
|
||||||
|
CPUs []*SchedstatCPU
|
||||||
|
}
|
||||||
|
|
||||||
|
// SchedstatCPU contains the values from one "cpu<N>" line
|
||||||
|
type SchedstatCPU struct {
|
||||||
|
CPUNum string
|
||||||
|
|
||||||
|
RunningJiffies uint64
|
||||||
|
WaitingJiffies uint64
|
||||||
|
RunTimeslices uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProcSchedstat contains the values from /proc/<pid>/schedstat
|
||||||
|
type ProcSchedstat struct {
|
||||||
|
RunningJiffies uint64
|
||||||
|
WaitingJiffies uint64
|
||||||
|
RunTimeslices uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fs FS) Schedstat() (*Schedstat, error) {
|
||||||
|
file, err := os.Open(fs.proc.Path("schedstat"))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
stats := &Schedstat{}
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
match := cpuLineRE.FindStringSubmatch(scanner.Text())
|
||||||
|
if match != nil {
|
||||||
|
cpu := &SchedstatCPU{}
|
||||||
|
cpu.CPUNum = match[1]
|
||||||
|
|
||||||
|
cpu.RunningJiffies, err = strconv.ParseUint(match[8], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu.WaitingJiffies, err = strconv.ParseUint(match[9], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu.RunTimeslices, err = strconv.ParseUint(match[10], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
stats.CPUs = append(stats.CPUs, cpu)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stats, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseProcSchedstat(contents string) (stats ProcSchedstat, err error) {
|
||||||
|
match := procLineRE.FindStringSubmatch(contents)
|
||||||
|
|
||||||
|
if match != nil {
|
||||||
|
stats.RunningJiffies, err = strconv.ParseUint(match[1], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
stats.WaitingJiffies, err = strconv.ParseUint(match[2], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
stats.RunTimeslices, err = strconv.ParseUint(match[3], 10, 64)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = errors.New("could not parse schedstat")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (stat *SchedstatCPU) RunningSeconds() float64 {
|
||||||
|
return float64(stat.RunningJiffies) / userHZ
|
||||||
|
}
|
||||||
|
|
||||||
|
func (stat *SchedstatCPU) WaitingSeconds() float64 {
|
||||||
|
return float64(stat.WaitingJiffies) / userHZ
|
||||||
|
}
|
||||||
|
|
||||||
|
func (stat *ProcSchedstat) RunningSeconds() float64 {
|
||||||
|
return float64(stat.RunningJiffies) / userHZ
|
||||||
|
}
|
||||||
|
|
||||||
|
func (stat *ProcSchedstat) WaitingSeconds() float64 {
|
||||||
|
return float64(stat.WaitingJiffies) / userHZ
|
||||||
|
}
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
|
@ -45,7 +45,7 @@ github.com/prometheus/common/version
|
||||||
github.com/prometheus/common/expfmt
|
github.com/prometheus/common/expfmt
|
||||||
github.com/prometheus/common/model
|
github.com/prometheus/common/model
|
||||||
github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
|
github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg
|
||||||
# github.com/prometheus/procfs v0.0.4-0.20190627154503-39e1aff1547e
|
# github.com/prometheus/procfs v0.0.4-0.20190702183519-8f55e607908e
|
||||||
github.com/prometheus/procfs
|
github.com/prometheus/procfs
|
||||||
github.com/prometheus/procfs/bcache
|
github.com/prometheus/procfs/bcache
|
||||||
github.com/prometheus/procfs/nfs
|
github.com/prometheus/procfs/nfs
|
||||||
|
|
Loading…
Reference in a new issue