diff --git a/steps/observer.py b/steps/observer.py
index 555321993836..a89f0c5b1962 100644
--- a/steps/observer.py
+++ b/steps/observer.py
@@ -29,15 +29,19 @@ class SimpleLogObserver(ShellCommand):
 
     def __init__(self, maxsteps=10, *args, **kwargs):
         super().__init__(*args, **kwargs)
+        self.builder = None
         self.warningLines = []
         self.errorLines = []
         self.links = []
+        self.failed_ptests = []
+        self.testResultsLink = None
         if "description" in kwargs:
             self.description = kwargs["description"]
         else:
             self.description = "run-config"
         self.addLogObserver('stdio', logobserver.LineConsumerLogObserver(partial(self.logConsumer, 'stdio')))
         self.yocto_io_re = re.compile(".*/([^/]*yocto.io/pub/(non-release|repro-fail[^/]*/)([^ ']|$)+).*")
+        self.ptest_fails_re = re.compile(r"WARNING: (\S*)-[0-9.]*-r[0-9]* do_testimage:")
 
     def describe(self, done=False):
         return self.description
@@ -48,12 +52,19 @@ class SimpleLogObserver(ShellCommand):
             if line.startswith("WARNING:"):
                 self.warnCount += 1
                 self.warningLines.append(logname + ": " + line)
+                match = self.ptest_fails_re.match(line)
+                if match:
+                    self.failed_ptests.append(match.group(1))
             if line.startswith("ERROR:"):
                 self.errorCount += 1
                 self.errorLines.append(logname + ": " + line)
+            if line.startswith("Builder:"):
+                self.builder = line.split(':')[1].strip()
             url, matched = self.yocto_io_re.subn('https://\\1', line)
             if matched:
                 self.links.append(url)
+                if not self.testResultsLink and url.endswith("/testresults"):
+                    self.testResultsLink = url
 
     @defer.inlineCallbacks
     def finish_logs(self):
@@ -71,6 +82,12 @@ class SimpleLogObserver(ShellCommand):
             links = list(dict.fromkeys(self.links))
             htmlLinks = ['Found links:<ul>']
             htmlLinks.extend([f'<li><a href="{link}">{link}</a></li>' for link in links])
+
+            if self.testResultsLink and self.builder:
+                htmlLinks.extend(['</ul>ptest logs:<ul>'])
+                ptestLinks = [f"{self.testResultsLink}/{self.builder}/{ptest}"
+                              for ptest in self.failed_ptests]
+                htmlLinks.extend([f'<li><a href="{link}">{link}</a></li>' for link in ptestLinks])
             htmlLinks.append('</ul>')
             yield self.addHTMLLog('links', '\n'.join(htmlLinks))
 
