telegraf/plugins/inputs/sensors/sensors.go

91 lines
1.8 KiB
Go

// +build linux,sensors
package sensors
import (
"strings"
"github.com/md14454/gosensors"
"github.com/influxdb/telegraf/plugins/inputs"
)
type Sensors struct {
Sensors []string
}
func (_ *Sensors) Description() string {
return "Monitor sensors using lm-sensors package"
}
var sensorsSampleConfig = `
# By default, telegraf gathers stats from all sensors detected by the
# lm-sensors module.
#
# Only collect stats from the selected sensors. Sensors are listed as
# <chip name>:<feature name>. This information can be found by running the
# sensors command, e.g. sensors -u
#
# A * as the feature name will return all features of the chip
#
# sensors = ["coretemp-isa-0000:Core 0", "coretemp-isa-0001:*"]
`
func (_ *Sensors) SampleConfig() string {
return sensorsSampleConfig
}
func (s *Sensors) Gather(acc inputs.Accumulator) error {
gosensors.Init()
defer gosensors.Cleanup()
for _, chip := range gosensors.GetDetectedChips() {
for _, feature := range chip.GetFeatures() {
chipName := chip.String()
featureLabel := feature.GetLabel()
if len(s.Sensors) != 0 {
var found bool
for _, sensor := range s.Sensors {
parts := strings.SplitN(":", sensor, 2)
if parts[0] == chipName {
if parts[1] == "*" || parts[1] == featureLabel {
found = true
break
}
}
}
if !found {
continue
}
}
tags := map[string]string{
"chip": chipName,
"adapter": chip.AdapterName(),
"feature-name": feature.Name,
"feature-label": featureLabel,
}
fieldName := chipName + ":" + featureLabel
fields := map[string]interface{}{
fieldName: feature.GetValue(),
}
acc.AddFields("sensors", fields, tags)
}
}
return nil
}
func init() {
inputs.Add("sensors", func() inputs.Input {
return &Sensors{}
})
}