diff --git a/ironic/drivers/modules/agent.py b/ironic/drivers/modules/agent.py
index 45222a3b09..bf93c4902f 100644
--- a/ironic/drivers/modules/agent.py
+++ b/ironic/drivers/modules/agent.py
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from ironic_lib import metrics_utils
 from oslo_log import log
 from oslo_utils import excutils
 from oslo_utils import units
@@ -39,6 +40,7 @@ from ironic.drivers.modules import deploy_utils
 
 LOG = log.getLogger(__name__)
 
+METRICS = metrics_utils.get_metrics_logger(__name__)
 
 REQUIRED_PROPERTIES = {
     'deploy_kernel': _('UUID (from Glance) of the deployment kernel. '
@@ -69,6 +71,7 @@ PARTITION_IMAGE_LABELS = ('kernel', 'ramdisk', 'root_gb', 'root_mb', 'swap_mb',
                           'deploy_boot_mode')
 
 
+@METRICS.timer('build_instance_info_for_deploy')
 def build_instance_info_for_deploy(task):
     """Build instance_info necessary for deploying to a node.
 
@@ -118,6 +121,7 @@ def build_instance_info_for_deploy(task):
     return instance_info
 
 
+@METRICS.timer('check_image_size')
 def check_image_size(task, image_source):
     """Check if the requested image is larger than the ram size.
 
@@ -155,6 +159,7 @@ def check_image_size(task, image_source):
         raise exception.InvalidParameterValue(msg)
 
 
+@METRICS.timer('validate_image_proxies')
 def validate_image_proxies(node):
     """Check that the provided proxy parameters are valid.
 
@@ -193,6 +198,7 @@ def validate_image_proxies(node):
 
 class AgentDeployMixin(agent_base_vendor.AgentDeployMixin):
 
+    @METRICS.timer('AgentDeployMixin.deploy_has_started')
     def deploy_has_started(self, task):
         commands = self._client.get_commands_status(task.node)
 
@@ -202,6 +208,7 @@ class AgentDeployMixin(agent_base_vendor.AgentDeployMixin):
                 return True
         return False
 
+    @METRICS.timer('AgentDeployMixin.deploy_is_done')
     def deploy_is_done(self, task):
         commands = self._client.get_commands_status(task.node)
         if not commands:
@@ -219,6 +226,7 @@ class AgentDeployMixin(agent_base_vendor.AgentDeployMixin):
 
         return False
 
+    @METRICS.timer('AgentDeployMixin.continue_deploy')
     @task_manager.require_exclusive_lock
     def continue_deploy(self, task):
         task.process_event('resume')
@@ -295,6 +303,7 @@ class AgentDeployMixin(agent_base_vendor.AgentDeployMixin):
                         return
                     return result
 
+    @METRICS.timer('AgentDeployMixin.check_deploy_success')
     def check_deploy_success(self, node):
         # should only ever be called after we've validated that
         # the prepare_image command is complete
@@ -302,6 +311,7 @@ class AgentDeployMixin(agent_base_vendor.AgentDeployMixin):
         if command['command_status'] == 'FAILED':
             return command['command_error']
 
+    @METRICS.timer('AgentDeployMixin.reboot_to_instance')
     def reboot_to_instance(self, task):
         task.process_event('resume')
         node = task.node
@@ -353,6 +363,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
         """
         return COMMON_PROPERTIES
 
+    @METRICS.timer('AgentDeploy.validate')
     def validate(self, task):
         """Validate the driver-specific Node deployment info.
 
@@ -393,6 +404,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
 
         validate_image_proxies(node)
 
+    @METRICS.timer('AgentDeploy.deploy')
     @task_manager.require_exclusive_lock
     def deploy(self, task):
         """Perform a deployment to a node.
@@ -408,6 +420,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
         manager_utils.node_power_action(task, states.REBOOT)
         return states.DEPLOYWAIT
 
+    @METRICS.timer('AgentDeploy.tear_down')
     @task_manager.require_exclusive_lock
     def tear_down(self, task):
         """Tear down a previous deployment on the task's node.
@@ -426,6 +439,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
 
         return states.DELETED
 
+    @METRICS.timer('AgentDeploy.prepare')
     @task_manager.require_exclusive_lock
     def prepare(self, task):
         """Prepare the deployment environment for this node.
@@ -457,6 +471,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
                 deploy_opts = deploy_utils.build_agent_options(node)
                 task.driver.boot.prepare_ramdisk(task, deploy_opts)
 
+    @METRICS.timer('AgentDeploy.clean_up')
     @task_manager.require_exclusive_lock
     def clean_up(self, task):
         """Clean up the deployment environment for this node.
@@ -490,6 +505,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
         """
         pass
 
+    @METRICS.timer('AgentDeploy.get_clean_steps')
     def get_clean_steps(self, task):
         """Get the list of clean steps from the agent.
 
@@ -506,6 +522,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
             task, interface='deploy',
             override_priorities=new_priorities)
 
+    @METRICS.timer('AgentDeploy.execute_clean_step')
     def execute_clean_step(self, task, step):
         """Execute a clean step asynchronously on the agent.
 
@@ -517,6 +534,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
         """
         return deploy_utils.agent_execute_clean_step(task, step)
 
+    @METRICS.timer('AgentDeploy.prepare_cleaning')
     def prepare_cleaning(self, task):
         """Boot into the agent to prepare for cleaning.
 
@@ -530,6 +548,7 @@ class AgentDeploy(AgentDeployMixin, base.DeployInterface):
         return deploy_utils.prepare_inband_cleaning(
             task, manage_boot=CONF.agent.manage_agent_boot)
 
+    @METRICS.timer('AgentDeploy.tear_down_cleaning')
     def tear_down_cleaning(self, task):
         """Clean up the PXE and DHCP files after cleaning.
 
@@ -556,6 +575,7 @@ class AgentRAID(base.RAIDInterface):
         """Return the properties of the interface."""
         return {}
 
+    @METRICS.timer('AgentRAID.create_configuration')
     @base.clean_step(priority=0)
     def create_configuration(self, task,
                              create_root_volume=True,
@@ -652,6 +672,7 @@ class AgentRAID(base.RAIDInterface):
 
         raid.update_raid_info(task.node, clean_result)
 
+    @METRICS.timer('AgentRAID.delete_configuration')
     @base.clean_step(priority=0)
     def delete_configuration(self, task):
         """Deletes RAID configuration on the given node.