Skip to content

Report Dag cache metrics under each component's own namespace - #71815

Merged
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace
Aug 21, 2026
Merged

Report Dag cache metrics under each component's own namespace#71815
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace

Conversation

@jason810496

@jason810496jason810496 commented Aug 19, 2026

Copy link
Copy Markdown
Member

Why

Every configured DBDagBag emitted cache counters under api_server.dag_bag.*. Once the scheduler gained a bounded cache in #71704, scheduler traffic was counted against the API server's series, so operators could not distinguish the two components.

The cache settings and metrics also made every DBDagBag caller opt into an interface intended only for long-lived component caches.

How

DBDagBag remains the simple base implementation for callers that do not configure eviction or cache metrics. CachedDBDagBag owns LRU, TTL, and no-eviction cache modes, along with thread safety and the required component metric namespace.

The API server always constructs CachedDBDagBag from its cache configuration. With size and TTL both set to 0, the subclass uses a plain unbounded dict and performs no eviction. The scheduler constructs CachedDBDagBag under scheduler.dag_bag.*.

The metrics registry check now matches every static part of a dynamic metric name, including names assembled from a caller-supplied prefix.

What

  • Reports API server cache metrics under api_server.dag_bag.*.
  • Reports scheduler cache metrics under scheduler.dag_bag.*.
  • Keeps short-lived and compatibility callers on the base DBDagBag.
  • Preserves the existing 0/0 no-eviction behavior while keeping configured component caches on CachedDBDagBag.

Supersedes #71276.


Was generative AI tooling used to co-author this PR?

Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
@uranusjr

Copy link
Copy Markdown
Member

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

@jason810496
jason810496 marked this pull request as draft August 20, 2026 08:08
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
@jason810496
jason810496 requested a lite review from CopilotAugust 20, 2026 09:35

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 20, 2026 11:09

@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.

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

It makes sense to separate them by purpose, thanks for the suggestion. I just updated it.

Comment threadairflow-core/src/airflow/models/dagbag.py Outdated
Comment threadairflow-core/src/airflow/api_fastapi/common/dagbag.py
@jason810496
jason810496 marked this pull request as draft August 21, 2026 02:15
@jason810496
jason810496 requested a lite review from CopilotAugust 21, 2026 02:40

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 21, 2026 06:13
@jason810496
jason810496 merged commit bcf1dbf into apache:mainAug 21, 2026
162 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-3-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-3-testCommit Link

You can attempt to backport this manually by running:

cherry_picker bcf1dbf v3-3-test

This should apply the commit to the v3-3-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

