diff --git a/dvc/analytics.py b/dvc/analytics.py index af4823ea9..3aa467bf0 100644 --- a/dvc/analytics.py +++ b/dvc/analytics.py @@ -102,6 +102,8 @@ def _runtime_info(): """ Gather information from the environment where DVC runs to fill a report. """ + from iterative_telemetry import find_or_create_user_id + from dvc import __version__ from dvc.utils import is_binary @@ -110,7 +112,7 @@ def _runtime_info(): "is_binary": is_binary(), "scm_class": _scm_in_use(), "system_info": _system_info(), - "user_id": _find_or_create_user_id(), + "user_id": find_or_create_user_id(), } @@ -146,45 +148,3 @@ def _system_info(): # We don't collect data for any other system. raise NotImplementedError - - -def _find_or_create_user_id(): - """ - The user's ID is stored on a file under the global config directory. - - The file should contain a JSON with a "user_id" key: - - {"user_id": "16fd2706-8baf-433b-82eb-8c7fada847da"} - - IDs are generated randomly with UUID. - """ - import uuid - - from dvc.config import Config - from dvc.lock import Lock, LockError - from dvc.utils.fs import makedirs - - config_dir = Config.get_dir("global") - fname = os.path.join(config_dir, "user_id") - lockfile = os.path.join(config_dir, "user_id.lock") - - # Since the `fname` and `lockfile` are under the global config, - # we need to make sure such directory exist already. - makedirs(config_dir, exist_ok=True) - - try: - with Lock(lockfile): - try: - with open(fname, encoding="utf-8") as fobj: - user_id = json.load(fobj)["user_id"] - - except (FileNotFoundError, ValueError, KeyError): - user_id = str(uuid.uuid4()) - - with open(fname, "w", encoding="utf-8") as fobj: - json.dump({"user_id": user_id}, fobj) - - return user_id - - except LockError: - logger.debug("Failed to acquire '%s'", lockfile) diff --git a/setup.cfg b/setup.cfg index 6be6b5b11..234ffcd05 100644 --- a/setup.cfg +++ b/setup.cfg @@ -69,6 +69,7 @@ install_requires = dvc-data==0.10.0 dvc-http==2.19.1 hydra-core>=1.1.0 + iterative-telemetry==0.0.5 [options.extras_require] all = diff --git a/tests/unit/test_analytics.py b/tests/unit/test_analytics.py index f676e6fa5..eaa86eec7 100644 --- a/tests/unit/test_analytics.py +++ b/tests/unit/test_analytics.py @@ -14,7 +14,11 @@ def tmp_global_dir(mocker, tmp_path): """ Fixture to prevent modifying the actual global config """ - mocker.patch("dvc.config.Config.get_dir", return_value=str(tmp_path)) + + def _user_config_dir(appname, *_args, **_kwargs): + return str(tmp_path / appname) + + mocker.patch("iterative_telemetry.user_config_dir", _user_config_dir) def test_collect_and_send_report(mocker, tmp_global_dir): @@ -155,10 +159,3 @@ def test_system_info(): ) assert schema(analytics._system_info()) - - -def test_find_or_create_user_id(tmp_global_dir): - created = analytics._find_or_create_user_id() - found = analytics._find_or_create_user_id() - - assert created == found