2016-01-08 21:38:28 +01: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.
// +build !novmstat
package collector
import (
"bufio"
"fmt"
"os"
2018-03-29 17:34:52 +02:00
"regexp"
2016-01-08 21:38:28 +01:00
"strconv"
"strings"
"github.com/prometheus/client_golang/prometheus"
2018-03-29 17:34:52 +02:00
"gopkg.in/alecthomas/kingpin.v2"
2016-01-08 21:38:28 +01:00
)
const (
vmStatSubsystem = "vmstat"
)
2018-03-29 17:34:52 +02:00
var (
2018-03-29 20:20:21 +02: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 17:34:52 +02:00
)
type vmStatCollector struct {
fieldPattern * regexp . Regexp
}
2016-01-08 21:38:28 +01:00
func init ( ) {
2017-09-28 15:06:26 +02:00
registerCollector ( "vmstat" , defaultEnabled , NewvmStatCollector )
2016-01-08 21:38:28 +01:00
}
2017-02-28 17:44:53 +01:00
// NewvmStatCollector returns a new Collector exposing vmstat stats.
2016-01-08 21:38:28 +01:00
func NewvmStatCollector ( ) ( Collector , error ) {
2018-03-29 17:34:52 +02:00
pattern := regexp . MustCompile ( * vmStatFields )
return & vmStatCollector {
fieldPattern : pattern ,
} , nil
2016-01-08 21:38:28 +01:00
}
2017-02-28 19:47:20 +01:00
func ( c * vmStatCollector ) Update ( ch chan <- prometheus . Metric ) error {
2016-01-08 21:38:28 +01: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 17:34:52 +02:00
if ! c . fieldPattern . MatchString ( parts [ 0 ] ) {
continue
}
2016-01-08 21:38:28 +01:00
2016-12-28 15:21:31 +01:00
ch <- prometheus . MustNewConstMetric (
prometheus . NewDesc (
2017-09-28 15:06:26 +02:00
prometheus . BuildFQName ( namespace , vmStatSubsystem , parts [ 0 ] ) ,
2016-12-28 15:21:31 +01:00
fmt . Sprintf ( "/proc/vmstat information field %s." , parts [ 0 ] ) ,
nil , nil ) ,
prometheus . UntypedValue ,
value ,
)
2016-01-08 21:38:28 +01:00
}
2017-02-28 19:31:35 +01:00
return scanner . Err ( )
2016-01-08 21:38:28 +01:00
}