This is an automated email from the ASF dual-hosted git repository. ashb pushed a commit to branch revert-66571-fix/tasksdk-remote-log-load-warning in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 75e4ac83be44d379d8b913130071f04ffc003094 Author: Ash Berlin-Taylor <[email protected]> AuthorDate: Thu Jun 4 10:56:35 2026 +0100 Revert "Surface remote-log upload failures via structured warnings (#66571)" This reverts commit ef87426904c6bde23139b773b802fbafe3f858d2. --- task-sdk/src/airflow/sdk/log.py | 26 +------- task-sdk/tests/task_sdk/test_log.py | 120 ------------------------------------ 2 files changed, 2 insertions(+), 144 deletions(-) diff --git a/task-sdk/src/airflow/sdk/log.py b/task-sdk/src/airflow/sdk/log.py index 9542baa4046..f93abe1a722 100644 --- a/task-sdk/src/airflow/sdk/log.py +++ b/task-sdk/src/airflow/sdk/log.py @@ -226,42 +226,20 @@ def relative_path_from_logger(logger) -> Path | None: def upload_to_remote(logger: FilteringBoundLogger, ti: RuntimeTI): raw_logger = getattr(logger, "_logger") - # Dedicated logger for remote-upload visibility — operators relying on - # remote log handlers need a way to see when those handlers fail to load - # or fail to upload. - upload_log = structlog.get_logger("airflow.logging.remote") handler = load_remote_log_handler() if not handler: - upload_log.warning( - "remote_log_handler_unavailable", - ti_id=str(ti.id), - note="Remote log handler could not be loaded; logs will be available locally only.", - ) return try: relative_path = relative_path_from_logger(raw_logger) - except Exception as exc: - upload_log.warning( - "remote_log_path_resolution_failed", - ti_id=str(ti.id), - exc_info=exc, - ) + except Exception: return if not relative_path: return log_relative_path = relative_path.as_posix() - try: - handler.upload(log_relative_path, ti) - except Exception as exc: - upload_log.warning( - "remote_log_upload_failed", - ti_id=str(ti.id), - log_relative_path=log_relative_path, - exc_info=exc, - ) + handler.upload(log_relative_path, ti) def mask_secret(secret: JsonValue, name: str | None = None) -> None: diff --git a/task-sdk/tests/task_sdk/test_log.py b/task-sdk/tests/task_sdk/test_log.py deleted file mode 100644 index 6b7b22a4cb6..00000000000 --- a/task-sdk/tests/task_sdk/test_log.py +++ /dev/null @@ -1,120 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from __future__ import annotations - -from unittest import mock - -import structlog -import structlog.testing -from uuid6 import uuid7 - -from airflow.sdk import log as sdk_log - - -def _make_ti(): - ti = mock.MagicMock() - ti.id = uuid7() - return ti - - -def _make_logger(): - """Build a FilteringBoundLogger-like object exposing ``_logger``.""" - logger = mock.MagicMock() - logger._logger = mock.MagicMock() - return logger - - -class TestUploadToRemote: - def test_warns_when_handler_unavailable(self): - ti = _make_ti() - with ( - mock.patch.object(sdk_log, "load_remote_log_handler", return_value=None), - structlog.testing.capture_logs() as captured, - ): - sdk_log.upload_to_remote(_make_logger(), ti) - - events = [e for e in captured if e["event"] == "remote_log_handler_unavailable"] - assert len(events) == 1 - assert events[0]["log_level"] == "warning" - assert events[0]["ti_id"] == str(ti.id) - - def test_warns_when_path_resolution_fails(self): - ti = _make_ti() - handler = mock.MagicMock() - boom = RuntimeError("cannot resolve path") - with ( - mock.patch.object(sdk_log, "load_remote_log_handler", return_value=handler), - mock.patch.object(sdk_log, "relative_path_from_logger", side_effect=boom), - structlog.testing.capture_logs() as captured, - ): - sdk_log.upload_to_remote(_make_logger(), ti) - - events = [e for e in captured if e["event"] == "remote_log_path_resolution_failed"] - assert len(events) == 1 - assert events[0]["log_level"] == "warning" - assert events[0]["ti_id"] == str(ti.id) - assert events[0]["exc_info"] is boom - handler.upload.assert_not_called() - - def test_warns_when_upload_fails(self, tmp_path): - ti = _make_ti() - handler = mock.MagicMock() - boom = RuntimeError("s3 unreachable") - handler.upload.side_effect = boom - relative = tmp_path / "dag_id" / "run_id" / "task.log" - with ( - mock.patch.object(sdk_log, "load_remote_log_handler", return_value=handler), - mock.patch.object(sdk_log, "relative_path_from_logger", return_value=relative), - structlog.testing.capture_logs() as captured, - ): - sdk_log.upload_to_remote(_make_logger(), ti) - - events = [e for e in captured if e["event"] == "remote_log_upload_failed"] - assert len(events) == 1 - assert events[0]["log_level"] == "warning" - assert events[0]["ti_id"] == str(ti.id) - assert events[0]["log_relative_path"] == relative.as_posix() - assert events[0]["exc_info"] is boom - handler.upload.assert_called_once_with(relative.as_posix(), ti) - - def test_silent_when_relative_path_is_none(self): - ti = _make_ti() - handler = mock.MagicMock() - with ( - mock.patch.object(sdk_log, "load_remote_log_handler", return_value=handler), - mock.patch.object(sdk_log, "relative_path_from_logger", return_value=None), - structlog.testing.capture_logs() as captured, - ): - sdk_log.upload_to_remote(_make_logger(), ti) - - assert captured == [] - handler.upload.assert_not_called() - - def test_silent_on_success(self, tmp_path): - ti = _make_ti() - handler = mock.MagicMock() - relative = tmp_path / "dag_id" / "run_id" / "task.log" - with ( - mock.patch.object(sdk_log, "load_remote_log_handler", return_value=handler), - mock.patch.object(sdk_log, "relative_path_from_logger", return_value=relative), - structlog.testing.capture_logs() as captured, - ): - sdk_log.upload_to_remote(_make_logger(), ti) - - assert captured == [] - handler.upload.assert_called_once_with(relative.as_posix(), ti)
