33import json
44import logging
55import os
6+ import platform
67import subprocess
8+ import sys
9+ import uuid
10+ from functools import lru_cache
711from threading import Thread
8- from typing import Any , Dict
12+ from typing import Any , Callable , Dict , Union
913
14+ import distro
1015import requests
1116from appdirs import user_config_dir
1217from filelock import FileLock , Timeout
1318
1419logger = logging .getLogger (__name__ )
15- TOKEN = "s2s.9vdp1745vpkibkcxznsfus.cgsh70aoy3m39bfuey6shn"
16- URL = "https://telemetry.mlem.ai/api/v1/s2s/event?ip_policy=strict"
20+ TOKEN = "s2s.jtyjusrpsww4k9b76rrjri.bl62fbzrb7nd9n6vn5bpqt"
21+ URL = (
22+ "https://iterative-telemetry.herokuapp.com"
23+ "/api/v1/s2s/event?ip_policy=strict"
24+ )
25+
26+ DO_NOT_TRACK_ENV = "ITERATIVE_DO_NOT_TRACK"
27+ DO_NOT_TRACK_VALUE = "do-not-track"
1728
1829
1930class IterativeTelemetryLogger :
2031 def __init__ (
2132 self ,
2233 tool_name ,
2334 tool_version ,
24- enabled : bool = True ,
35+ enabled : Union [ bool , Callable ] = True ,
2536 url = URL ,
2637 token = TOKEN ,
2738 ):
@@ -36,25 +47,33 @@ def send_cli_call(self, cmd_name: str, **kwargs):
3647
3748 def send_event (
3849 self ,
39- event_type : str ,
40- event_name : str ,
50+ interface : str ,
51+ action : str ,
4152 use_thread : bool = False ,
4253 use_daemon : bool = True ,
4354 ** kwargs ,
4455 ):
4556 self .send (
46- {"interface" : event_type , "action" : event_name , "extra" : kwargs },
57+ {"interface" : interface , "action" : action , "extra" : kwargs },
4758 use_thread = use_thread ,
4859 use_daemon = use_daemon ,
4960 )
5061
62+ def is_enabled (self ):
63+ return (
64+ os .environ .get (DO_NOT_TRACK_ENV , None ) is None and self .enabled ()
65+ if callable (self .enabled )
66+ else self .enabled
67+ and _find_or_create_user_id () != DO_NOT_TRACK_VALUE
68+ )
69+
5170 def send (
5271 self ,
5372 payload : Dict [str , Any ],
5473 use_thread : bool = False ,
5574 use_daemon : bool = True ,
5675 ):
57- if not self .enabled :
76+ if not self .is_enabled () :
5877 return
5978 payload .update (self ._runtime_info ())
6079 if use_thread and use_daemon :
@@ -69,8 +88,6 @@ def send(
6988 impl (payload )
7089
7190 def _send_daemon (self , payload ):
72- import sys
73-
7491 cmd = (
7592 f"import requests;requests.post('{ self .url } ',"
7693 f"params={{'token':'{ self .token } '}},json={ payload } )"
@@ -121,6 +138,7 @@ def _runtime_info(self):
121138 return {
122139 "tool_name" : self .tool_name ,
123140 "tool_version" : self .tool_version ,
141+ # "tool_source": self.tool_source, # TODO
124142 # "scm_class": _scm_in_use(),
125143 ** _system_info (),
126144 "user_id" : _find_or_create_user_id (),
@@ -129,11 +147,6 @@ def _runtime_info(self):
129147
130148
131149def _system_info ():
132- import platform
133- import sys
134-
135- import distro
136-
137150 system = platform .system ()
138151
139152 if system == "Windows" :
@@ -162,16 +175,16 @@ def _system_info():
162175 raise NotImplementedError
163176
164177
178+ @lru_cache
165179def _find_or_create_user_id ():
166180 """
167181 The user's ID is stored on a file under the global config directory.
168182 The file should contain a JSON with a "user_id" key:
169183 {"user_id": "16fd2706-8baf-433b-82eb-8c7fada847da"}
170184 IDs are generated randomly with UUID.
171185 """
172- import uuid
173186
174- config_dir = user_config_dir ("mlem " , "Iterative " )
187+ config_dir = user_config_dir ("telemetry " , "iterative " )
175188 fname = os .path .join (config_dir , "user_id" )
176189 lockfile = os .path .join (config_dir , "user_id.lock" )
177190
0 commit comments