79 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
| // +build linux
 | |
| 
 | |
| package kernel_vmstat
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"strconv"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/plugins/inputs"
 | |
| )
 | |
| 
 | |
| type KernelVmstat struct {
 | |
| 	statFile string
 | |
| }
 | |
| 
 | |
| func (k *KernelVmstat) Description() string {
 | |
| 	return "Get kernel statistics from /proc/vmstat"
 | |
| }
 | |
| 
 | |
| func (k *KernelVmstat) SampleConfig() string {
 | |
| 	return ""
 | |
| }
 | |
| 
 | |
| func (k *KernelVmstat) Gather(acc telegraf.Accumulator) error {
 | |
| 	data, err := k.getProcVmstat()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	fields := make(map[string]interface{})
 | |
| 
 | |
| 	dataFields := bytes.Fields(data)
 | |
| 	for i, field := range dataFields {
 | |
| 
 | |
| 		// dataFields is an array of {"stat1_name", "stat1_value", "stat2_name",
 | |
| 		// "stat2_value", ...}
 | |
| 		// We only want the even number index as that contain the stat name.
 | |
| 		if i%2 == 0 {
 | |
| 			// Convert the stat value into an integer.
 | |
| 			m, err := strconv.ParseInt(string(dataFields[i+1]), 10, 64)
 | |
| 			if err != nil {
 | |
| 				return err
 | |
| 			}
 | |
| 
 | |
| 			fields[string(field)] = int64(m)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	acc.AddFields("kernel_vmstat", fields, map[string]string{})
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (k *KernelVmstat) getProcVmstat() ([]byte, error) {
 | |
| 	if _, err := os.Stat(k.statFile); os.IsNotExist(err) {
 | |
| 		return nil, fmt.Errorf("kernel_vmstat: %s does not exist!", k.statFile)
 | |
| 	} else if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	data, err := ioutil.ReadFile(k.statFile)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	return data, nil
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	inputs.Add("kernel_vmstat", func() telegraf.Input {
 | |
| 		return &KernelVmstat{
 | |
| 			statFile: "/proc/vmstat",
 | |
| 		}
 | |
| 	})
 | |
| }
 |