|
|
@ -26,11 +26,15 @@ import (
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type softnetCollector struct {
|
|
|
|
type softnetCollector struct {
|
|
|
|
fs procfs.FS
|
|
|
|
fs procfs.FS
|
|
|
|
processed *prometheus.Desc
|
|
|
|
processed *prometheus.Desc
|
|
|
|
dropped *prometheus.Desc
|
|
|
|
dropped *prometheus.Desc
|
|
|
|
timeSqueezed *prometheus.Desc
|
|
|
|
timeSqueezed *prometheus.Desc
|
|
|
|
logger log.Logger
|
|
|
|
cpuCollision *prometheus.Desc
|
|
|
|
|
|
|
|
receivedRps *prometheus.Desc
|
|
|
|
|
|
|
|
flowLimitCount *prometheus.Desc
|
|
|
|
|
|
|
|
softnetBacklogLen *prometheus.Desc
|
|
|
|
|
|
|
|
logger log.Logger
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
const (
|
|
|
@ -65,19 +69,41 @@ func NewSoftnetCollector(logger log.Logger) (Collector, error) {
|
|
|
|
"Number of times processing packets ran out of quota",
|
|
|
|
"Number of times processing packets ran out of quota",
|
|
|
|
[]string{"cpu"}, nil,
|
|
|
|
[]string{"cpu"}, nil,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
|
|
|
|
cpuCollision: prometheus.NewDesc(
|
|
|
|
|
|
|
|
prometheus.BuildFQName(namespace, softnetSubsystem, "cpu_collision_total"),
|
|
|
|
|
|
|
|
"Number of collision occur while obtaining device lock while transmitting",
|
|
|
|
|
|
|
|
[]string{"cpu"}, nil,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
receivedRps: prometheus.NewDesc(
|
|
|
|
|
|
|
|
prometheus.BuildFQName(namespace, softnetSubsystem, "received_rps_total"),
|
|
|
|
|
|
|
|
"Number of times cpu woken up received_rps",
|
|
|
|
|
|
|
|
[]string{"cpu"}, nil,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
flowLimitCount: prometheus.NewDesc(
|
|
|
|
|
|
|
|
prometheus.BuildFQName(namespace, softnetSubsystem, "flow_limit_count_total"),
|
|
|
|
|
|
|
|
"Number of times flow limit has been reached",
|
|
|
|
|
|
|
|
[]string{"cpu"}, nil,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
softnetBacklogLen: prometheus.NewDesc(
|
|
|
|
|
|
|
|
prometheus.BuildFQName(namespace, softnetSubsystem, "backlog_len"),
|
|
|
|
|
|
|
|
"Softnet backlog status",
|
|
|
|
|
|
|
|
[]string{"cpu"}, nil,
|
|
|
|
|
|
|
|
),
|
|
|
|
logger: logger,
|
|
|
|
logger: logger,
|
|
|
|
}, nil
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Update gets parsed softnet statistics using procfs.
|
|
|
|
// Update gets parsed softnet statistics using procfs.
|
|
|
|
func (c *softnetCollector) Update(ch chan<- prometheus.Metric) error {
|
|
|
|
func (c *softnetCollector) Update(ch chan<- prometheus.Metric) error {
|
|
|
|
|
|
|
|
var cpu string
|
|
|
|
|
|
|
|
|
|
|
|
stats, err := c.fs.NetSoftnetStat()
|
|
|
|
stats, err := c.fs.NetSoftnetStat()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("could not get softnet statistics: %w", err)
|
|
|
|
return fmt.Errorf("could not get softnet statistics: %w", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for cpuNumber, cpuStats := range stats {
|
|
|
|
for _, cpuStats := range stats {
|
|
|
|
cpu := strconv.Itoa(cpuNumber)
|
|
|
|
cpu = strconv.FormatUint(uint64(cpuStats.Index), 10)
|
|
|
|
|
|
|
|
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
|
|
c.processed,
|
|
|
|
c.processed,
|
|
|
@ -97,6 +123,30 @@ func (c *softnetCollector) Update(ch chan<- prometheus.Metric) error {
|
|
|
|
float64(cpuStats.TimeSqueezed),
|
|
|
|
float64(cpuStats.TimeSqueezed),
|
|
|
|
cpu,
|
|
|
|
cpu,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
|
|
|
|
|
|
c.cpuCollision,
|
|
|
|
|
|
|
|
prometheus.CounterValue,
|
|
|
|
|
|
|
|
float64(cpuStats.CPUCollision),
|
|
|
|
|
|
|
|
cpu,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
|
|
|
|
|
|
c.receivedRps,
|
|
|
|
|
|
|
|
prometheus.CounterValue,
|
|
|
|
|
|
|
|
float64(cpuStats.ReceivedRps),
|
|
|
|
|
|
|
|
cpu,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
|
|
|
|
|
|
c.flowLimitCount,
|
|
|
|
|
|
|
|
prometheus.CounterValue,
|
|
|
|
|
|
|
|
float64(cpuStats.FlowLimitCount),
|
|
|
|
|
|
|
|
cpu,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
|
|
|
|
|
|
c.softnetBacklogLen,
|
|
|
|
|
|
|
|
prometheus.GaugeValue,
|
|
|
|
|
|
|
|
float64(cpuStats.SoftnetBacklogLen),
|
|
|
|
|
|
|
|
cpu,
|
|
|
|
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|