dagster-shared 1.12.11__py3-none-any.whl → 1.12.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,6 +18,7 @@ MAX_BYTES = 10485760 # 10 MB = 10 * 1024 * 1024 bytes
18
18
  DAGSTER_HOME_FALLBACK = "~/.dagster"
19
19
  TELEMETRY_STR = ".telemetry"
20
20
  INSTANCE_ID_STR = "instance_id"
21
+ USER_ID_STR = "user_id"
21
22
 
22
23
  KNOWN_CI_ENV_VAR_KEYS = {
23
24
  "GITLAB_CI", # https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
@@ -84,6 +85,17 @@ def get_or_create_dir_from_dagster_home(target_dir: str) -> str:
84
85
  return dagster_home_logs_path
85
86
 
86
87
 
88
+ def get_or_create_user_telemetry_dir() -> str:
89
+ """Always return ~/.dagster/.telemetry/, ignoring $DAGSTER_HOME.
90
+
91
+ This is used for user-level telemetry data (like user_id) that should be
92
+ consistent across all Dagster instances for a given user.
93
+ """
94
+ path = os.path.join(os.path.expanduser(DAGSTER_HOME_FALLBACK), TELEMETRY_STR)
95
+ os.makedirs(path, exist_ok=True)
96
+ return path
97
+
98
+
87
99
  class TelemetrySettings(NamedTuple):
88
100
  dagster_telemetry_enabled: bool
89
101
  instance_id: Optional[str]
@@ -154,6 +166,7 @@ class TelemetryEntry(
154
166
  ("event_id", str),
155
167
  ("elapsed_time", str),
156
168
  ("instance_id", str),
169
+ ("user_id", str),
157
170
  ("metadata", Mapping[str, str]),
158
171
  ("python_version", str),
159
172
  ("dagster_version", str),
@@ -173,7 +186,8 @@ class TelemetryEntry(
173
186
  client_time - Client time
174
187
  elapsed_time - Time elapsed between start of function and end of function call
175
188
  event_id - Unique id for the event
176
- instance_id - Unique id for dagster instance
189
+ instance_id - Unique id for dagster instance (varies by $DAGSTER_HOME)
190
+ user_id - Unique id for the user (consistent across all instances, stored in ~/.dagster)
177
191
  python_version - Python version
178
192
  metadata - More information i.e. pipeline success (boolean)
179
193
  version - Schema version
@@ -192,6 +206,7 @@ class TelemetryEntry(
192
206
  client_time: str,
193
207
  event_id: str,
194
208
  instance_id: str,
209
+ user_id: str,
195
210
  metadata: Optional[Mapping[str, str]] = None,
196
211
  elapsed_time: Optional[str] = None,
197
212
  run_storage_id: Optional[str] = None,
@@ -206,6 +221,7 @@ class TelemetryEntry(
206
221
  elapsed_time=elapsed_time or "",
207
222
  event_id=event_id,
208
223
  instance_id=instance_id,
224
+ user_id=user_id,
209
225
  python_version=get_python_version(),
210
226
  metadata=metadata or {},
211
227
  dagster_version=__version__ or "None",
@@ -239,6 +255,7 @@ def log_telemetry_action(
239
255
  elapsed_time=str(elapsed_time),
240
256
  event_id=str(uuid.uuid4()),
241
257
  instance_id=instance_id,
258
+ user_id=get_or_set_user_id(),
242
259
  metadata=metadata,
243
260
  run_storage_id=run_storage_id,
244
261
  )._asdict()
@@ -277,6 +294,56 @@ def get_or_set_instance_id() -> str:
277
294
  return instance_id
278
295
 
279
296
 
297
+ def get_or_set_user_id() -> str:
298
+ """Get or create a user-level telemetry ID.
299
+
300
+ Unlike instance_id which varies by $DAGSTER_HOME, user_id is always stored
301
+ in ~/.dagster/.telemetry/user_id.yaml to ensure consistency across all
302
+ Dagster instances for a given user.
303
+ """
304
+ user_id = _get_telemetry_user_id()
305
+ if user_id is None:
306
+ user_id = _set_telemetry_user_id() or "<<unable_to_set_user_id>>"
307
+ return user_id
308
+
309
+
310
+ def _get_telemetry_user_id() -> Optional[str]:
311
+ """Gets the user_id from ~/.dagster/.telemetry/user_id.yaml."""
312
+ import yaml
313
+
314
+ user_id_path = os.path.join(get_or_create_user_telemetry_dir(), "user_id.yaml")
315
+ if not os.path.exists(user_id_path):
316
+ return None
317
+
318
+ try:
319
+ with open(user_id_path, encoding="utf8") as user_id_file:
320
+ user_id_yaml = yaml.safe_load(user_id_file)
321
+ if (
322
+ user_id_yaml
323
+ and USER_ID_STR in user_id_yaml
324
+ and isinstance(user_id_yaml[USER_ID_STR], str)
325
+ ):
326
+ return user_id_yaml[USER_ID_STR]
327
+ except Exception:
328
+ pass
329
+ return None
330
+
331
+
332
+ def _set_telemetry_user_id() -> Optional[str]:
333
+ """Sets the user_id at ~/.dagster/.telemetry/user_id.yaml."""
334
+ import yaml
335
+
336
+ user_id_path = os.path.join(get_or_create_user_telemetry_dir(), "user_id.yaml")
337
+ user_id = str(uuid.uuid4())
338
+
339
+ try:
340
+ with open(user_id_path, "w", encoding="utf8") as user_id_file:
341
+ yaml.dump({USER_ID_STR: user_id}, user_id_file, default_flow_style=False)
342
+ return user_id
343
+ except Exception:
344
+ return None
345
+
346
+
280
347
  # Gets the instance_id at $DAGSTER_HOME/.telemetry/id.yaml
281
348
  def _get_telemetry_instance_id() -> Optional[str]:
282
349
  import yaml
@@ -1,6 +1,6 @@
1
- import asyncio
2
1
  from collections.abc import Callable, Hashable, Mapping
3
2
  from functools import wraps
3
+ from inspect import iscoroutinefunction
4
4
  from typing import Any, Concatenate, TypeVar, cast
5
5
 
6
6
  from typing_extensions import ParamSpec
@@ -93,7 +93,7 @@ def cached_method(method: Callable[Concatenate[S, P], T]) -> Callable[Concatenat
93
93
 
94
94
  return canonical_kwargs
95
95
 
96
- if asyncio.iscoroutinefunction(method):
96
+ if iscoroutinefunction(method):
97
97
 
98
98
  @wraps(method)
99
99
  async def _async_cached_method_wrapper(self: S, *args: P.args, **kwargs: P.kwargs) -> T:
dagster_shared/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.12.11"
1
+ __version__ = "1.12.12"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dagster_shared
3
- Version: 1.12.11
3
+ Version: 1.12.12
4
4
  Summary: Shared code between dagster and dagster-dg-core.
5
5
  Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-shared
6
6
  Author: Dagster Labs
@@ -5,7 +5,7 @@ dagster_shared/match.py,sha256=P9wQSvzb7a03jXlC-0w9msoX5bV_BE1uSvdYvavNO6M,3444
5
5
  dagster_shared/merger.py,sha256=c9cJTwHtgMXgR9MtB-KwZEMtQSXn13rF08F2ID5aDTg,1758
6
6
  dagster_shared/modules.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  dagster_shared/py.typed,sha256=mDShSrm8qg9qjacQc2F-rI8ATllqP6EdgHuEYxuCXZ0,7
8
- dagster_shared/version.py,sha256=V9Hrmon3VMx6Fm-BKFFV3DZcAfdU2IO-xs1MB4F4LlI,24
8
+ dagster_shared/version.py,sha256=vKk1j8B-0kB8gelcQBK0OZVY0ogGIIA3KR4K_1iNmJQ,24
9
9
  dagster_shared/check/README.md,sha256=UlxRVMWJEoVAlaHWDvhobUpuNQGBG5-ddqZ6OIfLYnM,1352
10
10
  dagster_shared/check/__init__.py,sha256=CHSOqJpaeWr6skJT7jD8HnN5s4bdnoX4x94sGN55KqA,3482
11
11
  dagster_shared/check/builder.py,sha256=FvxiGCOCOgA5cWEDPXVF7c2grnjhR2dkuxEN3dRpoEI,17570
@@ -36,9 +36,9 @@ dagster_shared/seven/abc.py,sha256=vaqd-UGzvqAADutqU4O0V7-Hihe0vQNerj2SlCPJMFQ,5
36
36
  dagster_shared/seven/json.py,sha256=TElHKCmD71QJSDKvFP4e_vLMoSAFsAllPAbmplzSN30,383
37
37
  dagster_shared/seven/temp_dir.py,sha256=L03xfE14yxlcmjCI9NrViY36r4MMjaahfexJygMPaJo,354
38
38
  dagster_shared/seven/compat/__init__.py,sha256=8BqkAab5uZGmSyvBFpePjAaXR9seNDobs3TYI45nt5k,105
39
- dagster_shared/telemetry/__init__.py,sha256=_SLCyZSLGFmaZLujii-z7FK642ewI78Nm4eV8n-3Xxs,11335
39
+ dagster_shared/telemetry/__init__.py,sha256=KeUTJmsmH3Xh4_6hRFAoIH9QdptnNogzygg4kwXebbI,13611
40
40
  dagster_shared/utils/__init__.py,sha256=m4QRhlvU_XCN3BWcUr_mead-7Ui4XvQJo3SIDgljirU,4310
41
- dagster_shared/utils/cached_method.py,sha256=WQj_xtSTO5qIejFqxnLXpjIMRsiWe8aJ0IcZkkWBWxY,7183
41
+ dagster_shared/utils/cached_method.py,sha256=_l_cL-U98ZX8uZDPSLhKEOP3dZeTS6Of3RX9oV2gA_E,7200
42
42
  dagster_shared/utils/config.py,sha256=np_6pJ6r3xRKfV-cPeR6qVXebhj-Oznw3rhWP67miNM,3536
43
43
  dagster_shared/utils/hash.py,sha256=WA0FegijIAhMphC0gt30tTqpR6BecRk1GhIMtV71qbU,2060
44
44
  dagster_shared/utils/test.py,sha256=rF0eXymdihf25euuyfQrnH7w8dicUDFAIloKlmKXyZ0,20
@@ -47,8 +47,8 @@ dagster_shared/utils/warnings.py,sha256=yxiG8ghc3RwyomRItwIKQe6TrUdTlJAUX3BssOwe
47
47
  dagster_shared/yaml_utils/__init__.py,sha256=Ya7qT3aJGPC1TgD-pSkkhLX5U4QbrUkCsrUtZQeACXg,10529
48
48
  dagster_shared/yaml_utils/sample_yaml.py,sha256=YC-1h1P48F3QV-Uwo-MqzEkzlrMliXPfZM_X6ynZvTQ,5461
49
49
  dagster_shared/yaml_utils/source_position.py,sha256=yVSnHUkBYzWzLzqtyGbqRjH2b7oTeiE4K3b-uokYUIQ,9786
50
- dagster_shared-1.12.11.dist-info/licenses/LICENSE,sha256=hgU51ohULAFKZE2la8sartPYoUaAA14jxFAfFC4Tow0,11347
51
- dagster_shared-1.12.11.dist-info/METADATA,sha256=8tbBWqKKGVyiW5RlFwfuXnm28uTn9suJuhPB_IaJCpc,1148
52
- dagster_shared-1.12.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
53
- dagster_shared-1.12.11.dist-info/top_level.txt,sha256=S8ADcO4aTW07ONhLHXDxiuSkDzucgYKOlocB2x3r_dY,15
54
- dagster_shared-1.12.11.dist-info/RECORD,,
50
+ dagster_shared-1.12.12.dist-info/licenses/LICENSE,sha256=hgU51ohULAFKZE2la8sartPYoUaAA14jxFAfFC4Tow0,11347
51
+ dagster_shared-1.12.12.dist-info/METADATA,sha256=701-XPDihIqTjyXuiayhLchrhs617grhdcF6pEu_bt8,1148
52
+ dagster_shared-1.12.12.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
53
+ dagster_shared-1.12.12.dist-info/top_level.txt,sha256=S8ADcO4aTW07ONhLHXDxiuSkDzucgYKOlocB2x3r_dY,15
54
+ dagster_shared-1.12.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5