Skip to content

Commit aee1517

Browse files
authored
uptime metric reporting (#32)
1 parent d4288ae commit aee1517

File tree

5 files changed

+108
-10
lines changed

5 files changed

+108
-10
lines changed

Gopkg.lock

Lines changed: 38 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.4-DEVEL
1+
1.0.5

collector/resource_collector.go

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
package collector
22

33
import (
4+
"regexp"
45
"strconv"
56
"strings"
7+
"time"
68

79
"github.com/prometheus/client_golang/prometheus"
810
log "github.com/sirupsen/logrus"
911
"gopkg.in/routeros.v2/proto"
1012
)
1113

14+
var uptimeRegex *regexp.Regexp
15+
var uptimeParts [5]time.Duration
16+
17+
func init() {
18+
uptimeRegex = regexp.MustCompile(`(?:(\d*)w)?(?:(\d*)d)?(?:(\d*)h)?(?:(\d*)m)?(?:(\d*)s)`)
19+
uptimeParts = [5]time.Duration{time.Hour * 168, time.Hour * 24, time.Hour, time.Minute, time.Second}
20+
}
21+
1222
type resourceCollector struct {
1323
props []string
1424
descriptions map[string]*prometheus.Desc
@@ -21,7 +31,7 @@ func newResourceCollector() routerOSCollector {
2131
}
2232

2333
func (c *resourceCollector) init() {
24-
c.props = []string{"free-memory", "total-memory", "cpu-load", "free-hdd-space", "total-hdd-space"}
34+
c.props = []string{"free-memory", "total-memory", "cpu-load", "free-hdd-space", "total-hdd-space", "uptime"}
2535

2636
labelNames := []string{"name", "address"}
2737
c.descriptions = make(map[string]*prometheus.Desc)
@@ -69,7 +79,15 @@ func (c *resourceCollector) collectForStat(re *proto.Sentence, ctx *collectorCon
6979
}
7080

7181
func (c *resourceCollector) collectMetricForProperty(property string, re *proto.Sentence, ctx *collectorContext) {
72-
v, err := strconv.ParseFloat(re.Map[property], 64)
82+
var v float64
83+
var err error
84+
85+
if property == "uptime" {
86+
v, err = parseUptime(re.Map[property])
87+
} else {
88+
v, err = strconv.ParseFloat(re.Map[property], 64)
89+
}
90+
7391
if err != nil {
7492
log.WithFields(log.Fields{
7593
"device": ctx.device.Name,
@@ -83,3 +101,24 @@ func (c *resourceCollector) collectMetricForProperty(property string, re *proto.
83101
desc := c.descriptions[property]
84102
ctx.ch <- prometheus.MustNewConstMetric(desc, prometheus.CounterValue, v, ctx.device.Name, ctx.device.Address)
85103
}
104+
105+
func parseUptime(uptime string) (float64, error) {
106+
var u time.Duration
107+
108+
for i, match := range uptimeRegex.FindAllStringSubmatch(uptime, -1)[0] {
109+
if match != "" && i != 0 {
110+
v, err := strconv.Atoi(match)
111+
if err != nil {
112+
log.WithFields(log.Fields{
113+
"uptime": uptime,
114+
"value": match,
115+
"error": err,
116+
}).Error("error parsing uptime field value")
117+
return float64(0), err
118+
}
119+
u += time.Duration(v) * uptimeParts[i-1]
120+
}
121+
}
122+
123+
return u.Seconds(), nil
124+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package collector
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestParseUptime(t *testing.T) {
8+
9+
uptimes := []struct {
10+
u string
11+
v float64
12+
}{
13+
{"3d3h42m53s", 272573},
14+
{"15w3d3h42m53s", 9344573},
15+
{"42m53s", 2573},
16+
}
17+
18+
for _, uptime := range uptimes {
19+
seconds, err := parseUptime(uptime.u)
20+
if err != nil {
21+
t.Error(err)
22+
}
23+
if seconds != uptime.v {
24+
t.Errorf("seconds : %f != v : %f\n", seconds, uptime.v)
25+
}
26+
}
27+
}

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func startServer() {
131131
</html>`))
132132
})
133133

134-
log.Info("Listening on", *port)
134+
log.Info("Listening on ", *port)
135135
log.Fatal(http.ListenAndServe(*port, nil))
136136
}
137137

0 commit comments

Comments
 (0)