| 
									
										
										
										
											2015-09-26 08:36:40 -07:00
										 |  |  | // Copyright 2015 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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-03 04:35:24 -07:00
										 |  |  | //go:build !nostat
 | 
					
						
							| 
									
										
										
										
											2015-05-12 04:06:41 -07:00
										 |  |  | // +build !nostat
 | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | package collector | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-06-13 02:21:53 -07:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 	"log/slog" | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-07 00:25:05 -08:00
										 |  |  | 	"github.com/alecthomas/kingpin/v2" | 
					
						
							| 
									
										
										
										
											2017-06-13 02:21:53 -07:00
										 |  |  | 	"github.com/prometheus/client_golang/prometheus" | 
					
						
							| 
									
										
										
										
											2019-12-31 08:19:37 -08:00
										 |  |  | 	"github.com/prometheus/procfs" | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type statCollector struct { | 
					
						
							| 
									
										
										
										
											2019-04-10 09:16:12 -07:00
										 |  |  | 	fs           procfs.FS | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 	intr         *prometheus.Desc | 
					
						
							|  |  |  | 	ctxt         *prometheus.Desc | 
					
						
							|  |  |  | 	forks        *prometheus.Desc | 
					
						
							|  |  |  | 	btime        *prometheus.Desc | 
					
						
							|  |  |  | 	procsRunning *prometheus.Desc | 
					
						
							|  |  |  | 	procsBlocked *prometheus.Desc | 
					
						
							| 
									
										
										
										
											2021-12-01 00:55:13 -08:00
										 |  |  | 	softIRQ      *prometheus.Desc | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 	logger       *slog.Logger | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-01 00:55:13 -08:00
										 |  |  | var statSoftirqFlag = kingpin.Flag("collector.stat.softirq", "Export softirq calls per vector").Default("false").Bool() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | func init() { | 
					
						
							| 
									
										
										
										
											2017-09-28 06:06:26 -07:00
										 |  |  | 	registerCollector("stat", defaultEnabled, NewStatCollector) | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 08:44:53 -08:00
										 |  |  | // NewStatCollector returns a new Collector exposing kernel/system statistics.
 | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | func NewStatCollector(logger *slog.Logger) (Collector, error) { | 
					
						
							| 
									
										
										
										
											2019-04-10 09:16:12 -07:00
										 |  |  | 	fs, err := procfs.NewFS(*procPath) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2019-11-29 05:51:31 -08:00
										 |  |  | 		return nil, fmt.Errorf("failed to open procfs: %w", err) | 
					
						
							| 
									
										
										
										
											2019-04-10 09:16:12 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-11-24 18:00:17 -08:00
										 |  |  | 	return &statCollector{ | 
					
						
							| 
									
										
										
										
											2019-04-10 09:16:12 -07:00
										 |  |  | 		fs: fs, | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 		intr: prometheus.NewDesc( | 
					
						
							| 
									
										
										
										
											2018-01-17 08:55:55 -08:00
										 |  |  | 			prometheus.BuildFQName(namespace, "", "intr_total"), | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 			"Total number of interrupts serviced.", | 
					
						
							| 
									
										
										
										
											2015-12-18 06:08:52 -08:00
										 |  |  | 			nil, nil, | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 		), | 
					
						
							|  |  |  | 		ctxt: prometheus.NewDesc( | 
					
						
							| 
									
										
										
										
											2018-01-17 08:55:55 -08:00
										 |  |  | 			prometheus.BuildFQName(namespace, "", "context_switches_total"), | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 			"Total number of context switches.", | 
					
						
							| 
									
										
										
										
											2015-12-18 06:08:52 -08:00
										 |  |  | 			nil, nil, | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 		), | 
					
						
							|  |  |  | 		forks: prometheus.NewDesc( | 
					
						
							| 
									
										
										
										
											2018-01-17 08:55:55 -08:00
										 |  |  | 			prometheus.BuildFQName(namespace, "", "forks_total"), | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 			"Total number of forks.", | 
					
						
							| 
									
										
										
										
											2015-12-18 06:08:52 -08:00
										 |  |  | 			nil, nil, | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 		), | 
					
						
							|  |  |  | 		btime: prometheus.NewDesc( | 
					
						
							| 
									
										
										
										
											2018-01-17 08:55:55 -08:00
										 |  |  | 			prometheus.BuildFQName(namespace, "", "boot_time_seconds"), | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 			"Node boot time, in unixtime.", | 
					
						
							| 
									
										
										
										
											2015-12-18 06:08:52 -08:00
										 |  |  | 			nil, nil, | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 		), | 
					
						
							| 
									
										
										
										
											2015-12-18 06:08:52 -08:00
										 |  |  | 		procsRunning: prometheus.NewDesc( | 
					
						
							| 
									
										
										
										
											2017-09-28 06:06:26 -07:00
										 |  |  | 			prometheus.BuildFQName(namespace, "", "procs_running"), | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 			"Number of processes in runnable state.", | 
					
						
							| 
									
										
										
										
											2015-12-18 06:08:52 -08:00
										 |  |  | 			nil, nil, | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 		), | 
					
						
							| 
									
										
										
										
											2015-12-18 06:08:52 -08:00
										 |  |  | 		procsBlocked: prometheus.NewDesc( | 
					
						
							| 
									
										
										
										
											2017-09-28 06:06:26 -07:00
										 |  |  | 			prometheus.BuildFQName(namespace, "", "procs_blocked"), | 
					
						
							| 
									
										
										
										
											2015-12-18 04:19:44 -08:00
										 |  |  | 			"Number of processes blocked waiting for I/O to complete.", | 
					
						
							| 
									
										
										
										
											2015-12-18 06:08:52 -08:00
										 |  |  | 			nil, nil, | 
					
						
							| 
									
										
										
										
											2014-11-24 18:00:17 -08:00
										 |  |  | 		), | 
					
						
							| 
									
										
										
										
											2021-12-01 00:55:13 -08:00
										 |  |  | 		softIRQ: prometheus.NewDesc( | 
					
						
							|  |  |  | 			prometheus.BuildFQName(namespace, "", "softirqs_total"), | 
					
						
							|  |  |  | 			"Number of softirq calls.", | 
					
						
							|  |  |  | 			[]string{"vector"}, nil, | 
					
						
							|  |  |  | 		), | 
					
						
							| 
									
										
										
										
											2019-12-31 08:19:37 -08:00
										 |  |  | 		logger: logger, | 
					
						
							| 
									
										
										
										
											2014-11-24 18:00:17 -08:00
										 |  |  | 	}, nil | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 02:21:53 -07:00
										 |  |  | // Update implements Collector and exposes kernel and system statistics.
 | 
					
						
							| 
									
										
										
										
											2017-02-28 10:47:20 -08:00
										 |  |  | func (c *statCollector) Update(ch chan<- prometheus.Metric) error { | 
					
						
							| 
									
										
										
										
											2019-06-12 11:47:16 -07:00
										 |  |  | 	stats, err := c.fs.Stat() | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-10-29 07:16:43 -07:00
										 |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 02:21:53 -07:00
										 |  |  | 	ch <- prometheus.MustNewConstMetric(c.intr, prometheus.CounterValue, float64(stats.IRQTotal)) | 
					
						
							|  |  |  | 	ch <- prometheus.MustNewConstMetric(c.ctxt, prometheus.CounterValue, float64(stats.ContextSwitches)) | 
					
						
							|  |  |  | 	ch <- prometheus.MustNewConstMetric(c.forks, prometheus.CounterValue, float64(stats.ProcessCreated)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ch <- prometheus.MustNewConstMetric(c.btime, prometheus.GaugeValue, float64(stats.BootTime)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ch <- prometheus.MustNewConstMetric(c.procsRunning, prometheus.GaugeValue, float64(stats.ProcessesRunning)) | 
					
						
							|  |  |  | 	ch <- prometheus.MustNewConstMetric(c.procsBlocked, prometheus.GaugeValue, float64(stats.ProcessesBlocked)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-01 00:55:13 -08:00
										 |  |  | 	if *statSoftirqFlag { | 
					
						
							|  |  |  | 		si := stats.SoftIRQ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for _, vec := range []struct { | 
					
						
							|  |  |  | 			name  string | 
					
						
							|  |  |  | 			value uint64 | 
					
						
							|  |  |  | 		}{ | 
					
						
							|  |  |  | 			{name: "hi", value: si.Hi}, | 
					
						
							|  |  |  | 			{name: "timer", value: si.Timer}, | 
					
						
							|  |  |  | 			{name: "net_tx", value: si.NetTx}, | 
					
						
							|  |  |  | 			{name: "net_rx", value: si.NetRx}, | 
					
						
							|  |  |  | 			{name: "block", value: si.Block}, | 
					
						
							|  |  |  | 			{name: "block_iopoll", value: si.BlockIoPoll}, | 
					
						
							|  |  |  | 			{name: "tasklet", value: si.Tasklet}, | 
					
						
							|  |  |  | 			{name: "sched", value: si.Sched}, | 
					
						
							|  |  |  | 			{name: "hrtimer", value: si.Hrtimer}, | 
					
						
							|  |  |  | 			{name: "rcu", value: si.Rcu}, | 
					
						
							|  |  |  | 		} { | 
					
						
							|  |  |  | 			ch <- prometheus.MustNewConstMetric(c.softIRQ, prometheus.CounterValue, float64(vec.value), vec.name) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-13 02:21:53 -07:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2014-06-05 08:59:51 -07:00
										 |  |  | } |