Merge ~cjwatson/launchpad:numbercruncher-empty-build-queues into launchpad:master

Proposed by Colin Watson
Status: Needs review
Proposed branch: ~cjwatson/launchpad:numbercruncher-empty-build-queues
Merge into: launchpad:master
Diff against target: 61 lines (+21/-7)
2 files modified
lib/lp/services/statsd/numbercruncher.py (+15/-5)
lib/lp/services/statsd/tests/test_numbercruncher.py (+6/-2)
Reviewer Review Type Date Requested Status
Launchpad code reviewers Pending
Review via email: mp+411047@code.launchpad.net

Commit message

Send buildqueue gauges for active builders with empty queues

Description of the change

If builders for a (processor name, virtualized) combination exist but have no queued builds, we should still send a zero value for the corresponding `buildqueue` gauge, as otherwise we end up with unsightly gaps in graphs.

To post a comment you must log in.

Unmerged commits

b1c7acc... by Colin Watson

Send buildqueue gauges for active builders with empty queues

If builders for a (processor name, virtualized) combination exist but
have no queued builds, we should still send a zero value for the
corresponding `buildqueue` gauge, as otherwise we end up with unsightly
gaps in graphs.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/services/statsd/numbercruncher.py b/lib/lp/services/statsd/numbercruncher.py
2index 8d538fe..02aa08a 100644
3--- a/lib/lp/services/statsd/numbercruncher.py
4+++ b/lib/lp/services/statsd/numbercruncher.py
5@@ -89,13 +89,23 @@ class NumberCruncher(service.Service):
6 """
7 self.logger.debug("Updating build queue stats.")
8 try:
9+ # Send gauges for any (processor name, virtualized) combination
10+ # that has either an active builder or a pending build.
11+ queues = set()
12+ for builder in self.builder_factory.iterVitals():
13+ for processor_name in builder.processor_names:
14+ queues.add((processor_name, builder.virtualized))
15 queue_details = getUtility(IBuilderSet).getBuildQueueSizes()
16 for queue_type, contents in queue_details.items():
17- virt = queue_type == 'virt'
18- for arch, value in contents.items():
19- self._sendGauge(
20- "buildqueue", value[0],
21- labels={"virtualized": virt, "arch": arch})
22+ for processor_name in contents:
23+ queues.add((processor_name, queue_type == "virt"))
24+ for processor_name, virt in sorted(queues):
25+ virt_str = "virt" if virt else "nonvirt"
26+ queue_size, _ = queue_details[virt_str].get(
27+ processor_name, (0, None))
28+ self._sendGauge(
29+ "buildqueue", queue_size,
30+ labels={"virtualized": virt, "arch": processor_name})
31 self.logger.debug("Build queue stats update complete.")
32 except Exception:
33 self.logger.exception("Failure while updating build queue stats:")
34diff --git a/lib/lp/services/statsd/tests/test_numbercruncher.py b/lib/lp/services/statsd/tests/test_numbercruncher.py
35index e2ed4be..cb9f61a 100644
36--- a/lib/lp/services/statsd/tests/test_numbercruncher.py
37+++ b/lib/lp/services/statsd/tests/test_numbercruncher.py
38@@ -205,17 +205,21 @@ class TestNumberCruncher(StatsMixin, TestCaseWithFactory):
39 transaction.commit()
40 clock = task.Clock()
41 manager = NumberCruncher(clock=clock)
42+ manager.builder_factory.update()
43 manager._updateBuilderCounts = FakeMethod()
44 manager.updateBuilderQueues()
45
46 self.assertFalse(is_transaction_in_progress())
47- self.assertEqual(2, self.stats_client.gauge.call_count)
48 self.assertThat(
49 [x[0] for x in self.stats_client.gauge.call_args_list],
50 MatchesSetwise(
51 Equals(('buildqueue,arch={},env=test,virtualized=True'.format(
52 build.processor.name), 1)),
53- Equals(('buildqueue,arch=386,env=test,virtualized=False', 1))
54+ Equals(('buildqueue,arch=386,env=test,virtualized=False', 1)),
55+ # These builders exist even though their queues are empty,
56+ # so we send gauges for them to avoid gaps in graphs.
57+ Equals(('buildqueue,arch=amd64,env=test,virtualized=True', 0)),
58+ Equals(('buildqueue,arch=386,env=test,virtualized=True', 0)),
59 ))
60
61 def test_updateBuilderQueues_error(self):

Subscribers

People subscribed via source and target branches

to status/vote changes: