Skip to content

Commit 81e258f

Browse files
authored
fix uptime regex and lazy coding for #34 (#35)
* fix uptime regex and lazy coding for #34 * [ci skip] version bump for merge
1 parent 9f22fc0 commit 81e258f

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

VERSION

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

collector/resource_collector.go

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package collector
22

33
import (
4+
"fmt"
45
"regexp"
56
"strconv"
67
"strings"
@@ -15,7 +16,7 @@ var uptimeRegex *regexp.Regexp
1516
var uptimeParts [5]time.Duration
1617

1718
func init() {
18-
uptimeRegex = regexp.MustCompile(`(?:(\d*)w)?(?:(\d*)d)?(?:(\d*)h)?(?:(\d*)m)?(?:(\d*)s)`)
19+
uptimeRegex = regexp.MustCompile(`(?:(\d*)w)?(?:(\d*)d)?(?:(\d*)h)?(?:(\d*)m)?(?:(\d*)s)?`)
1920
uptimeParts = [5]time.Duration{time.Hour * 168, time.Hour * 24, time.Hour, time.Minute, time.Second}
2021
}
2122

@@ -105,20 +106,26 @@ func (c *resourceCollector) collectMetricForProperty(property string, re *proto.
105106
func parseUptime(uptime string) (float64, error) {
106107
var u time.Duration
107108

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
109+
reMatch := uptimeRegex.FindAllStringSubmatch(uptime, -1)
110+
111+
// should get one and only one match back on the regex
112+
if len(reMatch) != 1 {
113+
return 0, fmt.Errorf("invalid uptime value sent to regex")
114+
} else {
115+
for i, match := range reMatch[0] {
116+
if match != "" && i != 0 {
117+
v, err := strconv.Atoi(match)
118+
if err != nil {
119+
log.WithFields(log.Fields{
120+
"uptime": uptime,
121+
"value": match,
122+
"error": err,
123+
}).Error("error parsing uptime field value")
124+
return float64(0), err
125+
}
126+
u += time.Duration(v) * uptimeParts[i-1]
118127
}
119-
u += time.Duration(v) * uptimeParts[i-1]
120128
}
121129
}
122-
123130
return u.Seconds(), nil
124131
}

collector/resource_collector_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ func TestParseUptime(t *testing.T) {
1313
{"3d3h42m53s", 272573},
1414
{"15w3d3h42m53s", 9344573},
1515
{"42m53s", 2573},
16+
{"7w6d9h34m", 4786440},
1617
}
1718

1819
for _, uptime := range uptimes {

0 commit comments

Comments
 (0)