From fe424dbfa292520794c21101fbbf66d9b2443a5a Mon Sep 17 00:00:00 2001 From: zzstoatzz Date: Thu, 24 Oct 2024 12:24:11 -0500 Subject: [PATCH 1/2] highlight cached state --- src/prefect/logging/highlighters.py | 2 + src/prefect/logging/logging.yml | 165 ++++++++++++++-------------- tests/test_highlighters.py | 4 +- 3 files changed, 87 insertions(+), 84 deletions(-) diff --git a/src/prefect/logging/highlighters.py b/src/prefect/logging/highlighters.py index 8a6e51632113..7b4bd1da2752 100644 --- a/src/prefect/logging/highlighters.py +++ b/src/prefect/logging/highlighters.py @@ -47,6 +47,8 @@ class StateHighlighter(RegexHighlighter): highlights = [ rf"(?P<{state.value.lower()}_state>{state.value.title()})" for state in StateType + ] + [ + r"(?PCached)(?=\(type=COMPLETED\))" # Highlight only "Cached" ] diff --git a/src/prefect/logging/logging.yml b/src/prefect/logging/logging.yml index 6bffc93c3b41..2d352b940952 100644 --- a/src/prefect/logging/logging.yml +++ b/src/prefect/logging/logging.yml @@ -9,107 +9,106 @@ version: 1 disable_existing_loggers: False formatters: - simple: - format: "%(asctime)s.%(msecs)03d | %(message)s" - datefmt: "%H:%M:%S" + simple: + format: "%(asctime)s.%(msecs)03d | %(message)s" + datefmt: "%H:%M:%S" - standard: - (): prefect.logging.formatters.PrefectFormatter - format: "%(asctime)s.%(msecs)03d | %(levelname)-7s | %(name)s - %(message)s" - flow_run_fmt: "%(asctime)s.%(msecs)03d | %(levelname)-7s | Flow run %(flow_run_name)r - %(message)s" - task_run_fmt: "%(asctime)s.%(msecs)03d | %(levelname)-7s | Task run %(task_run_name)r - %(message)s" - datefmt: "%H:%M:%S" + standard: + (): prefect.logging.formatters.PrefectFormatter + format: "%(asctime)s.%(msecs)03d | %(levelname)-7s | %(name)s - %(message)s" + flow_run_fmt: "%(asctime)s.%(msecs)03d | %(levelname)-7s | Flow run %(flow_run_name)r - %(message)s" + task_run_fmt: "%(asctime)s.%(msecs)03d | %(levelname)-7s | Task run %(task_run_name)r - %(message)s" + datefmt: "%H:%M:%S" - debug: - format: "%(asctime)s.%(msecs)03d | %(levelname)-7s | %(threadName)-12s | %(name)s - %(message)s" - datefmt: "%H:%M:%S" + debug: + format: "%(asctime)s.%(msecs)03d | %(levelname)-7s | %(threadName)-12s | %(name)s - %(message)s" + datefmt: "%H:%M:%S" - json: - class: prefect.logging.formatters.JsonFormatter - format: "default" + json: + class: prefect.logging.formatters.JsonFormatter + format: "default" # filters: - # Define any custom filters to drops records containing - # sensitive information - # my_filter: - # class: your_module.FilterClass +# Define any custom filters to drops records containing +# sensitive information +# my_filter: +# class: your_module.FilterClass handlers: - - # The handlers we define here will output all logs they receive by default - # but we include the `level` so it can be overridden by environment - - console: - level: 0 - class: prefect.logging.handlers.PrefectConsoleHandler - formatter: standard - styles: - log.web_url: bright_blue - log.local_url: bright_blue - - log.info_level: cyan - log.warning_level: yellow3 - log.error_level: red3 - log.critical_level: bright_red - - log.completed_state: green - log.cancelled_state: yellow3 - log.failed_state: red3 - log.crashed_state: bright_red - - log.flow_run_name: magenta - log.flow_name: bold magenta - - api: - level: 0 - class: prefect.logging.handlers.APILogHandler - - - debug: - level: 0 - class: logging.StreamHandler - formatter: debug + # The handlers we define here will output all logs they receive by default + # but we include the `level` so it can be overridden by environment + + console: + level: 0 + class: prefect.logging.handlers.PrefectConsoleHandler + formatter: standard + styles: + log.web_url: bright_blue + log.local_url: bright_blue + + log.info_level: cyan + log.warning_level: yellow3 + log.error_level: red3 + log.critical_level: bright_red + + log.completed_state: green + log.cancelled_state: yellow3 + log.failed_state: red3 + log.crashed_state: bright_red + log.cached_state: bright_blue + + log.flow_run_name: magenta + log.flow_name: bold magenta + + api: + level: 0 + class: prefect.logging.handlers.APILogHandler + + debug: + level: 0 + class: logging.StreamHandler + formatter: debug loggers: - prefect: - level: "${PREFECT_LOGGING_LEVEL}" + prefect: + level: "${PREFECT_LOGGING_LEVEL}" - prefect.extra: - level: "${PREFECT_LOGGING_LEVEL}" - handlers: [api] - propagate: false + prefect.extra: + level: "${PREFECT_LOGGING_LEVEL}" + handlers: [api] + propagate: false - prefect.flow_runs: - level: NOTSET - handlers: [api] + prefect.flow_runs: + level: NOTSET + handlers: [api] - prefect.task_runs: - level: NOTSET - handlers: [api] + prefect.task_runs: + level: NOTSET + handlers: [api] - prefect.server: - level: "${PREFECT_SERVER_LOGGING_LEVEL}" + prefect.server: + level: "${PREFECT_SERVER_LOGGING_LEVEL}" - prefect.client: - level: "${PREFECT_LOGGING_LEVEL}" + prefect.client: + level: "${PREFECT_LOGGING_LEVEL}" - prefect.infrastructure: - level: "${PREFECT_LOGGING_LEVEL}" + prefect.infrastructure: + level: "${PREFECT_LOGGING_LEVEL}" - prefect._internal: - level: "${PREFECT_LOGGING_INTERNAL_LEVEL}" - propagate: false - handlers: [debug] + prefect._internal: + level: "${PREFECT_LOGGING_INTERNAL_LEVEL}" + propagate: false + handlers: [debug] - uvicorn: - level: "${PREFECT_SERVER_LOGGING_LEVEL}" + uvicorn: + level: "${PREFECT_SERVER_LOGGING_LEVEL}" - fastapi: - level: "${PREFECT_SERVER_LOGGING_LEVEL}" + fastapi: + level: "${PREFECT_SERVER_LOGGING_LEVEL}" # The root logger: any logger without propagation disabled sends to here as well root: - # By default, we display warning level logs from any library in the console - # to match Python's default behavior while formatting logs nicely - level: WARNING - handlers: [console] + # By default, we display warning level logs from any library in the console + # to match Python's default behavior while formatting logs nicely + level: WARNING + handlers: [console] diff --git a/tests/test_highlighters.py b/tests/test_highlighters.py index 6c5a51444a62..3d4016633d27 100644 --- a/tests/test_highlighters.py +++ b/tests/test_highlighters.py @@ -44,7 +44,9 @@ def test_highlight_name(name, lower): ] -@pytest.mark.parametrize("state", ["completed", "cancelled", "failed", "crashed"]) +@pytest.mark.parametrize( + "state", ["completed", "cancelled", "failed", "crashed", "cached"] +) def test_highlight_state(state): keyword = state.title() text = Text(f"Flow run 'polite-jackal' - Finished in state {keyword}()") From c3d2e3bc7d82dfc4b86d150974ff8d0368bb64d2 Mon Sep 17 00:00:00 2001 From: zzstoatzz Date: Thu, 24 Oct 2024 12:25:45 -0500 Subject: [PATCH 2/2] fix test --- tests/test_highlighters.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/test_highlighters.py b/tests/test_highlighters.py index 3d4016633d27..73b15e573570 100644 --- a/tests/test_highlighters.py +++ b/tests/test_highlighters.py @@ -48,13 +48,21 @@ def test_highlight_name(name, lower): "state", ["completed", "cancelled", "failed", "crashed", "cached"] ) def test_highlight_state(state): - keyword = state.title() - text = Text(f"Flow run 'polite-jackal' - Finished in state {keyword}()") + if state == "cached": + text = Text( + "Flow run 'polite-jackal' - Finished in state Cached(type=COMPLETED)" + ) + expected_span = Span( + 45, 51, "state.cached_state" + ) # Only "Cached" is highlighted + else: + keyword = state.title() + text = Text(f"Flow run 'polite-jackal' - Finished in state {keyword}()") + expected_span = Span(45, 45 + len(keyword), f"state.{state}_state") + highlighter = StateHighlighter() highlighter.highlight(text) - assert text.spans == [ - Span(45, 45 + len(keyword), f"state.{state}_state"), - ] + assert text.spans == [expected_span] def test_highlight_console():