[users at bb.net] Gathering and displaying build time statistics on buildbot?

Dan Kegel dank at kegel.com
Tue Mar 15 15:36:53 UTC 2016

On Tue, Mar 15, 2016 at 6:48 AM, Pierre Tardy <tardyp at gmail.com> wrote:
>> > For eight indeed you are pretty much bound to polling the json api.
>> One bit of data I don't know how to access is the build request's
>> submitted_at time.  How would one get at that via json?
> Looks like there is none alas. I had to hack one or two endpoints in my own
> old eight instance.

What about in nine -- will the stats service expose submitted_at
(or its more interesting dual, latency = start_time - submitted_at)?

Back on eight, this hack seems to work, but of course doesn't give me
anything for old builds
(Is there a way to get the real submitted_at as a property, instead of
faking it?):

--- a/master/buildbot/schedulers/base.py
+++ b/master/buildbot/schedulers/base.py
@@ -23,6 +23,7 @@ from twisted.internet import defer
 from twisted.python import failure
 from twisted.python import log
 from zope.interface import implements
+import time

 class BaseScheduler(service.MultiService, ComparableMixin, StateMixin):
@@ -442,6 +443,9 @@ class BaseScheduler(service.MultiService,
ComparableMixin, StateMixin):
         if not builderNames:
             builderNames = self.builderNames

+        # fake submitted_at; it should come from BuildSetStatus, really?
+        properties.setProperty("submitted_at", str(time.time()),
"fakedByBaseScheduler", True)
         # translate properties object into a dict as required by the
         # addBuildset method
         properties_dict = properties.asDict()

--- a/master/contrib/buildbot_json.py
+++ b/master/contrib/buildbot_json.py
@@ -692,7 +692,7 @@ class BuildSteps(NonAddressableNodeList):
 class Build(AddressableDataNode):
     printable_attributes = AddressableDataNode.printable_attributes + [
         'key', 'number', 'steps', 'blame', 'reason', 'revision', 'result',
-        'simplified_result', 'start_time', 'end_time', 'duration', 'slave',
+        'simplified_result', 'start_time', 'end_time', 'latency',
'duration', 'slave',
         'properties', 'completed',

@@ -715,6 +715,14 @@ class Build(AddressableDataNode):

+    def latency(self):
+        if self.data.get('times'):
+            for p in self.data.get('properties'):
+                if p[0] == 'submitted_at':
+                    submitted_at = int(round(float(p[1])))
+                    return self.start_time - submitted_at
+    @property
     def start_time(self):
         if self.data.get('times'):
             return int(round(self.data['times'][0]))

More information about the users mailing list