Remove gunicorn daemonize for api-server - #52860

Merged
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize
Jul 7, 2025
Merged

Remove gunicorn daemonize for api-server#52860
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize

Conversation

@jason810496

@jason810496jason810496 commented Jul 4, 2025

Copy link
Copy Markdown
Member

related: #52581

Why

When I attempt to remove gunicorn dependency in #52581, I found that we are still using gunicorn for daemonization.

What

  • Replace gunicorn.daemonize with run_command_with_daemon_option, this also align the behavior of --daemon option for scheduler, triggerer ... and api-server
  • Add test for api-server with --daemon as well
    • Rename _CommonCLIGunicornTestClass to _CommonCLIUvicornTestClass, since we are using uvicorn instead of gunicorn for api-server now.
  • Replace [api/access_logfile] config with [api/log_config], detail in Remove gunicorn daemonize for api-server #52860 (comment)

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 1dfe755 to 7a44f9aCompareJuly 4, 2025 10:22
@jason810496jason810496 added the area:API Airflow's REST/HTTP API label Jul 4, 2025
@jason810496
jason810496 marked this pull request as ready for review July 4, 2025 10:22

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

access_log=access_logfile, # type: ignore[arg-type] this line is a strange part for me.

I add # type: ignore[arg-type] to ingore the mypy warning for now.

Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
@jason810496

jason810496 commented Jul 5, 2025

Copy link
Copy Markdown
MemberAuthor

Hi @potiuk, may I might need hints for replacing config.

I thought replacing them in config.yaml and add the pair in deprecated_option in configuration will be all right.

Thanks in advance!


Update:

I found the root cause.

My step is correct but I set [api/log_config] config default as None in config.yml and I set default=conf.get("api", "log_config") in cli_config module.
There is not need to set default=conf.get("api", "log_config") or should set fallback=None for the --log-config flag in cli_config, since the it is not mandatory.

@jason810496
jason810496 marked this pull request as draft July 6, 2025 02:29
@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 89b529e to 52151feCompareJuly 6, 2025 03:08
@jason810496
jason810496 marked this pull request as ready for review July 6, 2025 04:30

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @potiuk and @pierrejeambrun for the review!
Just resolved all comments and fixed the CI as well.

