[autotest] Use the metrics_mock object in case chromite is not set up.

BUG=chromium:688166
TEST=unittest

Change-Id: Ic0077cb2dba75a8d820f229060f3f70f507850a1
Reviewed-on: https://chromium-review.googlesource.com/438754
Commit-Ready: Dan Shi <[email protected]>
Tested-by: Dan Shi <[email protected]>
Reviewed-by: Dan Shi <[email protected]>
diff --git a/client/common_lib/cros/autoupdater.py b/client/common_lib/cros/autoupdater.py
index 6ef829d..3e50332 100644
--- a/client/common_lib/cros/autoupdater.py
+++ b/client/common_lib/cros/autoupdater.py
@@ -18,8 +18,8 @@
 
 try:
     from chromite.lib import metrics
-except:
-    metrics = None
+except ImportError:
+    metrics = utils.metrics_mock
 
 # Local stateful update path is relative to the CrOS source directory.
 LOCAL_STATEFUL_UPDATE_PATH = 'src/platform/dev/stateful_update'
@@ -221,24 +221,23 @@
             self._base_update_handler(run_args, err_prefix)
         except Exception as e:
             to_raise = e
-        if metrics:
-            build_name = url_to_image_name(self.update_url)
-            try:
-                board, build_type, milestone, _ = server_utils.ParseBuildName(
-                    build_name)
-            except server_utils.ParseBuildNameException:
-                logging.warning('Unable to parse build name %s for metrics. '
-                                'Continuing anyway.', build_name)
-                board, build_type, milestone = ('', '', '')
-            c = metrics.Counter(
-                'chromeos/autotest/autoupdater/trigger')
-            f = {'dev_server':
-                 dev_server.get_hostname(self.update_url),
-                 'success': to_raise is None,
-                 'board': board,
-                 'build_type': build_type,
-                 'milestone': milestone}
-            c.increment(fields=f)
+
+        build_name = url_to_image_name(self.update_url)
+        try:
+            board, build_type, milestone, _ = server_utils.ParseBuildName(
+                build_name)
+        except server_utils.ParseBuildNameException:
+            logging.warning('Unable to parse build name %s for metrics. '
+                            'Continuing anyway.', build_name)
+            board, build_type, milestone = ('', '', '')
+        c = metrics.Counter('chromeos/autotest/autoupdater/trigger')
+        f = {'dev_server':
+             dev_server.get_hostname(self.update_url),
+             'success': to_raise is None,
+             'board': board,
+             'build_type': build_type,
+             'milestone': milestone}
+        c.increment(fields=f)
         if to_raise:
             raise to_raise
 
@@ -271,24 +270,23 @@
             self._base_update_handler(run_args, err_prefix)
         except Exception as e:
             to_raise = e
-        if metrics:
-            build_name = url_to_image_name(self.update_url)
-            try:
-                board, build_type, milestone, _ = server_utils.ParseBuildName(
-                    build_name)
-            except server_utils.ParseBuildNameException:
-                logging.warning('Unable to parse build name %s for metrics. '
-                                'Continuing anyway.', build_name)
-                board, build_type, milestone = ('', '', '')
-            c = metrics.Counter(
-                'chromeos/autotest/autoupdater/update')
-            f = {'dev_server':
-                 dev_server.get_hostname(self.update_url),
-                 'success': to_raise is None,
-                 'board': board,
-                 'build_type': build_type,
-                 'milestone': milestone}
-            c.increment(fields=f)
+
+        build_name = url_to_image_name(self.update_url)
+        try:
+            board, build_type, milestone, _ = server_utils.ParseBuildName(
+                build_name)
+        except server_utils.ParseBuildNameException:
+            logging.warning('Unable to parse build name %s for metrics. '
+                            'Continuing anyway.', build_name)
+            board, build_type, milestone = ('', '', '')
+        c = metrics.Counter('chromeos/autotest/autoupdater/update')
+        f = {'dev_server':
+             dev_server.get_hostname(self.update_url),
+             'success': to_raise is None,
+             'board': board,
+             'build_type': build_type,
+             'milestone': milestone}
+        c.increment(fields=f)
         if to_raise:
             raise to_raise
         self._verify_update_completed()
diff --git a/client/common_lib/cros/dev_server.py b/client/common_lib/cros/dev_server.py
index 9139c92..6c4999a 100644
--- a/client/common_lib/cros/dev_server.py
+++ b/client/common_lib/cros/dev_server.py
@@ -27,8 +27,9 @@
 
 try:
     from chromite.lib import metrics
-except:
-    metrics = None
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 CONFIG = global_config.global_config
 # This file is generated at build time and specifies, per suite and per test,
@@ -1972,41 +1973,39 @@
                             'AU failed, trying IP instead of hostname: %s',
                             host_name_ip)
 
-        if metrics:
-            try:
-                board, build_type, milestone, _ = server_utils.ParseBuildName(
-                    build_name)
-            except server_utils.ParseBuildNameException:
-                logging.warning('Unable to parse build name %s for metrics. '
-                                'Continuing anyway.', build_name)
-                board, build_type, milestone = ('', '', '')
+        # Upload data to metrics
+        try:
+            board, build_type, milestone, _ = server_utils.ParseBuildName(
+                build_name)
+        except server_utils.ParseBuildNameException:
+            logging.warning('Unable to parse build name %s for metrics. '
+                            'Continuing anyway.', build_name)
+            board, build_type, milestone = ('', '', '')
 
-            # Note: To avoid reaching or exceeding the monarch field cardinality
-            # limit, we avoid a metric that includes both dut hostname and other
-            # high cardinality fields.
-            # Per-devserver cros_update metric.
-            c = metrics.Counter(
-                    'chromeos/autotest/provision/cros_update_by_devserver')
-            # Add a field |error| here. Current error's pattern is manually
-            # specified in _EXCEPTION_PATTERNS.
-            raised_error = self._classify_exceptions(error_list)
-            f = {'dev_server': self.resolved_hostname,
-                 'success': is_au_success,
-                 'board': board,
-                 'build_type': build_type,
-                 'milestone': milestone,
-                 'error': raised_error}
-            c.increment(fields=f)
+        # Note: To avoid reaching or exceeding the monarch field cardinality
+        # limit, we avoid a metric that includes both dut hostname and other
+        # high cardinality fields.
+        # Per-devserver cros_update metric.
+        c = metrics.Counter(
+                'chromeos/autotest/provision/cros_update_by_devserver')
+        # Add a field |error| here. Current error's pattern is manually
+        # specified in _EXCEPTION_PATTERNS.
+        raised_error = self._classify_exceptions(error_list)
+        f = {'dev_server': self.resolved_hostname,
+             'success': is_au_success,
+             'board': board,
+             'build_type': build_type,
+             'milestone': milestone,
+             'error': raised_error}
+        c.increment(fields=f)
 
-            # Per-DUT cros_update metric.
-            c = metrics.Counter(
-                    'chromeos/autotest/provision/cros_update_per_dut')
-            f = {'success': is_au_success,
-                 'board': board,
-                 'error': raised_error,
-                 'dut_host_name': host_name}
-            c.increment(fields=f)
-
+        # Per-DUT cros_update metric.
+        c = metrics.Counter('chromeos/autotest/provision/cros_update_per_dut')
+        f = {'success': is_au_success,
+             'board': board,
+             'error': raised_error,
+             'dut_host_name': host_name}
+        c.increment(fields=f)
 
         if not is_au_success:
             # If errors happen in the CrOS AU process, report the first error
diff --git a/scheduler/agent_task.py b/scheduler/agent_task.py
index 5b3f778..6cc3fd0 100644
--- a/scheduler/agent_task.py
+++ b/scheduler/agent_task.py
@@ -112,8 +112,6 @@
 import urllib
 import time
 
-from chromite.lib import metrics
-
 from autotest_lib.client.common_lib import global_config
 from autotest_lib.client.common_lib import utils
 from autotest_lib.frontend.afe import models
@@ -124,6 +122,12 @@
 from autotest_lib.server import autoserv_utils
 from autotest_lib.server import system_utils
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
+
 CONFIG = global_config.global_config
 AUTOSERV_NICE_LEVEL = 10
 
diff --git a/scheduler/drone_manager.py b/scheduler/drone_manager.py
index b296b65..ae331e6 100644
--- a/scheduler/drone_manager.py
+++ b/scheduler/drone_manager.py
@@ -2,15 +2,21 @@
 import os
 import logging
 
-from chromite.lib import metrics
-
 import common
-from autotest_lib.client.common_lib import error, global_config, utils
-from autotest_lib.scheduler import drone_utility, drones
+from autotest_lib.client.common_lib import error
+from autotest_lib.client.common_lib import global_config
+from autotest_lib.client.common_lib import utils
+from autotest_lib.scheduler import drones
+from autotest_lib.scheduler import drone_utility
 from autotest_lib.scheduler import drone_task_queue
 from autotest_lib.scheduler import scheduler_config
 from autotest_lib.scheduler import thread_lib
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 # results on drones will be placed under the drone_installation_directory in a
 # directory with this name
diff --git a/scheduler/host_scheduler.py b/scheduler/host_scheduler.py
index fb6265f..5300e05 100755
--- a/scheduler/host_scheduler.py
+++ b/scheduler/host_scheduler.py
@@ -62,10 +62,8 @@
 import common
 from autotest_lib.frontend import setup_django_environment
 
-from chromite.lib import metrics
-from chromite.lib import ts_mon_config
-
 from autotest_lib.client.common_lib import global_config
+from autotest_lib.client.common_lib import utils
 from autotest_lib.scheduler import email_manager
 from autotest_lib.scheduler import query_managers
 from autotest_lib.scheduler import rdb_lib
@@ -76,6 +74,14 @@
 from autotest_lib.site_utils import metadata_reporter
 from autotest_lib.site_utils import server_manager_utils
 
