From 09357ed3c44071ad41a34f1b1b97a43010e60015 Mon Sep 17 00:00:00 2001 From: Robert Estelle Date: Sun, 12 Jul 2015 13:31:32 -0400 Subject: [PATCH 1/3] Only log '[num] workers' message when it changes. Otherwise when debug logging is on, the message prints every second even with no system activity. --- gunicorn/arbiter.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index b7ee05da..2269fd5f 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -473,6 +473,8 @@ class Arbiter(object): Maintain the number of workers by spawning or killing as required. """ + orig_num_workers = self.num_workers + if len(self.WORKERS.keys()) < self.num_workers: self.spawn_workers() @@ -482,10 +484,11 @@ class Arbiter(object): (pid, _) = workers.pop(0) self.kill_worker(pid, signal.SIGTERM) - self.log.debug("{0} workers".format(len(workers)), - extra={"metric": "gunicorn.workers", - "value": len(workers), - "mtype": "gauge"}) + if self.num_workers != orig_num_workers: + self.log.debug("{0} workers".format(len(workers)), + extra={"metric": "gunicorn.workers", + "value": len(workers), + "mtype": "gauge"}) def spawn_worker(self): self.worker_age += 1 From 6f6ec92c4e917d4bde80bd35d5af96ce232ba549 Mon Sep 17 00:00:00 2001 From: Robert Estelle Date: Sun, 19 Jul 2015 16:09:23 -0400 Subject: [PATCH 2/3] Store last logged worker count. This is easier and safer than only logging when we detect that self.WORKERS has changed or that `spawn_worker` or `kill_worker` has been done. --- gunicorn/arbiter.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 2269fd5f..30f64df3 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -51,6 +51,8 @@ class Arbiter(object): if name[:3] == "SIG" and name[3] != "_" ) + last_logged_worker_count = None + def __init__(self, app): os.environ["SERVER_SOFTWARE"] = SERVER_SOFTWARE @@ -473,8 +475,6 @@ class Arbiter(object): Maintain the number of workers by spawning or killing as required. """ - orig_num_workers = self.num_workers - if len(self.WORKERS.keys()) < self.num_workers: self.spawn_workers() @@ -484,10 +484,12 @@ class Arbiter(object): (pid, _) = workers.pop(0) self.kill_worker(pid, signal.SIGTERM) - if self.num_workers != orig_num_workers: - self.log.debug("{0} workers".format(len(workers)), + active_worker_count = len(workers) + if self.last_logged_worker_count != active_worker_count: + self.last_logged_worker_count = active_worker_count + self.log.debug("{0} workers".format(active_worker_count), extra={"metric": "gunicorn.workers", - "value": len(workers), + "value": active_worker_count, "mtype": "gauge"}) def spawn_worker(self): From e0287108720b19ac520485349091df07d5c2a7d2 Mon Sep 17 00:00:00 2001 From: Robert Estelle Date: Thu, 23 Jul 2015 18:14:02 -0400 Subject: [PATCH 3/3] Make last logged worker count an explicit instance var. --- gunicorn/arbiter.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 30f64df3..9985d944 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -51,12 +51,12 @@ class Arbiter(object): if name[:3] == "SIG" and name[3] != "_" ) - last_logged_worker_count = None - def __init__(self, app): os.environ["SERVER_SOFTWARE"] = SERVER_SOFTWARE self._num_workers = None + self._last_logged_active_worker_count = None + self.setup(app) self.pidfile = None @@ -485,8 +485,8 @@ class Arbiter(object): self.kill_worker(pid, signal.SIGTERM) active_worker_count = len(workers) - if self.last_logged_worker_count != active_worker_count: - self.last_logged_worker_count = active_worker_count + if self._last_logged_active_worker_count != active_worker_count: + self._last_logged_active_worker_count = active_worker_count self.log.debug("{0} workers".format(active_worker_count), extra={"metric": "gunicorn.workers", "value": active_worker_count,