Why a DAG disappears and how to find out why
When a pipeline stops running or a DAG is missing from the UI, the cause is almost always one of three things: the file fails to parse, the DAG is missing from the set the processor has loaded, or two files declare the same DAG ID. The first check is whether the file parses and the DAG appears in the output of airflow dags list. If the DAG is not listed, the problem is upstream of scheduling, and no amount of scheduler tuning will bring it back. In Airflow 3 the DAG processor runs as its own component, separate from the scheduler and the API server, so it is the first place to look. Confirm which process is parsing your DAG folder and read its logs before changing anything else.
This matters most when your team runs Airflow itself. In a managed service, someone usually watches the scheduler and the import error list. In a self-hosted deployment, a DAG can fail to load for days while the rest of the platform looks healthy, and the only symptom may be a downstream dataset that never refreshed. Ask your platform owners who receives DAG processor logs, where import errors are shown, and whether anyone is notified when the count of import errors rises. Those answers define your detection gap before you need them. Changes to the DAG folder, the image or the Python environment should be followed by a parse check, because a missing dependency in one worker image can make a DAG disappear from one environment only.
Once you know the parser is the problem, sort the failure into a category before you fix it. A syntax error or an exception at import time is a code problem. A timeout points to parsing configuration and the amount of work done at the top level of the file. A missing module points to the environment the processor runs in. A duplicate ID means two files define the same DAG, and only one can appear. Each category has a different owner and a different fix, so record which one you are dealing with. The sections that follow walk through each category, the settings that control parsing, and the metric to alert on so the next failure is found by a rule instead of a user report.
How to diagnose a missing DAG step by step
This sequence moves from the parsing component down to the file on disk, so you can find whether a DAG is missing because the processor is not running, the file is not where Airflow looks, or the file fails to parse. Each step ends with a check that tells you whether to continue or stop and fix the cause.
Confirm the DAG processor is running
Start with the component that reads DAG files. In Airflow 3 the DAG processor runs as its own process, separate from the scheduler and the API server, so a stopped or crashed DAG processor can leave every DAG out of the UI while the rest of the stack looks healthy. Check the process status in your service manager, container platform or Helm release, and read its most recent logs for startup errors. Move on only when the process is up and logging parse activity. If it is down, fix that first, because no later step can succeed while nothing parses files.
Check the DAG list from the command line
Run
airflow dags liston a host or container that uses the same configuration and metadata database as the scheduler. This command shows which DAGs Airflow has registered, so it separates a display problem in the UI from a parsing problem. Look for your DAG ID in the output. If the DAG is listed, the file parsed at least once, and the problem is likely in the UI, pause state or the schedule. If it is absent, continue to the import error check. Run the same command from the environment that serves the UI, because a different configuration can show a different list.Read import errors in the UI and logs
When a DAG file fails to load, Airflow records an import error and shows it in the UI, usually on the DAG list page. Open the error and note the file path, the exception type and the line number. Then confirm the same error in the DAG processor logs, which can show errors the UI summarizes or hides. Two common results are a missing Python module, which points to dependencies in the processor's environment, and a timeout, which points to slow top-level code. Stop here if you find a clear error and fix it in the DAG code or environment. If the list is empty and the logs show no errors, continue, because the file may never have been read.
Verify the file path and DAG folder
Confirm that the file sits inside the DAG folder that the DAG processor actually reads. Compare the folder in your Airflow configuration with the path in the processor's runtime, not the path on your laptop or CI runner. Packaging differences are a frequent cause: a file copied to a sibling directory, a mounted volume that is empty, or a container image built before the file was added. Check that the file has a
.pyextension and that it is not excluded by an.airflowignorefile in the folder. Move on when the file is present in the processor's folder. If it is not, correct the delivery path before touching the code.Confirm the DAG was parsed after the latest change
Parsing is not instant. After you deploy a change, the processor must reread the file, and on large installations the order and interval for parsing files can delay the update. Check the modification time of the deployed file, then confirm that the processor has parsed it since that time. Look for the DAG in
airflow dags listagain, and check that the DAG ID matches what you expect. If you renamed a DAG and see two entries with the same ID, search for the duplicate DAG ID error in the import errors. If the file is newer than the last parse and the error persists, you have a parsing or configuration problem to resolve in the next step.Test the file parse directly
Run the DAG file with the Python interpreter that the processor uses, in the same virtual environment or image, to see the exception without the processor's logging around it. A clean run means the file imports without error in that environment, so remaining problems usually sit in configuration such as the DAG folder or the parsing timeout. An exception points to the module, syntax or top-level code that fails. Record the environment you tested in, because a file that imports on a developer workstation may still fail in the processor's image. Stop when the file imports cleanly in the processor's environment and the DAG appears in the list.
Set up an alert on import errors
Once the DAG appears, prevent a repeat by alerting on the import error count. Airflow emits the
dag_processing.import_errorsmetric and the parse time metricdag_processing.total_parse_time, so you can see the error count rise after a bad deployment instead of learning about it from a missing pipeline. Confirm with your metrics pipeline that these names reach your monitoring system, since the exact names can vary with your metrics backend. Your alert should page on a nonzero import error count that persists after a deployment window your team defines. Done when a deliberately broken test file in a non-production folder triggers the alert.
Which error type points to which fix
The DAG file raises an exception when the DAG processor loads it, so an import error appears in the UI and in the import error count. The file may look correct in an editor but still fail when its top-level code runs in the production environment, with its variables and connections.
- Likely cause: a syntax mistake, or top-level code that calls a service, reads a variable or opens a connection and fails during parsing.
- Check: open the import error in the UI, then run the file with the same Python interpreter the DAG processor uses and confirm the traceback points to a line in your DAG file.
- Author fix: move network calls, variable reads and heavy work into task callables so parsing only builds the DAG structure.
- Platform fix: confirm that the variables and connections visible to the DAG processor match what tasks see, since a value missing only at parse time fails only there.
- Alert: watch
dag_processing.import_errorsso a bad commit is caught before the next scheduled run.
Confirm that the failing file is the one named in the error, then fix it and check that the import error count returns to zero.
The DAG imports a package that is installed on a developer laptop or inside a task image but not in the environment where the DAG processor runs. In Airflow 3 the DAG processor is a separate component, so a package present in the worker image may be absent from the processor image.
- Likely cause: the package is missing from the DAG processor image or virtual environment, or the processor and workers run different versions of the same package.
- Check: read the import error, which names the module, then import that module inside the DAG processor container or environment with the same interpreter.
- Author fix: import heavy or optional packages inside the task function, or declare them in the requirements file that builds the processor image.
- Platform fix: rebuild the image or environment with the pinned constraints, then deploy the DAG processor and workers from the same build.
- Verify: run
airflow dags listfrom the processor environment and confirm the DAG appears before you close the ticket.
Compare the module name in the error against both the processor and worker environments, because a successful import in one does not show that the other is correct.
A file takes longer to parse than the configured import timeout allows, so the DAG processor stops loading it. The DAG may then be missing or show an error about the timeout, depending on the version and how the file fails. Large files, generated DAGs that build many tasks and slow calls to external systems during parsing are the usual causes.
- Likely cause: expensive top-level code, a generated file that creates many tasks, or a slow call to an external system while the file is parsed.
- Check: compare the parse time for the file using
dag_processing.total_parse_time, and review the value ofdagbag_import_timeoutin your configuration. - Author fix: remove top-level I/O, precompute lists outside the parse path, and split generated DAGs into smaller files.
- Platform fix: raise
dagbag_import_timeoutonly after the author fix is in place, since a higher value keeps the processor busy for longer on each pass. - Large estates: the Airflow FAQ suggests
file_parsing_sort_modeset tomodified_timeand a highermin_file_process_intervalwhen there are more than 1,000 DAG files.
Start with the slowest file, because one slow file can delay parsing for the others in the folder.
Two DAG files define the same dag_id, so Airflow cannot tell which definition to use. The error is named AirflowDagDuplicatedIdException, and it matters most during upgrades because the upgrade guide asks you to resolve it before the database migration runs.
- Likely cause: copied DAG files, a generated DAG that reuses an ID, or two teams deploying files with the same name into one folder.
- Check: search the DAG repository for the
dag_idstring and runairflow dags listto see which definition is present. - Author fix: agree a new
dag_idwith the owners, since the ID is how users and history refer to the DAG, then remove the copied file. - Platform fix: run
airflow dags reserializebefore the upgrade, resolve anyAirflowDagDuplicatedIdExceptionit reports, and only then runairflow db migrate. - Governance: add a CI check that fails when two files declare the same
dag_id, so the conflict is caught before deployment.
Confirm that each dag_id belongs to one file and that reserialize completes without errors before you start the upgrade.
The file parses without errors and no import error is recorded, yet the DAG is absent from the list or never runs. The Airflow FAQ advises checking first that the file parses and that the DAG appears in airflow dags list, because a missing DAG is usually a parsing question before it is a scheduling question.
- Likely cause: the file sits outside the DAG folder the processor reads, the file extension is not picked up, the DAG object is not created at module level, or the processor has not reached the file yet.
- Check: run
airflow dags listin the environment the scheduler uses, then compare the file path with the configured DAG folder and confirm the DAG object is defined at module level. - Author fix: define the DAG object at module level and keep the file in the configured folder with a Python extension.
- Platform fix: confirm that the DAG processor is running and reading the same DAG source as the scheduler, since parsing is a separate component in Airflow 3.
- Alert: watch
scheduler_heartbeatalongsidedag_processing.import_errors, so a stalled processor or scheduler is visible.
Check the result from the scheduler's environment before editing the DAG, because a file can look correct in an editor and still be absent there.
How import timeouts and large DAG folders cause missing DAGs
A DAG can go missing because its file takes too long to parse. When a file exceeds the parse window, Airflow can record it as an import error instead of loading its DAGs, so the DAG never appears in the UI or in airflow dags list. The setting that governs this window is dagbag_import_timeout, and the Airflow FAQ points to it as the first control to check when a file times out. Look at the import error entries and the parse time metrics together: a file that parses in a few seconds on a developer laptop can exceed the limit on a loaded scheduler host, especially when top-level code calls external APIs, reads large files or queries a database. Confirm the current default and the exact behavior of this key for your version in the configuration reference before you change it, because raising the timeout hides a slow file rather than fixing it.
Folder size changes how often every file is reparsed. The FAQ suggests that deployments with more than 1,000 DAG files set file_parsing_sort_mode to modified_time, so the DAG processor prioritizes recently changed files, and raise min_file_process_interval to a value such as 600 seconds. The trade-off is direct: a larger interval means a changed DAG can take longer to appear or update, so teams that need a new DAG visible within minutes should test the interval against their delivery process. Agree on that delay with DAG authors before the change, and record the chosen values in your configuration management. Confirm the defaults and accepted ranges for these keys in your Airflow version's configuration reference, since they have changed across releases.
Missing dependencies and duplicate DAG IDs
Most missing or broken DAGs come from a mismatch between what the DAG file needs and what a given component can see. The DAG processor, the scheduler, and the workers often run from different images, and each needs the same packages, the same DAG files, and the same rules for importing code. The cards below cover the failure patterns we see most often and the checks that catch them before a run is lost.
Package present in worker image only
The DAG file imports a package that is installed in the task image but missing from the image the DAG processor uses. The DAG then fails to parse and never shows up in the UI, even though tasks would run fine. Run airflow dags list-import-errors against the processor's image and compare its installed packages with the worker image. Prevention: build one dependency lockfile and use it for every component, so the processor and workers install the same set.
Import of code on one component only
A DAG file imports a helper module that exists only on the worker, for example from a plugin folder or a locally mounted path. The DAG parses on a machine that has the module and fails everywhere else. Check that every component mounts the same DAG bundle and that shared code is packaged with it. Prevention: keep shared helpers inside the DAG bundle or an installed package, and parse the bundle from a clean container during CI.
Two files defining one dag_id
Two files each declare a DAG with the same dag_id, so one of them is rejected with a duplicate DAG ID error and the DAG may flip between versions. This often happens after a copy-and-rename or when generated DAGs reuse a name. Search the repository with grep -r "dag_id=" and check the import error list for AirflowDagDuplicatedIdException. Prevention: enforce unique IDs in code review or a CI check that fails on duplicates.
Parse-time reads from the metadata database
Top-level DAG code queries Airflow connections, variables, or the metadata database to decide what to build. Airflow 3 does not allow task code to use database sessions or models directly, so this pattern breaks either at parse time or in tasks. Move lookups into tasks, or use the REST API or Task SDK where a value must be read at runtime. Prevention: review top-level code for any call that touches Airflow objects.
Drift between staging and production images
Staging parses cleanly, but production shows import errors after a release because the image tag, the Python version, or a pinned provider differs. Compare the image digest and the output of pip freeze in each environment before blaming the DAG code. Prevention: promote one image digest through staging to production, pin provider versions with constraints, and run airflow dags reserialize in the target environment before cutover.
Running airflow dags reserialize before an upgrade
Run airflow dags reserialize and clear every error it reports before you touch the metadata database. The Airflow upgrade guide recommends this step, and it calls airflow db migrate the biggest part of an Airflow upgrade, so a DAG that cannot be reserialized is the most likely thing to stall the cutover. The command rewrites the serialized form of each DAG using the new version's code, which surfaces problems such as AirflowDagDuplicatedIdException, where two DAG files declare the same DAG ID. Fix duplicate IDs by renaming or removing one of the files, because Airflow cannot choose between them and the DAG may otherwise disappear from the UI after the upgrade.
A reserialize pass is also useful outside a version jump. Run it after a DAG processor fault, after a large change to shared DAG code, or when the UI shows stale DAG definitions that no longer match the files in your repository. Run it first against a staging copy of the metadata database and the same DAG bundle that production uses, not against production. Confirm that the staging environment runs the target Airflow version, because the output depends on the code that performs the serialization. Record the errors, the fixes and the Airflow version in your change record so the production run has a known starting point.
Catch Airflow 3 incompatibilities earlier by linting DAG code with Ruff and its AIR301 and AIR302 rules, which the upgrade guide recommends. Run them in CI on every DAG change so that removed imports, changed arguments and other breaking patterns fail a build instead of failing the DAG processor in production. Lint results do not replace a reserialize pass, since some problems only appear when Airflow loads the DAG, but they remove most of the surprises before the processor sees the code.
Which metrics to alert on for DAG import problems
Which metric shows DAG import errors in Airflow?
The metric to alert on is dag_processing.import_errors, which counts the files the DAG processor could not import. Any sustained value above zero means at least one DAG file is failing to load, and the broken DAG may be missing or stale in the UI. Alert when the value stays above zero for longer than a normal deploy window, so a brief error during a commit does not page anyone. Metric names and emission settings can differ by version and by StatsD or OpenTelemetry configuration, so confirm the exact name in your environment against the metrics configuration reference before you write the rule. Pair this alert with a check of the import error list in the UI or with airflow dags list to identify which file is failing.
How do I track DAG parse time in Airflow?
Track dag_processing.total_parse_time, which reports how long a full parsing pass over your DAG files takes. A steadily rising value usually means top-level code is doing too much work, the number of DAG files has grown, or the parsing interval is too short for the file count. Chart the metric over days rather than alerting on single spikes, because a deploy that adds a few heavy files will move it briefly. Set the alert threshold from your own baseline after a few weeks of normal operation, and record the baseline in your runbook. Confirm the metric name and whether it is emitted by your DAG processor version before building the dashboard.
What does the scheduler heartbeat metric tell me?
The scheduler_heartbeat metric shows that a scheduler process is alive and still looping. If it stops advancing, the scheduler is hung, crashed or unable to reach the metadata database, and no DAG will be scheduled even if parsing looks healthy. Alert on the absence of the heartbeat for a period longer than your normal loop interval, and run the alert against each scheduler when you operate more than one, because the scheduler documentation describes running several at once. Heartbeat tells you the scheduler is running, not that the DAGs it loaded are correct, so use it alongside the import error and parse time metrics.
How do pool slot metrics help when a DAG exists but does not run?
Pool metrics help when the DAG loads without errors but its tasks never start. The pool metrics pool.open_slots, pool.running_slots and pool.queued_slots show whether tasks are waiting for capacity that another workload is holding. If pool.open_slots is zero while pool.queued_slots keeps growing, the pool is full and the tasks are waiting on it, not on parsing. Compare these values with the DAG's schedule and its concurrency settings before changing limits. Treat pool alerts as a separate rule from import alerts, so an on-call engineer can tell a parsing failure from a capacity problem at a glance.
Who should receive DAG import alerts, the platform team or the DAG authors?
Route the alert to the platform on-call first, and copy the DAG author team as a secondary recipient. Import failures often come from the environment rather than the DAG code, for example a missing Python dependency in the image, a broken DAG bundle sync, a database connection problem or a parser that has run out of time, and only the platform team can fix those quickly. The platform on-call can then identify the owning team from the failing file path and hand off with evidence. Authors who receive only email may not see a page at night, so decide the escalation path before the first incident and write it into the runbook.
How should I set alert thresholds for DAG import metrics in my environment?
Set thresholds from your own measured baseline, not from a number copied from another team. Collect the metrics for a representative period, note the normal import error count, typical parse time and heartbeat interval, then alert on sustained deviation from that baseline, such as an error count above zero for longer than a deploy window or a parse time well above its usual range. Use shorter windows for the heartbeat, because a silent scheduler stops all work, and longer windows for parse time trends. Review the thresholds after each Airflow upgrade or major change in DAG volume, since the metric behavior and volume can shift. Ask your team to confirm the chosen values in a test environment before they reach production paging.
Which Airflow versions should I confirm before setting up these metrics?
Confirm the metric names and emission settings for the exact Airflow version you run, because Airflow 3 changed the component layout, with the DAG processor running as its own component. Airflow 3 is the current major line, and the version support table lists the lifecycle dates for each release line, so check that your version still receives fixes before you invest in a long alerting setup. Also confirm whether your deployment emits metrics through StatsD or OpenTelemetry, since that choice changes how the metric names appear in your monitoring system. Keep a short record of the version, the emitter and the metric names in your runbook so the alerts survive upgrades.
Can my own team set up DAG import monitoring without outside help?
Yes, a team that already runs Prometheus, Grafana or another metrics system can set up these alerts internally, provided someone owns the metrics emitter configuration and the on-call runbook. The work is mostly confirming metric names for your version, routing the alerts, setting baselines and testing the escalation path. DeployOpen can plan and implement this monitoring as part of a fixed-scope engagement when your team prefers a partner, with the scope, deliverables and timeline agreed in writing before work starts. Ask any provider to name the Airflow version and the metrics backend they will configure, so the quote reflects your actual environment.
Operational and security considerations for DAG delivery
A DAG that fails to import usually traces back to who can change DAG files, how that code reaches the scheduler, and what the parser can read at parse time. The cards below cover the decisions that prevent import failures from reaching production and the places where import error details can leak or disappear. Security controls for the whole cluster are covered in the hardening section of this pillar.
Who can change DAG files
Every person or pipeline with write access to the DAG folder or DAG bundle can break parsing for every DAG in that location. A single syntax error or a bad import in one file produces an import error, and the other DAGs continue to parse. List the accounts, service identities and CI jobs that can write to DAG storage, and confirm that each one is needed. Check whether DAG authors can also deploy to production without a second reviewer.
Version control with review
Keeping DAG source in version control with required review makes each import failure traceable to a specific commit and author. Protected branches, mandatory reviews and a CI job that imports every DAG file before merge catch most import errors before the scheduler sees them. Confirm that a rollback to the last working commit is a documented, tested step. The merge gate should run the same Airflow version as production, so that version-specific import behavior is caught early.
Limiting what the DAG processor reads
The DAG processor executes DAG files, so it needs read access to the code it parses and to the packages those files import, and nothing beyond that. Run it with a service identity that cannot write to the DAG source, and keep network access limited to the endpoints that parse-time code truly needs. Review the image or environment the processor uses so that a stray file or dependency does not change import behavior between environments. Check the trust model described in the hardening section before granting broader access.
Keeping secrets out of parse time
DAG files that fetch credentials from a secrets backend while the file is parsed make imports depend on that backend being reachable and fast. When the backend times out or rejects the request, the DAG disappears or shows an import error that looks unrelated to secrets. Move secret lookups into task execution, where failures show up in task logs. Confirm which secret calls appear at module level in each DAG file and which are inside task callables.
Protecting the metadata database
Import errors and DAG records are stored in the metadata database, so its availability and backup status determine whether parse results survive a restart. The production guide warns that SQLite is for testing only and that production use can lead to data loss, so PostgreSQL or MySQL is the expected choice. Confirm that the database has tested backups, that access is limited to Airflow components, and that cleanup jobs do not remove import error history before the team has reviewed it.
Access to import error details
The Airflow UI shows import error messages, including file paths and tracebacks, to anyone with the matching role. Those tracebacks can reveal internal module names, paths and configuration values, so review which roles can view them before granting broad UI access. Confirm the role mapping in your chosen auth manager and test it with a non-admin account. Use the same review for the import error metric labels that your monitoring system displays.
Questions teams ask before fixing DAG import errors
How long does it take to fix DAG import errors?
The time depends mostly on how many DAG files are affected and whether the cause sits in DAG code or in the platform. A single broken import in one file is usually a short investigation, while a fleet of files that time out during parsing takes longer because each cause needs its own fix and test. Other drivers include the number of teams that own DAGs, whether parsing settings need changing, and how much monitoring already exists to show which files fail. Ask for a written scope that lists the DAG files and environments in question, since that is what turns a rough sense of effort into a plan with dates.
What does the internal team need to provide?
Your team needs to provide access to the Airflow environment, the DAG repository and the deployment pipeline, along with the people who own each DAG. Someone who can approve changes to DAG code and someone who can change Airflow configuration are both needed, because some import errors are fixed in the DAG and others in settings such as dagbag_import_timeout. Logs from the DAG processor and the current import error list help narrow the work quickly. Confirm the owners, change windows and review process before work starts, because waiting on those is often the longest part of the timeline.
Can our platform team fix this without a partner?
Often yes, if the team already runs Airflow 3 with the DAG processor as its own component and has access to its logs and metrics. Platform engineers can usually find the file and error behind an import error with airflow dags list and the DAG processor logs. The harder cases are duplicate DAG IDs, dependency conflicts across teams and parse timeouts across thousands of files, because they touch code owned by several groups. A partner is most useful when the team lacks time, when the same problem keeps returning, or when the fix needs a documented process that auditors can review.
Is a DAG code fix cheaper than a platform fix?
A DAG code fix is usually narrower, since it changes one file, reviewed by the team that owns it. A platform fix changes shared settings, the DAG processor, dependencies in the Airflow image or the metadata database, so it affects every DAG and needs more testing and a wider change window. Cost follows that difference in scope, not a fixed rate. Ask a quote to separate the two, list which files and components each item changes, and state which items are one-time fixes and which need ongoing checks, such as an alert on the import error metric.
Should this work be a fixed-scope engagement?
A fixed-scope engagement works well when the problem is bounded: a known set of failing DAG files, a defined number of environments and a clear list of deliverables. It is less suited to open-ended investigation, where the scope can only be set after the first findings. A common approach is a short, fixed investigation that produces a written list of causes, followed by a separately scoped fix. DeployOpen agrees scope, deliverables and timelines in writing before work starts, and ongoing checks can be covered by a retainer if your team wants continued support.
What drives the number of DAG files and parse time?
Parse time grows with the number of DAG files and with the work done at the top level of each file, such as database calls, API requests or heavy imports. Airflow's FAQ points to dagbag_import_timeout for files that exceed the limit, and for more than 1,000 DAG files it suggests setting file_parsing_sort_mode to modified_time and a higher min_file_process_interval, such as 600. Those settings change how often files are reparsed, so they need to be tested against how quickly your teams expect changes to appear. Track dag_processing.total_parse_time and dag_processing.import_errors before and after any change.
Which deployment factors change the fix?
Several deployment choices change how import errors appear and how they are fixed:
- Whether DAGs are baked into the image or synced from a repository, since a broken sync can leave an old or partial file set in place.
- Whether more than one team shares an environment, which raises the chance of duplicate DAG IDs.
- Whether the DAG processor runs as its own component, which Airflow 3 requires.
- Whether monitoring exists for
dag_processing.import_errors, so failures are seen before users report missing DAGs.
Write these answers down in the scope so the fix plan reflects your real setup.
What should we confirm before asking for a quote?
Confirm the Airflow version in use, since Airflow 3 changed the DAG processor and API server model, and the Airflow version support table lists which releases still receive fixes. Gather the number of DAG files, the teams that own them, the deployment method, the metadata database type and the monitoring tools in place. Also confirm your change windows and who approves DAG and configuration changes. With those facts, ask the quote to state scope, deliverables, assumptions, owners and what happens after the fix, so you can compare options on the same basis.
How DeployOpen approaches Airflow DAG troubleshooting
DeployOpen works on self-hosted Airflow inside your own cloud accounts, data centers or air-gapped networks, so DAG troubleshooting happens against your real deployment, your DAG repository and your metadata database rather than a generic lab copy. Before any change, we agree the scope in writing: which environments are covered, which DAG bundles and teams are in scope, whether the work is a one-time diagnosis of missing DAGs or a fix across the whole estate, and what evidence you receive at the end. Most engagements are fixed-scope, and a quote follows from that written scope.
In practice the work usually covers a short checklist. We confirm each DAG file parses and appears in airflow dags list, check the DAG processor logs and the import error view, review dagbag_import_timeout against slow top-level code, look for AirflowDagDuplicatedIdException before any airflow dags reserialize run, and verify that the Python environment of the DAG processor matches the one the authors tested. We can also set up alerting on the dag_processing.import_errors metric, add parse-time monitoring from dag_processing.total_parse_time, and produce upgrade checks, including Ruff AIR301 and AIR302 findings, so DAG problems surface before an Airflow 3 upgrade rather than during it.
Ongoing support, upgrade work and continuous monitoring can be arranged as a retainer after the initial fix, which suits teams that add DAGs every week. Your team keeps ownership of DAG code and of the decisions about alert routing and parsing intervals, and we document what changed so that the next person can repeat the checks. To scope a first engagement, prepare a list of the affected DAG IDs, the Airflow version and executor in use, and the recent deployment history for the DAG repository. Those inputs let us give you a written scope and a quote without guessing.

