diff --git a/doc/source/operation.rst b/doc/source/operation.rst index 33d315e11..2a680e99c 100644 --- a/doc/source/operation.rst +++ b/doc/source/operation.rst @@ -482,6 +482,13 @@ The following metrics are produced by a ``nodepool-builder`` process: Number of image uploads to a specific provider in the cloud plus the time in seconds spent to upload the image. +.. zuul:stat:: nodepool.image_build_requests + :type: gauge + + Number of manual build requests outstanding (does not include + currently running builds). + + Nodepool launcher ~~~~~~~~~~~~~~~~~ diff --git a/nodepool/builder.py b/nodepool/builder.py index 28dd9b2d2..de8f2077e 100644 --- a/nodepool/builder.py +++ b/nodepool/builder.py @@ -377,6 +377,24 @@ class CleanupWorker(BaseWorker): except Exception: self.log.exception("Exception cleaning up image %s:", image) + def _emitBuildRequestStats(self): + '''Emit general build request stats + + This runs in the cleanup worker because it's the least likely + thread to be stopped for hours on end. + ''' + if not self._statsd: + return + count = 0 + for image_name in self._zk.getImageNames(): + request = self._zk.getBuildRequest(image_name) + if request and request.pending: + count += 1 + pipeline = self._statsd.pipeline() + key = 'nodepool.image_build_requests' + pipeline.gauge(key, count) + pipeline.send() + def _filterLocalBuilds(self, image, builds): '''Return the subset of builds that are local''' ret = [] @@ -569,6 +587,7 @@ class CleanupWorker(BaseWorker): self._config = new_config self._cleanup() + self._emitBuildRequestStats() class BuildWorker(BaseWorker): diff --git a/nodepool/tests/unit/test_webapp.py b/nodepool/tests/unit/test_webapp.py index 34e9b0891..d6c0120f0 100644 --- a/nodepool/tests/unit/test_webapp.py +++ b/nodepool/tests/unit/test_webapp.py @@ -179,6 +179,9 @@ class TestWebApp(tests.DBTestCase): "paused": False, "build_request": "pending"}, objs[0]) + builder._janitor._emitBuildRequestStats() + self.assertReportedStat('nodepool.image_build_requests', '1', 'g') + webapp.cache.cache.clear() with self.zk.imageBuildLock('fake-image', blocking=True, timeout=1): f = request.urlopen(req) diff --git a/releasenotes/notes/build-requests-stats-789188316aa9831a.yaml b/releasenotes/notes/build-requests-stats-789188316aa9831a.yaml new file mode 100644 index 000000000..f4942f1af --- /dev/null +++ b/releasenotes/notes/build-requests-stats-789188316aa9831a.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + A new statsd metric, ``nodepool.image_build_requests`` is + available. It reports the number of outstanding manual image + build requests.