Merge "Report the per-job build wait time to graphite"

This commit is contained in:
Jenkins 2015-10-06 18:26:39 +00:00 committed by Gerrit Code Review
commit 58d685073a
5 changed files with 39 additions and 5 deletions

View File

@ -624,6 +624,8 @@ class FakeBuild(threading.Thread):
result = 'RUN_ERROR'
else:
data['result'] = result
data['node_labels'] = ['bare-necessities']
data['node_name'] = 'foo'
work_fail = False
changes = None

View File

@ -263,6 +263,12 @@ class Client(zuul.cmd.ZuulApp):
'number': {
'title': 'Number'
},
'node_labels': {
'title': 'Node Labels'
},
'node_name': {
'title': 'Node Name'
},
'worker.name': {
'title': 'Worker'
},
@ -276,7 +282,7 @@ class Client(zuul.cmd.ZuulApp):
'worker.fqdn': {
'title': 'Worker Domain'
},
'worker.progam': {
'worker.program': {
'title': 'Worker Program'
},
'worker.version': {

View File

@ -423,9 +423,11 @@ class Gearman(object):
build = self.builds.get(job.unique)
if build:
data = getJobData(job)
build.node_labels = data.get('node_labels')
build.node_name = data.get('node_name')
if not build.canceled:
if result is None:
data = getJobData(job)
result = data.get('result')
if result is None:
build.retry = True

View File

@ -581,6 +581,8 @@ class Build(object):
self.retry = False
self.parameters = {}
self.worker = Worker()
self.node_labels = []
self.node_name = None
def __repr__(self):
return ('<Build %s of %s on %s>' %
@ -802,7 +804,9 @@ class QueueItem(object):
'canceled': build.canceled if build else None,
'retry': build.retry if build else None,
'number': build.number if build else None,
'worker': worker
'node_labels': build.node_labels if build else [],
'node_name': build.node_name if build else None,
'worker': worker,
})
if self.pipeline.haveAllJobsStarted(self):

View File

@ -530,6 +530,16 @@ class Scheduler(threading.Thread):
def onBuildStarted(self, build):
self.log.debug("Adding start event for build: %s" % build)
build.start_time = time.time()
try:
if statsd and build.pipeline:
jobname = build.job.name.replace('.', '_')
key = 'zuul.pipeline.%s.job.%s.wait_time' % (
build.pipeline.name, jobname)
dt = int((build.start_time - build.launch_time) * 1000)
statsd.timing(key, dt)
statsd.incr(key)
except:
self.log.exception("Exception reporting runtime stats")
event = BuildStartedEvent(build)
self.result_event_queue.put(event)
self.wake_event.set()
@ -547,14 +557,24 @@ class Scheduler(threading.Thread):
try:
if statsd and build.pipeline:
jobname = build.job.name.replace('.', '_')
key = 'zuul.pipeline.%s.all_jobs' % build.pipeline.name
for label in build.node_labels:
# Jenkins includes the node name in its list of labels, so
# we filter it out here, since that is not statistically
# interesting.
if label == build.node_name:
continue
dt = int((build.start_time - build.launch_time) * 1000)
key = 'zuul.node_type.%s.job.%s.wait_time' % (
label, jobname)
statsd.timing(key, dt)
statsd.incr(key)
key = 'zuul.pipeline.%s.job.%s.%s' % (build.pipeline.name,
jobname, build.result)
if build.result in ['SUCCESS', 'FAILURE'] and build.start_time:
dt = int((build.end_time - build.start_time) * 1000)
statsd.timing(key, dt)
statsd.incr(key)
key = 'zuul.pipeline.%s.all_jobs' % build.pipeline.name
statsd.incr(key)
except:
self.log.exception("Exception reporting runtime stats")
event = BuildCompletedEvent(build)