summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gobang.go31
-rw-r--r--tests/gobang.go50
2 files changed, 81 insertions, 0 deletions
diff --git a/src/gobang.go b/src/gobang.go
index 921597e..804cd34 100644
--- a/src/gobang.go
+++ b/src/gobang.go
@@ -14,6 +14,7 @@ import (
"slices"
"strings"
"syscall"
+ "time"
"guuid"
)
@@ -201,6 +202,36 @@ func metric(type_ string, label string, args ...any) {
)
}
+func Timed(label string, thunk func() any, args ...any) any {
+ var (
+ start time.Time
+ end time.Time
+ ret any
+ )
+
+
+ {
+ start = time.Now()
+ ret = thunk()
+ end = time.Now()
+ }
+
+ duration := end.Sub(start)
+ metric(
+ "timer", label,
+ slices.Concat(
+ []any{
+ "start", start,
+ "end", end,
+ "duration", duration,
+ },
+ args,
+ )...,
+ )
+
+ return ret
+}
+
func MakeCounter(label string) func(...any) {
return func(args ...any) {
metric(
diff --git a/tests/gobang.go b/tests/gobang.go
index e2dd61b..14fe829 100644
--- a/tests/gobang.go
+++ b/tests/gobang.go
@@ -383,6 +383,55 @@ func test_metric() {
})
}
+func test_Timed() {
+ TestStart("Timed()")
+
+ Testing("we can use a noop thunk", func() {
+ savedLogger := slog.Default()
+ savedFlag := emitMetric
+
+ s := new(strings.Builder)
+ SetLoggerOutput(s)
+ emitMetric = true
+
+ Timed("timer-label", func() any { return nil }, "key-1", "value-1")
+
+ var data map[string]interface{}
+ err := json.Unmarshal([]byte(s.String()), &data)
+ ErrorIf(err)
+
+ AssertEqual(data["type"].(string), "timer")
+ AssertEqual(data["label"].(string), "timer-label")
+ AssertEqual(data["key-1"].(string), "value-1")
+
+ var ok bool
+ _, ok = data["start"].(string)
+ AssertEqual(ok, true)
+ _, ok = data["end"].(string)
+ AssertEqual(ok, true)
+ _, ok = data["duration"].(float64)
+ AssertEqual(ok, true)
+
+ slog.SetDefault(savedLogger)
+ emitMetric = savedFlag
+ })
+
+ Testing("it propagates the return value", func() {
+ savedLogger := slog.Default()
+ savedFlag := emitMetric
+
+ s := new(strings.Builder)
+ SetLoggerOutput(s)
+ emitMetric = true
+
+ val := Timed("timer-label", func() any { return 123 }, "key-1", "value-1")
+ AssertEqual(val, 123)
+
+ slog.SetDefault(savedLogger)
+ emitMetric = savedFlag
+ })
+}
+
func test_MakeCounter() {
TestStart("MakeCounter()")
@@ -875,6 +924,7 @@ func MainTest() {
test_Warning()
test_Error()
test_metric()
+ test_Timed()
test_MakeCounter()
test_MakeGauge()
test_ErrorIf()