+try:
+    from chromite.lib import metrics
+    from chromite.lib import ts_mon_config
+except ImportError:
+    metrics = utils.metrics_mock
+    ts_mon_config = utils.metrics_mock
+
+
 _db_manager = None
 _shutdown = False
 _tick_pause_sec = global_config.global_config.get_config_value(
diff --git a/scheduler/monitor_db.py b/scheduler/monitor_db.py
index f082b69..405f65f 100755
--- a/scheduler/monitor_db.py
+++ b/scheduler/monitor_db.py
@@ -20,8 +20,6 @@
 from autotest_lib.frontend import setup_django_environment
 
 import django.db
-from chromite.lib import metrics
-from chromite.lib import ts_mon_config
 
 from autotest_lib.client.common_lib import control_data
 from autotest_lib.client.common_lib import global_config
@@ -41,6 +39,13 @@
 from autotest_lib.site_utils import metadata_reporter
 from autotest_lib.site_utils import server_manager_utils
 
+try:
+    from chromite.lib import metrics
+    from chromite.lib import ts_mon_config
+except ImportError:
+    metrics = utils.metrics_mock
+    ts_mon_config = utils.metrics_mock
+
 
 BABYSITTER_PID_FILE_PREFIX = 'monitor_db_babysitter'
 PID_FILE_PREFIX = 'monitor_db'
diff --git a/scheduler/monitor_db_cleanup.py b/scheduler/monitor_db_cleanup.py
index fd5d73b..5c1ae87 100644
--- a/scheduler/monitor_db_cleanup.py
+++ b/scheduler/monitor_db_cleanup.py
@@ -7,14 +7,18 @@
 import random
 import time
 
-from chromite.lib import metrics
-
+from autotest_lib.client.common_lib import utils
 from autotest_lib.frontend.afe import models
 from autotest_lib.scheduler import email_manager
 from autotest_lib.scheduler import scheduler_config
 from autotest_lib.client.common_lib import global_config
 from autotest_lib.client.common_lib import host_protections
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 class PeriodicCleanup(object):
     """Base class to schedule periodical cleanup work.
diff --git a/scheduler/pidfile_monitor.py b/scheduler/pidfile_monitor.py
index 5caac71..7cccc44 100644
--- a/scheduler/pidfile_monitor.py
+++ b/scheduler/pidfile_monitor.py
@@ -10,13 +10,16 @@
 
 import common
 
-from chromite.lib import metrics
-
+from autotest_lib.client.common_lib import utils
 from autotest_lib.client.common_lib import global_config
 from autotest_lib.client.common_lib.cros.graphite import autotest_stats
 from autotest_lib.scheduler import drone_manager
 from autotest_lib.scheduler import scheduler_config
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
 
 
 def _get_pidfile_timeout_secs():
diff --git a/scheduler/postjob_task.py b/scheduler/postjob_task.py
index 9310c57..67733f5 100644
--- a/scheduler/postjob_task.py
+++ b/scheduler/postjob_task.py
@@ -10,13 +10,18 @@
 
 import os
 
+from autotest_lib.client.common_lib import utils
 from autotest_lib.frontend.afe import models, model_attributes
 from autotest_lib.scheduler import agent_task, drones, drone_manager
 from autotest_lib.scheduler import email_manager, pidfile_monitor
 from autotest_lib.scheduler import scheduler_config
 from autotest_lib.server import autoserv_utils
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 _parser_path = os.path.join(drones.AUTOTEST_INSTALL_DIR, 'tko', 'parse')
 
diff --git a/scheduler/query_managers.py b/scheduler/query_managers.py
index 1dc19ad..57f287f 100644
--- a/scheduler/query_managers.py
+++ b/scheduler/query_managers.py
@@ -13,12 +13,18 @@
 import common
 
 from autotest_lib.frontend import setup_django_environment
+
+from autotest_lib.client.common_lib import utils
 from autotest_lib.frontend.afe import models
 from autotest_lib.server.cros.dynamic_suite import constants
 from autotest_lib.scheduler import scheduler_models
 from autotest_lib.scheduler import scheduler_lib
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 _job_timer_name = 'chromeos/autotest/scheduler/job_query_durations/%s'
 class AFEJobQueryManager(object):
diff --git a/scheduler/rdb.py b/scheduler/rdb.py
index 98d785e..5cfe969 100644
--- a/scheduler/rdb.py
+++ b/scheduler/rdb.py
@@ -19,7 +19,11 @@
 from autotest_lib.scheduler import rdb_utils
 from autotest_lib.server import utils
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 _rdb_timer_name = 'chromeos/autotest/scheduler/rdb/durations/%s'
 _is_master = not utils.is_shard()
diff --git a/scheduler/rdb_cache_manager.py b/scheduler/rdb_cache_manager.py
index 2117750..08f9a00 100644
--- a/scheduler/rdb_cache_manager.py
+++ b/scheduler/rdb_cache_manager.py
@@ -81,10 +81,15 @@
 import logging
 
 import common
+from autotest_lib.client.common_lib import utils
 from autotest_lib.client.common_lib.global_config import global_config
 from autotest_lib.scheduler import rdb_utils
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 MEMOIZE_KEY = 'memoized_hosts'
 
diff --git a/scheduler/rdb_hosts.py b/scheduler/rdb_hosts.py
index 0b92004..58c4b87 100644
--- a/scheduler/rdb_hosts.py
+++ b/scheduler/rdb_hosts.py
@@ -20,9 +20,9 @@
 import time
 
 from django.core import exceptions as django_exceptions
-from chromite.lib import metrics
 
 import common
+from autotest_lib.client.common_lib import utils
 from autotest_lib.frontend.afe import rdb_model_extensions as rdb_models
 from autotest_lib.frontend.afe import models as afe_models
 from autotest_lib.scheduler import rdb_requests
@@ -31,6 +31,11 @@
 from autotest_lib.site_utils import metadata_reporter
 from autotest_lib.site_utils.suite_scheduler import constants
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 class RDBHost(object):
     """A python host object representing a django model for the host."""
diff --git a/scheduler/rdb_utils.py b/scheduler/rdb_utils.py
index 24f5d03..342634a 100644
--- a/scheduler/rdb_utils.py
+++ b/scheduler/rdb_utils.py
@@ -11,8 +11,13 @@
 
 import common
 from autotest_lib.client.common_lib import priorities
+from autotest_lib.client.common_lib import utils
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 RDB_STATS_KEY = 'rdb'
 
diff --git a/scheduler/scheduler_models.py b/scheduler/scheduler_models.py
index 23fd919..60436b8 100644
--- a/scheduler/scheduler_models.py
+++ b/scheduler/scheduler_models.py
@@ -38,7 +38,10 @@
 from autotest_lib.server import afe_urls
 from autotest_lib.server.cros import provision
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
 
 
 _notify_email_statuses = []
diff --git a/scheduler/shard/shard_client.py b/scheduler/shard/shard_client.py
index 0c86a78..e01e16f 100755
--- a/scheduler/shard/shard_client.py
+++ b/scheduler/shard/shard_client.py
@@ -24,11 +24,17 @@
 from autotest_lib.scheduler import scheduler_lib
 from autotest_lib.server.cros.dynamic_suite import frontend_wrappers
 from autotest_lib.server import utils as server_utils
-from chromite.lib import metrics
-from chromite.lib import ts_mon_config
 from chromite.lib import timeout_util
 from django.db import transaction
 
+try:
+    from chromite.lib import metrics
+    from chromite.lib import ts_mon_config
+except ImportError:
+    metrics = server_utils.metrics_mock
+    ts_mon_config = server_utils.metrics_mock
+
+
 """
 Autotest shard client
 
diff --git a/server/autoserv b/server/autoserv
index 54760c3..66ee795 100755
--- a/server/autoserv
+++ b/server/autoserv
@@ -27,7 +27,10 @@
 from autotest_lib.client.common_lib import utils
 from autotest_lib.client.common_lib.cros.graphite import autotest_es
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
 
 try:
     from autotest_lib.puppylab import results_mocker
diff --git a/server/autotest.py b/server/autotest.py
index 72bac39..3dd5ce4 100644
--- a/server/autotest.py
+++ b/server/autotest.py
@@ -4,8 +4,6 @@
 import re, os, sys, traceback, time, glob, tempfile
 import logging
 
-from chromite.lib import metrics
-
 import common
 from autotest_lib.server import installable_object, prebuild, utils
 from autotest_lib.client.common_lib import base_job, error, autotemp
@@ -13,6 +11,12 @@
 from autotest_lib.client.common_lib import global_config
 from autotest_lib.client.common_lib import utils as client_utils
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = client_utils.metrics_mock
+
+
 AUTOTEST_SVN = 'svn://test.kernel.org/autotest/trunk/client'
 AUTOTEST_HTTP = 'http://test.kernel.org/svn/autotest/trunk/client'
 
diff --git a/server/control_segments/cleanup b/server/control_segments/cleanup
index 90034c7..6305a62 100644
--- a/server/control_segments/cleanup
+++ b/server/control_segments/cleanup
@@ -1,12 +1,16 @@
 import logging
 import os
 
-from chromite.lib import metrics
-
 from autotest_lib.client.common_lib import error
 from autotest_lib.server import utils
 from autotest_lib.server.cros import provision
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
+
 DURATION_METRIC = 'chromeos/autotest/autoserv/cleanup_duration'
 
 
diff --git a/server/control_segments/provision b/server/control_segments/provision
index b0e84ce..580134b 100644
--- a/server/control_segments/provision
+++ b/server/control_segments/provision
@@ -5,12 +5,16 @@
 import datetime
 import re
 
-from chromite.lib import metrics
-
 from autotest_lib.client.cros import constants
 from autotest_lib.server import utils
 from autotest_lib.server.cros import provision
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
+
 LABEL_REGEX = r',.*:'
 _LABEL_UPDATE_DURATION_METRIC = metrics.SecondsDistribution(
         'chromeos/autotest/provision/label_update_durations')
diff --git a/server/control_segments/reset b/server/control_segments/reset
index 4f044f5..3935c75 100644
--- a/server/control_segments/reset
+++ b/server/control_segments/reset
@@ -1,10 +1,14 @@
 import sys
 
-from chromite.lib import metrics
-
 from autotest_lib.server import utils
 from autotest_lib.server.cros import provision
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
+
 DURATION_METRIC = 'chromeos/autotest/autoserv/reset_duration'
 
 
diff --git a/server/control_segments/verify b/server/control_segments/verify
index f390f4f..0af7e1b 100644
--- a/server/control_segments/verify
+++ b/server/control_segments/verify
@@ -1,8 +1,12 @@
-from chromite.lib import metrics
-
 from autotest_lib.server import utils
 from autotest_lib.server.cros import provision
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
+
 DURATION_METRIC = 'chromeos/autotest/autoserv/verify_duration'
 
 
diff --git a/server/crashcollect.py b/server/crashcollect.py
index 0902cde..dca2f5e 100644
--- a/server/crashcollect.py
+++ b/server/crashcollect.py
@@ -6,13 +6,16 @@
 import shutil
 import time
 
-from chromite.lib import metrics
-
 from autotest_lib.client.common_lib import error
 from autotest_lib.client.common_lib import global_config
 from autotest_lib.client.cros import constants
 from autotest_lib.server import utils
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 # The amortized max filesize to collect.  For example, if _MAX_FILESIZE is 10
 # then we would collect a file with size 20 half the time, and a file with size
diff --git a/server/cros/dynamic_suite/reporting.py b/server/cros/dynamic_suite/reporting.py
index 1ef8499..004f21f 100644
--- a/server/cros/dynamic_suite/reporting.py
+++ b/server/cros/dynamic_suite/reporting.py
@@ -7,14 +7,12 @@
 import collections
 import HTMLParser
 import logging
-import os
 import re
 import textwrap
 
 from xml.parsers import expat
 
 import common
-from chromite.lib import metrics
 
 from autotest_lib.client.common_lib import error
 from autotest_lib.client.common_lib import global_config
@@ -26,6 +24,12 @@
 from autotest_lib.server.cros.dynamic_suite import tools
 from autotest_lib.site_utils  import gmail_lib
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = site_utils.metrics_mock
+
+
 # Try importing the essential bug reporting libraries.
 try:
     from autotest_lib.site_utils import phapi_lib
diff --git a/server/frontend.py b/server/frontend.py
index 2e2eccc..7820a5f 100644
--- a/server/frontend.py
+++ b/server/frontend.py
@@ -20,7 +20,6 @@
 import re
 
 import common
-from chromite.lib import metrics
 
 from autotest_lib.frontend.afe import rpc_client_lib
 from autotest_lib.client.common_lib import control_data
@@ -29,6 +28,10 @@
 from autotest_lib.client.common_lib import utils
 from autotest_lib.tko import db
 
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
 
 try:
     from autotest_lib.server.site_common import site_utils as server_utils
diff --git a/server/hosts/cros_host.py b/server/hosts/cros_host.py
index d98284d..4819112 100644
--- a/server/hosts/cros_host.py
+++ b/server/hosts/cros_host.py
@@ -46,8 +46,9 @@
 # older chromite version.
 try:
     from chromite.lib import metrics
-except:
-    metrics = None
+except ImportError:
+    metrics =  utils.metrics_mock
+
 
 CONFIG = global_config.global_config
 ENABLE_DEVSERVER_TRIGGER_AUTO_UPDATE = CONFIG.get_config_value(
@@ -393,22 +394,24 @@
                 'branch': branch,
                 'devserver': devserver.replace('.', '_'),
             }
-            if metrics:
-                monarch_fields = {
-                    'board': board,
-                    'build_type': build_type,
-                    # TODO(akeshet): To be consistent with most other metrics,
-                    # consider changing the following field to be named
-                    # 'milestone'.
-                    'branch': branch,
-                    'dev_server': devserver,
-                }
-                metrics.Counter(
-                        'chromeos/autotest/provision/verify_url'
-                        ).increment(fields=monarch_fields)
-                metrics.SecondsDistribution(
-                        'chromeos/autotest/provision/verify_url_duration'
-                        ).add(stage_time, fields=monarch_fields)
+
+            monarch_fields = {
+                'board': board,
+                'build_type': build_type,
+                # TODO(akeshet): To be consistent with most other metrics,
+                # consider changing the following field to be named
+                # 'milestone'.
+                'branch': branch,
+                'dev_server': devserver,
+            }
+            metrics.Counter(
+                    'chromeos/autotest/provision/verify_url'
+                    ).increment(fields=monarch_fields)
+            metrics.SecondsDistribution(
+                    'chromeos/autotest/provision/verify_url_duration'
+                    ).add(stage_time, fields=monarch_fields)
+
+
     def stage_server_side_package(self, image=None):
         """Stage autotest server-side package on devserver.
 
@@ -701,17 +704,14 @@
                             server_name)
               logging.info('Staging build for AU: %s', update_url)
               devserver.trigger_download(build, synchronous=False)
-              if metrics:
-                  c = metrics.Counter(
-                      'chromeos/autotest/provision/failover_download')
-                  c.increment(fields=monarch_fields)
+              c = metrics.Counter(
+                  'chromeos/autotest/provision/failover_download')
+              c.increment(fields=monarch_fields)
         else:
             logging.info('Staging build for AU: %s', update_url)
             devserver.trigger_download(build, synchronous=False)
-            if metrics:
-                c = metrics.Counter(
-                        'chromeos/autotest/provision/trigger_download')
-                c.increment(fields=monarch_fields)
+            c = metrics.Counter('chromeos/autotest/provision/trigger_download')
+            c.increment(fields=monarch_fields)
 
         # Report provision stats.
         (metrics.Counter('chromeos/autotest/provision/install_with_devserver')
@@ -719,9 +719,8 @@
         logging.debug('Resolved devserver for auto-update: %s', devserver.url())
 
         # and other metrics from this function.
-        if metrics:
-            metrics.Counter('chromeos/autotest/provision/resolve',
-                            ).increment(fields=monarch_fields)
+        metrics.Counter('chromeos/autotest/provision/resolve'
+                        ).increment(fields=monarch_fields)
 
         devserver.auto_update(self.hostname, build,
                               log_dir=self.job.resultdir,
@@ -1378,16 +1377,15 @@
             raise
         finally:
             duration = int(time.time() - t0)
-            if metrics:
-                metrics.Counter(
-                        'chromeos/autotest/autoserv/reboot_count').increment(
-                        fields=metric_fields)
-                metrics.Counter(
-                        'chromeos/autotest/autoserv/reboot_debug').increment(
-                        fields=metric_debug_fields)
-                metrics.SecondsDistribution(
-                        'chromeos/autotest/autoserv/reboot_duration').add(
-                        duration, fields=metric_fields)
+            metrics.Counter(
+                    'chromeos/autotest/autoserv/reboot_count').increment(
+                    fields=metric_fields)
+            metrics.Counter(
+                    'chromeos/autotest/autoserv/reboot_debug').increment(
+                    fields=metric_debug_fields)
+            metrics.SecondsDistribution(
+                    'chromeos/autotest/autoserv/reboot_duration').add(
+                    duration, fields=metric_fields)
 
 
     def suspend(self, **dargs):
diff --git a/server/hosts/servo_host.py b/server/hosts/servo_host.py
index c74a378..7c938fe 100644
--- a/server/hosts/servo_host.py
+++ b/server/hosts/servo_host.py
@@ -38,7 +38,11 @@
 from autotest_lib.server.hosts import ssh_host
 from autotest_lib.site_utils.rpm_control_system import rpm_client
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 # Names of the host attributes in the database that represent the values for
 # the servo_host and servo_port for a servo connected to the DUT.
diff --git a/server/hosts/ssh_host.py b/server/hosts/ssh_host.py
index ab3dbf2..130337f 100644
--- a/server/hosts/ssh_host.py
+++ b/server/hosts/ssh_host.py
@@ -13,7 +13,8 @@
 import inspect
 import logging
 import re
-from autotest_lib.client.common_lib import error, pxssh
+from autotest_lib.client.common_lib import error
+from autotest_lib.client.common_lib import pxssh
 from autotest_lib.server import utils
 from autotest_lib.server.hosts import abstract_ssh
 
@@ -21,8 +22,8 @@
 # older chromite version.
 try:
     from chromite.lib import metrics
-except:
-    metrics = None
+except ImportError:
+    metrics = utils.metrics_mock
 
 
 class SSHHost(abstract_ssh.AbstractSSHHost):
@@ -130,24 +131,22 @@
             @param counter_name: string indicating which counter to use
             @param failure_name: string indentifying an error, or 'success'
             """
-            if metrics:
-                if counter_name == 'call':
-                    # ssh_counter records the outcome of each ssh invocation
-                    # inside _run(), including exceptions.
-                    ssh_counter = metrics.Counter('chromeos/autotest/ssh/calls')
-                    fields = {'error' : failure_name or 'success',
-                              'attempt' : ssh_call_count}
-                    ssh_counter.increment(fields=fields)
+            if counter_name == 'call':
+                # ssh_counter records the outcome of each ssh invocation
+                # inside _run(), including exceptions.
+                ssh_counter = metrics.Counter('chromeos/autotest/ssh/calls')
+                fields = {'error' : failure_name or 'success',
+                          'attempt' : ssh_call_count}
+                ssh_counter.increment(fields=fields)
 
-                if counter_name == 'run':
-                    # run_counter records each call to _run() with its result
-                    # and how many tries were made.  Calls are recorded when
-                    # _run() exits (including exiting with an exception)
-                    run_counter = metrics.Counter('chromeos/autotest/ssh/runs')
-                    fields = {'error' : failure_name or 'success',
-                              'attempt' : ssh_call_count}
-                    run_counter.increment(fields=fields)
-
+            if counter_name == 'run':
+                # run_counter records each call to _run() with its result
+                # and how many tries were made.  Calls are recorded when
+                # _run() exits (including exiting with an exception)
+                run_counter = metrics.Counter('chromeos/autotest/ssh/runs')
+                fields = {'error' : failure_name or 'success',
+                          'attempt' : ssh_call_count}
+                run_counter.increment(fields=fields)
 
         # If ssh_failure_retry_ok is True, retry twice on timeouts and generic
         # error 255: if a simple retry doesn't work, kill the ssh master
diff --git a/server/site_crashcollect.py b/server/site_crashcollect.py
index 9601c08..892a8a0 100644
--- a/server/site_crashcollect.py
+++ b/server/site_crashcollect.py
@@ -14,7 +14,10 @@
 from autotest_lib.server.crashcollect import collect_log_file
 from autotest_lib.server import utils
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = client_utils.metrics_mock
 
 
 def generate_minidump_stacktrace(minidump_path):
diff --git a/server/site_tests/cheets_CTS/cheets_CTS.py b/server/site_tests/cheets_CTS/cheets_CTS.py
index 3189380..c64fe83 100644
--- a/server/site_tests/cheets_CTS/cheets_CTS.py
+++ b/server/site_tests/cheets_CTS/cheets_CTS.py
@@ -21,10 +21,11 @@
 from autotest_lib.client.common_lib import error
 from autotest_lib.server import utils
 from autotest_lib.server.cros import tradefed_test
+
 try:
     from chromite.lib import metrics
-except:
-    metrics = None
+except ImportError:
+    metrics = utils.metrics_mock
 
 # Notice if there are only a few failures each RETRY step currently (08/01/2016)
 # takes a bit more than 6 minutes (mostly for reboot, login, starting ARC).
@@ -165,12 +166,9 @@
         m = 'chromeos/autotest/infra_benchmark/cheets/push_media/duration'
         fields = {'success': False,
                   'dut_host_name': self._host.hostname}
-        if metrics:
-            with metrics.SecondsTimer(m, fields=fields) as c:
-                self._copy_media(media)
-                c['success'] = True
-        else:
+        with metrics.SecondsTimer(m, fields=fields) as c:
             self._copy_media(media)
+            c['success'] = True
         if not self._verify_media(media):
             raise error.TestFail('Error: saw corruption pushing media files.')
 
diff --git a/server/site_tests/dummy_PassServer/control b/server/site_tests/dummy_PassServer/control
index 9cda02e..127064b 100644
--- a/server/site_tests/dummy_PassServer/control
+++ b/server/site_tests/dummy_PassServer/control
@@ -16,7 +16,13 @@
 This is a helper test that will succeed.
 """
 
-from chromite.lib import metrics
+from autotest_lib.client.common_lib import utils
+
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 def run(machine):
     job.run_test('dummy_PassServer',
diff --git a/site_utils/check_hung_proc.py b/site_utils/check_hung_proc.py
index e8b72cd..4b0326cf 100755
--- a/site_utils/check_hung_proc.py
+++ b/site_utils/check_hung_proc.py
@@ -20,7 +20,11 @@
 import subprocess
 
 from autotest_lib.server import site_utils
-from chromite.lib import metrics
+
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = site_utils.metrics_mock
 
 
 PROGRAM_TO_CHECK_SET = set(['gsutil', 'autoserv'])
diff --git a/site_utils/collect_host_stats.py b/site_utils/collect_host_stats.py
index 89e8dae..460c7dc 100755
--- a/site_utils/collect_host_stats.py
+++ b/site_utils/collect_host_stats.py
@@ -15,14 +15,20 @@
 from datetime import timedelta
 
 import common
-from chromite.lib import metrics
-from chromite.lib import ts_mon_config
 from autotest_lib.client.common_lib import time_utils
+from autotest_lib.client.common_lib import utils
 from autotest_lib.site_utils import gmail_lib
 from autotest_lib.site_utils import host_history
 from autotest_lib.site_utils import host_history_utils
 from autotest_lib.site_utils import host_label_utils
 
+try:
+    from chromite.lib import metrics
+    from chromite.lib import ts_mon_config
+except ImportError:
+    metrics = utils.metrics_mock
+    ts_mon_config = utils.metrics_mock
+
 
 _MACHINE_UTILIZATION_RATE_HOURLY = metrics.Float(
         'chromeos/autotest/host/machine_utilization_rate/hourly')
diff --git a/site_utils/count_jobs.py b/site_utils/count_jobs.py
index 19d61fb..6fe9056 100755
--- a/site_utils/count_jobs.py
+++ b/site_utils/count_jobs.py
@@ -14,7 +14,12 @@
 from autotest_lib.frontend import setup_django_environment
 from autotest_lib.frontend.afe import models
 from autotest_lib.server import site_utils
-from chromite.lib import metrics
+
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = site_utils.metrics_mock
+
 
 def number_of_jobs_since(delta):
     """Returns the number of jobs kicked off in the last |duration| minutes.
diff --git a/site_utils/gmail_lib.py b/site_utils/gmail_lib.py
index e604ae7..2659292 100755
--- a/site_utils/gmail_lib.py
+++ b/site_utils/gmail_lib.py
@@ -40,7 +40,11 @@
 # of a sys.path war between chromite and autotest crbug.com/622988
 from autotest_lib.server import utils as server_utils
 from chromite.lib import retry_util
-from chromite.lib import metrics
+
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = site_utils.metrics_mock
 
 
 DEFAULT_CREDS_FILE = global_config.global_config.get_config_value(
diff --git a/site_utils/gs_offloader.py b/site_utils/gs_offloader.py
index 657acf3..a323503 100755
--- a/site_utils/gs_offloader.py
+++ b/site_utils/gs_offloader.py
@@ -21,7 +21,6 @@
 import re
 import shutil
 import signal
-import socket
 import subprocess
 import sys
 import tempfile
@@ -38,15 +37,22 @@
 from autotest_lib.site_utils import pubsub_utils
 from autotest_lib.tko import models
 
-from chromite.lib import metrics
-from chromite.lib import parallel
-from chromite.lib import ts_mon_config
+# Autotest requires the psutil module from site-packages, so it must be imported
+# after "import common" 
 try:
     # Does not exist, nor is needed, on moblab.
     import psutil
 except ImportError:
     psutil = None
 
+from chromite.lib import parallel
+try:
+    from chromite.lib import metrics
+    from chromite.lib import ts_mon_config
+except ImportError:
+    metrics = site_utils.metrics_mock
+    ts_mon_config = site_utils.metrics_mock
+
 
 GS_OFFLOADING_ENABLED = global_config.global_config.get_config_value(
         'CROS', 'gs_offloading_enabled', type=bool, default=True)
@@ -270,7 +276,7 @@
                       ignore_status=True).stdout.strip()
     try:
         count = int(count)
-    except ValueError, TypeError:
+    except (ValueError, TypeError):
         logging.warning('Fail to get the file count in folder %s.', dir_entry)
         return
     if count < MAX_FILE_COUNT:
diff --git a/site_utils/lxc.py b/site_utils/lxc.py
index 4b73cc0..c81efe8 100644
--- a/site_utils/lxc.py
+++ b/site_utils/lxc.py
@@ -38,7 +38,11 @@
 from autotest_lib.site_utils import lxc_config
 from autotest_lib.site_utils import lxc_utils
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 config = global_config.global_config
 
diff --git a/site_utils/stats/mysql_stats.py b/site_utils/stats/mysql_stats.py
index e208d3c..02e100e 100755
--- a/site_utils/stats/mysql_stats.py
+++ b/site_utils/stats/mysql_stats.py
@@ -16,10 +16,15 @@
 
 import common
 
-from chromite.lib import ts_mon_config
-from chromite.lib import metrics
-
 from autotest_lib.client.common_lib import global_config
+from autotest_lib.client.common_lib import utils
+
+try:
+    from chromite.lib import metrics
+    from chromite.lib import ts_mon_config
+except ImportError:
+    metrics = utils.metrics_mock
+    ts_mon_config = utils.metrics_mock
 
 
 AT_DIR='/usr/local/autotest'
diff --git a/site_utils/suite_scheduler/deduping_scheduler.py b/site_utils/suite_scheduler/deduping_scheduler.py
index 0158c90..d0587b8 100644
--- a/site_utils/suite_scheduler/deduping_scheduler.py
+++ b/site_utils/suite_scheduler/deduping_scheduler.py
@@ -12,7 +12,11 @@
 from autotest_lib.server import site_utils
 from autotest_lib.server.cros import provision
 from autotest_lib.server.cros.dynamic_suite import frontend_wrappers, reporting
-from chromite.lib import metrics
+
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = site_utils.metrics_mock
 
 
 CONFIG = global_config.global_config
diff --git a/site_utils/suite_scheduler/driver.py b/site_utils/suite_scheduler/driver.py
index 68eb282..7651d81 100644
--- a/site_utils/suite_scheduler/driver.py
+++ b/site_utils/suite_scheduler/driver.py
@@ -11,9 +11,14 @@
 import task, timed_event
 
 import common
+from autotest_lib.client.common_lib import utils
 from autotest_lib.server import utils
 
-from chromite.lib import metrics
+try:
+    from chromite.lib import metrics
+except ImportError:
+    metrics = utils.metrics_mock
+
 
 POOL_SIZE = 32
 
diff --git a/site_utils/suite_scheduler/suite_scheduler.py b/site_utils/suite_scheduler/suite_scheduler.py
index 2a48a89..ba60657 100755
--- a/site_utils/suite_scheduler/suite_scheduler.py
+++ b/site_utils/suite_scheduler/suite_scheduler.py
@@ -40,6 +40,7 @@
 import board_enumerator, deduping_scheduler, driver, forgiving_config_parser
 import manifest_versions, sanity, task
 from autotest_lib.client.common_lib import global_config
+from autotest_lib.client.common_lib import utils
 from autotest_lib.client.common_lib import logging_config, logging_manager
 from autotest_lib.server.cros.dynamic_suite import frontend_wrappers
 try:
@@ -51,7 +52,11 @@
     server_manager_utils = None
     logging.debug('Could not load server_manager_utils module, expected '
                   'if you are running sanity check or pre-submit hook')
-from chromite.lib import ts_mon_config
+
+try:
+    from chromite.lib import ts_mon_config
+except ImportError:
+    ts_mon_config = utils.metrics_mock
 
 
 CONFIG_SECTION = 'SCHEDULER'