Diagnostics Reference¶
Azure Functions Doctor ships with a built-in diagnostics set for the Azure Functions Python v2 programming model.
Diagnostics are grouped by section, then evaluated as required or optional checks. Required checks protect baseline correctness (runtime, project structure, and core dependencies), while optional checks provide operational guidance (tooling, telemetry, and hygiene).
How Diagnostics Are Evaluated¶
Each rule is executed by a handler and returns a raw handler status (pass or fail).
The doctor then applies canonical mapping based on whether the rule is required:
| Handler status | required: true |
required: false |
|---|---|---|
pass |
pass |
pass |
fail |
fail |
warn |
Section status is fail if any required check in that section fails.
Optional failures do not fail a section, but they remain visible as warnings.
Required Checks¶
These checks run in both full and minimal profiles.
| Check | Purpose |
|---|---|
| Python version | Ensure Python 3.10 or newer. |
requirements.txt |
Ensure dependency declarations exist. |
azure-functions package |
Ensure the Functions library is declared. |
host.json |
Ensure the project includes host configuration. |
host.json version |
Ensure host.json declares "version": "2.0". |
Required Check Details¶
| Label | Rule ID | Handler Type | Fails When |
|---|---|---|---|
| Python version | check_python_version |
compare_version |
Current interpreter is lower than 3.10. |
requirements.txt |
check_requirements_txt |
file_exists |
requirements.txt is missing at project root. |
azure-functions package |
check_azure_functions_library |
package_declared |
azure-functions is not declared in requirements.txt. |
host.json |
check_host_json |
file_exists |
host.json is missing at project root. |
host.json version |
check_host_json_version |
host_json_version |
host.json does not declare "version": "2.0". |
Optional Checks¶
| Check | Purpose |
|---|---|
| Programming model v2 | Detect decorator-based Azure Functions usage (heuristic). |
| Virtual environment | Confirm local development is isolated. |
| Python executable | Confirm Python is available and resolvable. |
| azure-functions-worker not pinned | Warn if azure-functions-worker is declared in requirements.txt. |
local.settings.json |
Flag missing local settings for development. |
| Azure Functions Core Tools | Recommend local tooling presence. |
| Core Tools version | Recommend Functions Core Tools v4+. |
| Durable Functions configuration | Validate durableTask when durable usage is detected. |
| Application Insights configuration | Detect telemetry configuration signals. |
extensionBundle |
Check host extension bundle configuration. |
| ASGI/WSGI compatibility | Detect framework callable exposure. |
| Unwanted files | Flag common junk files in project trees. |
Optional Check Details¶
| Label | Rule ID | Handler Type | Warns When |
|---|---|---|---|
| Programming model v2 | check_programming_model_v2 |
source_code_contains |
Project source does not expose @app. decorators in AST mode. |
| Virtual environment | check_venv |
env_var_exists |
VIRTUAL_ENV is not set. |
| Python executable | check_python_executable |
path_exists |
sys.executable is empty or points to a missing path. |
| azure-functions-worker not pinned | check_azure_functions_worker |
package_forbidden |
azure-functions-worker is declared in requirements.txt. |
local.settings.json |
check_local_settings |
file_exists |
Local settings file is absent for local execution scenarios. |
| Azure Functions Core Tools | check_func_cli |
executable_exists |
func executable is not available on PATH. |
| Core Tools version | check_func_core_tools_version |
compare_version |
Detected Core Tools version is lower than 4.0. |
| Durable Functions configuration | check_durabletask_config |
conditional_exists |
Durable usage detected but $.extensions.durableTask is missing. |
| Application Insights configuration | check_app_insights |
any_of_exists |
No telemetry signal found in env vars or host.json. |
extensionBundle |
check_extension_bundle |
host_json_property |
$.extensionBundle key is not present in host.json. |
| ASGI/WSGI compatibility | check_asgi_wsgi_exposure |
callable_detection |
No ASGI/WSGI app exposure patterns are detected. |
| Unwanted files | check_unused_files |
file_glob_check |
Common deploy-time junk patterns are found. |
| ## Status Mapping |
pass: check succeededwarn: optional check failedfail: required check failed
Pass, Warn, and Fail Examples¶
from azure_functions_doctor.api import run_diagnostics
def split_by_status(path: str) -> dict[str, list[str]]:
grouped: dict[str, list[str]] = {"pass": [], "warn": [], "fail": []}
sections = run_diagnostics(path=path, profile="full", rules_path=None)
for section in sections:
for item in section["items"]:
grouped[item["status"]].append(item["label"])
return grouped
from azure_functions_doctor.api import run_diagnostics
def required_failures(path: str) -> list[tuple[str, str]]:
failures: list[tuple[str, str]] = []
for section in run_diagnostics(path=path, profile="full", rules_path=None):
for item in section["items"]:
if item["status"] == "fail":
failures.append((section["category"], item["label"]))
return failures
How Checks Are Loaded from v2.json¶
The default rule source is src/azure_functions_doctor/assets/rules/v2.json.
At runtime:
Doctor.load_rules()reads either customrules_pathor built-inv2.json.- Rules are validated against
src/azure_functions_doctor/schemas/rules.schema.json. - Rules are sorted by
check_order. - Rules are grouped by
sectionduring execution. - Handler results are normalized to
pass/warn/fail.
The following snippet shows how built-in rules can be loaded directly for inspection.
import importlib.resources
import json
def load_builtin_v2_rules() -> list[dict]:
assets = importlib.resources.files("azure_functions_doctor.assets")
rules_path = assets.joinpath("rules/v2.json")
with rules_path.open(encoding="utf-8") as handle:
return json.load(handle)
Profile Behavior¶
full: runs required and optional checksminimal: runs only required checks (required: true)
Choose minimal for strict CI gating on baseline correctness, and full for local quality feedback.