diff options
-rw-r--r-- | src/gobang.go | 31 | ||||
-rw-r--r-- | tests/gobang.go | 50 |
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() |