2016-01-08 12:38:28 -08:00
// Copyright 2016 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 !novmstat
2016-01-08 12:38:28 -08:00
// +build !novmstat
package collector
import (
"bufio"
"fmt"
2024-09-11 01:51:28 -07:00
"log/slog"
2016-01-08 12:38:28 -08:00
"os"
2018-03-29 08:34:52 -07:00
"regexp"
2016-01-08 12:38:28 -08:00
"strconv"
"strings"
2023-03-07 00:25:05 -08:00
"github.com/alecthomas/kingpin/v2"
2016-01-08 12:38:28 -08:00
"github.com/prometheus/client_golang/prometheus"
)
const (
vmStatSubsystem = "vmstat"
)
2018-03-29 08:34:52 -07:00
var (
2018-03-29 11:20:21 -07:00
vmStatFields = kingpin . Flag ( "collector.vmstat.fields" , "Regexp of fields to return for vmstat collector." ) . Default ( "^(oom_kill|pgpg|pswp|pg.*fault).*" ) . String ( )
2018-03-29 08:34:52 -07:00
)
type vmStatCollector struct {
fieldPattern * regexp . Regexp
2024-09-11 01:51:28 -07:00
logger * slog . Logger
2018-03-29 08:34:52 -07:00
}
2016-01-08 12:38:28 -08:00
func init ( ) {
2017-09-28 06:06:26 -07:00
registerCollector ( "vmstat" , defaultEnabled , NewvmStatCollector )
2016-01-08 12:38:28 -08:00
}
2017-02-28 08:44:53 -08:00
// NewvmStatCollector returns a new Collector exposing vmstat stats.
2024-09-11 01:51:28 -07:00
func NewvmStatCollector ( logger * slog . Logger ) ( Collector , error ) {
2018-03-29 08:34:52 -07:00
pattern := regexp . MustCompile ( * vmStatFields )
return & vmStatCollector {
fieldPattern : pattern ,
2019-12-31 08:19:37 -08:00
logger : logger ,
2018-03-29 08:34:52 -07:00
} , nil
2016-01-08 12:38:28 -08:00
}
2017-02-28 10:47:20 -08:00
func ( c * vmStatCollector ) Update ( ch chan <- prometheus . Metric ) error {
2016-01-08 12:38:28 -08:00
file , err := os . Open ( procFilePath ( "vmstat" ) )
if err != nil {
return err
}
defer file . Close ( )
scanner := bufio . NewScanner ( file )
for scanner . Scan ( ) {
parts := strings . Fields ( scanner . Text ( ) )
value , err := strconv . ParseFloat ( parts [ 1 ] , 64 )
if err != nil {
return err
}
2018-03-29 08:34:52 -07:00
if ! c . fieldPattern . MatchString ( parts [ 0 ] ) {
continue
}
2016-01-08 12:38:28 -08:00
2016-12-28 06:21:31 -08:00
ch <- prometheus . MustNewConstMetric (
prometheus . NewDesc (
2017-09-28 06:06:26 -07:00
prometheus . BuildFQName ( namespace , vmStatSubsystem , parts [ 0 ] ) ,
2016-12-28 06:21:31 -08:00
fmt . Sprintf ( "/proc/vmstat information field %s." , parts [ 0 ] ) ,
nil , nil ) ,
prometheus . UntypedValue ,
value ,
)
2016-01-08 12:38:28 -08:00
}
2017-02-28 10:31:35 -08:00
return scanner . Err ( )
2016-01-08 12:38:28 -08:00
}