summary refs log tree commit diff
path: root/pkgs/servers/monitoring/prometheus/smartctl-exporter/0001-Return-the-cached-value-if-it-s-not-time-to-scan-aga.patch
blob: 28616251f37ef41cd7bd8d63bc779075338094f8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
From e81b06df67b1d42ef915615fafa0b56ef956673b Mon Sep 17 00:00:00 2001
From: Andreas Fuchs <asf@boinkor.net>
Date: Thu, 11 Feb 2021 17:30:44 -0500
Subject: [PATCH] Return the cached value if it's not time to scan again yet

This should ensure that if we have a valid value cached (which ought
to be every time after the first scan), we return it as metrics.

This fixes the crashes that would happen if queries happened earlier
than the re-scan interval allowed.

Address review feedback: Shorten the time-to-scan logic

We can express this in a single if statement, so it takes fewer lines
to do the "should we check again" check.
---
 readjson.go | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/readjson.go b/readjson.go
index da35448..c9996fd 100644
--- a/readjson.go
+++ b/readjson.go
@@ -78,14 +78,7 @@ func readData(device string) (gjson.Result, error) {
 
 	if _, err := os.Stat(device); err == nil {
 		cacheValue, cacheOk := jsonCache[device]
-		timeToScan := false
-		if cacheOk {
-			timeToScan = time.Now().After(cacheValue.LastCollect.Add(options.SMARTctl.CollectPeriodDuration))
-		} else {
-			timeToScan = true
-		}
-
-		if timeToScan {
+		if !cacheOk || time.Now().After(cacheValue.LastCollect.Add(options.SMARTctl.CollectPeriodDuration)) {
 			json, ok := readSMARTctl(device)
 			if ok {
 				jsonCache[device] = JSONCache{JSON: json, LastCollect: time.Now()}
@@ -93,7 +86,7 @@ func readData(device string) (gjson.Result, error) {
 			}
 			return gjson.Parse(DEFAULT_EMPTY_JSON), fmt.Errorf("smartctl returned bad data for device %s", device)
 		}
-		return gjson.Parse(DEFAULT_EMPTY_JSON), fmt.Errorf("Too early collect called for device %s", device)
+		return cacheValue.JSON, nil
 	}
 	return gjson.Parse(DEFAULT_EMPTY_JSON), fmt.Errorf("Device %s unavialable", device)
 }
-- 
2.33.1