summaryrefslogtreecommitdiff
path: root/examples/redis-unstable/tests/unit/latency-monitor.tcl
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2026-01-21 22:40:55 +0100
committerMitja Felicijan <mitja.felicijan@gmail.com>2026-01-21 22:40:55 +0100
commit5d8dfe892a2ea89f706ee140c3bdcfd89fe03fda (patch)
tree1acdfa5220cd13b7be43a2a01368e80d306473ca /examples/redis-unstable/tests/unit/latency-monitor.tcl
parentc7ab12bba64d9c20ccd79b132dac475f7bc3923e (diff)
downloadcrep-5d8dfe892a2ea89f706ee140c3bdcfd89fe03fda.tar.gz
Add Redis source code for testing
Diffstat (limited to 'examples/redis-unstable/tests/unit/latency-monitor.tcl')
-rw-r--r--examples/redis-unstable/tests/unit/latency-monitor.tcl189
1 files changed, 189 insertions, 0 deletions
diff --git a/examples/redis-unstable/tests/unit/latency-monitor.tcl b/examples/redis-unstable/tests/unit/latency-monitor.tcl
new file mode 100644
index 0000000..9e714c1
--- /dev/null
+++ b/examples/redis-unstable/tests/unit/latency-monitor.tcl
@@ -0,0 +1,189 @@
+start_server {tags {"latency-monitor needs:latency"}} {
+ # Set a threshold high enough to avoid spurious latency events.
+ r config set latency-monitor-threshold 200
+ r latency reset
+
+ test {LATENCY HISTOGRAM with empty histogram} {
+ r config resetstat
+ set histo [dict create {*}[r latency histogram]]
+ # Config resetstat is recorded
+ assert_equal [dict size $histo] 1
+ assert_match {*config|resetstat*} $histo
+ }
+
+ test {LATENCY HISTOGRAM all commands} {
+ r config resetstat
+ r set a b
+ r set c d
+ set histo [dict create {*}[r latency histogram]]
+ assert_match {calls 2 histogram_usec *} [dict get $histo set]
+ assert_match {calls 1 histogram_usec *} [dict get $histo "config|resetstat"]
+ }
+
+ test {LATENCY HISTOGRAM sub commands} {
+ r config resetstat
+ r client id
+ r client list
+ # parent command reply with its sub commands
+ set histo [dict create {*}[r latency histogram client]]
+ assert {[dict size $histo] == 2}
+ assert_match {calls 1 histogram_usec *} [dict get $histo "client|id"]
+ assert_match {calls 1 histogram_usec *} [dict get $histo "client|list"]
+
+ # explicitly ask for one sub-command
+ set histo [dict create {*}[r latency histogram "client|id"]]
+ assert {[dict size $histo] == 1}
+ assert_match {calls 1 histogram_usec *} [dict get $histo "client|id"]
+ }
+
+ test {LATENCY HISTOGRAM with a subset of commands} {
+ r config resetstat
+ r set a b
+ r set c d
+ r get a
+ r hset f k v
+ r hgetall f
+ set histo [dict create {*}[r latency histogram set hset]]
+ assert_match {calls 2 histogram_usec *} [dict get $histo set]
+ assert_match {calls 1 histogram_usec *} [dict get $histo hset]
+ assert_equal [dict size $histo] 2
+ set histo [dict create {*}[r latency histogram hgetall get zadd]]
+ assert_match {calls 1 histogram_usec *} [dict get $histo hgetall]
+ assert_match {calls 1 histogram_usec *} [dict get $histo get]
+ assert_equal [dict size $histo] 2
+ }
+
+ test {LATENCY HISTOGRAM command} {
+ r config resetstat
+ r set a b
+ r get a
+ assert {[llength [r latency histogram set get]] == 4}
+ }
+
+ test {LATENCY HISTOGRAM with wrong command name skips the invalid one} {
+ r config resetstat
+ assert {[llength [r latency histogram blabla]] == 0}
+ assert {[llength [r latency histogram blabla blabla2 set get]] == 0}
+ r set a b
+ r get a
+ assert_match {calls 1 histogram_usec *} [lindex [r latency histogram blabla blabla2 set get] 1]
+ assert_match {calls 1 histogram_usec *} [lindex [r latency histogram blabla blabla2 set get] 3]
+ assert {[string length [r latency histogram blabla set get]] > 0}
+ }
+
+tags {"needs:debug"} {
+ set old_threshold_value [lindex [r config get latency-monitor-threshold] 1]
+
+ test {Test latency events logging} {
+ r config set latency-monitor-threshold 200
+ r latency reset
+ r debug sleep 0.3
+ after 1100
+ r debug sleep 0.4
+ after 1100
+ r debug sleep 0.5
+ r config set latency-monitor-threshold 0
+ assert {[r latency history command] >= 3}
+ }
+
+ test {LATENCY HISTORY output is ok} {
+ set res [r latency history command]
+ if {$::verbose} {
+ puts "LATENCY HISTORY data:"
+ puts $res
+ }
+
+ set min 250
+ set max 450
+ foreach event $res {
+ lassign $event time latency
+ if {!$::no_latency} {
+ assert {$latency >= $min && $latency <= $max}
+ }
+ incr min 100
+ incr max 100
+ set last_time $time ; # Used in the next test
+ }
+ }
+
+ test {LATENCY LATEST output is ok} {
+ set res [r latency latest]
+ if {$::verbose} {
+ puts "LATENCY LATEST data:"
+ puts $res
+ }
+
+ foreach event $res {
+ lassign $event eventname time latency max
+ assert {$eventname eq "command"}
+ if {!$::no_latency} {
+ assert {$max >= 450 & $max <= 650}
+ assert {$time == $last_time}
+ }
+ break
+ }
+ }
+
+ test {LATENCY GRAPH can output the event graph} {
+ set res [r latency graph command]
+ if {$::verbose} {
+ puts "LATENCY GRAPH data:"
+ puts $res
+ }
+ assert_match {*command*high*low*} $res
+
+ # These numbers are taken from the "Test latency events logging" test.
+ # (debug sleep 0.3) and (debug sleep 0.5), using range to prevent timing issue.
+ regexp "command - high (.*?) ms, low (.*?) ms" $res -> high low
+ assert_morethan_equal $high 500
+ assert_morethan_equal $low 300
+ }
+
+ r config set latency-monitor-threshold $old_threshold_value
+} ;# tag
+
+ test {LATENCY of expire events are correctly collected} {
+ r config set latency-monitor-threshold 20
+ r flushdb
+ if {$::valgrind} {set count 100000} else {set count 1000000}
+ r eval {
+ local i = 0
+ while (i < tonumber(ARGV[1])) do
+ redis.call('sadd',KEYS[1],i)
+ i = i+1
+ end
+ } 1 mybigkey $count
+ r pexpire mybigkey 50
+ wait_for_condition 5 100 {
+ [r dbsize] == 0
+ } else {
+ fail "key wasn't expired"
+ }
+ assert_match {*expire-cycle*} [r latency latest]
+
+ test {LATENCY GRAPH can output the expire event graph} {
+ assert_match {*expire-cycle*high*low*} [r latency graph expire-cycle]
+ }
+
+ r config set latency-monitor-threshold 200
+ }
+
+ test {LATENCY HISTORY / RESET with wrong event name is fine} {
+ assert {[llength [r latency history blabla]] == 0}
+ assert {[r latency reset blabla] == 0}
+ }
+
+ test {LATENCY DOCTOR produces some output} {
+ assert {[string length [r latency doctor]] > 0}
+ }
+
+ test {LATENCY RESET is able to reset events} {
+ assert {[r latency reset] > 0}
+ assert {[r latency latest] eq {}}
+ }
+
+ test {LATENCY HELP should not have unexpected options} {
+ catch {r LATENCY help xxx} e
+ assert_match "*wrong number of arguments for 'latency|help' command" $e
+ }
+}