master
go 178 lines 5.18 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 //go:build linux
4
5 package sensors
6
7 import (
8 "errors"
9 "fmt"
10
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/sensors/lmsensors"
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/oldmetrix"
13 )
14
15 const precision = 1000
16
17 func (c *Collector) collect() (map[string]int64, error) {
18 if c.sc == nil {
19 return nil, errors.New("sysfs scanner is not initialized")
20 }
21
22 chips, err := c.sc.Scan()
23 if err != nil {
24 return nil, err
25 }
26
27 if len(chips) == 0 {
28 return nil, errors.New("no chips found on the system")
29 }
30
31 mx := make(map[string]int64)
32
33 for _, chip := range chips {
34 for _, sn := range chip.Sensors.Voltage {
35 writeVoltage(mx, chip, sn)
36 }
37 for _, sn := range chip.Sensors.Fan {
38 writeFan(mx, chip, sn)
39 }
40 for _, sn := range chip.Sensors.Temperature {
41 writeTemperature(mx, chip, sn)
42 }
43 for _, sn := range chip.Sensors.Current {
44 writeCurrent(mx, chip, sn)
45 }
46 for _, sn := range chip.Sensors.Power {
47 writePower(mx, chip, sn)
48 }
49 for _, sn := range chip.Sensors.Energy {
50 writeEnergy(mx, chip, sn)
51 }
52 for _, sn := range chip.Sensors.Humidity {
53 writeHumidity(mx, chip, sn)
54 }
55 for _, sn := range chip.Sensors.Intrusion {
56 writeIntrusion(mx, chip, sn)
57 }
58 }
59
60 c.updateCharts(chips)
61
62 return mx, nil
63 }
64
65 func writeVoltage(mx map[string]int64, chip *lmsensors.Chip, sn *lmsensors.VoltageSensor) {
66 px := sensorPrefix(chip.UniqueName, sn.Name)
67
68 mx[px+"read_time"] = sn.ReadTime.Milliseconds()
69 writeMetricAlarm(mx, px, sn.Alarm)
70 writeMetric(mx, px+"input", sn.Input)
71 writeMetric(mx, px+"average", sn.Average)
72 writeMetric(mx, px+"min", sn.Min)
73 writeMetric(mx, px+"max", sn.Max)
74 writeMetric(mx, px+"lcrit", sn.CritMin)
75 writeMetric(mx, px+"crit", sn.CritMax)
76 writeMetric(mx, px+"lowest", sn.Lowest)
77 writeMetric(mx, px+"highest", sn.Highest)
78 }
79
80 func writeFan(mx map[string]int64, chip *lmsensors.Chip, sn *lmsensors.FanSensor) {
81 px := sensorPrefix(chip.UniqueName, sn.Name)
82
83 mx[px+"read_time"] = sn.ReadTime.Milliseconds()
84 writeMetricAlarm(mx, px, sn.Alarm)
85 writeMetric(mx, px+"input", sn.Input)
86 writeMetric(mx, px+"min", sn.Min)
87 writeMetric(mx, px+"max", sn.Max)
88 writeMetric(mx, px+"target", sn.Target)
89 }
90
91 func writeTemperature(mx map[string]int64, chip *lmsensors.Chip, sn *lmsensors.TemperatureSensor) {
92 px := sensorPrefix(chip.UniqueName, sn.Name)
93
94 mx[px+"read_time"] = sn.ReadTime.Milliseconds()
95 writeMetricAlarm(mx, px, sn.Alarm)
96 writeMetric(mx, px+"input", sn.Input)
97 writeMetric(mx, px+"min", sn.Min)
98 writeMetric(mx, px+"max", sn.Max)
99 writeMetric(mx, px+"lcrit", sn.CritMin)
100 writeMetric(mx, px+"crit", sn.CritMax)
101 writeMetric(mx, px+"emergency", sn.Emergency)
102 writeMetric(mx, px+"lowest", sn.Lowest)
103 writeMetric(mx, px+"highest", sn.Highest)
104 }
105
106 func writeCurrent(mx map[string]int64, chip *lmsensors.Chip, sn *lmsensors.CurrentSensor) {
107 px := sensorPrefix(chip.UniqueName, sn.Name)
108
109 mx[px+"read_time"] = sn.ReadTime.Milliseconds()
110 writeMetricAlarm(mx, px, sn.Alarm)
111 writeMetric(mx, px+"max", sn.Max)
112 writeMetric(mx, px+"min", sn.Min)
113 writeMetric(mx, px+"lcrit", sn.CritMin)
114 writeMetric(mx, px+"crit", sn.CritMax)
115 writeMetric(mx, px+"input", sn.Input)
116 writeMetric(mx, px+"average", sn.Average)
117 writeMetric(mx, px+"lowest", sn.Lowest)
118 writeMetric(mx, px+"highest", sn.Highest)
119 }
120
121 func writePower(mx map[string]int64, chip *lmsensors.Chip, sn *lmsensors.PowerSensor) {
122 px := sensorPrefix(chip.UniqueName, sn.Name)
123
124 mx[px+"read_time"] = sn.ReadTime.Milliseconds()
125 writeMetricAlarm(mx, px, sn.Alarm)
126 writeMetric(mx, px+"average", sn.Average)
127 writeMetric(mx, px+"average_highest", sn.AverageHighest)
128 writeMetric(mx, px+"average_lowest", sn.AverageLowest)
129 writeMetric(mx, px+"average_max", sn.AverageMax)
130 writeMetric(mx, px+"average_min", sn.AverageMin)
131 writeMetric(mx, px+"input", sn.Input)
132 writeMetric(mx, px+"input_highest", sn.InputHighest)
133 writeMetric(mx, px+"input_lowest", sn.InputLowest)
134 writeMetric(mx, px+"accuracy", sn.Accuracy)
135 writeMetric(mx, px+"cap", sn.Cap)
136 writeMetric(mx, px+"cap_max", sn.CapMax)
137 writeMetric(mx, px+"cap_min", sn.CapMin)
138 writeMetric(mx, px+"max", sn.Max)
139 writeMetric(mx, px+"crit", sn.CritMax)
140 }
141
142 func writeEnergy(mx map[string]int64, chip *lmsensors.Chip, sn *lmsensors.EnergySensor) {
143 px := sensorPrefix(chip.UniqueName, sn.Name)
144
145 mx[px+"read_time"] = sn.ReadTime.Milliseconds()
146 writeMetric(mx, px+"input", sn.Input)
147 }
148
149 func writeHumidity(mx map[string]int64, chip *lmsensors.Chip, sn *lmsensors.HumiditySensor) {
150 px := sensorPrefix(chip.UniqueName, sn.Name)
151
152 mx[px+"read_time"] = sn.ReadTime.Milliseconds()
153 writeMetric(mx, px+"input", sn.Input)
154 }
155
156 func writeIntrusion(mx map[string]int64, chip *lmsensors.Chip, sn *lmsensors.IntrusionSensor) {
157 px := sensorPrefix(chip.UniqueName, sn.Name)
158
159 mx[px+"read_time"] = sn.ReadTime.Milliseconds()
160 writeMetricAlarm(mx, px, sn.Alarm)
161 }
162
163 func writeMetric(mx map[string]int64, key string, value *float64) {
164 if value != nil {
165 mx[key] = int64(*value * precision)
166 }
167 }
168
169 func writeMetricAlarm(mx map[string]int64, px string, value *bool) {
170 if value != nil {
171 mx[px+"alarm_clear"] = oldmetrix.Bool(!*value)
172 mx[px+"alarm_triggered"] = oldmetrix.Bool(*value)
173 }
174 }
175
176 func sensorPrefix(chip, sensor string) string {
177 return fmt.Sprintf("chip_%s_sensor_%s_", chip, sensor)
178 }