return ret
- def get_build_durations(self):
- res = self.db.query("SELECT platform, MIN(duration) AS minimum, \
- MAX(duration) AS maximum, AVG(duration) AS average, \
- STDDEV_POP(duration) AS stddev \
- FROM builds_times GROUP BY platform \
- UNION SELECT 'all', MIN(duration) AS minimum, \
- MAX(duration) AS maximum, AVG(duration) AS average, \
- STDDEV_POP(duration) AS stddev \
- FROM builds_times")
-
- ret = {}
- for row in res:
- ret[row.platform] = {
- "minimum" : int(row.minimum),
- "maximum" : int(row.maximum),
- "average" : int(row.average),
- "stddev" : int(row.stddev),
- }
-
- return ret
-
class Job(base.DataObject):
table = "jobs"
CREATE VIEW builds_times AS
SELECT builds.id AS build_id,
jobs.arch,
- arches.platform,
jobs.type AS job_type,
(jobs.time_finished - jobs.time_started) AS duration
- FROM (((jobs
+ FROM (jobs
LEFT JOIN builds ON ((jobs.build_id = builds.id)))
- LEFT JOIN packages ON ((builds.pkg_id = packages.id)))
- LEFT JOIN arches ON ((jobs.arch = arches.name)))
WHERE (jobs.state = 'finished'::jobs_state);
# Statistics
(r"/statistics/builds/types", handlers.StatsBuildsTypesHandler),
- (r"/statistics/jobs/durations", handlers.StatsJobsDurationsHandler),
(r"/statistics/jobs/queue", handlers.StatsJobsQueueHandler),
(r"/statistics/jobs/states", handlers.StatsJobsStatesHandler),
self.write(ret)
-class StatsJobsDurationsHandler(BaseHandler):
- def get(self):
- durations = self.backend.jobs.get_build_durations()
-
- ret = {}
- for platform, d in durations.items():
- ret.update({
- "jobs_durations_%s_minimum" % platform : d.get("minimum", None),
- "jobs_durations_%s_maximum" % platform : d.get("maximum", None),
- "jobs_durations_%s_average" % platform : d.get("average", None),
- "jobs_durations_%s_stddev" % platform : d.get("stddev", None),
- })
-
- self.write(ret)
-
class StatsJobsStatesHandler(BaseHandler):
def get(self):
ret = {}