Prefect tracks information about the current flow or task run with a run context. The run context can be thought of as a global variable that allows the Prefect engine to determine relationships between your runs, such as which flow your task was called from.
The run context itself contains many internal objects used by Prefect to manage execution of your run and is only available in specific situations. For this reason, we expose a simple interface that only includes the items you care about and dynamically retrieves additional information when necessary. We call this the "runtime context" as it contains information that can be accessed only when a run is happening.
Mock values via environment variable
Oftentimes, you may want to mock certain values for testing purposes. For example, by manually setting an ID or a scheduled start time to ensure your code is functioning properly. Starting in version 2.10.3, you can mock values in runtime via environment variable using the schema PREFECT__RUNTIME__{SUBMODULE}__{KEY_NAME}=value:
If the environment variable mocks an existing runtime attribute, the value is cast to the same type. This works for runtime attributes of basic types (bool, int, float and str) and pendulum.DateTime. For complex types like list or dict, we suggest mocking them using monkeypatch or a similar tool.
The prefect.runtime module is the home for all runtime context access. Each major runtime concept has its own submodule:
deployment: Access information about the deployment for the current run
flow_run: Access information about the current flow run
task_run: Access information about the current task run
For example:
my_runtime_info.py
fromprefectimportflow,taskfromprefectimportruntime@flow(log_prints=True)defmy_flow(x):print("My name is",runtime.flow_run.name)print("I belong to deployment",runtime.deployment.name)my_task(2)@taskdefmy_task(y):print("My name is",runtime.task_run.name)print("Flow run parameters:",runtime.flow_run.parameters)my_flow(1)
Running this file will produce output similar to the following:
10:08:02.948|INFO|prefect.engine-Createdflowrun'solid-gibbon'forflow'my-flow'10:08:03.555|INFO|Flowrun'solid-gibbon'-Mynameissolid-gibbon
10:08:03.558|INFO|Flowrun'solid-gibbon'-IbelongtodeploymentNone
10:08:03.703|INFO|Flowrun'solid-gibbon'-Createdtaskrun'my_task-0'fortask'my_task'10:08:03.704|INFO|Flowrun'solid-gibbon'-Executing'my_task-0'immediately...
10:08:04.006|INFO|Taskrun'my_task-0'-Mynameismy_task-0
10:08:04.007|INFO|Taskrun'my_task-0'-Flowrunparameters:{'x':1}10:08:04.105|INFO|Taskrun'my_task-0'-FinishedinstateCompleted()10:08:04.968|INFO|Flowrun'solid-gibbon'-FinishedinstateCompleted('All states completed.')
Above, we demonstrated access to information about the current flow run, task run, and deployment.
When run without a deployment (via python my_runtime_info.py), you should see "I belong to deployment None" logged.
When information is not available, the runtime will always return an empty value.
Because this flow was run outside of a deployment, there is no deployment data.
If this flow was run as part of a deployment, we'd see the name of the deployment instead.
The current run context can be accessed with prefect.context.get_run_context().
This function will raise an exception if no run context is available, meaning you are not in a flow or task run.
If a task run context is available, it will be returned even if a flow run context is available.
Alternatively, you can access the flow run or task run context explicitly.
This will, for example, allow you to access the flow run context from a task run.
Note that we do not send the flow run context to distributed task workers because the context is costly to serialize and deserialize.