Comment threadairflow-core/src/airflow/config_templates/config.yml

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. One NIT about updating newsfragment.

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 52151fe to ef4c730CompareJuly 7, 2025 14:02
@potiuk
potiuk merged commit ab1ee72 into apache:mainJul 7, 2025
1 check passed
This was referenced Jul 10, 2025
HsiuChuanHsu pushed a commit to HsiuChuanHsu/airflow that referenced this pull request Jul 10, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
stephen-bracken pushed a commit to stephen-bracken/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 18, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
potiuk pushed a commit that referenced this pull request Jul 20, 2025
* [v3-0-test] Remove gunicorn daemonize for api-server (#52860)
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
* Fix spelling wordlist
* Fix configuration
("api", "require_confirmation_dag_change"): ("webserver", "require_confirmation_dag_change", "3.1.0"),
("api", "instance_name"): ("webserver", "instance_name", "3.1.0"),
("dag_processor", "parsing_pre_import_modules"): ("scheduler", "parsing_pre_import_modules", "3.1.0"),
("api", "log_config"): ("api", "access_logfile", "3.1.0"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not safe to do - they are different config options. As mentioned in the comment above, this will use the old access_logfile value for log_config if it's set, which isn't what we want.

Replace API server ``access_logfile`` configuration with ``log_config``

The API server configuration option ``[api] access_logfile`` has been replaced with ``[api] log_config`` to align with uvicorn's logging configuration instead of the legacy gunicorn approach.
The new ``log_config`` option accepts a path to a logging configuration file compatible with ``logging.config.fileConfig``, providing more flexible logging configuration for the API server.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we can continue to support a simple access logfile config? I just worry a bit about backcompat, right now this is a breaking change. Maybe we leave access_logfile, build our own log_config file dynamically, and make log_config and access_logfile mutually exclusive? And we should emit a deprecation warning when access_logfile is used.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, good and bad news. Good news is no backcompat issues to worry about! I believe it got broken in #45103. Bad news is I don't think access_log ever worked in AF3.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@potiuk@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Remove gunicorn daemonize for api-server - #52860

Merged
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize
Jul 7, 2025
Merged

Remove gunicorn daemonize for api-server#52860
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize

Conversation

@jason810496

@jason810496jason810496 commented Jul 4, 2025

Copy link
Copy Markdown
Member

related: #52581

Why

When I attempt to remove gunicorn dependency in #52581, I found that we are still using gunicorn for daemonization.

What

  • Replace gunicorn.daemonize with run_command_with_daemon_option, this also align the behavior of --daemon option for scheduler, triggerer ... and api-server
  • Add test for api-server with --daemon as well
    • Rename _CommonCLIGunicornTestClass to _CommonCLIUvicornTestClass, since we are using uvicorn instead of gunicorn for api-server now.
  • Replace [api/access_logfile] config with [api/log_config], detail in Remove gunicorn daemonize for api-server #52860 (comment)

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 1dfe755 to 7a44f9aCompareJuly 4, 2025 10:22
@jason810496jason810496 added the area:API Airflow's REST/HTTP API label Jul 4, 2025
@jason810496
jason810496 marked this pull request as ready for review July 4, 2025 10:22

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

access_log=access_logfile, # type: ignore[arg-type] this line is a strange part for me.

I add # type: ignore[arg-type] to ingore the mypy warning for now.

Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
@jason810496

jason810496 commented Jul 5, 2025

Copy link
Copy Markdown
MemberAuthor

Hi @potiuk, may I might need hints for replacing config.

I thought replacing them in config.yaml and add the pair in deprecated_option in configuration will be all right.

Thanks in advance!


Update:

I found the root cause.

My step is correct but I set [api/log_config] config default as None in config.yml and I set default=conf.get("api", "log_config") in cli_config module.
There is not need to set default=conf.get("api", "log_config") or should set fallback=None for the --log-config flag in cli_config, since the it is not mandatory.

@jason810496
jason810496 marked this pull request as draft July 6, 2025 02:29
@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 89b529e to 52151feCompareJuly 6, 2025 03:08
@jason810496
jason810496 marked this pull request as ready for review July 6, 2025 04:30

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @potiuk and @pierrejeambrun for the review!
Just resolved all comments and fixed the CI as well.

Comment threadairflow-core/src/airflow/config_templates/config.yml

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. One NIT about updating newsfragment.

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 52151fe to ef4c730CompareJuly 7, 2025 14:02
@potiuk
potiuk merged commit ab1ee72 into apache:mainJul 7, 2025
1 check passed
This was referenced Jul 10, 2025
HsiuChuanHsu pushed a commit to HsiuChuanHsu/airflow that referenced this pull request Jul 10, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
stephen-bracken pushed a commit to stephen-bracken/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 18, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
potiuk pushed a commit that referenced this pull request Jul 20, 2025
* [v3-0-test] Remove gunicorn daemonize for api-server (#52860)
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
* Fix spelling wordlist
* Fix configuration
("api", "require_confirmation_dag_change"): ("webserver", "require_confirmation_dag_change", "3.1.0"),
("api", "instance_name"): ("webserver", "instance_name", "3.1.0"),
("dag_processor", "parsing_pre_import_modules"): ("scheduler", "parsing_pre_import_modules", "3.1.0"),
("api", "log_config"): ("api", "access_logfile", "3.1.0"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not safe to do - they are different config options. As mentioned in the comment above, this will use the old access_logfile value for log_config if it's set, which isn't what we want.

Replace API server ``access_logfile`` configuration with ``log_config``

The API server configuration option ``[api] access_logfile`` has been replaced with ``[api] log_config`` to align with uvicorn's logging configuration instead of the legacy gunicorn approach.
The new ``log_config`` option accepts a path to a logging configuration file compatible with ``logging.config.fileConfig``, providing more flexible logging configuration for the API server.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we can continue to support a simple access logfile config? I just worry a bit about backcompat, right now this is a breaking change. Maybe we leave access_logfile, build our own log_config file dynamically, and make log_config and access_logfile mutually exclusive? And we should emit a deprecation warning when access_logfile is used.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, good and bad news. Good news is no backcompat issues to worry about! I believe it got broken in #45103. Bad news is I don't think access_log ever worked in AF3.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@potiuk@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Remove gunicorn daemonize for api-server - #52860

Merged
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize
Jul 7, 2025
Merged

Remove gunicorn daemonize for api-server#52860
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize

Conversation

@jason810496

@jason810496jason810496 commented Jul 4, 2025

Copy link
Copy Markdown
Member

related: #52581

Why

When I attempt to remove gunicorn dependency in #52581, I found that we are still using gunicorn for daemonization.

What

  • Replace gunicorn.daemonize with run_command_with_daemon_option, this also align the behavior of --daemon option for scheduler, triggerer ... and api-server
  • Add test for api-server with --daemon as well
    • Rename _CommonCLIGunicornTestClass to _CommonCLIUvicornTestClass, since we are using uvicorn instead of gunicorn for api-server now.
  • Replace [api/access_logfile] config with [api/log_config], detail in Remove gunicorn daemonize for api-server #52860 (comment)

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 1dfe755 to 7a44f9aCompareJuly 4, 2025 10:22
@jason810496jason810496 added the area:API Airflow's REST/HTTP API label Jul 4, 2025
@jason810496
jason810496 marked this pull request as ready for review July 4, 2025 10:22

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

access_log=access_logfile, # type: ignore[arg-type] this line is a strange part for me.

I add # type: ignore[arg-type] to ingore the mypy warning for now.

Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
@jason810496

jason810496 commented Jul 5, 2025

Copy link
Copy Markdown
MemberAuthor

Hi @potiuk, may I might need hints for replacing config.

I thought replacing them in config.yaml and add the pair in deprecated_option in configuration will be all right.

Thanks in advance!


Update:

I found the root cause.

My step is correct but I set [api/log_config] config default as None in config.yml and I set default=conf.get("api", "log_config") in cli_config module.
There is not need to set default=conf.get("api", "log_config") or should set fallback=None for the --log-config flag in cli_config, since the it is not mandatory.

@jason810496
jason810496 marked this pull request as draft July 6, 2025 02:29
@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 89b529e to 52151feCompareJuly 6, 2025 03:08
@jason810496
jason810496 marked this pull request as ready for review July 6, 2025 04:30

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @potiuk and @pierrejeambrun for the review!
Just resolved all comments and fixed the CI as well.

Comment threadairflow-core/src/airflow/config_templates/config.yml

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. One NIT about updating newsfragment.

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 52151fe to ef4c730CompareJuly 7, 2025 14:02
@potiuk
potiuk merged commit ab1ee72 into apache:mainJul 7, 2025
1 check passed
This was referenced Jul 10, 2025
HsiuChuanHsu pushed a commit to HsiuChuanHsu/airflow that referenced this pull request Jul 10, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
stephen-bracken pushed a commit to stephen-bracken/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 18, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
potiuk pushed a commit that referenced this pull request Jul 20, 2025
* [v3-0-test] Remove gunicorn daemonize for api-server (#52860)
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
* Fix spelling wordlist
* Fix configuration
("api", "require_confirmation_dag_change"): ("webserver", "require_confirmation_dag_change", "3.1.0"),
("api", "instance_name"): ("webserver", "instance_name", "3.1.0"),
("dag_processor", "parsing_pre_import_modules"): ("scheduler", "parsing_pre_import_modules", "3.1.0"),
("api", "log_config"): ("api", "access_logfile", "3.1.0"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not safe to do - they are different config options. As mentioned in the comment above, this will use the old access_logfile value for log_config if it's set, which isn't what we want.

Replace API server ``access_logfile`` configuration with ``log_config``

The API server configuration option ``[api] access_logfile`` has been replaced with ``[api] log_config`` to align with uvicorn's logging configuration instead of the legacy gunicorn approach.
The new ``log_config`` option accepts a path to a logging configuration file compatible with ``logging.config.fileConfig``, providing more flexible logging configuration for the API server.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we can continue to support a simple access logfile config? I just worry a bit about backcompat, right now this is a breaking change. Maybe we leave access_logfile, build our own log_config file dynamically, and make log_config and access_logfile mutually exclusive? And we should emit a deprecation warning when access_logfile is used.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, good and bad news. Good news is no backcompat issues to worry about! I believe it got broken in #45103. Bad news is I don't think access_log ever worked in AF3.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@potiuk@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Remove gunicorn daemonize for api-server - #52860

Merged
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize
Jul 7, 2025
Merged

Remove gunicorn daemonize for api-server#52860
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize

Conversation

@jason810496

@jason810496jason810496 commented Jul 4, 2025

Copy link
Copy Markdown
Member

related: #52581

Why

When I attempt to remove gunicorn dependency in #52581, I found that we are still using gunicorn for daemonization.

What

  • Replace gunicorn.daemonize with run_command_with_daemon_option, this also align the behavior of --daemon option for scheduler, triggerer ... and api-server
  • Add test for api-server with --daemon as well
    • Rename _CommonCLIGunicornTestClass to _CommonCLIUvicornTestClass, since we are using uvicorn instead of gunicorn for api-server now.
  • Replace [api/access_logfile] config with [api/log_config], detail in Remove gunicorn daemonize for api-server #52860 (comment)

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 1dfe755 to 7a44f9aCompareJuly 4, 2025 10:22
@jason810496jason810496 added the area:API Airflow's REST/HTTP API label Jul 4, 2025
@jason810496
jason810496 marked this pull request as ready for review July 4, 2025 10:22

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

access_log=access_logfile, # type: ignore[arg-type] this line is a strange part for me.

I add # type: ignore[arg-type] to ingore the mypy warning for now.

Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
@jason810496

jason810496 commented Jul 5, 2025

Copy link
Copy Markdown
MemberAuthor

Hi @potiuk, may I might need hints for replacing config.

I thought replacing them in config.yaml and add the pair in deprecated_option in configuration will be all right.

Thanks in advance!


Update:

I found the root cause.

My step is correct but I set [api/log_config] config default as None in config.yml and I set default=conf.get("api", "log_config") in cli_config module.
There is not need to set default=conf.get("api", "log_config") or should set fallback=None for the --log-config flag in cli_config, since the it is not mandatory.

@jason810496
jason810496 marked this pull request as draft July 6, 2025 02:29
@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 89b529e to 52151feCompareJuly 6, 2025 03:08
@jason810496
jason810496 marked this pull request as ready for review July 6, 2025 04:30

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @potiuk and @pierrejeambrun for the review!
Just resolved all comments and fixed the CI as well.

Comment threadairflow-core/src/airflow/config_templates/config.yml

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. One NIT about updating newsfragment.

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 52151fe to ef4c730CompareJuly 7, 2025 14:02
@potiuk
potiuk merged commit ab1ee72 into apache:mainJul 7, 2025
1 check passed
This was referenced Jul 10, 2025
HsiuChuanHsu pushed a commit to HsiuChuanHsu/airflow that referenced this pull request Jul 10, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
stephen-bracken pushed a commit to stephen-bracken/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 18, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
potiuk pushed a commit that referenced this pull request Jul 20, 2025
* [v3-0-test] Remove gunicorn daemonize for api-server (#52860)
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
* Fix spelling wordlist
* Fix configuration
("api", "require_confirmation_dag_change"): ("webserver", "require_confirmation_dag_change", "3.1.0"),
("api", "instance_name"): ("webserver", "instance_name", "3.1.0"),
("dag_processor", "parsing_pre_import_modules"): ("scheduler", "parsing_pre_import_modules", "3.1.0"),
("api", "log_config"): ("api", "access_logfile", "3.1.0"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not safe to do - they are different config options. As mentioned in the comment above, this will use the old access_logfile value for log_config if it's set, which isn't what we want.

Replace API server ``access_logfile`` configuration with ``log_config``

The API server configuration option ``[api] access_logfile`` has been replaced with ``[api] log_config`` to align with uvicorn's logging configuration instead of the legacy gunicorn approach.
The new ``log_config`` option accepts a path to a logging configuration file compatible with ``logging.config.fileConfig``, providing more flexible logging configuration for the API server.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we can continue to support a simple access logfile config? I just worry a bit about backcompat, right now this is a breaking change. Maybe we leave access_logfile, build our own log_config file dynamically, and make log_config and access_logfile mutually exclusive? And we should emit a deprecation warning when access_logfile is used.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, good and bad news. Good news is no backcompat issues to worry about! I believe it got broken in #45103. Bad news is I don't think access_log ever worked in AF3.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@potiuk@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Remove gunicorn daemonize for api-server - #52860

Merged
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize
Jul 7, 2025
Merged

Remove gunicorn daemonize for api-server#52860
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize

Conversation

@jason810496

@jason810496jason810496 commented Jul 4, 2025

Copy link
Copy Markdown
Member

related: #52581

Why

When I attempt to remove gunicorn dependency in #52581, I found that we are still using gunicorn for daemonization.

What

  • Replace gunicorn.daemonize with run_command_with_daemon_option, this also align the behavior of --daemon option for scheduler, triggerer ... and api-server
  • Add test for api-server with --daemon as well
    • Rename _CommonCLIGunicornTestClass to _CommonCLIUvicornTestClass, since we are using uvicorn instead of gunicorn for api-server now.
  • Replace [api/access_logfile] config with [api/log_config], detail in Remove gunicorn daemonize for api-server #52860 (comment)

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 1dfe755 to 7a44f9aCompareJuly 4, 2025 10:22
@jason810496jason810496 added the area:API Airflow's REST/HTTP API label Jul 4, 2025
@jason810496
jason810496 marked this pull request as ready for review July 4, 2025 10:22

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

access_log=access_logfile, # type: ignore[arg-type] this line is a strange part for me.

I add # type: ignore[arg-type] to ingore the mypy warning for now.

Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
@jason810496

jason810496 commented Jul 5, 2025

Copy link
Copy Markdown
MemberAuthor

Hi @potiuk, may I might need hints for replacing config.

I thought replacing them in config.yaml and add the pair in deprecated_option in configuration will be all right.

Thanks in advance!


Update:

I found the root cause.

My step is correct but I set [api/log_config] config default as None in config.yml and I set default=conf.get("api", "log_config") in cli_config module.
There is not need to set default=conf.get("api", "log_config") or should set fallback=None for the --log-config flag in cli_config, since the it is not mandatory.

@jason810496
jason810496 marked this pull request as draft July 6, 2025 02:29
@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 89b529e to 52151feCompareJuly 6, 2025 03:08
@jason810496
jason810496 marked this pull request as ready for review July 6, 2025 04:30

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @potiuk and @pierrejeambrun for the review!
Just resolved all comments and fixed the CI as well.

Comment threadairflow-core/src/airflow/config_templates/config.yml

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. One NIT about updating newsfragment.

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 52151fe to ef4c730CompareJuly 7, 2025 14:02
@potiuk
potiuk merged commit ab1ee72 into apache:mainJul 7, 2025
1 check passed
This was referenced Jul 10, 2025
HsiuChuanHsu pushed a commit to HsiuChuanHsu/airflow that referenced this pull request Jul 10, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
stephen-bracken pushed a commit to stephen-bracken/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 18, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
potiuk pushed a commit that referenced this pull request Jul 20, 2025
* [v3-0-test] Remove gunicorn daemonize for api-server (#52860)
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
* Fix spelling wordlist
* Fix configuration
("api", "require_confirmation_dag_change"): ("webserver", "require_confirmation_dag_change", "3.1.0"),
("api", "instance_name"): ("webserver", "instance_name", "3.1.0"),
("dag_processor", "parsing_pre_import_modules"): ("scheduler", "parsing_pre_import_modules", "3.1.0"),
("api", "log_config"): ("api", "access_logfile", "3.1.0"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not safe to do - they are different config options. As mentioned in the comment above, this will use the old access_logfile value for log_config if it's set, which isn't what we want.

Replace API server ``access_logfile`` configuration with ``log_config``

The API server configuration option ``[api] access_logfile`` has been replaced with ``[api] log_config`` to align with uvicorn's logging configuration instead of the legacy gunicorn approach.
The new ``log_config`` option accepts a path to a logging configuration file compatible with ``logging.config.fileConfig``, providing more flexible logging configuration for the API server.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we can continue to support a simple access logfile config? I just worry a bit about backcompat, right now this is a breaking change. Maybe we leave access_logfile, build our own log_config file dynamically, and make log_config and access_logfile mutually exclusive? And we should emit a deprecation warning when access_logfile is used.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, good and bad news. Good news is no backcompat issues to worry about! I believe it got broken in #45103. Bad news is I don't think access_log ever worked in AF3.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@potiuk@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Remove gunicorn daemonize for api-server - #52860

Merged
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize
Jul 7, 2025
Merged

Remove gunicorn daemonize for api-server#52860
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize

Conversation

@jason810496

@jason810496jason810496 commented Jul 4, 2025

Copy link
Copy Markdown
Member

related: #52581

Why

When I attempt to remove gunicorn dependency in #52581, I found that we are still using gunicorn for daemonization.

What

  • Replace gunicorn.daemonize with run_command_with_daemon_option, this also align the behavior of --daemon option for scheduler, triggerer ... and api-server
  • Add test for api-server with --daemon as well
    • Rename _CommonCLIGunicornTestClass to _CommonCLIUvicornTestClass, since we are using uvicorn instead of gunicorn for api-server now.
  • Replace [api/access_logfile] config with [api/log_config], detail in Remove gunicorn daemonize for api-server #52860 (comment)

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 1dfe755 to 7a44f9aCompareJuly 4, 2025 10:22
@jason810496jason810496 added the area:API Airflow's REST/HTTP API label Jul 4, 2025
@jason810496
jason810496 marked this pull request as ready for review July 4, 2025 10:22

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

access_log=access_logfile, # type: ignore[arg-type] this line is a strange part for me.

I add # type: ignore[arg-type] to ingore the mypy warning for now.

Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
@jason810496

jason810496 commented Jul 5, 2025

Copy link
Copy Markdown
MemberAuthor

Hi @potiuk, may I might need hints for replacing config.

I thought replacing them in config.yaml and add the pair in deprecated_option in configuration will be all right.

Thanks in advance!


Update:

I found the root cause.

My step is correct but I set [api/log_config] config default as None in config.yml and I set default=conf.get("api", "log_config") in cli_config module.
There is not need to set default=conf.get("api", "log_config") or should set fallback=None for the --log-config flag in cli_config, since the it is not mandatory.

@jason810496
jason810496 marked this pull request as draft July 6, 2025 02:29
@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 89b529e to 52151feCompareJuly 6, 2025 03:08
@jason810496
jason810496 marked this pull request as ready for review July 6, 2025 04:30

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @potiuk and @pierrejeambrun for the review!
Just resolved all comments and fixed the CI as well.

Comment threadairflow-core/src/airflow/config_templates/config.yml

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. One NIT about updating newsfragment.

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 52151fe to ef4c730CompareJuly 7, 2025 14:02
@potiuk
potiuk merged commit ab1ee72 into apache:mainJul 7, 2025
1 check passed
This was referenced Jul 10, 2025
HsiuChuanHsu pushed a commit to HsiuChuanHsu/airflow that referenced this pull request Jul 10, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
stephen-bracken pushed a commit to stephen-bracken/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 18, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
potiuk pushed a commit that referenced this pull request Jul 20, 2025
* [v3-0-test] Remove gunicorn daemonize for api-server (#52860)
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
* Fix spelling wordlist
* Fix configuration
("api", "require_confirmation_dag_change"): ("webserver", "require_confirmation_dag_change", "3.1.0"),
("api", "instance_name"): ("webserver", "instance_name", "3.1.0"),
("dag_processor", "parsing_pre_import_modules"): ("scheduler", "parsing_pre_import_modules", "3.1.0"),
("api", "log_config"): ("api", "access_logfile", "3.1.0"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not safe to do - they are different config options. As mentioned in the comment above, this will use the old access_logfile value for log_config if it's set, which isn't what we want.

Replace API server ``access_logfile`` configuration with ``log_config``

The API server configuration option ``[api] access_logfile`` has been replaced with ``[api] log_config`` to align with uvicorn's logging configuration instead of the legacy gunicorn approach.
The new ``log_config`` option accepts a path to a logging configuration file compatible with ``logging.config.fileConfig``, providing more flexible logging configuration for the API server.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we can continue to support a simple access logfile config? I just worry a bit about backcompat, right now this is a breaking change. Maybe we leave access_logfile, build our own log_config file dynamically, and make log_config and access_logfile mutually exclusive? And we should emit a deprecation warning when access_logfile is used.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, good and bad news. Good news is no backcompat issues to worry about! I believe it got broken in #45103. Bad news is I don't think access_log ever worked in AF3.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@potiuk@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Remove gunicorn daemonize for api-server - #52860

Merged
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize
Jul 7, 2025
Merged

Remove gunicorn daemonize for api-server#52860
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize

Conversation

@jason810496

@jason810496jason810496 commented Jul 4, 2025

Copy link
Copy Markdown
Member

related: #52581

Why

When I attempt to remove gunicorn dependency in #52581, I found that we are still using gunicorn for daemonization.

What

  • Replace gunicorn.daemonize with run_command_with_daemon_option, this also align the behavior of --daemon option for scheduler, triggerer ... and api-server
  • Add test for api-server with --daemon as well
    • Rename _CommonCLIGunicornTestClass to _CommonCLIUvicornTestClass, since we are using uvicorn instead of gunicorn for api-server now.
  • Replace [api/access_logfile] config with [api/log_config], detail in Remove gunicorn daemonize for api-server #52860 (comment)

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 1dfe755 to 7a44f9aCompareJuly 4, 2025 10:22
@jason810496jason810496 added the area:API Airflow's REST/HTTP API label Jul 4, 2025
@jason810496
jason810496 marked this pull request as ready for review July 4, 2025 10:22

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

access_log=access_logfile, # type: ignore[arg-type] this line is a strange part for me.

I add # type: ignore[arg-type] to ingore the mypy warning for now.

Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
@jason810496

jason810496 commented Jul 5, 2025

Copy link
Copy Markdown
MemberAuthor

Hi @potiuk, may I might need hints for replacing config.

I thought replacing them in config.yaml and add the pair in deprecated_option in configuration will be all right.

Thanks in advance!


Update:

I found the root cause.

My step is correct but I set [api/log_config] config default as None in config.yml and I set default=conf.get("api", "log_config") in cli_config module.
There is not need to set default=conf.get("api", "log_config") or should set fallback=None for the --log-config flag in cli_config, since the it is not mandatory.

@jason810496
jason810496 marked this pull request as draft July 6, 2025 02:29
@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 89b529e to 52151feCompareJuly 6, 2025 03:08
@jason810496
jason810496 marked this pull request as ready for review July 6, 2025 04:30

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @potiuk and @pierrejeambrun for the review!
Just resolved all comments and fixed the CI as well.

Comment threadairflow-core/src/airflow/config_templates/config.yml

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. One NIT about updating newsfragment.

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 52151fe to ef4c730CompareJuly 7, 2025 14:02
@potiuk
potiuk merged commit ab1ee72 into apache:mainJul 7, 2025
1 check passed
This was referenced Jul 10, 2025
HsiuChuanHsu pushed a commit to HsiuChuanHsu/airflow that referenced this pull request Jul 10, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
stephen-bracken pushed a commit to stephen-bracken/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 18, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
potiuk pushed a commit that referenced this pull request Jul 20, 2025
* [v3-0-test] Remove gunicorn daemonize for api-server (#52860)
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
* Fix spelling wordlist
* Fix configuration
("api", "require_confirmation_dag_change"): ("webserver", "require_confirmation_dag_change", "3.1.0"),
("api", "instance_name"): ("webserver", "instance_name", "3.1.0"),
("dag_processor", "parsing_pre_import_modules"): ("scheduler", "parsing_pre_import_modules", "3.1.0"),
("api", "log_config"): ("api", "access_logfile", "3.1.0"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not safe to do - they are different config options. As mentioned in the comment above, this will use the old access_logfile value for log_config if it's set, which isn't what we want.

Replace API server ``access_logfile`` configuration with ``log_config``

The API server configuration option ``[api] access_logfile`` has been replaced with ``[api] log_config`` to align with uvicorn's logging configuration instead of the legacy gunicorn approach.
The new ``log_config`` option accepts a path to a logging configuration file compatible with ``logging.config.fileConfig``, providing more flexible logging configuration for the API server.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we can continue to support a simple access logfile config? I just worry a bit about backcompat, right now this is a breaking change. Maybe we leave access_logfile, build our own log_config file dynamically, and make log_config and access_logfile mutually exclusive? And we should emit a deprecation warning when access_logfile is used.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, good and bad news. Good news is no backcompat issues to worry about! I believe it got broken in #45103. Bad news is I don't think access_log ever worked in AF3.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@potiuk@jedcunningham
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Remove gunicorn daemonize for api-server - #52860

Merged
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize
Jul 7, 2025
Merged

Remove gunicorn daemonize for api-server#52860
potiuk merged 9 commits into
apache:mainfrom
jason810496:refactor/api-server/remove-gunicorn-daemonize

Conversation

@jason810496

@jason810496jason810496 commented Jul 4, 2025

Copy link
Copy Markdown
Member

related: #52581

Why

When I attempt to remove gunicorn dependency in #52581, I found that we are still using gunicorn for daemonization.

What

  • Replace gunicorn.daemonize with run_command_with_daemon_option, this also align the behavior of --daemon option for scheduler, triggerer ... and api-server
  • Add test for api-server with --daemon as well
    • Rename _CommonCLIGunicornTestClass to _CommonCLIUvicornTestClass, since we are using uvicorn instead of gunicorn for api-server now.
  • Replace [api/access_logfile] config with [api/log_config], detail in Remove gunicorn daemonize for api-server #52860 (comment)

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 1dfe755 to 7a44f9aCompareJuly 4, 2025 10:22
@jason810496jason810496 added the area:API Airflow's REST/HTTP API label Jul 4, 2025
@jason810496
jason810496 marked this pull request as ready for review July 4, 2025 10:22

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

access_log=access_logfile, # type: ignore[arg-type] this line is a strange part for me.

I add # type: ignore[arg-type] to ingore the mypy warning for now.

Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py
Comment threadairflow-core/src/airflow/cli/commands/api_server_command.py Outdated
@jason810496

jason810496 commented Jul 5, 2025

Copy link
Copy Markdown
MemberAuthor

Hi @potiuk, may I might need hints for replacing config.

I thought replacing them in config.yaml and add the pair in deprecated_option in configuration will be all right.

Thanks in advance!


Update:

I found the root cause.

My step is correct but I set [api/log_config] config default as None in config.yml and I set default=conf.get("api", "log_config") in cli_config module.
There is not need to set default=conf.get("api", "log_config") or should set fallback=None for the --log-config flag in cli_config, since the it is not mandatory.

@jason810496
jason810496 marked this pull request as draft July 6, 2025 02:29
@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 89b529e to 52151feCompareJuly 6, 2025 03:08
@jason810496
jason810496 marked this pull request as ready for review July 6, 2025 04:30

@jason810496jason810496 left a comment

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @potiuk and @pierrejeambrun for the review!
Just resolved all comments and fixed the CI as well.

Comment threadairflow-core/src/airflow/config_templates/config.yml

@potiukpotiuk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. One NIT about updating newsfragment.

@jason810496
jason810496force-pushed the refactor/api-server/remove-gunicorn-daemonize branch from 52151fe to ef4c730CompareJuly 7, 2025 14:02
@potiuk
potiuk merged commit ab1ee72 into apache:mainJul 7, 2025
1 check passed
This was referenced Jul 10, 2025
HsiuChuanHsu pushed a commit to HsiuChuanHsu/airflow that referenced this pull request Jul 10, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
stephen-bracken pushed a commit to stephen-bracken/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 15, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 18, 2025
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
potiuk pushed a commit that referenced this pull request Jul 20, 2025
* [v3-0-test] Remove gunicorn daemonize for api-server (#52860)
* Remove gunicorn daemonize for api-server
* Rename _CommonCLIUvicornTestClass
* Add test for api-server with daemon option
* Fix setproctitle on MacOS
* Replace api/access_logfile with api/log_config
* Fix [api/log_config] cli_config
* Remove logging and unsed option in api_server_command
- the logging before daemonization is not logging the correct PID so
remove it
- should_setup_logging is default as False
* Fix test_run_command_daemon
* Add significant rst
(cherry picked from commit ab1ee72)
* Fix spelling wordlist
* Fix configuration
("api", "require_confirmation_dag_change"): ("webserver", "require_confirmation_dag_change", "3.1.0"),
("api", "instance_name"): ("webserver", "instance_name", "3.1.0"),
("dag_processor", "parsing_pre_import_modules"): ("scheduler", "parsing_pre_import_modules", "3.1.0"),
("api", "log_config"): ("api", "access_logfile", "3.1.0"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not safe to do - they are different config options. As mentioned in the comment above, this will use the old access_logfile value for log_config if it's set, which isn't what we want.

Replace API server ``access_logfile`` configuration with ``log_config``

The API server configuration option ``[api] access_logfile`` has been replaced with ``[api] log_config`` to align with uvicorn's logging configuration instead of the legacy gunicorn approach.
The new ``log_config`` option accepts a path to a logging configuration file compatible with ``logging.config.fileConfig``, providing more flexible logging configuration for the API server.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way we can continue to support a simple access logfile config? I just worry a bit about backcompat, right now this is a breaking change. Maybe we leave access_logfile, build our own log_config file dynamically, and make log_config and access_logfile mutually exclusive? And we should emit a deprecation warning when access_logfile is used.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, good and bad news. Good news is no backcompat issues to worry about! I believe it got broken in #45103. Bad news is I don't think access_log ever worked in AF3.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@potiuk@jedcunningham