diff --git a/Documentation/topics/testing.rst b/Documentation/topics/testing.rst
index d85dc50c6..cc928ef64 100644
--- a/Documentation/topics/testing.rst
+++ b/Documentation/topics/testing.rst
@@ -220,6 +220,30 @@ All the features documented under `Unit Tests`_ are available for the
 datapath testsuites, except that the datapath testsuites do not
 support running tests in parallel.
 
+It is also possible to run `retis`_ capture along with the `check-kernel` tests
+by setting `OVS_TEST_WITH_RETIS` environment variable to 'yes'.  This can be
+useful for debugging the test cases.  For example, the following command can be
+used to run the test 168 under `retis`::
+
+    $ make check-kernel OVS_TEST_WITH_RETIS=yes TESTSUITEFLAGS='168 -d'
+
+After the test is completed, the following data will be available in the test
+directory:
+
+* `retis.err` - standard error stream of the `retis collect`.
+* `retis.log` - standard output of the `retis collect`, contains all captured
+  events in the order they appeared.
+* `retis.data` - raw events collected by retis, `retis sort` or other commands
+  can be used on this file for further analysis.
+* `retis.sorted` - text file containing the output of `retis sort` executed on
+  the `retis.data`, for convenience.
+
+Requires retis version 1.5 or newer.  And this also requires OVS submodule to
+be built with `--enable-usdt-probes`.
+
+.. _retis: https://github.com/retis-org/retis
+
+
 Performance testing
 ~~~~~~~~~~~~~~~~~~~
 
diff --git a/NEWS b/NEWS
index 8fa0c3f26..365134d61 100644
--- a/NEWS
+++ b/NEWS
@@ -36,6 +36,9 @@ Post v25.03.0
    - Added a new ACL option "--all" to "acl-list" command. When set,
      "acl-list" command will also list port groups ACLs associated with
      each port of the target logical switch.
+   - Added support for running tests from the 'check-kernel' system test target
+     under retis by setting OVS_TEST_WITH_RETIS=yes.  See the 'Testing' section
+     of the documentation for more details.
 
 OVN v25.03.0 - 07 Mar 2025
 --------------------------
diff --git a/tests/system-common-macros.at b/tests/system-common-macros.at
index 93979ff62..a49776f38 100644
--- a/tests/system-common-macros.at
+++ b/tests/system-common-macros.at
@@ -244,9 +244,20 @@ m4_define([FORMAT_CT],
 #
 m4_define([DAEMONIZE],
    [$1 & echo $! > $2
-     echo "kill \`cat $2\`" >> cleanup
-   ]
-)
+    on_exit "kill \`cat $2\`"
+   ])
+
+# RETIS_CHECK_AND_RUN()
+#
+# Start retis to track all the traffic passing through OVS.
+m4_define([RETIS_CHECK_AND_RUN],
+  [if test "$OVS_TEST_WITH_RETIS" = yes && retis --version > /dev/null; then
+       on_exit 'retis sort --utc retis.data > retis.sorted'
+       DAEMONIZE([retis -p ifdump collect --utc --allow-system-changes \
+                        --ovs-track --out --print 2>retis.err 1>retis.log],
+                 [retis.pid])
+       OVS_WAIT_UNTIL([grep -q 'loaded' retis.err])
+   fi])
 
 # NETNS_DAEMONIZE([namespace], [command], [pidfile])
 #
diff --git a/tests/system-kmod-macros.at b/tests/system-kmod-macros.at
index 41a8b7914..1ada0077e 100644
--- a/tests/system-kmod-macros.at
+++ b/tests/system-kmod-macros.at
@@ -30,6 +30,9 @@ m4_define([OVS_TRAFFIC_VSWITCHD_START],
    if test OVN_MONITOR_ALL = yes; then
         ovs-vsctl set open . external_ids:ovn-monitor-all=true
    fi
+
+   dnl Start retis capture if requested.
+   RETIS_CHECK_AND_RUN()
 ])
 
 # OVS_TRAFFIC_VSWITCHD_STOP([ALLOWLIST], [extra_cmds])
