analytics: use iterative-telemetry for user_id lookup

This commit is contained in:
Ruslan Kuprieiev
2022-09-17 00:45:45 +03:00
parent 4531fec2b7
commit 35e6f082a4
3 changed files with 9 additions and 51 deletions
+3 -43
View File
@@ -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)
+1
View File
@@ -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 =
+5 -8
View File
@@ -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