88 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package hddtemp
 | |
| 
 | |
| import (
 | |
| 	"net"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/plugins/inputs"
 | |
| 	gohddtemp "github.com/influxdata/telegraf/plugins/inputs/hddtemp/go-hddtemp"
 | |
| )
 | |
| 
 | |
| const defaultAddress = "127.0.0.1:7634"
 | |
| 
 | |
| type HDDTemp struct {
 | |
| 	Address string
 | |
| 	Devices []string
 | |
| 	fetcher Fetcher
 | |
| }
 | |
| 
 | |
| type Fetcher interface {
 | |
| 	Fetch(address string) ([]gohddtemp.Disk, error)
 | |
| }
 | |
| 
 | |
| func (_ *HDDTemp) Description() string {
 | |
| 	return "Monitor disks' temperatures using hddtemp"
 | |
| }
 | |
| 
 | |
| var hddtempSampleConfig = `
 | |
|   ## By default, telegraf gathers temps data from all disks detected by the
 | |
|   ## hddtemp.
 | |
|   ##
 | |
|   ## Only collect temps from the selected disks.
 | |
|   ##
 | |
|   ## A * as the device name will return the temperature values of all disks.
 | |
|   ##
 | |
|   # address = "127.0.0.1:7634"
 | |
|   # devices = ["sda", "*"]
 | |
| `
 | |
| 
 | |
| func (_ *HDDTemp) SampleConfig() string {
 | |
| 	return hddtempSampleConfig
 | |
| }
 | |
| 
 | |
| func (h *HDDTemp) Gather(acc telegraf.Accumulator) error {
 | |
| 	if h.fetcher == nil {
 | |
| 		h.fetcher = gohddtemp.New()
 | |
| 	}
 | |
| 	source, _, err := net.SplitHostPort(h.Address)
 | |
| 	if err != nil {
 | |
| 		source = h.Address
 | |
| 	}
 | |
| 
 | |
| 	disks, err := h.fetcher.Fetch(h.Address)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	for _, disk := range disks {
 | |
| 		for _, chosenDevice := range h.Devices {
 | |
| 			if chosenDevice == "*" || chosenDevice == disk.DeviceName {
 | |
| 				tags := map[string]string{
 | |
| 					"device": disk.DeviceName,
 | |
| 					"model":  disk.Model,
 | |
| 					"unit":   disk.Unit,
 | |
| 					"status": disk.Status,
 | |
| 					"source": source,
 | |
| 				}
 | |
| 
 | |
| 				fields := map[string]interface{}{
 | |
| 					"temperature": disk.Temperature,
 | |
| 				}
 | |
| 
 | |
| 				acc.AddFields("hddtemp", fields, tags)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	inputs.Add("hddtemp", func() telegraf.Input {
 | |
| 		return &HDDTemp{
 | |
| 			Address: defaultAddress,
 | |
| 			Devices: []string{"*"},
 | |
| 		}
 | |
| 	})
 | |
| }
 |