jason810496 added a commit to jason810496/airflow that referenced this pull request Aug 28, 2026
…pace (apache#71815)
* Report Dag cache metrics under each component's own namespace
Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
* Scope Dag cache configuration to cached database Dag bags
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
* Preserve no-eviction Dag cache configuration
* Avoid redundant Dag cache checks
(cherry picked from commit bcf1dbf)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:ConfigTemplatesarea:dev-toolsarea:Schedulerincluding HA (high availability) schedulerbackport-to-v3-3-testBackport to v3-3-testkind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@uranusjr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Report Dag cache metrics under each component's own namespace by jason810496 · Pull Request #71815 · apache/airflow · GitHub
Skip to content

Report Dag cache metrics under each component's own namespace - #71815

Merged
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace
Aug 21, 2026
Merged

Report Dag cache metrics under each component's own namespace#71815
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace

Conversation

@jason810496

@jason810496jason810496 commented Aug 19, 2026

Copy link
Copy Markdown
Member

Why

Every configured DBDagBag emitted cache counters under api_server.dag_bag.*. Once the scheduler gained a bounded cache in #71704, scheduler traffic was counted against the API server's series, so operators could not distinguish the two components.

The cache settings and metrics also made every DBDagBag caller opt into an interface intended only for long-lived component caches.

How

DBDagBag remains the simple base implementation for callers that do not configure eviction or cache metrics. CachedDBDagBag owns LRU, TTL, and no-eviction cache modes, along with thread safety and the required component metric namespace.

The API server always constructs CachedDBDagBag from its cache configuration. With size and TTL both set to 0, the subclass uses a plain unbounded dict and performs no eviction. The scheduler constructs CachedDBDagBag under scheduler.dag_bag.*.

The metrics registry check now matches every static part of a dynamic metric name, including names assembled from a caller-supplied prefix.

What

  • Reports API server cache metrics under api_server.dag_bag.*.
  • Reports scheduler cache metrics under scheduler.dag_bag.*.
  • Keeps short-lived and compatibility callers on the base DBDagBag.
  • Preserves the existing 0/0 no-eviction behavior while keeping configured component caches on CachedDBDagBag.

Supersedes #71276.


Was generative AI tooling used to co-author this PR?

Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
@uranusjr

Copy link
Copy Markdown
Member

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

@jason810496
jason810496 marked this pull request as draft August 20, 2026 08:08
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
@jason810496
jason810496 requested a lite review from CopilotAugust 20, 2026 09:35

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 20, 2026 11:09

@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.

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

It makes sense to separate them by purpose, thanks for the suggestion. I just updated it.

Comment threadairflow-core/src/airflow/models/dagbag.py Outdated
Comment threadairflow-core/src/airflow/api_fastapi/common/dagbag.py
@jason810496
jason810496 marked this pull request as draft August 21, 2026 02:15
@jason810496
jason810496 requested a lite review from CopilotAugust 21, 2026 02:40

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 21, 2026 06:13
@jason810496
jason810496 merged commit bcf1dbf into apache:mainAug 21, 2026
162 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-3-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-3-testCommit Link

You can attempt to backport this manually by running:

cherry_picker bcf1dbf v3-3-test

This should apply the commit to the v3-3-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

jason810496 added a commit to jason810496/airflow that referenced this pull request Aug 28, 2026
…pace (apache#71815)
* Report Dag cache metrics under each component's own namespace
Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
* Scope Dag cache configuration to cached database Dag bags
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
* Preserve no-eviction Dag cache configuration
* Avoid redundant Dag cache checks
(cherry picked from commit bcf1dbf)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:ConfigTemplatesarea:dev-toolsarea:Schedulerincluding HA (high availability) schedulerbackport-to-v3-3-testBackport to v3-3-testkind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@uranusjr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Report Dag cache metrics under each component's own namespace by jason810496 · Pull Request #71815 · apache/airflow · GitHub
Skip to content

Report Dag cache metrics under each component's own namespace - #71815

Merged
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace
Aug 21, 2026
Merged

Report Dag cache metrics under each component's own namespace#71815
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace

Conversation

@jason810496

@jason810496jason810496 commented Aug 19, 2026

Copy link
Copy Markdown
Member

Why

Every configured DBDagBag emitted cache counters under api_server.dag_bag.*. Once the scheduler gained a bounded cache in #71704, scheduler traffic was counted against the API server's series, so operators could not distinguish the two components.

The cache settings and metrics also made every DBDagBag caller opt into an interface intended only for long-lived component caches.

How

DBDagBag remains the simple base implementation for callers that do not configure eviction or cache metrics. CachedDBDagBag owns LRU, TTL, and no-eviction cache modes, along with thread safety and the required component metric namespace.

The API server always constructs CachedDBDagBag from its cache configuration. With size and TTL both set to 0, the subclass uses a plain unbounded dict and performs no eviction. The scheduler constructs CachedDBDagBag under scheduler.dag_bag.*.

The metrics registry check now matches every static part of a dynamic metric name, including names assembled from a caller-supplied prefix.

What

  • Reports API server cache metrics under api_server.dag_bag.*.
  • Reports scheduler cache metrics under scheduler.dag_bag.*.
  • Keeps short-lived and compatibility callers on the base DBDagBag.
  • Preserves the existing 0/0 no-eviction behavior while keeping configured component caches on CachedDBDagBag.

Supersedes #71276.


Was generative AI tooling used to co-author this PR?

Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
@uranusjr

Copy link
Copy Markdown
Member

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

@jason810496
jason810496 marked this pull request as draft August 20, 2026 08:08
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
@jason810496
jason810496 requested a lite review from CopilotAugust 20, 2026 09:35

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 20, 2026 11:09

@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.

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

It makes sense to separate them by purpose, thanks for the suggestion. I just updated it.

Comment threadairflow-core/src/airflow/models/dagbag.py Outdated
Comment threadairflow-core/src/airflow/api_fastapi/common/dagbag.py
@jason810496
jason810496 marked this pull request as draft August 21, 2026 02:15
@jason810496
jason810496 requested a lite review from CopilotAugust 21, 2026 02:40

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 21, 2026 06:13
@jason810496
jason810496 merged commit bcf1dbf into apache:mainAug 21, 2026
162 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-3-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-3-testCommit Link

You can attempt to backport this manually by running:

cherry_picker bcf1dbf v3-3-test

This should apply the commit to the v3-3-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

jason810496 added a commit to jason810496/airflow that referenced this pull request Aug 28, 2026
…pace (apache#71815)
* Report Dag cache metrics under each component's own namespace
Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
* Scope Dag cache configuration to cached database Dag bags
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
* Preserve no-eviction Dag cache configuration
* Avoid redundant Dag cache checks
(cherry picked from commit bcf1dbf)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:ConfigTemplatesarea:dev-toolsarea:Schedulerincluding HA (high availability) schedulerbackport-to-v3-3-testBackport to v3-3-testkind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

Report Dag cache metrics under each component's own namespace - #71815

Merged
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace
Aug 21, 2026
Merged

Report Dag cache metrics under each component's own namespace#71815
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace

Conversation

@jason810496

@jason810496jason810496 commented Aug 19, 2026

Copy link
Copy Markdown
Member

Why

Every configured DBDagBag emitted cache counters under api_server.dag_bag.*. Once the scheduler gained a bounded cache in #71704, scheduler traffic was counted against the API server's series, so operators could not distinguish the two components.

The cache settings and metrics also made every DBDagBag caller opt into an interface intended only for long-lived component caches.

How

DBDagBag remains the simple base implementation for callers that do not configure eviction or cache metrics. CachedDBDagBag owns LRU, TTL, and no-eviction cache modes, along with thread safety and the required component metric namespace.

The API server always constructs CachedDBDagBag from its cache configuration. With size and TTL both set to 0, the subclass uses a plain unbounded dict and performs no eviction. The scheduler constructs CachedDBDagBag under scheduler.dag_bag.*.

The metrics registry check now matches every static part of a dynamic metric name, including names assembled from a caller-supplied prefix.

What

  • Reports API server cache metrics under api_server.dag_bag.*.
  • Reports scheduler cache metrics under scheduler.dag_bag.*.
  • Keeps short-lived and compatibility callers on the base DBDagBag.
  • Preserves the existing 0/0 no-eviction behavior while keeping configured component caches on CachedDBDagBag.

Supersedes #71276.


Was generative AI tooling used to co-author this PR?

Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
@uranusjr

Copy link
Copy Markdown
Member

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

@jason810496
jason810496 marked this pull request as draft August 20, 2026 08:08
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
@jason810496
jason810496 requested a lite review from CopilotAugust 20, 2026 09:35

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 20, 2026 11:09

@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.

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

It makes sense to separate them by purpose, thanks for the suggestion. I just updated it.

Comment threadairflow-core/src/airflow/models/dagbag.py Outdated
Comment threadairflow-core/src/airflow/api_fastapi/common/dagbag.py
@jason810496
jason810496 marked this pull request as draft August 21, 2026 02:15
@jason810496
jason810496 requested a lite review from CopilotAugust 21, 2026 02:40

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 21, 2026 06:13
@jason810496
jason810496 merged commit bcf1dbf into apache:mainAug 21, 2026
162 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-3-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-3-testCommit Link

You can attempt to backport this manually by running:

cherry_picker bcf1dbf v3-3-test

This should apply the commit to the v3-3-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

jason810496 added a commit to jason810496/airflow that referenced this pull request Aug 28, 2026
…pace (apache#71815)
* Report Dag cache metrics under each component's own namespace
Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
* Scope Dag cache configuration to cached database Dag bags
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
* Preserve no-eviction Dag cache configuration
* Avoid redundant Dag cache checks
(cherry picked from commit bcf1dbf)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:ConfigTemplatesarea:dev-toolsarea:Schedulerincluding HA (high availability) schedulerbackport-to-v3-3-testBackport to v3-3-testkind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

Report Dag cache metrics under each component's own namespace - #71815

Merged
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace
Aug 21, 2026
Merged

Report Dag cache metrics under each component's own namespace#71815
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace

Conversation

@jason810496

@jason810496jason810496 commented Aug 19, 2026

Copy link
Copy Markdown
Member

Why

Every configured DBDagBag emitted cache counters under api_server.dag_bag.*. Once the scheduler gained a bounded cache in #71704, scheduler traffic was counted against the API server's series, so operators could not distinguish the two components.

The cache settings and metrics also made every DBDagBag caller opt into an interface intended only for long-lived component caches.

How

DBDagBag remains the simple base implementation for callers that do not configure eviction or cache metrics. CachedDBDagBag owns LRU, TTL, and no-eviction cache modes, along with thread safety and the required component metric namespace.

The API server always constructs CachedDBDagBag from its cache configuration. With size and TTL both set to 0, the subclass uses a plain unbounded dict and performs no eviction. The scheduler constructs CachedDBDagBag under scheduler.dag_bag.*.

The metrics registry check now matches every static part of a dynamic metric name, including names assembled from a caller-supplied prefix.

What

  • Reports API server cache metrics under api_server.dag_bag.*.
  • Reports scheduler cache metrics under scheduler.dag_bag.*.
  • Keeps short-lived and compatibility callers on the base DBDagBag.
  • Preserves the existing 0/0 no-eviction behavior while keeping configured component caches on CachedDBDagBag.

Supersedes #71276.


Was generative AI tooling used to co-author this PR?

Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
@uranusjr

Copy link
Copy Markdown
Member

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

@jason810496
jason810496 marked this pull request as draft August 20, 2026 08:08
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
@jason810496
jason810496 requested a lite review from CopilotAugust 20, 2026 09:35

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 20, 2026 11:09

@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.

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

It makes sense to separate them by purpose, thanks for the suggestion. I just updated it.

Comment threadairflow-core/src/airflow/models/dagbag.py Outdated
Comment threadairflow-core/src/airflow/api_fastapi/common/dagbag.py
@jason810496
jason810496 marked this pull request as draft August 21, 2026 02:15
@jason810496
jason810496 requested a lite review from CopilotAugust 21, 2026 02:40

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 21, 2026 06:13
@jason810496
jason810496 merged commit bcf1dbf into apache:mainAug 21, 2026
162 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-3-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-3-testCommit Link

You can attempt to backport this manually by running:

cherry_picker bcf1dbf v3-3-test

This should apply the commit to the v3-3-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

jason810496 added a commit to jason810496/airflow that referenced this pull request Aug 28, 2026
…pace (apache#71815)
* Report Dag cache metrics under each component's own namespace
Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
* Scope Dag cache configuration to cached database Dag bags
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
* Preserve no-eviction Dag cache configuration
* Avoid redundant Dag cache checks
(cherry picked from commit bcf1dbf)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:ConfigTemplatesarea:dev-toolsarea:Schedulerincluding HA (high availability) schedulerbackport-to-v3-3-testBackport to v3-3-testkind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@uranusjr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Report Dag cache metrics under each component's own namespace by jason810496 · Pull Request #71815 · apache/airflow · GitHub
Skip to content

Report Dag cache metrics under each component's own namespace - #71815

Merged
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace
Aug 21, 2026
Merged

Report Dag cache metrics under each component's own namespace#71815
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace

Conversation

@jason810496

@jason810496jason810496 commented Aug 19, 2026

Copy link
Copy Markdown
Member

Why

Every configured DBDagBag emitted cache counters under api_server.dag_bag.*. Once the scheduler gained a bounded cache in #71704, scheduler traffic was counted against the API server's series, so operators could not distinguish the two components.

The cache settings and metrics also made every DBDagBag caller opt into an interface intended only for long-lived component caches.

How

DBDagBag remains the simple base implementation for callers that do not configure eviction or cache metrics. CachedDBDagBag owns LRU, TTL, and no-eviction cache modes, along with thread safety and the required component metric namespace.

The API server always constructs CachedDBDagBag from its cache configuration. With size and TTL both set to 0, the subclass uses a plain unbounded dict and performs no eviction. The scheduler constructs CachedDBDagBag under scheduler.dag_bag.*.

The metrics registry check now matches every static part of a dynamic metric name, including names assembled from a caller-supplied prefix.

What

  • Reports API server cache metrics under api_server.dag_bag.*.
  • Reports scheduler cache metrics under scheduler.dag_bag.*.
  • Keeps short-lived and compatibility callers on the base DBDagBag.
  • Preserves the existing 0/0 no-eviction behavior while keeping configured component caches on CachedDBDagBag.

Supersedes #71276.


Was generative AI tooling used to co-author this PR?

Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
@uranusjr

Copy link
Copy Markdown
Member

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

@jason810496
jason810496 marked this pull request as draft August 20, 2026 08:08
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
@jason810496
jason810496 requested a lite review from CopilotAugust 20, 2026 09:35

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 20, 2026 11:09

@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.

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

It makes sense to separate them by purpose, thanks for the suggestion. I just updated it.

Comment threadairflow-core/src/airflow/models/dagbag.py Outdated
Comment threadairflow-core/src/airflow/api_fastapi/common/dagbag.py
@jason810496
jason810496 marked this pull request as draft August 21, 2026 02:15
@jason810496
jason810496 requested a lite review from CopilotAugust 21, 2026 02:40

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 21, 2026 06:13
@jason810496
jason810496 merged commit bcf1dbf into apache:mainAug 21, 2026
162 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-3-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-3-testCommit Link

You can attempt to backport this manually by running:

cherry_picker bcf1dbf v3-3-test

This should apply the commit to the v3-3-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

jason810496 added a commit to jason810496/airflow that referenced this pull request Aug 28, 2026
…pace (apache#71815)
* Report Dag cache metrics under each component's own namespace
Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
* Scope Dag cache configuration to cached database Dag bags
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
* Preserve no-eviction Dag cache configuration
* Avoid redundant Dag cache checks
(cherry picked from commit bcf1dbf)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:ConfigTemplatesarea:dev-toolsarea:Schedulerincluding HA (high availability) schedulerbackport-to-v3-3-testBackport to v3-3-testkind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@uranusjr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Report Dag cache metrics under each component's own namespace by jason810496 · Pull Request #71815 · apache/airflow · GitHub
Skip to content

Report Dag cache metrics under each component's own namespace - #71815

Merged
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace
Aug 21, 2026
Merged

Report Dag cache metrics under each component's own namespace#71815
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace

Conversation

@jason810496

@jason810496jason810496 commented Aug 19, 2026

Copy link
Copy Markdown
Member

Why

Every configured DBDagBag emitted cache counters under api_server.dag_bag.*. Once the scheduler gained a bounded cache in #71704, scheduler traffic was counted against the API server's series, so operators could not distinguish the two components.

The cache settings and metrics also made every DBDagBag caller opt into an interface intended only for long-lived component caches.

How

DBDagBag remains the simple base implementation for callers that do not configure eviction or cache metrics. CachedDBDagBag owns LRU, TTL, and no-eviction cache modes, along with thread safety and the required component metric namespace.

The API server always constructs CachedDBDagBag from its cache configuration. With size and TTL both set to 0, the subclass uses a plain unbounded dict and performs no eviction. The scheduler constructs CachedDBDagBag under scheduler.dag_bag.*.

The metrics registry check now matches every static part of a dynamic metric name, including names assembled from a caller-supplied prefix.

What

  • Reports API server cache metrics under api_server.dag_bag.*.
  • Reports scheduler cache metrics under scheduler.dag_bag.*.
  • Keeps short-lived and compatibility callers on the base DBDagBag.
  • Preserves the existing 0/0 no-eviction behavior while keeping configured component caches on CachedDBDagBag.

Supersedes #71276.


Was generative AI tooling used to co-author this PR?

Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
@uranusjr

Copy link
Copy Markdown
Member

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

@jason810496
jason810496 marked this pull request as draft August 20, 2026 08:08
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
@jason810496
jason810496 requested a lite review from CopilotAugust 20, 2026 09:35

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 20, 2026 11:09

@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.

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

It makes sense to separate them by purpose, thanks for the suggestion. I just updated it.

Comment threadairflow-core/src/airflow/models/dagbag.py Outdated
Comment threadairflow-core/src/airflow/api_fastapi/common/dagbag.py
@jason810496
jason810496 marked this pull request as draft August 21, 2026 02:15
@jason810496
jason810496 requested a lite review from CopilotAugust 21, 2026 02:40

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 21, 2026 06:13
@jason810496
jason810496 merged commit bcf1dbf into apache:mainAug 21, 2026
162 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-3-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-3-testCommit Link

You can attempt to backport this manually by running:

cherry_picker bcf1dbf v3-3-test

This should apply the commit to the v3-3-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

jason810496 added a commit to jason810496/airflow that referenced this pull request Aug 28, 2026
…pace (apache#71815)
* Report Dag cache metrics under each component's own namespace
Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
* Scope Dag cache configuration to cached database Dag bags
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
* Preserve no-eviction Dag cache configuration
* Avoid redundant Dag cache checks
(cherry picked from commit bcf1dbf)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:ConfigTemplatesarea:dev-toolsarea:Schedulerincluding HA (high availability) schedulerbackport-to-v3-3-testBackport to v3-3-testkind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

Report Dag cache metrics under each component's own namespace - #71815

Merged
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace
Aug 21, 2026
Merged

Report Dag cache metrics under each component's own namespace#71815
jason810496 merged 4 commits into
apache:mainfrom
jason810496:feat/dagbag-cache-metric-namespace

Conversation

@jason810496

@jason810496jason810496 commented Aug 19, 2026

Copy link
Copy Markdown
Member

Why

Every configured DBDagBag emitted cache counters under api_server.dag_bag.*. Once the scheduler gained a bounded cache in #71704, scheduler traffic was counted against the API server's series, so operators could not distinguish the two components.

The cache settings and metrics also made every DBDagBag caller opt into an interface intended only for long-lived component caches.

How

DBDagBag remains the simple base implementation for callers that do not configure eviction or cache metrics. CachedDBDagBag owns LRU, TTL, and no-eviction cache modes, along with thread safety and the required component metric namespace.

The API server always constructs CachedDBDagBag from its cache configuration. With size and TTL both set to 0, the subclass uses a plain unbounded dict and performs no eviction. The scheduler constructs CachedDBDagBag under scheduler.dag_bag.*.

The metrics registry check now matches every static part of a dynamic metric name, including names assembled from a caller-supplied prefix.

What

  • Reports API server cache metrics under api_server.dag_bag.*.
  • Reports scheduler cache metrics under scheduler.dag_bag.*.
  • Keeps short-lived and compatibility callers on the base DBDagBag.
  • Preserves the existing 0/0 no-eviction behavior while keeping configured component caches on CachedDBDagBag.

Supersedes #71276.


Was generative AI tooling used to co-author this PR?

Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
@uranusjr

Copy link
Copy Markdown
Member

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

@jason810496
jason810496 marked this pull request as draft August 20, 2026 08:08
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
@jason810496
jason810496 requested a lite review from CopilotAugust 20, 2026 09:35

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 20, 2026 11:09

@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.

Instead of an argument in DBDagBag to make it double-duty, I feel it’s cleaner if we make the _use_cache=True variant a separate subclass i.e. class CachedDBDagBag. This way, the arguments will be cleaner (no more complicated optional arguments + checks in __init__, and the stats functions only need to be on the class they’re actually needed.

It makes sense to separate them by purpose, thanks for the suggestion. I just updated it.

Comment threadairflow-core/src/airflow/models/dagbag.py Outdated
Comment threadairflow-core/src/airflow/api_fastapi/common/dagbag.py
@jason810496
jason810496 marked this pull request as draft August 21, 2026 02:15
@jason810496
jason810496 requested a lite review from CopilotAugust 21, 2026 02:40

This comment was marked as off-topic.

@jason810496
jason810496 marked this pull request as ready for review August 21, 2026 06:13
@jason810496
jason810496 merged commit bcf1dbf into apache:mainAug 21, 2026
162 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-3-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-3-testCommit Link

You can attempt to backport this manually by running:

cherry_picker bcf1dbf v3-3-test

This should apply the commit to the v3-3-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

jason810496 added a commit to jason810496/airflow that referenced this pull request Aug 28, 2026
…pace (apache#71815)
* Report Dag cache metrics under each component's own namespace
Every DBDagBag emitted its cache counters under api_server.dag_bag.*, so once the
scheduler gained a cache its traffic was silently counted against the API
server's series. An operator reading cache_hit or cache_size could not tell the
two components apart, and the API server's numbers became wrong rather than
merely incomplete.
Each caller now supplies the namespace it reports under, and a cache built
without one fails at construction instead of emitting a partially-formed metric
name mid-request.
The registry check matched dynamic metric names only by the static prefix ahead
of their first variable, which cannot express a name assembled from a caller
supplied prefix. It now matches on all static parts wherever the variable sits.
* Scope Dag cache configuration to cached database Dag bags
DBDagBag is used by callers that do not configure cache eviction or metrics. Keeping those concerns behind a dedicated subtype prevents optional constructor combinations and makes metric ownership explicit.
* Preserve no-eviction Dag cache configuration
* Avoid redundant Dag cache checks
(cherry picked from commit bcf1dbf)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APIarea:ConfigTemplatesarea:dev-toolsarea:Schedulerincluding HA (high availability) schedulerbackport-to-v3-3-testBackport to v3-3-testkind:documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jason810496@uranusjr