diff --git a/plugins/inputs/all/all.go b/plugins/inputs/all/all.go index fea1c7ca0..b6b1e74da 100644 --- a/plugins/inputs/all/all.go +++ b/plugins/inputs/all/all.go @@ -28,6 +28,7 @@ import ( _ "github.com/influxdb/telegraf/plugins/inputs/rabbitmq" _ "github.com/influxdb/telegraf/plugins/inputs/redis" _ "github.com/influxdb/telegraf/plugins/inputs/rethinkdb" + _ "github.com/influxdb/telegraf/plugins/inputs/sensors" _ "github.com/influxdb/telegraf/plugins/inputs/statsd" _ "github.com/influxdb/telegraf/plugins/inputs/system" _ "github.com/influxdb/telegraf/plugins/inputs/trig" diff --git a/plugins/inputs/sensors/sensors.go b/plugins/inputs/sensors/sensors.go new file mode 100644 index 000000000..6267ac64b --- /dev/null +++ b/plugins/inputs/sensors/sensors.go @@ -0,0 +1,88 @@ +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 :. 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{}{ + featureLabel: feature.GetValue(), + } + + acc.AddFields("sensors", fields, tags) + } + } + + return nil +} + +func init() { + inputs.Add("sensors", func() inputs.Input { + return &Sensors{} + }) +}