From 330be40cd6d119832771be5f76ef29d37fbd4e13 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Tue, 13 Jan 2026 12:01:03 +1100 Subject: [PATCH 1/8] compose: allow to simulate a remote environment locally --- compose.yaml | 4 ++++ src/lando/remote_settings.py | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/compose.yaml b/compose.yaml index bb114fe66..074f5ccd1 100644 --- a/compose.yaml +++ b/compose.yaml @@ -30,6 +30,10 @@ services: env_file: - .env environment: + # To simulate a remote environment, uncomment the following lines. + # ENVIRONMENT: production + # DJANGO_SETTINGS_MODULE: lando.remote_settings + DEFAULT_DB_HOST: db depends_on: db: diff --git a/src/lando/remote_settings.py b/src/lando/remote_settings.py index 3ca741acb..8548f0930 100644 --- a/src/lando/remote_settings.py +++ b/src/lando/remote_settings.py @@ -8,7 +8,9 @@ "BACKEND": "storages.backends.gcloud.GoogleCloudStorage", }, } -STATIC_URL = os.getenv("STATIC_URL") + +# Defined in lando.settings. +STATIC_URL = os.getenv("STATIC_URL", STATIC_URL) # noqa: F405 GS_BUCKET_NAME = os.getenv("GS_BUCKET_NAME") GS_PROJECT_ID = os.getenv("GS_PROJECT_ID") GS_QUERYSTRING_AUTH = False From 495c56a6e7690f34c2449e082a9b417c1c6a00f1 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Tue, 13 Jan 2026 14:09:59 +1100 Subject: [PATCH 2/8] logging: update MozLogFormatter to output MozLog (bug 1977738) --- src/lando/main/logging.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lando/main/logging.py b/src/lando/main/logging.py index be97550d2..b86e285e5 100644 --- a/src/lando/main/logging.py +++ b/src/lando/main/logging.py @@ -70,6 +70,17 @@ def format(self, record: logging.LogRecord) -> str: # (for example, the WSGIRequest object representing the request). Therefore # those values are converted to a string to avoid any issues when serializing. mozlog_record = { + # MozLog https://firefox-source-docs.mozilla.org/mozbase/mozlog.html#data-format + "action": "log", + "time": int(record.created * 1e3), + # We're single-threaded, but might as well report something useful. + "thread": self.hostname, + "pid": record.process, + "source": record.name, + # log action + "level": record.levelname, + "message": record.getMessage(), + # Old format "EnvVersion": self.MOZLOG_ENVVERSION, "Hostname": self.hostname, "Logger": self.mozlog_logger, From 42a9403a9183d2793e1dca0b9ea26b1599187d84 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Tue, 13 Jan 2026 16:19:50 +1100 Subject: [PATCH 3/8] landing_worker: fix log message typo --- src/lando/api/legacy/workers/landing_worker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lando/api/legacy/workers/landing_worker.py b/src/lando/api/legacy/workers/landing_worker.py index aebd96bba..7379c2aeb 100644 --- a/src/lando/api/legacy/workers/landing_worker.py +++ b/src/lando/api/legacy/workers/landing_worker.py @@ -566,5 +566,5 @@ def bootstrap_repos(self): except Exception as exc: sentry_sdk.capture_exception(exc) logger.warning( - f"Unexpected error `running mach` bootstrap for repo {repo.name}: {exc}" + f"Unexpected error running `mach bootstrap` for repo {repo.name}: {exc}" ) From cb134786136ca6ef865debf8b87453c0613cd0e1 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Tue, 13 Jan 2026 16:32:22 +1100 Subject: [PATCH 4/8] worker: log Worker.name when paused --- src/lando/api/legacy/workers/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lando/api/legacy/workers/base.py b/src/lando/api/legacy/workers/base.py index 570c1a191..09a7ab4fb 100644 --- a/src/lando/api/legacy/workers/base.py +++ b/src/lando/api/legacy/workers/base.py @@ -180,7 +180,7 @@ def _start(self, max_loops: int | None = None, *args, **kwargs): while self._paused: # Wait a set number of seconds before checking paused variable again. logger.info( - f"Paused, waiting {self.worker_instance.sleep_seconds} seconds..." + f"{self.worker_instance.name} paused, waiting {self.worker_instance.sleep_seconds} seconds..." ) self.throttle(self.worker_instance.sleep_seconds) self.loop(*args, **kwargs) From 156756ffd8663161a6307b7346839ae35d07d643 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Tue, 13 Jan 2026 16:32:39 +1100 Subject: [PATCH 5/8] dockerflow: log heartbeat requests at debug level --- src/lando/dockerflow/decorators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lando/dockerflow/decorators.py b/src/lando/dockerflow/decorators.py index eba9d27f2..51c2979de 100644 --- a/src/lando/dockerflow/decorators.py +++ b/src/lando/dockerflow/decorators.py @@ -22,7 +22,7 @@ def _wrapped_view(self, request, *args, **kwargs): # noqa: ANN001 "t": int(1000 * (end_time - start_time)), } - request_logger.info("Request Summary: ", extra=summary) + request_logger.debug("Request Summary: ", extra=summary) return response From acaa9ef2caf60f30b22f5289d47d768f441069f7 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Wed, 14 Jan 2026 10:25:26 +1100 Subject: [PATCH 6/8] fixup! compose: allow to simulate a remote environment locally --- compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose.yaml b/compose.yaml index 074f5ccd1..4b5115f29 100644 --- a/compose.yaml +++ b/compose.yaml @@ -31,7 +31,7 @@ services: - .env environment: # To simulate a remote environment, uncomment the following lines. - # ENVIRONMENT: production + # ENVIRONMENT: development # DJANGO_SETTINGS_MODULE: lando.remote_settings DEFAULT_DB_HOST: db From 06cff9b5648dcdef780ee592886e6ee84cc722fd Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Wed, 14 Jan 2026 10:25:26 +1100 Subject: [PATCH 7/8] fixup! compose: allow to simulate a remote environment locally --- src/lando/remote_settings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lando/remote_settings.py b/src/lando/remote_settings.py index 8548f0930..3b7bf91eb 100644 --- a/src/lando/remote_settings.py +++ b/src/lando/remote_settings.py @@ -9,7 +9,9 @@ }, } -# Defined in lando.settings. +# If missing, we default to `STATIC_URL`, from the `from settings import *`. +# This allows the code to run in a local environment configured to simulate a remote +# environment. STATIC_URL = os.getenv("STATIC_URL", STATIC_URL) # noqa: F405 GS_BUCKET_NAME = os.getenv("GS_BUCKET_NAME") GS_PROJECT_ID = os.getenv("GS_PROJECT_ID") From 24931e42d3c0f404dfc422fc1ee6f8e786f088d4 Mon Sep 17 00:00:00 2001 From: Olivier Mehani Date: Thu, 15 Jan 2026 16:23:31 +1100 Subject: [PATCH 8/8] fixup! acaa9ef2caf60f30b22f5289d47d768f441069f7 --- compose.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/compose.yaml b/compose.yaml index 4b5115f29..bb114fe66 100644 --- a/compose.yaml +++ b/compose.yaml @@ -30,10 +30,6 @@ services: env_file: - .env environment: - # To simulate a remote environment, uncomment the following lines. - # ENVIRONMENT: development - # DJANGO_SETTINGS_MODULE: lando.remote_settings - DEFAULT_DB_HOST: db depends_on: db: